安卓4.1bluetooth之?dāng)?shù)據(jù)收發(fā)kernel流程_第1頁(yè)
安卓4.1bluetooth之?dāng)?shù)據(jù)收發(fā)kernel流程_第2頁(yè)
安卓4.1bluetooth之?dāng)?shù)據(jù)收發(fā)kernel流程_第3頁(yè)
安卓4.1bluetooth之?dāng)?shù)據(jù)收發(fā)kernel流程_第4頁(yè)
安卓4.1bluetooth之?dāng)?shù)據(jù)收發(fā)kernel流程_第5頁(yè)
已閱讀5頁(yè),還剩3頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、安卓 4.1 bluetooth 之?dāng)?shù)據(jù)收發(fā) kernel 流程注冊(cè)中斷處理函數(shù)首先是注冊(cè)中斷函數(shù)來(lái)處理藍(lán)牙硬件得到數(shù)據(jù)的事件。這是一個(gè)標(biāo)準(zhǔn)的 tty 串口類的實(shí)現(xiàn)。serial core 對(duì)應(yīng)硬件抽象驅(qū)動(dòng)( drivers/tty/serial/pxa.c ,module_init 時(shí)被調(diào)用入口函數(shù)) | | uart_register_driver(&serial_pxa_reg) ,注冊(cè) uart driver , 這里定了 tty| 設(shè)備的名字/dev/ttyS%d ,然后platform_driver_register(&serial_pxa_driver)| 里面注冊(cè)了一個(gè)prob

2、e 函數(shù), platform 總線掃描到設(shè)備時(shí)會(huì)調(diào)用 serial_pxa_probe 增加| 一個(gè)對(duì)應(yīng)的 uart_pxa_port (函數(shù)uart_add_one_port) ,設(shè)置 uport 有對(duì)應(yīng)的內(nèi)存,op| s,以及中斷號(hào)。這里關(guān)注下 uart 的注冊(cè)函數(shù)| serial core(drivers/tty/serial/serial_core.c ,函數(shù) uart_register_driver )| normal-driver_state = drv| tty_set_operations(normal, &uart_ops);|給uart driver設(shè)置了自己的ops,著重

3、關(guān)注下open函數(shù),當(dāng)用戶空間嘗試用 open 函數(shù)打 | 開一個(gè) uart 設(shè)備時(shí), uart_open 會(huì)被 tty_open 調(diào)用 (retval =tty-ops-open)| | serial core( drivers/tty/serial/serial_core.c ,函數(shù)uart_open-uart_startup , 調(diào)用 uport-ops-startup 設(shè) 置端口以及對(duì)應(yīng)的 irq 處理,也就是 serial_pxa_pops 里面設(shè) 置的 serial_pxa_startup , request_irq(up-port.irq, serial_pxa_irq, 0,

4、up-name, up) 。 可以看到設(shè)置的中斷處理 函數(shù)是 serial_pxa_irq )/ drivers/tty/serial/pxa.c static inline irqreturn_t serial_pxa_irq(int irq, void *dev_id) struct uart_pxa_port *up = dev_id; unsigned int iir, lsr; iir = serial_in(up, UART_IIR); if (iir & UART_IIR_NO_INT) return IRQ_NONE; lsr = serial_in(up, UART_LSR)

5、;if (lsr & UART_LSR_DR)receive_chars(up,&lsr); / 接收數(shù)據(jù)的中斷處理check_modem_status(up);if (lsr &UART_LSR_THRE)transmit_chars(up); / 發(fā)送數(shù)據(jù)的中斷處理return IRQ_HANDLED; 數(shù)據(jù)接收和數(shù)據(jù)發(fā)送都不是阻塞的,可以看出這是一個(gè)全雙工的傳輸。 數(shù)據(jù)接收 然后是數(shù)據(jù)接收流程(這里是被動(dòng)接收數(shù)據(jù),由中斷調(diào)起) : receive_chars調(diào)用uart_insert_char獲得數(shù)據(jù)并且寫至fj tty結(jié)構(gòu) 體的 buffer 中,通過(guò) tty_flip_buffer_

6、push 統(tǒng)一推送到 hci uart層| tty core( drivers/tty/tty_buffer.c ,函數(shù) tty_flip_buffer_push ,調(diào)用 flush_to_ldisc 交給 ldisc 去處理數(shù)據(jù)) | | 通過(guò) tty_ldisc_ref(tty) 找到 ldisc 指針,并通過(guò)disc-ops-receive_buf| 讓 hci 的ldisc 去處理這些數(shù)據(jù)| hci uart( drivers/bluetooth/hci_ldisc.c ,函數(shù) hci_uart_tty_receive )| 調(diào)用 hu-proto-recv 交給 proto 處理數(shù)據(jù)

7、| 對(duì)應(yīng)的 proto 層( drivers/bluetooth/hci_h4.c 或者 hci_bcsp.c, recv ,調(diào)用 hci_recv_stream_fragment 或者 hci_recv_frame 將數(shù)據(jù)推送給 hci 層,也就是bluez 的 kernel 協(xié)議棧去處理數(shù)據(jù)包。這部分處理取決于 bcsp 協(xié)議或者 h4 協(xié)議,需要參看對(duì)應(yīng)文檔)| hci 層( net/bluetooth/hci_core.c ,函數(shù) hci_recv_frame 通過(guò) tasklet 異步調(diào)用 hci_rx_task , 調(diào)用 hci_send_to_sock 通過(guò)已經(jīng) 連接并且正在監(jiān)聽

8、的 sockt 將數(shù)據(jù)拷貝發(fā)送給HAL ,并且根據(jù) skb 的類型作對(duì)應(yīng)處理這步才是關(guān)鍵,類型見代碼)/ net/bluetooth/hci_core.cstatic void hci_rx_task(unsigned long arg) /* Process frame */ switch(bt_cb(skb)-pkt_type) case HCI_EVENT_PKT:/ hci event ,通常是保存下來(lái),以便上層查詢時(shí)告知hci_event_packet(hdev, skb);break;caseHCI_ACLDATA_PKT: / l2cap 協(xié)議,如果上層有BTPROTO_L2CA

9、P 類型socket,/ 能夠收到這些數(shù)據(jù)包 hci_acldata_packet(hdev,skb);break;case HCI_SCODATA_PKT:/ 如果上層有BTPROTO_SCO 類型socket, 能夠收到這些數(shù)據(jù)包hci_scodata_packet(hdev, skb);break;default: / 丟掉kfree_skb(skb);break;這塊有個(gè)疑問(wèn), 就是 hci 的 ldisc 里面, bscp有給 skb 的 pkt_type 賦值,但是 h4 沒有,不知道h4 類型的proto 怎么實(shí)現(xiàn) 的 . hci_acldata_packet 在調(diào)用net/bl

10、uetooth/l2cap_core.c 里面的 l2cap_recv_acldata 往BTPROTO_L2CAP 類型 socket 寫包, 并且會(huì)通過(guò)回調(diào)函數(shù)的方法接著往BTPROTO_RFCOMM 類型的 socket 寫一遍。所以數(shù)據(jù)接收 流程簡(jiǎn)言之,就是:tty uart 層中斷(drivers/tty/serial/pxa.c )|tty core( drivers/tty/tty_buffer.c )|hci uart 層( drivers/bluetooth/hci_ldisc.c , hci_bcsp.c)|hci 層|hci 層|hci 層( net/bluetooth/

11、hci_core.c )l2cap( net/bluetooth/l2cap_core.c )rfcomm ( net/bluetooth/rfcomm/core.c )|HAL 層( external/bluetooth/bluez/ )數(shù)據(jù)發(fā)送基本上是數(shù)據(jù)接收的一個(gè)逆過(guò)程hci 層( net/bluetooth/hci_sock.c ) , hci_sock_sendmsg 或者h(yuǎn)ci_cmd_task| 把 msg 打包成 sk_buff 結(jié)構(gòu)體,放到 hci_dev 的 raw_q 里面| 然后通過(guò) tasklet_schedule(&hdev-tx_task) 喚醒| 初始化的 hc

12、i_tx_task , 在這個(gè)函數(shù)里面調(diào)用 hci_send_frame| 發(fā)送 hci_dev 里面的 raw_q|hci 層( net/bluetooth/hci_core.c ) , hci_send_frame| 調(diào)用 hdev-send(skb) 將 sk_buff 發(fā)送|hci uart 層( drivers/bluetooth/hci_ldisc.c ) , hci_uart_send_frame| hu-proto-enqueue(hu, skb) 將sk_buff 放 proto 對(duì)應(yīng)的 | sk_buff_head 里面然后調(diào)用 hci_uart_tx_wakeup(hu)

13、 用一個(gè) wihle| 循環(huán)發(fā)送 sk_buff_head 里面的所有sk_buff ,并且調(diào)用hci_uart_tx_complete| 進(jìn)行發(fā)送的包的統(tǒng)計(jì)。發(fā)送數(shù)據(jù)是通過(guò)調(diào)用 tty 的方法實(shí)現(xiàn)|具體代碼為 tty-ops-write(tty, skb-data,skb-len)| 這里面的 ops 是在 pxa.c 里面的初始化函數(shù)通過(guò)uart_register_driver 注冊(cè)的|serial core( drivers/tty/serial/serial_core.c ) , uart_write| uart_state *state = tty-driver_data ,通過(guò) s

14、tate 獲得緩沖區(qū) | circ = &state-xmit ,將需要放送的數(shù)據(jù)(也就是sk_buff )放到 | 緩沖區(qū)準(zhǔn)備發(fā)送(注意這個(gè) xmit 稍候會(huì)發(fā)現(xiàn)用到) ,發(fā)送的方式是寫完數(shù)據(jù)到緩沖區(qū)后| 調(diào)用 uart_start(tty )喚醒對(duì)應(yīng)端口,然后通過(guò) port-ops-start_tx(port) 發(fā)送|tty serial層硬件抽象驅(qū)動(dòng)( drivers/tty/serial/pxa.c ) , serial_pxa_start_tx | serial_out(up, UART_IER, up-ier) ,調(diào)用writel方法enable發(fā)送的port|的傳輸中斷,真正的中斷響應(yīng)見前面注冊(cè)的 irq 響應(yīng)函數(shù) serial_pxa_irq ;中斷響應(yīng)后, | 會(huì)調(diào)具體的 函數(shù)去真正發(fā)送數(shù)據(jù)|tty serial 層硬件抽象驅(qū)動(dòng)( drivers/tty

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論