1. 程式人生 > >基於ARM9和Linux的嵌入式列印終端系統

基於ARM9和Linux的嵌入式列印終端系統

張 臻

碩士研究生

南京資訊工程大學601信箱,南京210044

0 引言

隨 著開放原始碼運動的飛速發展,Linux作業系統越來越受到人們的重視。其良好的可裁減性與可移植性,卓越的效率和穩定性,以及支援多種處理器體系架構的 特點,使得Linux越來越廣泛的應用於嵌入式領域。同時,ARM9處理器高主頻的處理速度、大容量的快閃記憶體晶片和MMU控制單元的支援,使得執行嵌入式 Linux變得穩定而高效。本文設計與實現的列印終端系統,正是基於這兩個軟硬體平臺搭建起來的。

1 嵌入式列印終端系統的設計原理


                                             

                        

圖1 列印終端原理圖

嵌 入式列印終端原理連線圖如圖1所示。主要由開發板、主機、印表機和掃描器四部分組成。主機是一臺PC機。開發板採用的是三星公司S3C2410開發 板,ARM9的核,跑的是2.4核心版本的嵌入式Linux作業系統。掃描器為超市等用的手持掃描器。再加一臺微型印表機接在開發板的GPIO口上。

工作流程為:開發板將掃描器的資料從串列埠讀出,然後通過網口將資料傳送給主機進行檢索處理。開發板等待直至接收到主機處理完畢的資料後轉發給印表機,將資訊打印出來。

2 嵌入式列印終端系統的硬體設計

2.1硬體開發平臺S3C2410結構

三 星公司的S3C2410開發板用的是32位RISC架構基於ARM920T核,其增強的MMU單元、AMBA匯流排,可以支援WinCE、Linux等實時 作業系統。片上資源豐富介面眾多,包含LCD控制器、USB Host、CS9800A網路晶片、SD卡、3個UART通用非同步序列口等裝置介面。[1]



2.2印表機與開發板介面電路的設計

我 們使用的微型印表機使用的是並行介面。由於開發板上沒有提供並口,所以必須自己設計一個板卡介面電路,以連線印表機的並口和我們的嵌入式開發板。檢視 S3C2410的電路原理圖,由於此係統不需要用到LCD屏,可以將板子上用於LCD連線的GPIO口進行改造,根據ARM9core的LCD電路引腳和 板上的LCD插槽定義,如圖2,找到了14根空閒的GPIO口:

gpio_c8~gpio_d15,gpi0_d0~gpio_d4。用這14根通用輸入輸出口連線微型印表機的並口。



圖2 核心core的LCD引腳和板上LCD引腳原理圖

同時檢視印表機的電路手冊和管腳定義,選用其STB選通線、ACK回答脈衝線、BUSY線、DATA0-DATA7資料線來與開發板的GPIO口相連,並初始化高低電平值。為了避免接線過緊互相干擾,製作一個介面板定義各引腳連線如圖3所示。

至此,硬體的電路設計及連線基本完成。

 SHAPE  /* MERGEFORMAT

圖3 印表機並口與開發板GPIO口介面板設計圖

3嵌入式列印終端系統的軟體設計

軟體平臺採用的是基於2.4核心的嵌入式Linux系統。採用的交叉編譯器工具包為CROSS2.95.3.tgz(包含arm-linux-gcc等)。

3.1 印表機驅動的編寫

Linux的裝置分為塊裝置,字元裝置和網路裝置,該系統使用到的微型印表機屬於字元裝置,下面將具體說明如何設計印表機驅動。

3.1.1  定義裝置名

#define DEVICE_NAME weida_printer

3.1.2  模組函式設計

在該系統中,採用模組化載入驅動程式的方法,因此必須實現模組的初始化函式和解除安裝函式。採用devfs方式註冊印表機。

初始化函式weida_init通過devfs_register函式向系統註冊裝置。

函式原型devfs_register(NULL, DEVICE_NAME, DEVFS_FL_DEFAULT, 0, 0, S_IFCHR | S_IRUSR | S_IWUSR,  &weida_printer_fops, NULL);

其中,DEVICE_NAME為主裝置名,weida_printer_fops為定義的一個數據結構,用來實現的檔案操作,包括open、close、write等。

3.1.3  初始化列印埠

初始化印表機第一個要做的事情就是要對GPIO口進行初始化,初始化函式如下:

static void weida_init(void){

devfs_register(); /*註冊裝置驅動*/

set_gpio_ctrl(WEIDA_STB|GPIO_PULLUP_DIS|GPIO_MODE_OUT); /*設定STB口*/

    write_gpio_bit(WEIDA_STB,1);

    weida_printer_io_port_init();

/*設定其它IO口,以及賦初值*/ }

其中,WEIDA_STB為連線印表機選通口初始化為高電平,GPIO_PULL_DIS是設定是否需要上拉電阻,GPIO_MODE_OUT 設定GPIO口為輸出口。最後使用module_init(weida_printer_init);採用模組方式載入驅動。[2]



3.1.4  介面函式設計

ioctl()函式主要完成印表機字型、行距等引數的設定,在設計過程中必須解決使用者資料和核心資料之間如何傳遞。從使用者態讀取資料,然後在核心態執行,可以使用copy_from_user函式來完成傳遞資料。

weida_printer_write ( )先對印表機是否線上,是否忙,是否準備好做進一步的判斷,然後再進行列印。在列印的時候要注意每發一個字元要延遲150毫秒,因為如果列印資料發得過快印表機的來不急處理,所以要設定延時。

open/close函式開啟/關閉檔案,因為在LINUX下裝置都是當作檔案來操作的,所以需要open和close這兩個介面函式。

3.2 掃描器串列埠的設定

嵌入式移動列印終端中使用到的掃描器是串列埠掃描器,這種掃描器相對於USB介面的掃描器來說,控制較簡單,在掃描器掃描後,可以直接從串列埠讀取資料。

3.2.1  串列埠設定[3]

設定串列埠速率函式:set_speed(int fd, int speed),其中fd 為開啟的裝置檔案,speed為速率。

設 置串列埠引數:set_parity(int fd,int databits,int stopbits,int parity),databits為有多少個數據位,stopbit為設定多少個停止位,parity為奇偶校驗位設定。設定串列埠波特率為9600,資料 位為8位,一位停止位,沒有校驗位。

3.2.2  編寫讀取掃描器資料函式

首先開啟裝置檔案,該系統中使用的串列埠為串列埠2,因此開啟函式為:

open(“/dev/ttyS1”,O_RDWR|O_NONBLOCK|O_NDELAY);其中,O_RDWR表示可讀可寫,O_NONBLOCK表示非堵塞模式,O_NDELAY表示沒有延遲,立即發出去。

3.2.3 客戶端和伺服器的socket編寫

嵌入式列印終端採用C/S的模式,把PC機作為伺服器,開發板作為客戶端,通過乙太網連線。客戶端建立一個socket連線去尋找PC機上的服務程式。PC機上同時也執行一個socket用來listen請求和繫結。採用的是TCP的連線方式。

3.4 主應用程式的設計

開發板上的應用程式Main函式註冊兩個執行緒p1和p2,兩個全域性陣列c1和c2。

執行緒p1將從串列埠讀到的資料放入c1中,然後sent socket直接從c1中取走資料傳送給伺服器。執行緒p2負責將received socket資料放入c2陣列中,然後直接從c2取走資料交給印表機去列印。

這裡對執行緒使用了兩個訊號量,並初始化為:sem_init(&sem1,0,1); sem_init(&sem2,0,0);[4]

兩個執行緒的核心程式碼如下:

void thread1(void) {

    開啟串列埠;設定串列埠;建立連線;

    while(1)    {

        sem_wait(&sem1);

        從串列埠讀書據;

用clinetsocket傳送出去;

        sem_post(&sem2);}

}

void thread2(void)  {

    開啟印表機裝置;

    while(1)    {

        sem_wait(&sem2);

        接收資料;扔給印表機;

        sem_post(&sem1);    }

}

如此可以使兩個執行緒得以同步執行,並可以執行多次掃描和列印任務。

本 文作者創新點及其經濟效益:本系統具有移動性強,功耗低等特點,而且與以往傳統的用PC機實現的列印終端相比,還具有低成本優勢。能廣泛地應用於超市收銀 系統,銀行自動存取款機,等各種工業領域。筆者試驗了一下把802.11g的無線網絡卡移植到開發板上,併成功實現了和主機的無線通訊,使得該系統更加便 攜。根據對南京各大學校區內超市的研究調查,此係統估計可產生50萬元的經濟效益。

參考文獻:

[1]  SAMSUNG. S3C2410A 200MHz&266MHz 32-BIT RISC MICROPROCESSOR USER’S MANUAL [EB/OL]. http://www.samsung.com/, 2004-03. 35,367-408

[2]  CORBET J, RUBINI A. LINUX裝置驅動程式(第三版)[M]. 中國電力出版社, 2006. 46-74 TP316.81

[3]  孫瓊. 嵌入式LINUX應用程式開發詳解[M]. 人民郵電出版社, 2006. 184-191 TP316.89

[4]  田家林,陳利學,寇向輝. LINUX嵌入式作業系統在ARM上的移植[J]. 微計算機資訊, 2007,4-2:P60-62.