一、首先要作Bluez协议栈的移植,这样在开发板上才能够用hciconfig, hcitool等命令。关于bluez协议栈的移植步骤网上不少。网络
二、该驱动是USB蓝牙设备驱动,分析根据蓝牙驱动的写的顺序进行。由于只是要作数据的传输,因此讲用于语音的等时传输部分去掉了。tcp
首先,定义一个结构体函数
struct bcm_data ={
struct usb_endpoint_descriptor *intr_ep;
struct usb_endpoint_descriptor *bulk_tx_ep; //批量传输的收端点
struct usb_endpoint_descriptor *bulk_rx_ep; //批量传输的收端点
struct usb_anchor tx_anchor; //用于阻塞操做
struct usb_anchor intr_anchor;
struct usb_anchor bulk_anchor;
struct usb_device *udev;
struct usb_interface *intf;
unsigned long flags;
__u8 cmdreq_type;
}ui
接下来是入口函数和出口函数指针
static int __init bcm_driver_init(void)
{
usb_register(&bcm_driver);
return 0;
}
static void __exit bcm_driver_exit(void)
{
usb_deregister(&bcm_driver);
}
module_init(bcm_driver_init);
module_exit(bcm_driver_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("WillwWu")接口
入口函数和出口函数是对该USB设备进行注册和注销的操做。事件
而后是定义struct usb_driver,并对其成员进行填充。ip
static struct usb_driver bcm_driver={
.name = "BCMT",
.probe = bcm_probe, //探测函数
.disconnect = bcm_disconnect,
.id_table = bcm_table, //所支持的USB设备表
.supports_autosuspend = 1, //支持自动挂起,如果设置为0则不支持
.disable_hub_initiated_lpm = 1, //容许低功率态的传输
};ci
支持的USB设备表开发
static usb_device_id bcm_table[]={
{ USB_DEVICE(0x0a5c, 0x2148)},
{},
}
MODULE_DEVICE_TABLE(usb, bcm_table);
MODULE_DEVICE_TABLE用于输出到用户空间,以便于知道支持什么设备,第一个参数是所支持的类型,此处为USB。
下面来看看探测函数
static int bcm_probe (struct usb_interface *intf ,const struct usb_device_id * id)
{
struct usb_endpoint_descriptor *ep_desc;
struct hci_dev *hdev;
struct bcm_data *data;
int i,err;
if(intf->cur_altsetting->desc.bInterfaceNumber !=0) //该接口的编号,端点0保留
return -ENODEV;
data=kzalloc( sizeof(*data) , GFP_KERNEL)
if(!data)
return -ENOMEM;
for(i=0;icur_altsetting->desc.bNumEndpoints;i++){ //对端点描述符进行分配
ep_desc = &intf->cur_altsetting->endpoint[i].desc;
if(!data->intr_ep && usb_endpoint_is_int_in(ep_desc)){
data->intr_ep=ep_desc;
}
if(!data->bulk_tx_ep && usb_endpoint_is_bulk_out(ep_desc)){
data->bulk_tx_ep=ep_desc;</