昨天看了一下介紹藍牙協議文檔,今天索性對照看了看kernel里的代碼(bluez),這里記點筆記,還是繼承了老毛病,只關注整體流程而忽略細節,先了解個大概,等真正需要時再仔細分析。net/hci_core.cHCI在主機端的驅動主要是為上層提供一個統一的接口,讓上層協議不依賴于具體硬件的實現。HCI在硬件中的固件與HCI在主機" />

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

linux藍牙驅動代碼閱讀筆記

系統 2572 0
linux藍牙驅動代碼閱讀筆記

轉載時請注明出處和作者聯系方式
作者聯系方式:李先靜 <xianjimli at hotmail dot com>

昨天看了一下介紹藍牙協議文檔,今天索性對照看了看kernel里的代碼(bluez),這里記點筆記,還是繼承了老毛病,只關注整體流程而忽略細節,先了解個大概,等真正需要時再仔細分析。

net/hci_core.c

HCI在主機端的驅動主要是為上層提供一個統一的接口,讓上層協議不依賴于具體硬件的實現。HCI在硬件中的固件與HCI在主機端的驅動通信方式有多種,比如像UART、USB和PC Card等等。hci_core.c相當于一個框架,用于把各種具體通信方式膠合起來,并提供一些公共函數的實現。

hci_cmd_task 是負責發送CMD的任務,它從hdev->cmd_q隊列中取CMD,然后調用hci_send_frame把CMD發送出去,hci_send_frame又會調用實際的HCI驅動的send函數發送數據。

hci_rx_task 是負責接收數據的任務,它從hdev->rx_q隊列中取數據,然后根據數據的類型調用上層函數處理。數據包有三種類型:
  1. HCI_EVENT_PKT: 用于處理一些通信事件,比如連接建立,連接斷開,認證和加密等事件,這些事件控制協議狀態的改變。
  2. HCI_ACLDATA_PKT: 異步非連接的數據包,通過hci_acldata_packet提交給上層的L2CAP協議處理(hci_proto[HCI_PROTO_L2CAP])。
  3. HCI_SCODATA_PKT: 同步面向連接的數據包,通過hci_scodata_packet提供給上層的SCO協議處理(hci_proto[HCI_PROTO_SCO])。

hci_tx_task  是負責發送數據的任務,發送所有connection中的ACL和SCO數據,以及hdev->raw_q中的數據包。

HCI為上層提供的接口主要有:
  1. hci_send_sco:發送SCO數據包,把要發送的數據包放入connection的發送隊列中,然后調度發送任務去發送。
  2. hci_send_acl:發送ACL數據包,把要發送的數據包放入connection的發送隊列中,然后調度發送任務去發送。
  3. hci_send_cmd:發送命令數據,把要發送的數據包放入hdev->cmd_q隊列中,然后調度命令發送任務去發送。
  4. hci_register_proto/hci_unregister_proto:注冊/注銷上層協議,HCI會把接收到的數據轉發給這些上層協議。
  5. hci_register_dev/hci_unregister_dev: 注冊/注銷設備,HCI會把要發送的數據通過這些設備發送出去。
  6. 其它一些公共函數。

net/hci_conn.c
提供了一些連接管理,論證和加密的函數。

net/hci_event.c
事件處理函數,負責狀態機的維護,這些事件通常會使連接從一個狀態轉換另一個狀態。
  1. hci_si_event:用于發送事件。
  2. hci_event_packet:用于處理底層上報的事件,從hci_rx_task處調用過來。

net/hci_sock.c
給上層提供一個socket接口,應用程序可以通過socket的方式來訪問HCI。
  1. hci_sock_init:中注冊了BTPROTO_HCI類型family。
  2. hci_sock_create:創建sock的函數,它的sock的ops指向hci_sock_ops。
  3. hci_sock_setsockopt/hci_sock_getsockopt:設置/獲取sock的一些選項。
  4. hci_sock_sendmsg:發送消息,根據消息的類型把消息放到適當的隊列中。
  5. hci_sock_recvmsg:接收消息,從接收隊列中取消息。
  6. hci_sock_recvmsg:ioctl函數。

net/hci_sysfs.c
提供一些sysfs文件系統接口。

net/l2cap.c
L2CAP是HCI之上的協議,提供諸如QoS,分組,多路復用,分段和組裝之類的功能。

通過bt_sock_register為上層提供一個sock接口:
  1. l2cap_sock_create:創建sock的函數,它的sock的ops指向l2cap_sock_ops。
  2. l2cap_sock_setsockopt/l2cap_sock_getsockopt設置/獲取sock的一些選項。
  3. l2cap_sock_sendmsg:發送消息,通過HCI提供hci_send_acl函數把消息傳遞給下層的設備。
  4. bt_sock_recvmsg:接收消息,從接收隊列中取消息。

通過hci_register_proto向其下的HCI注冊協議:
  1. l2cap_connect_ind:處理連接請求。
  2. l2cap_connect_cfm:確認連接。
  3. l2cap_disconn:處理斷開請求。
  4. l2cap_auth_cfm:認證確認。
  5. l2cap_encrypt_cfm:加密確認。
  6. l2cap_recv_acldata:處理來自HCI的數據。

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

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

通過hci_register_proto向其下的HCI注冊協議:
  1. sco_connect_ind:處理連接請求。
  2. sco_connect_cfm:確認連接。
  3. sco_disconn_ind:處理斷開請求。
  4. sco_recv_scodata: 處理來自HCI數據。

rfcomm/*
rfcomm是基于l2CAP之上的協議,它在藍牙協議之上封裝傳統的RS232串口。

drivers/bluetooth
前面我們介紹的都是HCI及其上層的協議,HCI下層的實現就是HCI驅動程序,這些驅動程序用于與藍牙硬件通信,通信的方式常見的有USB,UART和PC card等幾種。這里我們看看USB的方式:

drivers/bluetooth/hci_usb.c
  1. hci_usb_probe: 調用hci_register_dev向前面說的hci_core注冊HCI設備。
  2. hci_usb_send_frame:用于提供給HCI去發送數據包。它把數據包放到傳輸隊列__transmit_q(husb, bt_cb(skb)->pkt_type)之中,然后調用hci_usb_tx_process去傳輸數據。
  3. hci_usb_tx_process:根據數據的類型去調用hci_usb_send_ctrl /hci_usb_send_isoc /hci_usb_send_bulk把數據通過USB發送給硬件。

~~end~~
?


Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1852337


linux藍牙驅動代碼閱讀筆記


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

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

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 免费国产午夜在线观看 | 亚洲福利一区福利三区 | 国产精品福利视频免费观看 | 亚洲精品爱爱久久 | 免费在线黄色网址 | 热久久在线观看 | 久久久久久久久性潮 | 在线亚洲小视频 | 毛片一级在线 | 久久天天躁狠狠躁夜夜爽蜜月 | 四虎在线影视在线影库 | 天天干天天操天天射 | 国内精品久久久久影院一蜜桃 | 中文字幕一区久久久久 | h片网站在线观看 | 99精品国产高清一区二区 | 中国老太婆bbbbbxxxxx | 狠狠色丁香婷综合久久 | 色五月在线视频 | 青青久久国产 | 亚洲精品二区中文字幕 | 99视频精品全国在线观看 | 日韩三区| 91国内精品久久久久怡红院 | 日本不卡中文字幕 | 国产精品久久久久久久伊一 | 国产l精品国产亚洲区久久 国产l精品国产亚洲区在线观看 | 国产欧美精品一区二区 | 99精品日韩 | 国产精品日韩欧美一区二区 | 久久亚洲欧美成人精品 | 99久久精品国产9999高清 | 天天看片天天爽 | 久久天天躁日日躁狠狠躁 | 色综合合久久天天给综看 | 91视频青青草 | 精品国产亚一区二区三区 | 在线观看a视频 | 亚洲图片欧美日韩 | 精品久久久一二三区 | 国产尤物视频 |