版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、基于 AR M 和 uClinux 多串口通訊的設計與實現(xiàn) 3王 欣 羅志祥 沈 光(華中科技大學光電子科學與工程學院 武漢 430074摘 要 以 AR M7嵌入式處理器 S3C44B0X 、 TI (T L16C752B 為硬件開發(fā) 平臺 , 設計基于 uClinux 。關鍵詞 AR M uClinux 串行設備驅動 中圖分類號 TP316. 891 引言通用異步接收發(fā)送芯片 UART 產(chǎn)生于上個世 紀 70年代 , 是第一塊大規(guī)模集成電路 。 1981年的 推出的 I B M PC 采用了 8250UART 芯片與外設進 行數(shù)據(jù)通信 , 直到上個世紀末 , UART 一直是 PC 中 最
2、主要的串行通信接口 。嵌入式系統(tǒng)的多串口擴展的應用范圍很廣 。 它可以用來做多串口服務器 /多串口卡 , 工業(yè) /自動 化現(xiàn)場 RS -485控制 , 使用 CDMA /GPRS MODE M 的無線數(shù)據(jù)傳輸 , 車載信息平臺 /車載 GPS 定位系 統(tǒng) , 遠傳自動抄表 (AMR 系統(tǒng) , 稅控 P OS/銀行終 端等金融機具 , DSP 數(shù)據(jù)采集和傳輸系統(tǒng)等 。 本文給出了系統(tǒng)的多串口擴展完整硬件和驅 動解決方案 。 該方案對于多串口擴展應用以及以 L inux/uClinux類的操作系統(tǒng)為基礎的驅動開發(fā)有 一定的指導意義和參考價值 。2 硬件方案設計目前嵌入式處理器常見的有 AR M 、
3、 Po werPC 、 M I PS 、 Mot or ola 68K 、 ColdFire (冷火 等 , 但 ARM 占 據(jù)了絕對主流 。由于低端市場上 AR M7/9型嵌入 式處理器非?;鸨?, 本文就選用了其中一種流行的 ARM7型處理器 S3C44B0X 作為硬件開發(fā)平臺 。 因為處理器 S3C44B0X 不帶內存管理單元 MMU (無內存分頁和地址映射機制 , 所以不能使用虛擬 內存 , 所以選用支持無存儲管理單元微處理器的 uClinux 操作系統(tǒng)作為軟件驅動開發(fā)平臺 。截止到目前 , 全球范圍內有超過 40種 UART 芯片可以選擇 , 大多數(shù) UART 芯片是以計算機總線 轉
4、換 UART 為應用基礎的 , 其管腳 、 寄存器基本相 同 。 這就使得 UART 芯片有很好的通用性 。本文 選用了其中較復雜的通用異步接收發(fā)送 (UART 芯片 T L16C752B 來擴展異步串行通訊口 。2. 1 UART 芯片 T L16C752B 工作原理圖 1 T L16C752B 功能模塊圖 1T L16C752B 芯片與 UART 芯片 ST16C2550引 腳兼容 , 使用外部晶振時有高達 3Mbp s 的波特率 , 內置兩套 UART 系統(tǒng) , 每套都能獨立工作 , 具有可 選的流控功能等 。T L16C752B 具有 64字節(jié)發(fā)送 /接收 F I F O , 收 、
5、發(fā) F I F O 的觸發(fā)等級可通過軟件編程實現(xiàn) , 能減少 對 CP U 中 斷 次 數(shù) , 提 高 芯 片 收 發(fā) 效 率 。 T L16C752B 芯片功能模塊如圖 1所示 。2. 2 接口電路設計處理器 S3C44B0X 2與 T L16C752B 之間的硬 件連接如圖 2所示 , D0D7通過總線收發(fā)芯片 S N74LVC16245A 連接 CP U 數(shù)據(jù)總線的低 8位 , 是441 計算機與數(shù)字工程 第 35卷 3收到本文時間 :2006年 9月 20日作者簡介 :王欣 , 男 , 碩士研究生 , 研究方向 :嵌入式系統(tǒng) 、 數(shù)字圖像處理 。 羅志祥 , 男 , 副教授 , 碩士生
6、導師 , 研究方 向 :寬帶光通信 , 傳感器網(wǎng)絡 。 沈光 , 男 , 碩士研究生 , 研究方向 :嵌入式系統(tǒng) 。UART 的 數(shù) 據(jù) 輸 入 與 輸 出 通 道 , 其 中 S N74LVC16245A 是用來延時和增強數(shù)據(jù)總線驅動能力 ; 片選 CS A 、 CS B 連接 Bank4和 Bank5的引腳 nCGS4、 nGCS5, 這兩個片選可以確定 2個 UART 端 口的起始地址 , 分別是 0x08000000、 0x0a000000。 即高位地址部分已固定 , 而片內寄存器的地址主要 由地址低 3位 A0A2確定 。只有在片選信號和 地址信號都有效時 , 才能對片內相應的寄存器
7、進行 正常讀寫 。 要注意的是 , Bank4和 Bank5的控制寄 存器的設置要參考 T L16C752B 圖 2 S3C44B0X 與 T L16C752B 硬件連接圖采用中斷方式通知 CP U 接收到新的字符或字 符已發(fā)送 , 這樣可以提高系統(tǒng)的實時性 。 這里中斷 引腳 I N T A 、 I N T B 直接連接 S3C44B0X 的外部中斷 引腳 EX I N T2EX I N T3。接入 T L16C752B 的外接 時鐘頻率最好是使用的波特率的倍數(shù) 。本文使用 的是 11. 0592M 的外部時鐘 , 輸出的的串口波特率 是 115200。 T L16C752B 內部寄存器的映
8、射表及訪 問方法在參考文獻 1中可查到 。3 串行設備驅動程序設計3. 1 uClinux 系統(tǒng)內核架構圖 3 uClinux 內核架構 (字符型設備 設備驅動程序是操作系統(tǒng)內核與機器硬件之間的接口 。 它為應用程序屏蔽了硬件的細節(jié) 。在 應用程序看來 , 硬件設備只是一個設備文件 , 應用 程序可以像操作普通文件一樣對硬件設備進行操 作 。 而事實上 , 對硬件的所有實際操作都是由用戶 空間的應用程序調用內核空間的驅動程序來完成 操作的 。 在 uClinux (本文使用 2. 4. 20 中 :、 網(wǎng)絡接口型 。 其中字 , (比如文件 一樣被訪問 。 open 、 cl ose 、 re
9、ad 和 write 等系統(tǒng)調用 , 如圖 3所示 。 3. 2 串行設備驅動的分析在 uClinux 內核中提供了訪問串行硬件的設 備 , 通常叫 tty 設備 (tty 是 Teletype 的簡寫 , 也可稱 為終端設備 , 現(xiàn)在用來表示任何基于字符的數(shù)據(jù) 終端 。 uClinux 提供了三類 tty 設備 :串行設備 (有 的書中干脆稱為串口 , 控制臺 , 偽終端 (p ty 。其 中 , 后兩者的命名只是因為從程序員的角度來看 , 它們和典型的 tty 設備 (即串行設備 以相似的方式工作 , 且它們的驅動程序已經(jīng)被編寫好了 , 而且 可能也不必為這兩類 tty 驅動程序編寫其他的
10、驅動 程序 。 這使得任何使用 tty 核心與用戶和系統(tǒng)交互 的新驅動程序都可以被看成是串行設備驅動程序 。 本文所設計的硬件就是典型的串行設備 。下面將 詳細介紹 tty 類設備驅動的層次結構和串行設備驅 動的實現(xiàn) 。3. 2. 1 TTY 驅動的層次結構在 uClinux 系統(tǒng)中 , tty 驅動根據(jù)它們與設備的 關系 , 以及在執(zhí)行流程中的位置 , 可以分為 tty 驅動 程序和與上層直接聯(lián)系的 tty 驅動接口程序 。 可以 用圖 4示意圖來表示這種控制關系 。各種串行設 備都有自己的 tty 驅動程序來控制硬件 。在 tty 驅 動程序上層接口中 , tty 驅動程序的核心緊挨在標
11、準字符設備驅動層之下 , 并提供了一系列的功能 , 作為接口被終端類型設備使用 。內核負責控制通 過 tty 設備的數(shù)據(jù)流 , 并且格式化這些數(shù)據(jù) 。這使 得 tty 驅動程序把重點放在處理流向或者流出硬件 的數(shù)據(jù)上 , 而不必重點考慮使用常規(guī)方法與用戶空 間的交互 。 為了控制數(shù)據(jù)流 , 有許多不同的線路設 置 (line disci p line 可虛擬地 “ 插入 ” 任何的 tty 設備 上 , 這由不同的 tty 線路設置驅動程序實現(xiàn) 。tty 線路設置對于 tty 驅動程序來說是不透明的 。 驅動程序不能直接與線路設置通信 , 甚至不知 541第 35卷 (2007 第 8期 計算
12、機與數(shù)字工程 道它的存在 。 在某種意義上講 , 驅動程序的作用是 將發(fā)送給它的數(shù)據(jù)格式化成硬件能理解的格式 , 并 從硬件那里接收數(shù)據(jù) 。 tty 線路設置的作用就是使 用特殊的方法 , 把從用戶或者硬件那里接收的數(shù)據(jù) 格式化 。 這種格式化通常使用一些協(xié)議來完成轉換 , 比如 PPP 或者是藍牙 (B luet ooth 3 。圖 4 tty 驅動層次結構圖 在 tty 驅動中使用到了一些數(shù)據(jù)結構 , 這些數(shù) 據(jù)結構關聯(lián)了整個 tty 驅動的各個層次 。 如圖 4和 圖 5所示 , 這些數(shù)據(jù)結構有如下幾種 。 在終端驅動 程序上層接口 tty_i o . c 文件中定義了終端驅動程 序的文
13、件操作結構 file_operations 實例 -用于和用 戶空間通訊 , 這是典型的字符設備的結構 , 它的每 一個成員函數(shù)都將與系統(tǒng)調用的 read 、 write 、 i octl 等關聯(lián)起來 。 在文件中還定義了 tty_struct 結構實 例 (如圖 4虛線框所示 , 它內部包含了下面的三種 結構 -它描述了通用 (或高層 tty 的屬性 , 主要是 在當 tty 設備打開的時候 , tty 核心將當前特定的 tty 端口的狀態(tài)保存在此結構中 。在默認線路設置模 塊 n_tty. c 文件和其它文件如 ppp 協(xié)議的線路設置 文件 ppp_async. c 中 , 定義了 tty
14、_ldisc 結構實例5-它列出了所有的當前線路設置的入口 。在各種串行設備的 tty 驅動程序中定義了 tty_driver結構 實例 (如圖 4虛線框所示 , 它內部包含了下面的 ter m i os 結構 -用來向 tty 核心注冊一個 tty 驅動程序 。 tty_driver結構中還包含所有的回調函數(shù) , 它們被 tty 驅動程序設置 , 并被 tty 核心調用 。 這些 回調函數(shù)的實現(xiàn)需要調用到底層硬件控制 , 對具體 寄存器進行讀寫 , 完成串行設備的收發(fā)操作 。ter m i os 結構 (如下所示 -每個 tty 驅動程序都包含有這樣一個結構實例 , 結構中的標志集合控 制終
15、端接口的各種特征 。用戶進程就是通過 ter 2m i os 結構來設置和修改終端屬性的 。struct ter m i os tcflag_tc_iflag;/3輸入模式標志 3/tcflag_tc_oflag;/3輸出模式標志 3/tcflag_tc_cflag;/3控制模式標志 3/tcflag_tc_lflag;/3局部模式標志 3/cc_tc_line;/3線路設置 3/cc_tc_ccNCCS;/33/;3. 2. 2tty 驅動中最重要的一 中 , tty 核心從用戶那里得到將被 tty 設備的數(shù)據(jù) , 然后把數(shù)據(jù)發(fā)送給 tty 線路設 置驅動程序 , 該驅動程序負責把數(shù)據(jù)傳遞給
16、 tty 驅 動程序 。 tty 驅動程序對數(shù)據(jù)進行格式化 , 然后才 能發(fā)送給硬件 。 從 tty 硬件那里接受的數(shù)據(jù)將回溯 至 tty 驅動程序 , 然后流入 tty 線路設置驅動程序 , 接著是 tty 核心 , 最后用戶從 tty 核心那里得到數(shù)據(jù) 。 有時 tty 驅動程序直接與 tty 核心通信 , tty 核 心將數(shù)據(jù)直接發(fā)送給 tty 驅動程序 , 但通常是 tty 線 路設置驅動程序修改在二者之間流動的數(shù)據(jù)3。在不同的線路設置中 , 數(shù)據(jù)的流向和處理方式 是不同的 。 例如如圖 5所示 , 串行設備在默認狀態(tài) 下和 ppp 撥號連接建立時的數(shù)據(jù)處理方式是不同 的 , 而且數(shù)據(jù)
17、傳入的用戶空間 (或是傳出的用戶空 間 也是不同的 。圖 5中描述了串行設備驅動所 涉及的重要模塊是如何注冊的 (注冊是為了允許 每個程序塊能像內核模塊一樣被調用 , 以及串行 數(shù)據(jù)是如何在不同的線路設置情況下傳輸?shù)?。其 中實線箭頭表示串行設備驅動在默認的線路設置 下的情況下數(shù)據(jù)在不同的驅動程序文件間的流向 , 而點劃線箭頭描述了串行設備驅動在 ppp 撥號連 接的線路設置下的情況 。 3. 3 串行設備驅動的實現(xiàn)如前面所述 , 實現(xiàn)串行設備驅動 (即 tty 驅動 程序 , 就是要定義 tty_driver結構實例和實現(xiàn)結構 中的回調函數(shù) 。而在 uClinux 內核中 (如圖 5所 示
18、, 為了簡化并標準化串行設備驅動的編寫 , 又 在 tty 驅動程序中抽象出了一個串行核心驅動層 serial_core,其中申明了 uart_driver結構 (用來向串行核心驅動注冊一個串行設備硬件控制驅動 , 并 將對串行設備硬件的一組標準控制方法接口 (供 tty_driver結構中的回調函數(shù)使用 封裝在 uart_op s 6結構中 , 另外在 uart_port結構中封裝了串行設備端口的相關參數(shù) , 還對外提供了注冊串行設備 硬件控制驅動的輔助函數(shù) 。6 41 王 欣等 :基于 AR M 和 uClinux 多串口通訊的設計與實現(xiàn) 第 35卷圖 5 串行設備驅動模塊關聯(lián)圖 由于串行
19、核心驅動 serial_core封裝的大部分 的通用串行設備的操作 , 且為串行設備硬件控制驅 動提供了一組實現(xiàn)串行硬件控制的標準接口 , 這就 大大簡化了編寫此類串行設備驅動的難度 。只需 針對特定的硬件實現(xiàn)這一組方法和對應的中斷服 務程序 , 就基本上實現(xiàn)了串行設備驅動 。 (如果在 某些情況下不適合使用這套標準接口 , 也可以不借 助串行核心驅動 , 而單獨編寫串行設備驅動 。 具體 情況請參考 L inux/uClinux 的串行設備驅動源碼 。 因此 , 實現(xiàn)串行設備硬件控制驅動是本文編寫 串行設備驅動的主要目標 。本文中所需做的就只 是在串行設備硬件控制驅動程序中對端口進行注 冊和
20、實現(xiàn) uart_ops 結構中提供的對端口的一組控 制方法及所需的中斷服務程序 (I SR 。uart_ops 結構是串行核心驅動 serial_core和串 行設備硬件控制驅動之間的主要接口 。它包含控 制硬件的所有方法 。其中重要函數(shù)的偽碼及說明 如下所示 :int (3startup (struct uart_port3port, struct uart_info 3info 重置串行設備對應端口的 F I F O 隊列 ;清除對應端口中斷相關的寄存器的值 ;檢查對應端口線路狀態(tài)寄存器的值判斷 UART 是否存 在 , 如果不存在 , 則立即返回 ;搶占對應端口的中斷資源 , 如果中斷申
21、請出錯 , 則立即 返回 ;初始化對應端口的狀態(tài) ;使能對應的端口中斷并再次重置 F I F O 隊列 ;該函數(shù)在接收字符時調用并使能端口 。此外 , 還有 void (3shutdown (struct uart_port 3port, struct uart_info 3inf o 函數(shù) , 它與 startup ( 函數(shù)操作相反 , 該函數(shù)在關閉端口時調用 , 并釋放 所有的中斷資源 。在串行設備硬件控制驅動中還使用了串行核 心驅動提供的一些輔助函數(shù) 。如在模塊初始化函 數(shù)中使用了 int uart_register_driver(struct uart_driv2 er 3drv 函數(shù)
22、來注冊一個串行設備端口 ; 在模塊卸 載函數(shù)中使用了 void uart_unregister_driver(struct uart_driver3drv 函數(shù)移除串行設備端口 。 中斷處理是串行設備硬件控制驅動中的重要 部分 , 當接收 F I F O 中的字符和發(fā)送 F I F O 中的字 符數(shù)到達觸發(fā)等級的時候都會觸發(fā)系統(tǒng)中斷進行 處理 。為了減少中斷次數(shù) , 提高收發(fā)效率 , 在設置 端口參數(shù)時 , 設置接收 F I F O 至少有 8個字符時就 觸發(fā)中斷 , 設置發(fā)送 F I F O 至少有 8個空位時就觸 發(fā)中斷 。當注冊中斷服務程序時 , 如“ request_irq (port
23、 ->irq, handler, S A _I N TERRUPT, “ tl16c751buart_int_pr oc ” , info ; ” , 驅動將通知內 核該串行設備將使用 port ->irq 對應的中斷號 (本文驅動中使用的中斷號是 22、 23 。 handler 指 向的是中斷服務函數(shù)的地址 , S A _I N TERRUPT 說 明注冊的是一個快速中斷 。由于每個 UART 都分 配了一個中斷 , 且 UART 收發(fā)字符都會產(chǎn)生中斷 , 因此在中斷服務函數(shù)中應對兩種中斷分別進行處 理 , 這可由中斷標示寄存器 II R 的值來區(qū)分 。 其中 發(fā)送中斷的操作如
24、圖 7所示 。為了解決字符型設備的外設處理速度和 CP U 的處理速度不匹配問題 , 往往需要緩沖 。一般的 7 41第 35卷 (2007 第 8期 計算機與數(shù)字工程 UART 控制器都帶有不多于幾十個比特的 F I F O,但這遠遠不夠 , 還需要從主存中開辟緩沖區(qū) , 具體大小視情況而定 。 在 tty 驅動程序中緩沖區(qū)采用的 是一種環(huán)形緩沖區(qū) , 如圖 6所示 。 當接收中斷到來 后中斷服務程序從 UART 的 F I F O 中讀入接收的字 節(jié) , 放入接收環(huán)形緩沖區(qū)的頭 , 然后喚醒處于睡眠 狀態(tài)的用戶讀操作 。用戶讀操作將接收緩沖區(qū)尾 部的數(shù)據(jù)傳給用戶空間 。 當用戶進程想讀操作
25、 , 而 接收緩沖區(qū)無數(shù)據(jù)時 , 用戶讀進程睡眠在讀等待隊 列上 , 直到 UART 有新的數(shù)據(jù)到來 , 斷時才被喚醒。 當發(fā)送中斷到來后 , , 當 用戶進程想寫操作 , 用戶寫進 程睡眠在寫等待隊列上 , 直到 UART 產(chǎn)生新的發(fā)送 中斷 , 讀走發(fā)送緩從區(qū)的數(shù)據(jù)時才被喚醒。當中斷服務函數(shù)退出前 , 應該清除中斷 。 清除 中斷有兩步 :一是清除 UART 端口的中斷請求信 號 , 只需設置 UART 的中斷使能寄存器關閉中斷即 可 。 二是清除 CP U 的相應中斷請求 位 , 只需對 S3C44B0X 的中斷掛起寄存器相應位置 1即可 。圖 6 接收 /發(fā)送緩沖示意圖中斷服務程序的偽碼如下所示 :void tl16c752buart_int_pr oc (int irq , void 3dev_id , struct p t_regs3regs 清除中斷請求位 ;判斷該中斷來自哪個 UART 端口 ; 讀取該端口的中斷標示寄存器 ;if (端口的 tty_struct結構不存在或中斷未發(fā)生 退出本程序 ;s witch (中斷標示寄存器 case 發(fā)送中斷 :調用中斷發(fā)送函數(shù) ;break; case 接收中斷 :case 接收超時中斷 :調用中斷接收函數(shù) ;break; default:break; 中
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年幼兒園后勤工作計劃書格式
- 2025年白酒銷售個人工作計劃范文
- 2025年大學新學期學習部成員的個人工作計劃
- Unit 6 Survival Using language 說課稿-2024-2025學年高中英語外研版(2019)選擇性必修第二冊
- 綠化施工員工作職責及具體內容
- Unit 1 Cultural Heritage Discovering Useful Structures 說課稿-2024-2025學年高中英語人教版(2019)必修第二冊
- 2025年度教學工作計劃范文工作計劃范文
- 人教版歷史與社會八年級上冊4.3.1《高度集權的北宋政權》說課稿
- 2025年秋季學期教師工作計劃范文
- 2025年節(jié)能減排工作季度總結與計劃
- SB/T 10412-2007速凍面米食品
- 數(shù)控線切割機床的手工編程
- -油水井小修工藝技術課件
- (完整版)兒童醫(yī)學康復科疾病護理常規(guī)
- 2022閥門制造作業(yè)指導書
- 科技創(chuàng)新社團活動教案課程
- 建筑結構加固工程施工質量驗收規(guī)范表格
- 部編版語文六年級上冊作文總復習課件
- 無水氯化鈣MSDS資料
- 專利產(chǎn)品“修理”與“再造”的區(qū)分
- 氨堿法純堿生產(chǎn)工藝概述
評論
0/150
提交評論