mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-02-25 06:40:10 +00:00
stm32-f4discovery-usb: implement ACL Out
This commit is contained in:
parent
8b703f3d8c
commit
eaecc60a9c
@ -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;
|
||||
}
|
||||
|
@ -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",
|
||||
|
@ -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
|
||||
#endif
|
||||
|
Loading…
x
Reference in New Issue
Block a user