




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、安卓 4.1 bluetooth 之?dāng)?shù)據(jù)收發(fā) kernel 流程注冊中斷處理函數(shù)首先是注冊中斷函數(shù)來處理藍牙硬件得到數(shù)據(jù)的事件。這是一個標(biāo)準(zhǔn)的 tty 串口類的實現(xiàn)。serial core 對應(yīng)硬件抽象驅(qū)動( drivers/tty/serial/pxa.c ,module_init 時被調(diào)用入口函數(shù)) | | uart_register_driver(&serial_pxa_reg) ,注冊 uart driver , 這里定了 tty| 設(shè)備的名字/dev/ttyS%d ,然后platform_driver_register(&serial_pxa_driver)| 里面注冊了一個prob
2、e 函數(shù), platform 總線掃描到設(shè)備時會調(diào)用 serial_pxa_probe 增加| 一個對應(yīng)的 uart_pxa_port (函數(shù)uart_add_one_port) ,設(shè)置 uport 有對應(yīng)的內(nèi)存,op| s,以及中斷號。這里關(guān)注下 uart 的注冊函數(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ù)打 | 開一個 uart 設(shè)備時, uart_open 會被 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è) 置端口以及對應(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ā)送都不是阻塞的,可以看出這是一個全雙工的傳輸。 數(shù)據(jù)接收 然后是數(shù)據(jù)接收流程(這里是被動接收數(shù)據(jù),由中斷調(diào)起) : receive_chars調(diào)用uart_insert_char獲得數(shù)據(jù)并且寫至fj tty結(jié)構(gòu) 體的 buffer 中,通過 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ù)) | | 通過 tty_ldisc_ref(tty) 找到 ldisc 指針,并通過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、| 對應(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é)議,需要參看對應(yīng)文檔)| hci 層( net/bluetooth/hci_core.c ,函數(shù) hci_recv_frame 通過 tasklet 異步調(diào)用 hci_rx_task , 調(diào)用 hci_send_to_sock 通過已經(jīng) 連接并且正在監(jiān)聽
8、的 sockt 將數(shù)據(jù)拷貝發(fā)送給HAL ,并且根據(jù) skb 的類型作對應(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 ,通常是保存下來,以便上層查詢時告知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;這塊有個疑問, 就是 hci 的 ldisc 里面, bscp有給 skb 的 pkt_type 賦值,但是 h4 沒有,不知道h4 類型的proto 怎么實現(xiàn) 的 . hci_acldata_packet 在調(diào)用net/bl
10、uetooth/l2cap_core.c 里面的 l2cap_recv_acldata 往BTPROTO_L2CAP 類型 socket 寫包, 并且會通過回調(diào)函數(shù)的方法接著往BTPROTO_RFCOMM 類型的 socket 寫一遍。所以數(shù)據(jù)接收 流程簡言之,就是: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ù)接收的一個逆過程hci 層( net/bluetooth/hci_sock.c ) , hci_sock_sendmsg 或者hci_cmd_task| 把 msg 打包成 sk_buff 結(jié)構(gòu)體,放到 hci_dev 的 raw_q 里面| 然后通過 tasklet_schedule(&hdev-tx_task) 喚醒| 初始化的 hc
12、i_tx_task , 在這個函數(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 對應(yīng)的 | sk_buff_head 里面然后調(diào)用 hci_uart_tx_wakeup(hu)
13、 用一個 wihle| 循環(huán)發(fā)送 sk_buff_head 里面的所有sk_buff ,并且調(diào)用hci_uart_tx_complete| 進行發(fā)送的包的統(tǒng)計。發(fā)送數(shù)據(jù)是通過調(diào)用 tty 的方法實現(xiàn)|具體代碼為 tty-ops-write(tty, skb-data,skb-len)| 這里面的 ops 是在 pxa.c 里面的初始化函數(shù)通過uart_register_driver 注冊的|serial core( drivers/tty/serial/serial_core.c ) , uart_write| uart_state *state = tty-driver_data ,通過 s
14、tate 獲得緩沖區(qū) | circ = &state-xmit ,將需要放送的數(shù)據(jù)(也就是sk_buff )放到 | 緩沖區(qū)準(zhǔn)備發(fā)送(注意這個 xmit 稍候會發(fā)現(xiàn)用到) ,發(fā)送的方式是寫完數(shù)據(jù)到緩沖區(qū)后| 調(diào)用 uart_start(tty )喚醒對應(yīng)端口,然后通過 port-ops-start_tx(port) 發(fā)送|tty serial層硬件抽象驅(qū)動( drivers/tty/serial/pxa.c ) , serial_pxa_start_tx | serial_out(up, UART_IER, up-ier) ,調(diào)用writel方法enable發(fā)送的port|的傳輸中斷,真正的中斷響應(yīng)見前面注冊的 irq 響應(yīng)函數(shù) serial_pxa_irq ;中斷響應(yīng)后, | 會調(diào)具體的 函數(shù)去真正發(fā)送數(shù)據(jù)|tty serial 層硬件抽象驅(qū)動( drivers/tty
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030中國藍色信標(biāo)浮標(biāo)行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略研究報告
- 2025-2030中國葡萄糖酸鈉行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略研究報告
- 2025-2030中國藥用明膠行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略研究報告
- 2025-2030中國船用橢圓形舷窗行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略研究報告
- 碳纖維汽車輪轂建設(shè)項目可行性研究報告(參考)
- 2025-2030中國自動播種機行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略研究報告
- 2025-2030中國自動化醫(yī)院病床行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略研究報告
- 《鋪地錦》(教學(xué)設(shè)計)-2024-2025學(xué)年三年級下冊數(shù)學(xué)蘇教版
- 2025-2030中國胰島素樣生長因子Ⅱ行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略研究報告
- 2025-2030中國聚碳酸酯樹脂行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略研究報告
- 叉車掛靠公司合同范本
- 2023-2024學(xué)年天津市中小學(xué)生mixly創(chuàng)意編程 第4課 聰明的按鍵-教學(xué)設(shè)計
- 團隊領(lǐng)導(dǎo)力與沖突管理技能
- 2025年四川綿陽新投集團含所屬公司招聘筆試參考題庫含答案解析
- SA8000社會責(zé)任法律法規(guī)清單一覽表
- 化學(xué)-遼寧省協(xié)作體2024-2025學(xué)年度高三上學(xué)期期末考試試題試題和答案
- 2025年文化產(chǎn)業(yè)投資入股保密協(xié)議模板3篇
- 《公司財務(wù)決算報表》課件
- 2025年國信證券股份有限公司招聘筆試參考題庫含答案解析
- 軍戀對象申請書表
- 2025年山東省港口集團招聘筆試參考題庫含答案解析
評論
0/150
提交評論