summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/driver/usbh_device_driver.h10
-rw-r--r--src/usbh_core.c33
-rw-r--r--src/usbh_driver_ac_midi.c2
-rw-r--r--src/usbh_driver_gp_xbox.c2
-rw-r--r--src/usbh_driver_hid_mouse.c2
-rw-r--r--src/usbh_driver_hub.c25
-rw-r--r--src/usbh_lld_stm32f4.c18
7 files changed, 60 insertions, 32 deletions
diff --git a/include/driver/usbh_device_driver.h b/include/driver/usbh_device_driver.h
index 690044c..9307f77 100644
--- a/include/driver/usbh_device_driver.h
+++ b/include/driver/usbh_device_driver.h
@@ -56,6 +56,11 @@ enum USBH_POLL_STATUS {
USBH_POLL_STATUS_DEVICE_DISCONNECTED
};
+enum USBH_CONTROL_TYPE {
+ USBH_CONTROL_TYPE_SETUP,
+ USBH_CONTROL_TYPE_DATA
+};
+
/**
* @brief The _usbh_device struct
*
@@ -121,6 +126,8 @@ struct _usbh_packet {
*/
uint8_t endpoint_type;
+ enum USBH_CONTROL_TYPE control_type;
+
/// Endpoint number 0..15
uint8_t endpoint_address;
@@ -210,7 +217,8 @@ void usbh_write(usbh_device_t *dev, const usbh_packet_t *packet);
/* Helper functions used by device drivers */
void device_xfer_control_read(void *data, uint16_t datalen, usbh_packet_callback_t callback, usbh_device_t *dev);
-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);
+void device_xfer_control_write_data(void *data, uint16_t datalen, usbh_packet_callback_t callback, usbh_device_t *dev);
END_DECLS
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<<HUB_FEATURE_PORT_RESET)) {
// clear feature C_PORT_RESET
@@ -599,7 +602,7 @@ static void event(usbh_device_t *dev, usbh_packet_callback_data_t cb_data)
hub->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("");