Android(Linux)線路規程的使用

来源:http://www.cnblogs.com/we-hjb/archive/2016/02/28/5224125.html
-Advertisement-
Play Games

本文簡單介紹了Android(Linux)串口驅動線路規程的使用。


    一般來說,車載導航主機都需要外接若幹個UART的外設,如支持HFP的藍牙模塊、與原車通信的CAN解碼盒模塊、u-bloxGPS模塊和DVD機芯等。早年使用Telechips TCC8902+WinCE6.0的方案,該晶元串口比較多,基本夠用。最後實在不夠時想了一招,動態復用調試串口,參見《WinCE下調試串口的動態復用》。後來改用RK3188+Android做車機,RK3188沒那麼多串口,於是將所有串口外設都接到了STM32上,甚至把觸摸屏和收音機等IIC的設備也一併接了過去。STM32負責在RK3188和各個外設之間做數據透明傳輸。不得不說STM32確實很強大,當然也得虧姚同學用的出神入化了。一個軟體支持幾十款觸屏,N版硬體,自己寫的OS在上面跑得飛快。他用STM32把所有的外設都搞掂了,對主CPU就一個串口,數據流示意圖如下。
    Android更新太快,RK3188沒多久也過時了,後來改用MTK6735做主CPU。姚同學分分鐘就把STM32程式移植到了新板子上。用老鄧的話說,姚同學就是快!板子拿給我,開始移植Android驅動。原來在RK3188上是直接修改的串口驅動底層,從中斷開始、緩存、打包分發等,觸屏驅動也是基於原有GT9XX驅動修改的,看了半天,覺得這種方式平臺依賴性太大,不便於移植。後來跟老鄧和GYP討論,準備修改軟體架構,寫一個虛擬設備驅動讀取串口數據,並用成對的虛擬串口將數據分發到Bluetooth、CAN等設備驅動中。如此,所有設備驅動都是純虛的,就無需修改MTK6735串口驅動了,以後再移植到其他平臺也會很方便。想得很美,可是剛動手就發現有問題。虛擬設備驅動無法讀取TTY設備,這跟WinCE完全不同,Linux不能在驅動里調用open,read。搜遍Linux的驅動代碼,幾乎就沒有這樣用的,僅有幾處,也是做調試用,看著都彆扭,網上也找不到相關的信息,而《Driving Me Nuts - Things You Never Should Do in the Kernel》里明確提到,禁止這樣做,且文章還分析了為什麼開發者會有此種不合理的想法,摘錄如下:
  The most common question asked in this don't-do-that category is, "How do I read a file from within my kernel module?" Most new kernel developers are coming from user-space programming environments or other operating systems where reading a file is a natural and essential part of bringing configuration information into a program. From within the Linux kernel, however, reading data out of a file for configuration information is considered to be forbidden. This is due to a vast array of different problems that could result if a developer tries to do this.
    此路不通,再想別的辦法。驅動里不能讀取TTY設備,那麼就寫一個應用讀取TTY設備,再將讀取的數據分發到Bluetooth等設備驅動中。可仔細一琢磨,覺得這個方案很糟,數據流繞了很多彎,非常不好。還有沒有別的法子?Linux下支持串口滑鼠、串口藍牙模塊和串口的Modem,它們都是如何在驅動里獲取TTY上的數據的呢,一定有妙法!雖然項目有點急,姚同學又太給力,但我還是打算再研究兩天,不急於動手去改原生的串口驅動。我知道那是一個坑,掉進去一次就會有第二次第三次,寧可慢點也要繞過它去。
    功夫不負有心人,後來終於Google到一篇介紹TTY的好文,《The TTY demystified》。其中提到:
  Incidentally, the kernel provides several different line disciplines. Only one of them is attached to a given serial device at a time. The default discipline, which provides line editing, is called N_TTY (drivers/char/n_tty.c, if you're feeling adventurous). Other disciplines are used for other purposes, such as managing packet switched data (ppp, IrDA, serial mice), but that is outside the scope of this article. 
    這就是我想要的東東啊!雖然作者沒有詳述line discipline,但他明確指出Modem及串口滑鼠等都使用了線路規程來處理數據,而TTY本身就是預設的線路規程。真是山窮水復疑無路,柳暗花明又一村!接下來重點研究線路規程是如何工作的,並找一個合適的驅動移植過來,最終選定kernel-3.10/drivers/tty/n_hdlc.c為驅動模版進行移植,它支持數據幀的打包和雙向通信。Linux下驅動開發,儘可能找現成的移植,這樣效率才會高。《Writing a Kernel Line Discipline》也是一片好文,在移植驅動時很有幫助。
    Linux下UART數據流如下圖所示。
    簡易圖如下:
    原來在RK3188上是修改的Low level serial driver,平臺相關行大,如果原廠更新了串口驅動也需要手動同步代碼。使用線路規程的方式,則避免了以上問題,且與平臺無關,移植非常方便。在MT6735上移植好所有驅動後,後來項目改用MT8735,大概只花了半個小時就移植好了,只要拷貝線路規程驅動、虛擬觸屏驅動、收音機驅動、藍牙模塊驅動和uartd應用,修改幾個配置文件,編譯即可,不用修改一行代碼。其中uartd是一個用來切換線路規程的應用。後面如果採用高通的CPU,應該也可以像姚同學一樣刷刷地分分鐘搞定。
    使用線路規程,除了實現以上基本功能外,同時還增加了一個監測及抓取UART上所有數據流的功能,便於後期開發調試新的串口外設。不得不說,線路規程真是個好東西!Linux的驅動架構實在是牛!

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • package com.example.yanlei.wifi;import android.content.ContentResolver;import android.database.Cursor;import android.os.Bundle;import android.provider
  • activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width
  • 使用view畫圖,有兩個重要的組件需要介紹: (1)Paint 可以理解為畫刷或者畫筆,去主要用來設置繪圖使用的顏色、填充方式、透明度、字體以及字體樣式等。 (2)Canvas 畫布,在view上顯示的圖形都是由canvas來繪製的,可以繪製矩形、圓、橢圓、扇形……。 Paint常見方法與屬性: (
  • 很多天之前就安裝了visual studio community 2015,今天閑著麽事想試一下Apache Cordova,用它來開發跨平臺App。在這之前需要配置N多東西,這裡找到了一篇MS官方文章:配置 Visual Studio Tools for Apache Cordova。看著這片文章
  • http://pan.baidu.com/share/link?shareid=3506499606&uk=4278629985&app=zd
  • RecyclerView是加強版的ListView,用於在有限的視窗中展示大量的數據,而LoadMoreRecyclerView則是為RecyclerView增加了載入更多的功能,先來看效果: 三種載入方式: 自動載入: 手動載入: 使用圖片動畫載入: 項目簡介: demo中的下拉刷新採用的是Swi
  • AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.y
  • AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.y
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...