#ifndef _H2GENERIC_H_
#define _H2GENERIC_H_
#include <net_buffer.h>
#include <net_device.h>
#include <OS.h>
#include <USB3.h>
#include <util/list.h>
#include <bluetooth/HCI/btHCI.h>
#include <bluetooth/HCI/btHCI_transport.h>
#include <btCoreData.h>
#include "snet_buffer.h"
#define UDCLASS_WIRELESS 0xe0
#define UDSUBCLASS_RF 0x01
#define UDPROTO_BLUETOOTH 0x01
#define BLUETOOTH_DEVICE_TRANSPORT "h2"
#define BLUETOOTH_DEVICE_NAME "generic"
#include "h2cfg.h"
#define USB_TYPE_CLASS (0x01 << 5)
#define USB_TYPE_VENDOR (0x02 << 5)
#define TOUCH(x) ((void)(x))
#define MAX_BT_GENERIC_USB_DEVICES 16
extern usb_module_info* usb;
extern bt_hci_module_info* hci;
extern struct bt_hci_module_info* btDevices;
extern struct net_buffer_module_info* nb;
extern struct bluetooth_core_data_module_info* btCoreData;
#define MAX_COMMAND_WINDOW 1
#define MAX_ACL_OUT_WINDOW 4
#define MAX_ACL_IN_WINDOW 1
#define MAX_NUM_QUEUED_PACKETS 1
#define NUM_BUFFERS 1
typedef struct bt_usb_dev bt_usb_dev;
struct bt_usb_dev {
usb_device dev;
hci_id hdev;
bluetooth_device* ndev;
char name[B_OS_NAME_LENGTH];
bool connected;
int32 open_count;
int32 num;
sem_id lock;
sem_id cmd_complete;
size_t actual_len;
status_t cmd_status;
uint8 ctrl_req;
uint8 driver_info;
uint32 state;
bt_hci_statistics stat;
const usb_endpoint_info* bulk_in_ep;
uint16 max_packet_size_bulk_in;
const usb_endpoint_info* bulk_out_ep;
uint16 max_packet_size_bulk_out;
const usb_endpoint_info* intr_in_ep;
uint16 max_packet_size_intr_in;
#ifdef BLUETOOTH_SUPPORTS_SCO
const usb_endpoint_info *iso_in_ep;
const usb_endpoint_info *iso_out_ep;
#endif
struct list eventRoom;
struct list aclRoom;
struct list nbuffersTx[BT_DRIVER_TXCOVERAGE];
uint32 nbuffersPendingTx[BT_DRIVER_TXCOVERAGE];
net_buffer* nbufferRx[BT_DRIVER_RXCOVERAGE];
snet_buffer* eventRx;
struct list snetBufferRecycleTrash;
};
bt_usb_dev* fetch_device(bt_usb_dev* dev, hci_id hid);
static inline uint32
TEST_AND_SET(uint32 *byte, uint32 bit_mask)
{
uint32 val = (*byte&bit_mask)!=0;
*byte |= bit_mask;
return val;
}
static inline uint32
TEST_AND_CLEAR(uint32* byte, uint32 bit_mask)
{
uint32 val = (*byte&bit_mask)!=0;
*byte &= ~bit_mask;
return val;
}
#endif