From 3e95b389c37046759cbe9df2e671240ec5666ad8 Mon Sep 17 00:00:00 2001 From: Amir Hammad Date: Sat, 30 Jul 2016 12:24:20 +0200 Subject: add option to pass data to control writes Signed-off-by: Amir Hammad --- src/usbh_core.c | 33 +++++++++++++++++++++++++++------ src/usbh_driver_ac_midi.c | 2 +- src/usbh_driver_gp_xbox.c | 2 +- src/usbh_driver_hid_mouse.c | 2 +- src/usbh_driver_hub.c | 25 ++++++++++++++----------- src/usbh_lld_stm32f4.c | 18 +++++++----------- 6 files changed, 51 insertions(+), 31 deletions(-) (limited to 'src') diff --git a/src/usbh_core.c b/src/usbh_core.c index 82f080f..c14fbe4 100644 --- a/src/usbh_core.c +++ b/src/usbh_core.c @@ -198,7 +198,7 @@ void usbh_init(const void *low_level_drivers[], const usbh_dev_driver_t * const * NEW ENUMERATE * */ -void device_xfer_control_write(void *data, uint16_t datalen, usbh_packet_callback_t callback, usbh_device_t *dev) +void device_xfer_control_write_setup(void *data, uint16_t datalen, usbh_packet_callback_t callback, usbh_device_t *dev) { usbh_packet_t packet; @@ -208,13 +208,34 @@ void device_xfer_control_write(void *data, uint16_t datalen, usbh_packet_callbac packet.endpoint_address = 0; packet.endpoint_size_max = dev->packet_size_max0; packet.endpoint_type = USBH_ENDPOINT_TYPE_CONTROL; + packet.control_type = USBH_CONTROL_TYPE_SETUP; packet.speed = dev->speed; packet.callback = callback; packet.callback_arg = dev; packet.toggle = &dev->toggle0; usbh_write(dev, &packet); - LOG_PRINTF("WR@device...%d | \n", dev->address); + LOG_PRINTF("WR-setup@device...%d \n", dev->address); +} + +void device_xfer_control_write_data(void *data, uint16_t datalen, usbh_packet_callback_t callback, usbh_device_t *dev) +{ + usbh_packet_t packet; + + packet.data = data; + packet.datalen = datalen; + packet.address = dev->address; + packet.endpoint_address = 0; + packet.endpoint_size_max = dev->packet_size_max0; + packet.endpoint_type = USBH_ENDPOINT_TYPE_CONTROL; + packet.control_type = USBH_CONTROL_TYPE_DATA; + packet.speed = dev->speed; + packet.callback = callback; + packet.callback_arg = dev; + packet.toggle = &dev->toggle0; + + usbh_write(dev, &packet); + LOG_PRINTF("WR-data@device...%d \n", dev->address); } void device_xfer_control_read(void *data, uint16_t datalen, usbh_packet_callback_t callback, usbh_device_t *dev) @@ -323,7 +344,7 @@ static void device_enumerate(usbh_device_t *dev, usbh_packet_callback_data_t cb_ setup_data.wLength = USB_DT_DEVICE_SIZE; dev->state++; - device_xfer_control_write(&setup_data, sizeof(setup_data), + device_xfer_control_write_setup(&setup_data, sizeof(setup_data), device_enumerate, dev); break; @@ -380,7 +401,7 @@ static void device_enumerate(usbh_device_t *dev, usbh_packet_callback_data_t cb_ setup_data.wLength = ddt->bMaxPacketSize0;//USB_DT_CONFIGURATION_SIZE; dev->state++; - device_xfer_control_write(&setup_data, sizeof(setup_data), + device_xfer_control_write_setup(&setup_data, sizeof(setup_data), device_enumerate, dev); } break; @@ -443,7 +464,7 @@ static void device_enumerate(usbh_device_t *dev, usbh_packet_callback_data_t cb_ setup_data.wLength = cdt->wTotalLength; dev->state++; - device_xfer_control_write(&setup_data, sizeof(setup_data), + device_xfer_control_write_setup(&setup_data, sizeof(setup_data), device_enumerate, dev); } break; @@ -558,7 +579,7 @@ void device_enumeration_start(usbh_device_t *dev) setup_data.wIndex = 0; setup_data.wLength = 0; - device_xfer_control_write(&setup_data, sizeof(setup_data), + device_xfer_control_write_setup(&setup_data, sizeof(setup_data), device_enumerate, dev); } diff --git a/src/usbh_driver_ac_midi.c b/src/usbh_driver_ac_midi.c index c5403d2..413875f 100644 --- a/src/usbh_driver_ac_midi.c +++ b/src/usbh_driver_ac_midi.c @@ -308,7 +308,7 @@ static void midi_poll(void *drvdata, uint32_t t_us) midi->state++; - device_xfer_control_write(&setup_data, sizeof(setup_data), event, dev); + device_xfer_control_write_setup(&setup_data, sizeof(setup_data), event, dev); } break; } diff --git a/src/usbh_driver_gp_xbox.c b/src/usbh_driver_gp_xbox.c index d8bb1b2..ddd62de 100644 --- a/src/usbh_driver_gp_xbox.c +++ b/src/usbh_driver_gp_xbox.c @@ -372,7 +372,7 @@ static void poll(void *drvdata, uint32_t time_curr_us) gp_xbox->state_next = STATE_SET_CONFIGURATION_EMPTY_READ; - device_xfer_control_write(&setup_data, sizeof(setup_data), event, dev); + device_xfer_control_write_setup(&setup_data, sizeof(setup_data), event, dev); } break; diff --git a/src/usbh_driver_hid_mouse.c b/src/usbh_driver_hid_mouse.c index 62ba481..94f232d 100644 --- a/src/usbh_driver_hid_mouse.c +++ b/src/usbh_driver_hid_mouse.c @@ -261,7 +261,7 @@ static void poll(void *drvdata, uint32_t time_curr_us) mouse->state_next = STATE_SET_CONFIGURATION_EMPTY_READ; - device_xfer_control_write(&setup_data, sizeof(setup_data), event, dev); + device_xfer_control_write_setup(&setup_data, sizeof(setup_data), event, dev); } break; diff --git a/src/usbh_driver_hub.c b/src/usbh_driver_hub.c index 9f061b5..a26d7d0 100644 --- a/src/usbh_driver_hub.c +++ b/src/usbh_driver_hub.c @@ -204,7 +204,7 @@ static void event(usbh_device_t *dev, usbh_packet_callback_data_t cb_data) hub->current_port = port; LOG_PRINTF("\n\nPORT FOUND: %d\n", port); - device_xfer_control_write(&setup_data, sizeof(setup_data), event, dev); + device_xfer_control_write_setup(&setup_data, sizeof(setup_data), event, dev); } break; @@ -265,7 +265,7 @@ static void event(usbh_device_t *dev, usbh_packet_callback_data_t cb_data) setup_data.wLength = hub->desc_len; hub->state++; - device_xfer_control_write(&setup_data, sizeof(setup_data), event, dev); + device_xfer_control_write_setup(&setup_data, sizeof(setup_data), event, dev); LOG_PRINTF("DO Need to get HUB DESC\n"); } break; @@ -316,7 +316,7 @@ static void event(usbh_device_t *dev, usbh_packet_callback_data_t cb_data) setup_data.wLength = hub->desc_len; hub->state = 4; - device_xfer_control_write(&setup_data, sizeof(setup_data), event, dev); + device_xfer_control_write_setup(&setup_data, sizeof(setup_data), event, dev); break; } else if (hub_descriptor->head.bDescLength == hub->desc_len) { hub->ports_num = hub_descriptor->head.bNbrPorts; @@ -382,7 +382,7 @@ static void event(usbh_device_t *dev, usbh_packet_callback_data_t cb_data) hub->state_after_empty_read = hub->state; hub->state = EMPTY_PACKET_READ_STATE; - device_xfer_control_write(&setup_data, sizeof(setup_data), event, dev); + device_xfer_control_write_setup(&setup_data, sizeof(setup_data), event, dev); } else { hub->state++; // TODO: @@ -419,7 +419,7 @@ static void event(usbh_device_t *dev, usbh_packet_callback_data_t cb_data) setup_data.wLength = 4; hub->state++; - device_xfer_control_write(&setup_data, sizeof(setup_data), event, dev); + device_xfer_control_write_setup(&setup_data, sizeof(setup_data), event, dev); } break; @@ -449,6 +449,7 @@ static void event(usbh_device_t *dev, usbh_packet_callback_data_t cb_data) } } break; + case 9: { switch (cb_data.status) { @@ -464,7 +465,7 @@ static void event(usbh_device_t *dev, usbh_packet_callback_data_t cb_data) hub->state++; - device_xfer_control_write(&setup_data, sizeof(setup_data), event, dev); + device_xfer_control_write_setup(&setup_data, sizeof(setup_data), event, dev); } break; @@ -476,6 +477,7 @@ static void event(usbh_device_t *dev, usbh_packet_callback_data_t cb_data) } } break; + case 10: { switch (cb_data.status) { @@ -492,6 +494,7 @@ static void event(usbh_device_t *dev, usbh_packet_callback_data_t cb_data) } } break; + case 11: { switch (cb_data.status) { @@ -582,7 +585,7 @@ static void event(usbh_device_t *dev, usbh_packet_callback_data_t cb_data) hub->state_after_empty_read = 33; hub->state = EMPTY_PACKET_READ_STATE; - device_xfer_control_write(&setup_data, sizeof(setup_data), event, dev); + device_xfer_control_write_setup(&setup_data, sizeof(setup_data), event, dev); } else if(stc & (1<state = EMPTY_PACKET_READ_STATE; LOG_PRINTF("RESET"); - device_xfer_control_write(&setup_data, sizeof(setup_data), event, dev); + device_xfer_control_write_setup(&setup_data, sizeof(setup_data), event, dev); } else { LOG_PRINTF("another STC %d\n", stc); } @@ -643,7 +646,7 @@ static void event(usbh_device_t *dev, usbh_packet_callback_data_t cb_data) LOG_PRINTF("CONN"); hub->busy = 1; - device_xfer_control_write(&setup_data, sizeof(setup_data), event, dev); + device_xfer_control_write_setup(&setup_data, sizeof(setup_data), event, dev); } } else { LOG_PRINTF("\t\t\t\tDISCONNECT EVENT\n"); @@ -707,7 +710,7 @@ static void event(usbh_device_t *dev, usbh_packet_callback_data_t cb_data) hub->state = EMPTY_PACKET_READ_STATE; hub->current_port = CURRENT_PORT_NONE; - device_xfer_control_write(&setup_data, sizeof(setup_data), event, dev); + device_xfer_control_write_setup(&setup_data, sizeof(setup_data), event, dev); } else if (!(sts & (1<<(HUB_FEATURE_PORT_LOWSPEED))) && !(sts & (1<<(HUB_FEATURE_PORT_HIGHSPEED)))) { hub->device[port]->speed = USBH_SPEED_FULL; @@ -799,7 +802,7 @@ static void poll(void *drvdata, uint32_t time_curr_us) hub->state = EMPTY_PACKET_READ_STATE; hub->state_after_empty_read = 3; - device_xfer_control_write(&setup_data, sizeof(setup_data), event, dev); + device_xfer_control_write_setup(&setup_data, sizeof(setup_data), event, dev); } break; diff --git a/src/usbh_lld_stm32f4.c b/src/usbh_lld_stm32f4.c index 0b12888..6f1d4aa 100644 --- a/src/usbh_lld_stm32f4.c +++ b/src/usbh_lld_stm32f4.c @@ -261,20 +261,16 @@ static void write(void *drvdata, const usbh_packet_t *packet) uint32_t dpid; if (packet->endpoint_type == USBH_ENDPOINT_TYPE_CONTROL) { - dpid = OTG_HCTSIZ_DPID_MDATA; - packet->toggle[0] = 0; - } else if(packet->endpoint_type == USBH_ENDPOINT_TYPE_INTERRUPT) { - if (packet->toggle[0]) { - dpid = OTG_HCTSIZ_DPID_DATA1; + if (packet->control_type == USBH_CONTROL_TYPE_DATA) { + dpid = packet->toggle[0] ? OTG_HCTSIZ_DPID_DATA1 : OTG_HCTSIZ_DPID_DATA0; } else { - dpid = OTG_HCTSIZ_DPID_DATA0; + dpid = OTG_HCTSIZ_DPID_MDATA; + packet->toggle[0] = 0; } + } else if(packet->endpoint_type == USBH_ENDPOINT_TYPE_INTERRUPT) { + dpid = packet->toggle[0] ? OTG_HCTSIZ_DPID_DATA1 : OTG_HCTSIZ_DPID_DATA0; } else if (packet->endpoint_type == USBH_ENDPOINT_TYPE_BULK) { - if (packet->toggle[0]) { - dpid = OTG_HCTSIZ_DPID_DATA1; - } else { - dpid = OTG_HCTSIZ_DPID_DATA0; - } + dpid = packet->toggle[0] ? OTG_HCTSIZ_DPID_DATA1 : OTG_HCTSIZ_DPID_DATA0; } else { dpid = OTG_HCTSIZ_DPID_DATA0; // ! TODO: BUG ERROR(""); -- cgit