From eaecc60a9cd2ad0f68400ce6d1212ace8eeada27 Mon Sep 17 00:00:00 2001 From: Matthias Ringwald Date: Sun, 31 Jan 2021 21:17:05 +0100 Subject: [PATCH] stm32-f4discovery-usb: implement ACL Out --- .../port/hci_transport_h2_stm32.c | 3 ++ .../port/usbh_bluetooth.c | 42 ++++++++++++++++++- .../port/usbh_bluetooth.h | 26 +++++++++++- 3 files changed, 68 insertions(+), 3 deletions(-) diff --git a/port/stm32-f4discovery-usb/port/hci_transport_h2_stm32.c b/port/stm32-f4discovery-usb/port/hci_transport_h2_stm32.c index af85fa4c9..e472ba8a9 100644 --- a/port/stm32-f4discovery-usb/port/hci_transport_h2_stm32.c +++ b/port/stm32-f4discovery-usb/port/hci_transport_h2_stm32.c @@ -116,6 +116,9 @@ static int hci_transport_h2_stm32_send_packet(uint8_t packet_type, uint8_t * pac case HCI_COMMAND_DATA_PACKET: usbh_bluetooth_send_cmd(packet, size); return 0; + case HCI_ACL_DATA_PACKET: + usbh_bluetooth_send_acl(packet, size); + return 0; default: break; } diff --git a/port/stm32-f4discovery-usb/port/usbh_bluetooth.c b/port/stm32-f4discovery-usb/port/usbh_bluetooth.c index 2c9b94eea..a7f303fe3 100644 --- a/port/stm32-f4discovery-usb/port/usbh_bluetooth.c +++ b/port/stm32-f4discovery-usb/port/usbh_bluetooth.c @@ -60,7 +60,8 @@ static enum { USBH_OUT_OFF, USBH_OUT_IDLE, USBH_OUT_CMD, - USBH_OUT_ACL + USBH_OUT_ACL_SEND, + USBH_OUT_ACL_POLL, } usbh_out_state; static enum { @@ -80,6 +81,9 @@ static USB_Bluetooth_t usb_bluetooth; static const uint8_t * cmd_packet; static uint16_t cmd_len; +static const uint8_t * acl_packet; +static uint16_t acl_len; + // incoming static uint16_t hci_event_offset; static uint8_t hci_event[258]; @@ -162,6 +166,13 @@ USBH_StatusTypeDef USBH_Bluetooth_InterfaceInit(USBH_HandleTypeDef *phost){ hci_acl_in_offset = 0; usbh_bluetooth_start_acl_in_transfer(phost, usb); + // ACL Out + usb->acl_out_ep = interface->Ep_Desc[acl_out].bEndpointAddress; + usb->acl_out_len = interface->Ep_Desc[acl_out].wMaxPacketSize; + usb->acl_out_pipe = USBH_AllocPipe(phost, usb->acl_out_ep); + USBH_OpenPipe(phost, usb->acl_out_pipe, usb->acl_out_ep, phost->device.address, phost->device.speed, USB_EP_TYPE_BULK, usb->acl_out_len); + USBH_LL_SetToggle(phost, usb->acl_out_pipe, 0U); + return USBH_OK; } @@ -183,6 +194,7 @@ USBH_StatusTypeDef USBH_Bluetooth_ClassRequest(USBH_HandleTypeDef *phost){ USBH_StatusTypeDef USBH_Bluetooth_Process(USBH_HandleTypeDef *phost){ USBH_StatusTypeDef status; + USBH_URBStateTypeDef urb_state; USB_Bluetooth_t * usb = (USB_Bluetooth_t *) phost->pActiveClass->pData; switch (usbh_out_state){ case USBH_OUT_CMD: @@ -199,11 +211,31 @@ USBH_StatusTypeDef USBH_Bluetooth_Process(USBH_HandleTypeDef *phost){ (*usbh_packet_sent)(); } break; + case USBH_OUT_ACL_SEND: + USBH_BulkSendData(phost, (uint8_t *) acl_packet, acl_len, usb->acl_out_pipe, 0); + usbh_out_state = USBH_OUT_ACL_POLL; + break; + case USBH_OUT_ACL_POLL: + urb_state = USBH_LL_GetURBState(phost, usb->acl_out_pipe); + switch (urb_state){ + case USBH_URB_IDLE: + break; + case USBH_URB_NOTREADY: + break; + case USBH_URB_DONE: + usbh_out_state = USBH_OUT_IDLE; + // notify host stack + (*usbh_packet_sent)(); + break; + default: + log_info("URB State ACL Out: %02x", urb_state); + break; + } + break; default: break; } - USBH_URBStateTypeDef urb_state; uint8_t event_transfer_size; uint16_t event_size; switch (usbh_in_state){ @@ -297,6 +329,12 @@ void usbh_bluetooth_send_cmd(const uint8_t * packet, uint16_t len){ usbh_out_state = USBH_OUT_CMD; } +void usbh_bluetooth_send_acl(const uint8_t * packet, uint16_t len){ + btstack_assert(usbh_out_state == USBH_OUT_IDLE); + acl_packet = packet; + acl_len = len; + usbh_out_state = USBH_OUT_ACL_SEND; +} USBH_ClassTypeDef Bluetooth_Class = { "Bluetooth", diff --git a/port/stm32-f4discovery-usb/port/usbh_bluetooth.h b/port/stm32-f4discovery-usb/port/usbh_bluetooth.h index dd4b97471..5a5af560b 100644 --- a/port/stm32-f4discovery-usb/port/usbh_bluetooth.h +++ b/port/stm32-f4discovery-usb/port/usbh_bluetooth.h @@ -61,12 +61,36 @@ extern "C" { extern USBH_ClassTypeDef Bluetooth_Class; #define USBH_BLUETOOTH_CLASS &Bluetooth_Class +/** + * @brief Check stack if a packet can be sent now + * @return true if packet can be sent + */ bool usbh_bluetooth_can_send_now(void); +/** + * @brief Send HCI Command packet + * @param packet + * @param len + */ void usbh_bluetooth_send_cmd(const uint8_t * packet, uint16_t len); +/** + * @brief Send HCI ACL packet + * @param packet + * @param len + */ +void usbh_bluetooth_send_acl(const uint8_t * packet, uint16_t len); + +/** + * @brief Set packet sent callback + * @param callback + */ void usbh_bluetooth_set_packet_sent(void (*callback)(void)); +/** + * @brief Set packet handler + * @param callback + */ void usbh_bluetooth_set_packet_received(void (*callback)(uint8_t packet_type, uint8_t * packet, uint16_t size)); -#endif \ No newline at end of file +#endif