From 4aa69b4eaf44757aa71997e4a59f0889ea6e23f4 Mon Sep 17 00:00:00 2001 From: Amir Hammad Date: Thu, 1 Sep 2016 14:16:17 +0200 Subject: make usbh_packet->data of union type out: const void * in: void * Signed-off-by: Amir Hammad --- src/usbh_lld_stm32f4.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src/usbh_lld_stm32f4.c') diff --git a/src/usbh_lld_stm32f4.c b/src/usbh_lld_stm32f4.c index 9e81c09..08000a2 100644 --- a/src/usbh_lld_stm32f4.c +++ b/src/usbh_lld_stm32f4.c @@ -295,7 +295,7 @@ static void write(void *drvdata, const usbh_packet_t *packet) packet->endpoint_type == USBH_ENDPOINT_TYPE_BULK) { volatile uint32_t *fifo = &REBASE_CH(OTG_FIFO, channel) + RX_FIFO_SIZE; - const uint32_t * buf32 = packet->data; + const uint32_t * buf32 = packet->data.out; int i; LOG_PRINTF("\nSending[%d]: ", packet->datalen); for(i = packet->datalen; i >= 4; i-=4) { @@ -317,7 +317,7 @@ static void write(void *drvdata, const usbh_packet_t *packet) } else { volatile uint32_t *fifo = &REBASE_CH(OTG_FIFO, channel) + RX_FIFO_SIZE + TX_NP_FIFO_SIZE; - const uint32_t * buf32 = packet->data; + const uint32_t * buf32 = packet->data.out; int i; for(i = packet->datalen; i > 0; i-=4) { *fifo++ = *buf32++; @@ -334,7 +334,7 @@ static void rxflvl_handle(void *drvdata) uint8_t channel = rxstsp&0xf; uint32_t len = (rxstsp>>4) & 0x1ff; if ((rxstsp&OTG_GRXSTSP_PKTSTS_MASK) == OTG_GRXSTSP_PKTSTS_IN) { - uint8_t *data = channels[channel].packet.data; + uint8_t *data = channels[channel].packet.data.in; uint32_t *buf32 = (uint32_t *)&data[channels[channel].data_index]; int32_t i; @@ -366,7 +366,7 @@ static void rxflvl_handle(void *drvdata) uint32_t i; LOG_PRINTF("\nDATA: "); for (i = 0; i < channels[channel].data_index; i++) { - uint8_t *data = channels[channel].packet.data; + uint8_t *data = channels[channel].packet.data.in; LOG_PRINTF("%02X ", data[i]); } #endif -- cgit From 63446f99fc03cd21f744f75228175d99c5ef672b Mon Sep 17 00:00:00 2001 From: Amir Hammad Date: Wed, 7 Sep 2016 08:56:51 +0200 Subject: lld: don't enable channel on write nack, return EAGAIN instead Signed-off-by: Amir Hammad --- src/usbh_lld_stm32f4.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) (limited to 'src/usbh_lld_stm32f4.c') diff --git a/src/usbh_lld_stm32f4.c b/src/usbh_lld_stm32f4.c index 08000a2..aff12c5 100644 --- a/src/usbh_lld_stm32f4.c +++ b/src/usbh_lld_stm32f4.c @@ -504,9 +504,17 @@ static enum USBH_POLL_STATUS poll_run(usbh_lld_stm32f4_driver_data_t *dev) if (hcint & OTG_HCINT_NAK) { REBASE_CH(OTG_HCINT, channel) = OTG_HCINT_NAK; - LOG_PRINTF("NAK"); + LOG_PRINTF("NAK\n"); - REBASE_CH(OTG_HCCHAR, channel) |= OTG_HCCHAR_CHENA; + free_channel(dev, channel); + + usbh_packet_callback_data_t cb_data; + cb_data.status = USBH_PACKET_CALLBACK_STATUS_EAGAIN; + cb_data.transferred_length = channels[channel].data_index; + + channels[channel].packet.callback( + channels[channel].packet.callback_arg, + cb_data); } @@ -540,6 +548,8 @@ static enum USBH_POLL_STATUS poll_run(usbh_lld_stm32f4_driver_data_t *dev) REBASE_CH(OTG_HCINT, channel) = OTG_HCINT_FRMOR; LOG_PRINTF("FRMOR"); + free_channel(dev, channel); + usbh_packet_callback_data_t cb_data; cb_data.status = USBH_PACKET_CALLBACK_STATUS_EFATAL; cb_data.transferred_length = 0; @@ -547,7 +557,6 @@ static enum USBH_POLL_STATUS poll_run(usbh_lld_stm32f4_driver_data_t *dev) channels[channel].packet.callback( channels[channel].packet.callback_arg, cb_data); - free_channel(dev, channel); } if (hcint & OTG_HCINT_TXERR) { -- cgit From 8946cb522b10465d3fe3a9846158dbff4e924240 Mon Sep 17 00:00:00 2001 From: Amir Hammad Date: Fri, 9 Sep 2016 18:33:26 +0200 Subject: lld: rework low level driver initialization Signed-off-by: Amir Hammad --- src/usbh_lld_stm32f4.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src/usbh_lld_stm32f4.c') diff --git a/src/usbh_lld_stm32f4.c b/src/usbh_lld_stm32f4.c index aff12c5..5ac26e1 100644 --- a/src/usbh_lld_stm32f4.c +++ b/src/usbh_lld_stm32f4.c @@ -1022,7 +1022,7 @@ static usbh_lld_stm32f4_driver_data_t driver_data_fs = { .channels = channels_fs, .num_channels = NUM_CHANNELS_FS }; -static const usbh_low_level_driver_t driver_fs = { +const usbh_low_level_driver_t usbh_lld_stm32f4_driver_fs = { .init = init, .poll = poll, .read = read, @@ -1030,7 +1030,6 @@ static const usbh_low_level_driver_t driver_fs = { .root_speed = root_speed, .driver_data = &driver_data_fs }; -const void *usbh_lld_stm32f4_driver_fs = &driver_fs; #endif // USB High Speed - OTG_HS @@ -1042,7 +1041,8 @@ static usbh_lld_stm32f4_driver_data_t driver_data_hs = { .channels = channels_hs, .num_channels = NUM_CHANNELS_HS }; -static const usbh_low_level_driver_t driver_hs = { + +const usbh_low_level_driver_t usbh_lld_stm32f4_driver_hs = { .init = init, .poll = poll, .read = read, @@ -1050,5 +1050,5 @@ static const usbh_low_level_driver_t driver_hs = { .root_speed = root_speed, .driver_data = &driver_data_hs }; -const void *usbh_lld_stm32f4_driver_hs = &driver_hs; + #endif -- cgit From d7f23c7a8fab589ef35690e4cdaab7ce3ef72b74 Mon Sep 17 00:00:00 2001 From: Amir Hammad Date: Sun, 11 Sep 2016 09:33:34 +0200 Subject: lld: simplify stm32f4_usbh_port_channel_setup Signed-off-by: Amir Hammad --- src/usbh_lld_stm32f4.c | 59 ++++++++++++++++++++------------------------------ 1 file changed, 23 insertions(+), 36 deletions(-) (limited to 'src/usbh_lld_stm32f4.c') diff --git a/src/usbh_lld_stm32f4.c b/src/usbh_lld_stm32f4.c index 5ac26e1..38b46e7 100644 --- a/src/usbh_lld_stm32f4.c +++ b/src/usbh_lld_stm32f4.c @@ -143,34 +143,31 @@ static void init(void *drvdata) REBASE(OTG_GUSBCFG) |= OTG_GUSBCFG_PHYSEL; } -static void stm32f4_usbh_port_channel_setup( - void *drvdata, uint32_t channel, uint32_t address, - uint32_t eptyp, uint32_t epnum, uint32_t epdir, - uint32_t max_packet_size) +static uint32_t usbh_to_stm32_endpoint_type(enum USBH_ENDPOINT_TYPE usbh_eptyp) { - usbh_lld_stm32f4_driver_data_t *dev = drvdata; - channel_t *channels = dev->channels; - - // TODO: maybe to function - switch (eptyp) { - case USBH_ENDPOINT_TYPE_CONTROL: - eptyp = OTG_HCCHAR_EPTYP_CONTROL; - break; - case USBH_ENDPOINT_TYPE_BULK: - eptyp = OTG_HCCHAR_EPTYP_BULK; - break; - case USBH_ENDPOINT_TYPE_INTERRUPT: - // Use bulk transfer also for interrupt, since no difference is on protocol layer - // Except different behaviour of the core - eptyp = OTG_HCCHAR_EPTYP_BULK; - break; - case USBH_ENDPOINT_TYPE_ISOCHRONOUS: - eptyp = OTG_HCCHAR_EPTYP_ISOCHRONOUS; - break; + switch (usbh_eptyp) { + case USBH_ENDPOINT_TYPE_CONTROL: return OTG_HCCHAR_EPTYP_CONTROL; + case USBH_ENDPOINT_TYPE_BULK: return OTG_HCCHAR_EPTYP_BULK; + + // Use bulk transfer also for interrupt, since no difference is on protocol layer + // Except different behaviour of the core + case USBH_ENDPOINT_TYPE_INTERRUPT: return OTG_HCCHAR_EPTYP_BULK; + case USBH_ENDPOINT_TYPE_ISOCHRONOUS: return OTG_HCCHAR_EPTYP_ISOCHRONOUS; default: LOG_PRINTF("\n\n\n\nWRONG EP TYPE\n\n\n\n\n"); - return; + return OTG_HCCHAR_EPTYP_CONTROL; } +} + +static void stm32f4_usbh_port_channel_setup( + void *drvdata, uint32_t channel, uint32_t epdir) +{ + usbh_lld_stm32f4_driver_data_t *dev = drvdata; + channel_t *channels = dev->channels; + uint32_t max_packet_size = channels[channel].packet.endpoint_size_max; + uint32_t address = channels[channel].packet.address; + uint32_t epnum = channels[channel].packet.endpoint_address; + uint32_t eptyp = usbh_to_stm32_endpoint_type(channels[channel].packet.endpoint_type); uint32_t speed = 0; if (channels[channel].packet.speed == USBH_SPEED_LOW) { @@ -227,12 +224,7 @@ static void read(void *drvdata, usbh_packet_t *packet) REBASE_CH(OTG_HCTSIZ, channel) = dpid | (num_packets << 19) | packet->datalen; - stm32f4_usbh_port_channel_setup(dev, channel, - packet->address, - packet->endpoint_type, - packet->endpoint_address, - OTG_HCCHAR_EPDIR_IN, - packet->endpoint_size_max); + stm32f4_usbh_port_channel_setup(dev, channel, OTG_HCCHAR_EPDIR_IN); } /** @@ -284,12 +276,7 @@ static void write(void *drvdata, const usbh_packet_t *packet) } REBASE_CH(OTG_HCTSIZ, channel) = dpid | (num_packets << 19) | packet->datalen; - stm32f4_usbh_port_channel_setup(dev, channel, - packet->address, - packet->endpoint_type, - packet->endpoint_address, - OTG_HCCHAR_EPDIR_OUT, - packet->endpoint_size_max); + stm32f4_usbh_port_channel_setup(dev, channel, OTG_HCCHAR_EPDIR_OUT); if (packet->endpoint_type == USBH_ENDPOINT_TYPE_CONTROL || packet->endpoint_type == USBH_ENDPOINT_TYPE_BULK) { -- cgit From b055665fb0f978960797cd66fcc93ab7638e3695 Mon Sep 17 00:00:00 2001 From: Amir Hammad Date: Sun, 11 Sep 2016 09:39:08 +0200 Subject: lld: remove not used error_count field in channel struct Signed-off-by: Amir Hammad --- src/usbh_lld_stm32f4.c | 2 -- 1 file changed, 2 deletions(-) (limited to 'src/usbh_lld_stm32f4.c') diff --git a/src/usbh_lld_stm32f4.c b/src/usbh_lld_stm32f4.c index 38b46e7..26ad6bd 100644 --- a/src/usbh_lld_stm32f4.c +++ b/src/usbh_lld_stm32f4.c @@ -47,7 +47,6 @@ struct _channel { enum CHANNEL_STATE state; usbh_packet_t packet; uint32_t data_index; //used in receive function - uint8_t error_count; }; typedef struct _channel channel_t; @@ -918,7 +917,6 @@ static int8_t get_free_channel(void *drvdata) OTG_HCINTMSK_CHHM | OTG_HCINTMSK_STALLM | OTG_HCINTMSK_FRMORM; REBASE(OTG_HAINTMSK) |= (1 << i); - dev->channels[i].error_count = 0; return i; } } -- cgit From b7167bf2aff1a7c9cf223dc2a1d2e401f599d5d8 Mon Sep 17 00:00:00 2001 From: Amir Hammad Date: Sun, 11 Sep 2016 12:12:41 +0200 Subject: lld: add mask with epdir Signed-off-by: Amir Hammad --- src/usbh_lld_stm32f4.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/usbh_lld_stm32f4.c') diff --git a/src/usbh_lld_stm32f4.c b/src/usbh_lld_stm32f4.c index 26ad6bd..0654d28 100644 --- a/src/usbh_lld_stm32f4.c +++ b/src/usbh_lld_stm32f4.c @@ -178,7 +178,7 @@ static void stm32f4_usbh_port_channel_setup( OTG_HCCHAR_MCNT_1 | (OTG_HCCHAR_EPTYP_MASK & (eptyp)) | (speed) | - (epdir) | + (OTG_HCCHAR_EPDIR_MASK & epdir) | (OTG_HCCHAR_EPNUM_MASK & (epnum << 11)) | (OTG_HCCHAR_MPSIZ_MASK & max_packet_size); -- cgit