昨天看了一下介紹藍(lán)牙協(xié)議文檔,今天索性對(duì)照看了看kernel里的代碼(bluez),這里記點(diǎn)筆記,還是繼承了老毛病,只關(guān)注整體流程而忽略細(xì)節(jié),先了解個(gè)大概,等真正需要時(shí)再仔細(xì)分析。net/hci_core.cHCI在主機(jī)端的驅(qū)動(dòng)主要是為上層提供一個(gè)統(tǒng)一的接口,讓上層協(xié)議不依賴于具體硬件的實(shí)現(xiàn)。HCI在硬件中的固件與HCI在主機(jī)" />

亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

linux藍(lán)牙驅(qū)動(dòng)代碼閱讀筆記

系統(tǒng) 2970 0
linux藍(lán)牙驅(qū)動(dòng)代碼閱讀筆記

轉(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ù)包有三種類型:
  1. HCI_EVENT_PKT: 用于處理一些通信事件,比如連接建立,連接斷開,認(rèn)證和加密等事件,這些事件控制協(xié)議狀態(tài)的改變。
  2. HCI_ACLDATA_PKT: 異步非連接的數(shù)據(jù)包,通過hci_acldata_packet提交給上層的L2CAP協(xié)議處理(hci_proto[HCI_PROTO_L2CAP])。
  3. 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為上層提供的接口主要有:
  1. hci_send_sco:發(fā)送SCO數(shù)據(jù)包,把要發(fā)送的數(shù)據(jù)包放入connection的發(fā)送隊(duì)列中,然后調(diào)度發(fā)送任務(wù)去發(fā)送。
  2. hci_send_acl:發(fā)送ACL數(shù)據(jù)包,把要發(fā)送的數(shù)據(jù)包放入connection的發(fā)送隊(duì)列中,然后調(diào)度發(fā)送任務(wù)去發(fā)送。
  3. hci_send_cmd:發(fā)送命令數(shù)據(jù),把要發(fā)送的數(shù)據(jù)包放入hdev->cmd_q隊(duì)列中,然后調(diào)度命令發(fā)送任務(wù)去發(fā)送。
  4. hci_register_proto/hci_unregister_proto:注冊(cè)/注銷上層協(xié)議,HCI會(huì)把接收到的數(shù)據(jù)轉(zhuǎn)發(fā)給這些上層協(xié)議。
  5. hci_register_dev/hci_unregister_dev: 注冊(cè)/注銷設(shè)備,HCI會(huì)把要發(fā)送的數(shù)據(jù)通過這些設(shè)備發(fā)送出去。
  6. 其它一些公共函數(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)。
  1. hci_si_event:用于發(fā)送事件。
  2. hci_event_packet:用于處理底層上報(bào)的事件,從hci_rx_task處調(diào)用過來。

net/hci_sock.c
給上層提供一個(gè)socket接口,應(yīng)用程序可以通過socket的方式來訪問HCI。
  1. hci_sock_init:中注冊(cè)了BTPROTO_HCI類型family。
  2. hci_sock_create:創(chuàng)建sock的函數(shù),它的sock的ops指向hci_sock_ops。
  3. hci_sock_setsockopt/hci_sock_getsockopt:設(shè)置/獲取sock的一些選項(xiàng)。
  4. hci_sock_sendmsg:發(fā)送消息,根據(jù)消息的類型把消息放到適當(dāng)?shù)年?duì)列中。
  5. hci_sock_recvmsg:接收消息,從接收隊(duì)列中取消息。
  6. 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接口:
  1. l2cap_sock_create:創(chuàng)建sock的函數(shù),它的sock的ops指向l2cap_sock_ops。
  2. l2cap_sock_setsockopt/l2cap_sock_getsockopt設(shè)置/獲取sock的一些選項(xiàng)。
  3. l2cap_sock_sendmsg:發(fā)送消息,通過HCI提供hci_send_acl函數(shù)把消息傳遞給下層的設(shè)備。
  4. bt_sock_recvmsg:接收消息,從接收隊(duì)列中取消息。

通過hci_register_proto向其下的HCI注冊(cè)協(xié)議:
  1. l2cap_connect_ind:處理連接請(qǐng)求。
  2. l2cap_connect_cfm:確認(rèn)連接。
  3. l2cap_disconn:處理斷開請(qǐng)求。
  4. l2cap_auth_cfm:認(rèn)證確認(rèn)。
  5. l2cap_encrypt_cfm:加密確認(rèn)。
  6. l2cap_recv_acldata:處理來自HCI的數(shù)據(jù)。

net/sco.c
SCO也是運(yùn)行在HCI之上的協(xié)議,它是面向連接的可靠的傳輸方式,主要用于聲音數(shù)據(jù)傳輸。

通過bt_sock_register為上層提供一個(gè)sock接口:
  1. sco_sock_create:創(chuàng)建sock的函數(shù),它的sock的ops指向sco_sock_ops。
  2. sco_sock_setsockopt/sco_sock_getsockopt設(shè)置/獲取sock的一些選項(xiàng)。
  3. sco_sock_sendmsg:發(fā)送消息,通過HCI提供sco_send_frame函數(shù)把消息傳遞給下層的設(shè)備。
  4. bt_sock_recvmsg:接收消息,從接收隊(duì)列中取消息。

通過hci_register_proto向其下的HCI注冊(cè)協(xié)議:
  1. sco_connect_ind:處理連接請(qǐng)求。
  2. sco_connect_cfm:確認(rèn)連接。
  3. sco_disconn_ind:處理斷開請(qǐng)求。
  4. 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
  1. hci_usb_probe: 調(diào)用hci_register_dev向前面說的hci_core注冊(cè)HCI設(shè)備。
  2. 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ù)。
  3. 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


linux藍(lán)牙驅(qū)動(dòng)代碼閱讀筆記


更多文章、技術(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ì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 在线观看精品一区 | 欧美日韩一级黄色片 | 婷婷免费在线 | 4hu四虎最新免费地址 | 国产性生活视频 | 亚洲精品色播一区二区 | 国产中日韩一区二区三区 | 久久伊人一区二区三区四区 | 欧美久久超级碰碰碰二区三区 | 美国一级毛片免费看成人 | 久久影视免费体验区午夜啪啪 | 九九视频在线免费观看 | 免费二区| 一级a做爰片欧欧美毛片4 | 尹人在线视频 | 欧美18—19sex性护士 | 日一区二区 | 日韩在线视频免费播放 | 91精品国产免费久久久久久 | 欧美一级人与动毛片免费播放 | 欧美又黄又嫩大片a级 | 亚洲国产欧美国产综合一区 | 天天操天天弄 | 人人揉揉香蕉大免费不卡 | 亚洲精品久久久久中文 | 日韩中文字幕精品久久 | 国产亚洲综合一区二区在线 | 免费a黄色| 中文字幕一区二区三 | 五月天婷婷在线视频国产在线 | 国产精品视频全国免费观看 | 国产在线观看91 | 在线日韩视频 | 四虎影院免费在线播放 | 日本一级特黄毛片免费视频9 | 免费国产不卡午夜福在线观看 | 男人的天堂视频 | 97在线视频免费播放 | 亚洲欧美在线免费 | 色视频在线观看视频 | 香蕉国产人午夜视频在线观看 |