轉(zhuǎn)載時(shí)請(qǐng)注明出處和作者聯(lián)系方式
作者聯(lián)系方式:李先靜 <xianjimli at hotmail dot com>
昨天看了一下介紹藍(lán)牙協(xié)議文檔,今天索性對(duì)照看了看kernel里的代碼(bluez),這里記點(diǎn)筆記,還是繼承了老毛病,只關(guān)注整體流程而忽略細(xì)節(jié),先了解個(gè)大概,等真正需要時(shí)再仔細(xì)分析。
net/hci_core.c
HCI在主機(jī)端的驅(qū)動(dòng)主要是為上層提供一個(gè)統(tǒng)一的接口,讓上層協(xié)議不依賴于具體硬件的實(shí)現(xiàn)。HCI在硬件中的固件與HCI在主機(jī)端的驅(qū)動(dòng)通信方式有多種,比如像UART、USB和PC Card等等。hci_core.c相當(dāng)于一個(gè)框架,用于把各種具體通信方式膠合起來,并提供一些公共函數(shù)的實(shí)現(xiàn)。
hci_cmd_task 是負(fù)責(zé)發(fā)送CMD的任務(wù),它從hdev->cmd_q隊(duì)列中取CMD,然后調(diào)用hci_send_frame把CMD發(fā)送出去,hci_send_frame又會(huì)調(diào)用實(shí)際的HCI驅(qū)動(dòng)的send函數(shù)發(fā)送數(shù)據(jù)。
hci_rx_task 是負(fù)責(zé)接收數(shù)據(jù)的任務(wù),它從hdev->rx_q隊(duì)列中取數(shù)據(jù),然后根據(jù)數(shù)據(jù)的類型調(diào)用上層函數(shù)處理。數(shù)據(jù)包有三種類型:
- HCI_EVENT_PKT: 用于處理一些通信事件,比如連接建立,連接斷開,認(rèn)證和加密等事件,這些事件控制協(xié)議狀態(tài)的改變。
- HCI_ACLDATA_PKT: 異步非連接的數(shù)據(jù)包,通過hci_acldata_packet提交給上層的L2CAP協(xié)議處理(hci_proto[HCI_PROTO_L2CAP])。
- HCI_SCODATA_PKT: 同步面向連接的數(shù)據(jù)包,通過hci_scodata_packet提供給上層的SCO協(xié)議處理(hci_proto[HCI_PROTO_SCO])。
hci_tx_task 是負(fù)責(zé)發(fā)送數(shù)據(jù)的任務(wù),發(fā)送所有connection中的ACL和SCO數(shù)據(jù),以及hdev->raw_q中的數(shù)據(jù)包。
HCI為上層提供的接口主要有:
- hci_send_sco:發(fā)送SCO數(shù)據(jù)包,把要發(fā)送的數(shù)據(jù)包放入connection的發(fā)送隊(duì)列中,然后調(diào)度發(fā)送任務(wù)去發(fā)送。
- hci_send_acl:發(fā)送ACL數(shù)據(jù)包,把要發(fā)送的數(shù)據(jù)包放入connection的發(fā)送隊(duì)列中,然后調(diào)度發(fā)送任務(wù)去發(fā)送。
- hci_send_cmd:發(fā)送命令數(shù)據(jù),把要發(fā)送的數(shù)據(jù)包放入hdev->cmd_q隊(duì)列中,然后調(diào)度命令發(fā)送任務(wù)去發(fā)送。
- hci_register_proto/hci_unregister_proto:注冊(cè)/注銷上層協(xié)議,HCI會(huì)把接收到的數(shù)據(jù)轉(zhuǎn)發(fā)給這些上層協(xié)議。
- hci_register_dev/hci_unregister_dev: 注冊(cè)/注銷設(shè)備,HCI會(huì)把要發(fā)送的數(shù)據(jù)通過這些設(shè)備發(fā)送出去。
- 其它一些公共函數(shù)。
net/hci_conn.c
提供了一些連接管理,論證和加密的函數(shù)。
net/hci_event.c
事件處理函數(shù),負(fù)責(zé)狀態(tài)機(jī)的維護(hù),這些事件通常會(huì)使連接從一個(gè)狀態(tài)轉(zhuǎn)換另一個(gè)狀態(tài)。
- hci_si_event:用于發(fā)送事件。
- hci_event_packet:用于處理底層上報(bào)的事件,從hci_rx_task處調(diào)用過來。
net/hci_sock.c
給上層提供一個(gè)socket接口,應(yīng)用程序可以通過socket的方式來訪問HCI。
- hci_sock_init:中注冊(cè)了BTPROTO_HCI類型family。
- hci_sock_create:創(chuàng)建sock的函數(shù),它的sock的ops指向hci_sock_ops。
- hci_sock_setsockopt/hci_sock_getsockopt:設(shè)置/獲取sock的一些選項(xiàng)。
- hci_sock_sendmsg:發(fā)送消息,根據(jù)消息的類型把消息放到適當(dāng)?shù)年?duì)列中。
- hci_sock_recvmsg:接收消息,從接收隊(duì)列中取消息。
- hci_sock_recvmsg:ioctl函數(shù)。
net/hci_sysfs.c
提供一些sysfs文件系統(tǒng)接口。
net/l2cap.c
L2CAP是HCI之上的協(xié)議,提供諸如QoS,分組,多路復(fù)用,分段和組裝之類的功能。
通過bt_sock_register為上層提供一個(gè)sock接口:
- l2cap_sock_create:創(chuàng)建sock的函數(shù),它的sock的ops指向l2cap_sock_ops。
- l2cap_sock_setsockopt/l2cap_sock_getsockopt設(shè)置/獲取sock的一些選項(xiàng)。
- l2cap_sock_sendmsg:發(fā)送消息,通過HCI提供hci_send_acl函數(shù)把消息傳遞給下層的設(shè)備。
- bt_sock_recvmsg:接收消息,從接收隊(duì)列中取消息。
通過hci_register_proto向其下的HCI注冊(cè)協(xié)議:
- l2cap_connect_ind:處理連接請(qǐng)求。
- l2cap_connect_cfm:確認(rèn)連接。
- l2cap_disconn:處理斷開請(qǐng)求。
- l2cap_auth_cfm:認(rèn)證確認(rèn)。
- l2cap_encrypt_cfm:加密確認(rèn)。
- l2cap_recv_acldata:處理來自HCI的數(shù)據(jù)。
net/sco.c
SCO也是運(yùn)行在HCI之上的協(xié)議,它是面向連接的可靠的傳輸方式,主要用于聲音數(shù)據(jù)傳輸。
通過bt_sock_register為上層提供一個(gè)sock接口:
- sco_sock_create:創(chuàng)建sock的函數(shù),它的sock的ops指向sco_sock_ops。
- sco_sock_setsockopt/sco_sock_getsockopt設(shè)置/獲取sock的一些選項(xiàng)。
- sco_sock_sendmsg:發(fā)送消息,通過HCI提供sco_send_frame函數(shù)把消息傳遞給下層的設(shè)備。
- bt_sock_recvmsg:接收消息,從接收隊(duì)列中取消息。
通過hci_register_proto向其下的HCI注冊(cè)協(xié)議:
- sco_connect_ind:處理連接請(qǐng)求。
- sco_connect_cfm:確認(rèn)連接。
- sco_disconn_ind:處理斷開請(qǐng)求。
- sco_recv_scodata: 處理來自HCI數(shù)據(jù)。
rfcomm/*
rfcomm是基于l2CAP之上的協(xié)議,它在藍(lán)牙協(xié)議之上封裝傳統(tǒng)的RS232串口。
drivers/bluetooth
前面我們介紹的都是HCI及其上層的協(xié)議,HCI下層的實(shí)現(xiàn)就是HCI驅(qū)動(dòng)程序,這些驅(qū)動(dòng)程序用于與藍(lán)牙硬件通信,通信的方式常見的有USB,UART和PC card等幾種。這里我們看看USB的方式:
drivers/bluetooth/hci_usb.c
- hci_usb_probe: 調(diào)用hci_register_dev向前面說的hci_core注冊(cè)HCI設(shè)備。
- hci_usb_send_frame:用于提供給HCI去發(fā)送數(shù)據(jù)包。它把數(shù)據(jù)包放到傳輸隊(duì)列__transmit_q(husb, bt_cb(skb)->pkt_type)之中,然后調(diào)用hci_usb_tx_process去傳輸數(shù)據(jù)。
- hci_usb_tx_process:根據(jù)數(shù)據(jù)的類型去調(diào)用hci_usb_send_ctrl /hci_usb_send_isoc /hci_usb_send_bulk把數(shù)據(jù)通過USB發(fā)送給硬件。
~~end~~
?
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1852337
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
