1. 程式人生 > >linux藍芽驅動程式碼閱讀筆記

linux藍芽驅動程式碼閱讀筆記

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

                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.    
  3. HCI_ACLDATA_PKT: 非同步非連線的資料包,通過hci_acldata_packet提交給上層的L2CAP協議處理(hci_proto[HCI_PROTO_L2CAP])。
  4.    
  5. 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.    
  3. hci_send_acl:傳送ACL資料包,把要傳送的資料包放入connection的傳送佇列中,然後排程傳送任務去傳送。
  4.    
  5. hci_send_cmd:傳送命令資料,把要傳送的資料包放入hdev->cmd_q佇列中,然後排程命令傳送任務去傳送。
  6.    
  7. hci_register_proto/hci_unregister_proto:註冊/登出上層協議,HCI會把接收到的資料轉發給這些上層協議。
  8.    
  9. hci_register_dev/hci_unregister_dev: 註冊/登出裝置,HCI會把要傳送的資料通過這些裝置傳送出去。
  10.    
  11. 其它一些公共函式。

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

net/hci_event.c
事件處理函式,負責狀態機的維護,這些事件通常會使連線從一個狀態轉換另一個狀態。
  1. hci_si_event:用於傳送事件。
  2.    
  3. hci_event_packet:用於處理底層上報的事件,從hci_rx_task處呼叫過來。

net/hci_sock.c
給上層提供一個socket介面,應用程式可以通過socket的方式來訪問HCI。
  1. hci_sock_init:中註冊了BTPROTO_HCI型別family。
  2.    
  3. hci_sock_create:建立sock的函式,它的sock的ops指向hci_sock_ops。
  4.    
  5. hci_sock_setsockopt/hci_sock_getsockopt:設定/獲取sock的一些選項。
  6.    
  7. hci_sock_sendmsg:傳送訊息,根據訊息的型別把訊息放到適當的佇列中。
  8.    
  9. hci_sock_recvmsg:接收訊息,從接收佇列中取訊息。
  10.    
  11. 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.    
  3. l2cap_sock_setsockopt/l2cap_sock_getsockopt設定/獲取sock的一些選項。
  4.    
  5. l2cap_sock_sendmsg:傳送訊息,通過HCI提供hci_send_acl函式把訊息傳遞給下層的裝置。
  6.    
  7. bt_sock_recvmsg:接收訊息,從接收佇列中取訊息。

通過hci_register_proto向其下的HCI註冊協議:
  1. l2cap_connect_ind:處理連線請求。
  2.    
  3. l2cap_connect_cfm:確認連線。
  4.    
  5. l2cap_disconn:處理斷開請求。
  6.    
  7. l2cap_auth_cfm:認證確認。
  8.    
  9. l2cap_encrypt_cfm:加密確認。
  10.    
  11. l2cap_recv_acldata:處理來自HCI的資料。

net/sco.c
SCO也是執行在HCI之上的協議,它是面向連線的可靠的傳輸方式,主要用於聲音資料傳輸。

通過bt_sock_register為上層提供一個sock介面:
  1. sco_sock_create:建立sock的函式,它的sock的ops指向sco_sock_ops。
  2.    
  3. sco_sock_setsockopt/sco_sock_getsockopt設定/獲取sock的一些選項。
  4.    
  5. sco_sock_sendmsg:傳送訊息,通過HCI提供sco_send_frame函式把訊息傳遞給下層的裝置。
  6.    
  7. bt_sock_recvmsg:接收訊息,從接收佇列中取訊息。

通過hci_register_proto向其下的HCI註冊協議:
  1. sco_connect_ind:處理連線請求。
  2.    
  3. sco_connect_cfm:確認連線。
  4.    
  5. sco_disconn_ind:處理斷開請求。
  6.    
  7. 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.    
  3. hci_usb_send_frame:用於提供給HCI去傳送資料包。它把資料包放到傳輸佇列__transmit_q(husb, bt_cb(skb)->pkt_type)之中,然後呼叫hci_usb_tx_process去傳輸資料。
  4.    
  5. hci_usb_tx_process:根據資料的型別去呼叫hci_usb_send_ctrl /hci_usb_send_isoc /hci_usb_send_bulk把資料通過USB傳送給硬體。

~~end~~
 
           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述