Android(Linux)線路規程的使用,androidlinux

來源:互聯網
上載者:User

Android(Linux)線路規程的使用,androidlinux

    一般來說,車載導航主機都需要外接若干個UART的外設,如支援HFP的藍芽模組、與原車通訊的CAN解碼盒模組、u-blox的GPS模組和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的驅動架構實在是牛!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.