Skip to content

Commit

Permalink
USB 2.0 seems to work now
Browse files Browse the repository at this point in the history
  • Loading branch information
cozycactus committed Sep 6, 2020
1 parent 1f07eb4 commit c380230
Show file tree
Hide file tree
Showing 5 changed files with 71 additions and 101 deletions.
55 changes: 40 additions & 15 deletions bsp/usb.c
Original file line number Diff line number Diff line change
Expand Up @@ -292,31 +292,56 @@ void Fx3UsbConnect(void)
}
}

void Fx3UsbStallEp0(void)
void Fx3UsbStallEp0(Fx3UsbSpeed_t s)
{
Fx3UartTxString("STALL EP0!\n");

Fx3SetReg32(FX3_PROT_EPI_CS1+0, FX3_PROT_EPI_CS1_STALL);
Fx3SetReg32(FX3_PROT_EPO_CS1+0, FX3_PROT_EPO_CS1_STALL);
Fx3UtilDelayUs(1);
Fx3SetReg32(FX3_PROT_CS, FX3_PROT_CS_SETUP_CLR_BUSY);
if (s == FX3_USB_SUPER_SPEED){
Fx3SetReg32(FX3_PROT_EPI_CS1+0, FX3_PROT_EPI_CS1_STALL);
Fx3SetReg32(FX3_PROT_EPO_CS1+0, FX3_PROT_EPO_CS1_STALL);
Fx3UtilDelayUs(1);
Fx3SetReg32(FX3_PROT_CS, FX3_PROT_CS_SETUP_CLR_BUSY);
} else {
Fx3SetReg32(FX3_DEV_EPI_CS+0, FX3_DEV_EPI_CS_STALL);
Fx3SetReg32(FX3_DEV_EPO_CS+0, FX3_DEV_EPO_CS_STALL);
Fx3UtilDelayUs(1);
Fx3SetReg32(FX3_DEV_CS, FX3_DEV_CS_SETUP_CLR_BUSY);
}

}

void Fx3UsbUnstallEp0(void)
/*void Fx3UsbHSStallEp0(void)
{
Fx3ClearReg32(FX3_PROT_EPI_CS1+0, FX3_PROT_EPI_CS1_STALL);
Fx3ClearReg32(FX3_PROT_EPO_CS1+0, FX3_PROT_EPO_CS1_STALL);
Fx3UartTxString("STALL HS EP0!\n");
Fx3SetReg32(FX3_DEV_EPI_CS+0, FX3_DEV_EPI_CS_STALL);
Fx3SetReg32(FX3_DEV_EPO_CS+0, FX3_DEV_EPO_CS_STALL);
Fx3UtilDelayUs(1);
Fx3SetReg32(FX3_PROT_CS, FX3_PROT_CS_SETUP_CLR_BUSY);
Fx3SetReg32(FX3_DEV_CS, FX3_DEV_CS_SETUP_CLR_BUSY);
}*/

void Fx3UsbUnstallEp0(Fx3UsbSpeed_t s)
{
if (s == FX3_USB_SUPER_SPEED){
Fx3ClearReg32(FX3_PROT_EPI_CS1+0, FX3_PROT_EPI_CS1_STALL);
Fx3ClearReg32(FX3_PROT_EPO_CS1+0, FX3_PROT_EPO_CS1_STALL);
Fx3UtilDelayUs(1);
Fx3SetReg32(FX3_PROT_CS, FX3_PROT_CS_SETUP_CLR_BUSY);
} else {
Fx3ClearReg32(FX3_DEV_EPI_CS+0,FX3_DEV_EPI_CS_STALL);
Fx3ClearReg32(FX3_DEV_EPO_CS+0,FX3_DEV_EPO_CS_STALL);
Fx3UtilDelayUs(1);
Fx3SetReg32(FX3_DEV_CS, FX3_DEV_CS_SETUP_CLR_BUSY);
}

}

void Fx3UsbHSUnstallEp0(void)
/*void Fx3UsbHSUnstallEp0(void)
{
Fx3ClearReg32(FX3_DEV_EPI_CS+0,FX3_DEV_EPI_CS_STALL);
Fx3ClearReg32(FX3_DEV_EPO_CS+0,FX3_DEV_EPO_CS_STALL);
Fx3UtilDelayUs(1);
Fx3SetReg32(FX3_DEV_CS, FX3_DEV_CS_SETUP_CLR_BUSY);
}
}*/

void Fx3UsbDmaDataOut(uint8_t ep, volatile void *buffer, uint16_t length)
{
Expand Down Expand Up @@ -372,7 +397,7 @@ static void Fx3UsbUsbCoreIsr(void)
(req_type, sudat0 >> FX3_PROT_SETUP_DAT_SETUP_REQUEST_SHIFT,
sudat0 >> FX3_PROT_SETUP_DAT_SETUP_VALUE_SHIFT,
sudat1 >> (FX3_PROT_SETUP_DAT_SETUP_INDEX_SHIFT - 32),
length);
length, FX3_USB_SUPER_SPEED);
}
if (prot_req & FX3_PROT_INTR_TIMEOUT_PORT_CFG_EV) {
Fx3UartTxString(" TIMEOUT_PORT_CFG_EV\n");
Expand Down Expand Up @@ -482,11 +507,11 @@ static void Fx3UsbUsbCoreIsr(void)
else
/* OUT transfer */
Fx3WriteReg32(FX3_DEV_EPO_XFER_CNT, length);
(*Fx3UsbUserCallbacks->sudav)
(*Fx3UsbUserCallbacks->sutok)
(req_type, setupdat0 >> FX3_PROT_SETUP_DAT_SETUP_REQUEST_SHIFT,
setupdat0 >> FX3_PROT_SETUP_DAT_SETUP_VALUE_SHIFT,
setupdat1 >> (FX3_PROT_SETUP_DAT_SETUP_INDEX_SHIFT - 32),
length);
length, FX3_USB_HIGH_SPEED);
//Fx3SetReg32(FX3_DEV_CTRL_INTR_MASK, (1UL << 6));
}
if (dev_ctrl_req & (1UL << 7))
Expand Down
16 changes: 10 additions & 6 deletions bsp/usb.h
Original file line number Diff line number Diff line change
Expand Up @@ -73,18 +73,22 @@ typedef enum {
FX3_USB_EP_CONTROL,
} Fx3UsbEndpointType_t;

typedef enum {
FX3_USB_HIGH_SPEED = 0,
FX3_USB_SUPER_SPEED,
} Fx3UsbSpeed_t;

struct Fx3UsbCallbacks {
void (*sutok)(uint8_t request_type, uint8_t request, uint16_t value,
uint16_t index, uint16_t length);
void (*sudav)(uint8_t request_type, uint8_t request, uint16_t value,
uint16_t index, uint16_t length);
uint16_t index, uint16_t length, Fx3UsbSpeed_t s);
};

extern void Fx3UsbInit(const struct Fx3UsbCallbacks *callbacks);
extern void Fx3UsbConnect(void);
extern void Fx3UsbStallEp0(void);
extern void Fx3UsbUnstallEp0(void);
void Fx3UsbHSUnstallEp0(void);
extern void Fx3UsbStallEp0(Fx3UsbSpeed_t s);

extern void Fx3UsbUnstallEp0(Fx3UsbSpeed_t s);

extern void Fx3UsbDmaDataOut(uint8_t ep, volatile void *buffer,
uint16_t length);
extern void Fx3UsbDmaDataIn(uint8_t ep, const volatile void *buffer,
Expand Down
23 changes: 7 additions & 16 deletions descriptors.c
Original file line number Diff line number Diff line change
Expand Up @@ -166,13 +166,16 @@ static const uint16_t * const string_descriptors[] = {
[3] = u"\x0312" "12345678",
};

const void *GetDescriptor(uint8_t descriptor_type, uint8_t descriptor_no)
const void *GetDescriptor(uint8_t descriptor_type, uint8_t descriptor_no, Fx3UsbSpeed_t s)
{
switch(descriptor_type) {
case FX3_USB_DESCRIPTOR_DEVICE:
if (descriptor_no == 0)
return &superspeed_device_descriptor;
break;
if (descriptor_no == 0){
if (s == FX3_USB_SUPER_SPEED)
return &superspeed_device_descriptor;
return &highspeed_device_descriptor;
} else
break;
case FX3_USB_DESCRIPTOR_CONFIGURATION:
if (descriptor_no == 0)
return &superspeed_configuration_descriptor;
Expand All @@ -189,15 +192,3 @@ const void *GetDescriptor(uint8_t descriptor_type, uint8_t descriptor_no)
return NULL;
}

const void *GetDescriptorHS(uint8_t descriptor_type, uint8_t descriptor_no)
{
switch(descriptor_type) {
case FX3_USB_DESCRIPTOR_DEVICE:
if (descriptor_no == 0)
//Fx3UartTxString("\nim here!\n");
return &highspeed_device_descriptor;
break;
}
//(void)(descriptor_no);
return NULL;
}
4 changes: 2 additions & 2 deletions descriptors.h
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@

extern const void *GetDescriptor(uint8_t descriptor_type, uint8_t descriptor_no);
extern const void *GetDescriptorHS(uint8_t descriptor_type, uint8_t descriptor_no);
extern const void *GetDescriptor(uint8_t descriptor_type, uint8_t descriptor_no, Fx3UsbSpeed_t s);

74 changes: 12 additions & 62 deletions main.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
static volatile uint8_t DmaBuf[32] __attribute__((aligned(32)));

static void VendorCommand(uint8_t request_type, uint8_t request, uint16_t value,
uint16_t index, uint16_t length)
uint16_t index, uint16_t length, Fx3UsbSpeed_t s)
{
switch(request) {
case CMD_START:
Expand All @@ -29,7 +29,7 @@ static void VendorCommand(uint8_t request_type, uint8_t request, uint16_t value,
if (value != 0 || index != 0 || length != sizeof(struct cmd_start_acquisition))
goto stall;
Fx3UartTxString("CMD_START\n");
Fx3UsbUnstallEp0();
Fx3UsbUnstallEp0(s);
Fx3UsbDmaDataOut(0, DmaBuf, sizeof(struct cmd_start_acquisition));
Fx3CacheInvalidateDCacheEntry(DmaBuf);
volatile struct cmd_start_acquisition *cmd = (volatile struct cmd_start_acquisition *)DmaBuf;
Expand Down Expand Up @@ -69,7 +69,7 @@ static void VendorCommand(uint8_t request_type, uint8_t request, uint16_t value,
vinfo->major = 1;
vinfo->minor = 3;
Fx3CacheCleanDCacheEntry(DmaBuf);
Fx3UsbUnstallEp0();
Fx3UsbUnstallEp0(s);
Fx3UsbDmaDataIn(0, DmaBuf, sizeof(struct version_info));
return;
case CMD_GET_REVID_VERSION:
Expand All @@ -81,16 +81,16 @@ static void VendorCommand(uint8_t request_type, uint8_t request, uint16_t value,
Fx3UartTxString("CMD_GET_REVID_VERSION\n");
DmaBuf[0] = 1;
Fx3CacheCleanDCacheEntry(DmaBuf);
Fx3UsbUnstallEp0();
Fx3UsbUnstallEp0(s);
Fx3UsbDmaDataIn(0, DmaBuf, 1);
return;
}
stall:
Fx3UsbStallEp0();
Fx3UsbStallEp0(s);
}

static void SetupData(uint8_t request_type, uint8_t request, uint16_t value,
uint16_t index, uint16_t length)
uint16_t index, uint16_t length, Fx3UsbSpeed_t s)
{
char buf[64];
snprintf(buf, sizeof(buf),
Expand All @@ -100,7 +100,7 @@ static void SetupData(uint8_t request_type, uint8_t request, uint16_t value,
Fx3UartTxString(buf);

if ((request_type & FX3_USB_REQTYPE_TYPE_MASK) == FX3_USB_REQTYPE_TYPE_VENDOR) {
VendorCommand(request_type, request, value, index, length);
VendorCommand(request_type, request, value, index, length, s);
return;
}

Expand All @@ -112,15 +112,15 @@ static void SetupData(uint8_t request_type, uint8_t request, uint16_t value,
if (request_type !=
(FX3_USB_REQTYPE_IN | FX3_USB_REQTYPE_TYPE_STD | FX3_USB_REQTYPE_TGT_DEVICE))
goto stall;
const uint8_t *descr = GetDescriptor(value>>8, value&0xff);
const uint8_t *descr = GetDescriptor(value>>8, value&0xff, s);
if (!descr) goto stall;
uint8_t descr_type = descr[1];
uint16_t len = (descr_type == FX3_USB_DESCRIPTOR_CONFIGURATION ||
descr_type == FX3_USB_DESCRIPTOR_BOS?
*(const uint16_t *)(descr+2) : *descr);
if (len < length)
length = len;
Fx3UsbUnstallEp0();
Fx3UsbUnstallEp0(s);
Fx3UsbDmaDataIn(0, descr, length);
return;

Expand All @@ -132,70 +132,20 @@ static void SetupData(uint8_t request_type, uint8_t request, uint16_t value,
goto stall;

Fx3UsbEnableInEndpoint(2, FX3_USB_EP_BULK, 1024);
Fx3UsbUnstallEp0();
Fx3UsbUnstallEp0(s);
return;
}

stall:
Fx3UsbStallEp0();
Fx3UsbStallEp0(s);
}

static void SetupDataHS(uint8_t request_type, uint8_t request, uint16_t value,
uint16_t index, uint16_t length)
{
char buf[64];
snprintf(buf, sizeof(buf),
"req: %02x %02x value: %04x index: %04x length: %04x\n",
(unsigned)request_type, (unsigned)request,
(unsigned)value, (unsigned)index, (unsigned)length);
Fx3UartTxString(buf);

if ((request_type & FX3_USB_REQTYPE_TYPE_MASK) == FX3_USB_REQTYPE_TYPE_VENDOR) {
VendorCommand(request_type, request, value, index, length);
return;
}

if ((request_type & FX3_USB_REQTYPE_TYPE_MASK) != FX3_USB_REQTYPE_TYPE_STD)
goto stall;

switch(request) {
case FX3_USB_STD_REQUEST_GET_DESCRIPTOR:
if (request_type !=
(FX3_USB_REQTYPE_IN | FX3_USB_REQTYPE_TYPE_STD | FX3_USB_REQTYPE_TGT_DEVICE))
goto stall;
const uint8_t *descr = GetDescriptorHS(value>>8, value&0xff);
if (!descr) goto stall;
uint8_t descr_type = descr[1];
uint16_t len = (descr_type == FX3_USB_DESCRIPTOR_CONFIGURATION ||
descr_type == FX3_USB_DESCRIPTOR_BOS?
*(const uint16_t *)(descr+2) : *descr);
if (len < length)
length = len;
Fx3UsbHSUnstallEp0();
Fx3UsbDmaDataIn(0, descr, length);
return;

case FX3_USB_STD_REQUEST_SET_CONFIGURATION:
if (request_type !=
(FX3_USB_REQTYPE_OUT | FX3_USB_REQTYPE_TYPE_STD | FX3_USB_REQTYPE_TGT_DEVICE))
goto stall;
if (value != 1)
goto stall;

Fx3UsbEnableInEndpoint(2, FX3_USB_EP_BULK, 1024);
Fx3UsbUnstallEp0();
return;
}

stall:
Fx3UsbStallEp0();
}

int main(void)
{
static const struct Fx3UsbCallbacks callbacks = {
.sutok = SetupData,
.sudav = SetupDataHS
.sutok = SetupData
};

Fx3CacheEnableCaches();
Expand Down

0 comments on commit c380230

Please sign in to comment.