add option to pass data to control writes
Signed-off-by: Amir Hammad <amir.hammad@hotmail.com>
This commit is contained in:
parent
0c1bd8ff76
commit
3e95b389c3
7 changed files with 61 additions and 33 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
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_MDATA;
|
||||
packet->toggle[0] = 0;
|
||||
}
|
||||
} else if(packet->endpoint_type == USBH_ENDPOINT_TYPE_INTERRUPT) {
|
||||
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 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("");
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue