stm32-f4discovery-usb: implement ACL Out

This commit is contained in:
Matthias Ringwald 2021-01-31 21:17:05 +01:00
parent 8b703f3d8c
commit eaecc60a9c
3 changed files with 68 additions and 3 deletions

View File

@ -116,6 +116,9 @@ static int hci_transport_h2_stm32_send_packet(uint8_t packet_type, uint8_t * pac
case HCI_COMMAND_DATA_PACKET: case HCI_COMMAND_DATA_PACKET:
usbh_bluetooth_send_cmd(packet, size); usbh_bluetooth_send_cmd(packet, size);
return 0; return 0;
case HCI_ACL_DATA_PACKET:
usbh_bluetooth_send_acl(packet, size);
return 0;
default: default:
break; break;
} }

View File

@ -60,7 +60,8 @@ static enum {
USBH_OUT_OFF, USBH_OUT_OFF,
USBH_OUT_IDLE, USBH_OUT_IDLE,
USBH_OUT_CMD, USBH_OUT_CMD,
USBH_OUT_ACL USBH_OUT_ACL_SEND,
USBH_OUT_ACL_POLL,
} usbh_out_state; } usbh_out_state;
static enum { static enum {
@ -80,6 +81,9 @@ static USB_Bluetooth_t usb_bluetooth;
static const uint8_t * cmd_packet; static const uint8_t * cmd_packet;
static uint16_t cmd_len; static uint16_t cmd_len;
static const uint8_t * acl_packet;
static uint16_t acl_len;
// incoming // incoming
static uint16_t hci_event_offset; static uint16_t hci_event_offset;
static uint8_t hci_event[258]; static uint8_t hci_event[258];
@ -162,6 +166,13 @@ USBH_StatusTypeDef USBH_Bluetooth_InterfaceInit(USBH_HandleTypeDef *phost){
hci_acl_in_offset = 0; hci_acl_in_offset = 0;
usbh_bluetooth_start_acl_in_transfer(phost, usb); 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; 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 USBH_Bluetooth_Process(USBH_HandleTypeDef *phost){
USBH_StatusTypeDef status; USBH_StatusTypeDef status;
USBH_URBStateTypeDef urb_state;
USB_Bluetooth_t * usb = (USB_Bluetooth_t *) phost->pActiveClass->pData; USB_Bluetooth_t * usb = (USB_Bluetooth_t *) phost->pActiveClass->pData;
switch (usbh_out_state){ switch (usbh_out_state){
case USBH_OUT_CMD: case USBH_OUT_CMD:
@ -199,11 +211,31 @@ USBH_StatusTypeDef USBH_Bluetooth_Process(USBH_HandleTypeDef *phost){
(*usbh_packet_sent)(); (*usbh_packet_sent)();
} }
break; 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: default:
break; break;
} }
USBH_URBStateTypeDef urb_state;
uint8_t event_transfer_size; uint8_t event_transfer_size;
uint16_t event_size; uint16_t event_size;
switch (usbh_in_state){ 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; 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 = { USBH_ClassTypeDef Bluetooth_Class = {
"Bluetooth", "Bluetooth",

View File

@ -61,12 +61,36 @@ extern "C" {
extern USBH_ClassTypeDef Bluetooth_Class; extern USBH_ClassTypeDef Bluetooth_Class;
#define USBH_BLUETOOTH_CLASS &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); 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); 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)); 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)); void usbh_bluetooth_set_packet_received(void (*callback)(uint8_t packet_type, uint8_t * packet, uint16_t size));
#endif #endif