mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-02-25 15:41:00 +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:
|
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;
|
||||||
}
|
}
|
||||||
|
@ -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",
|
||||||
|
@ -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
|
Loading…
x
Reference in New Issue
Block a user