版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 倉(cāng)庫(kù)擴(kuò)大補(bǔ)充協(xié)議書
- 第9課-2023-2024學(xué)年初中信息技術(shù)七年級(jí)上冊(cè)(人教版)-說(shuō)課稿-制作電子表格
- 變更扶養(yǎng)協(xié)議書
- 北京房屋租賃合同2008
- 防火應(yīng)急疏散演練幼兒園
- 天津市南開區(qū)2024-2025學(xué)年高一上學(xué)期11月期中考試語(yǔ)文試題(含答案)
- 遼寧省錦州市某校2024-2025學(xué)年高二上學(xué)期期中質(zhì)量檢測(cè)英語(yǔ)試卷(無(wú)答案)
- 糖尿病的演講
- 《纖維繩索彎曲疲勞試驗(yàn)方法》
- 飼料級(jí)磷酸鹽相關(guān)項(xiàng)目投資計(jì)劃書范本
- 大國(guó)崛起:中國(guó)對(duì)外貿(mào)易概論學(xué)習(xí)通課后章節(jié)答案期末考試題庫(kù)2023年
- 企業(yè)內(nèi)控手冊(cè)之股權(quán)投資管理流程手冊(cè)
- 2023同等學(xué)力申碩統(tǒng)考英語(yǔ)考試真題
- BIM技術(shù)大賽考試題庫(kù)(600題)
- 2023年大學(xué)試題(法學(xué))-著作權(quán)法考試參考題庫(kù)(含答案)
- Module9Unit2Ifeelhappy.(學(xué)習(xí)任務(wù)單)外研版英語(yǔ)五年級(jí)上冊(cè)
- 大一高等數(shù)學(xué)期末考試題選編及解析
- 綠博園站初步設(shè)計(jì)說(shuō)明
- 中控ECS-700學(xué)習(xí)課件
- 武漢理工大學(xué)計(jì)算機(jī)網(wǎng)絡(luò)試題及答案
- 山地光伏施工組織設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論