基于ARM9和Linux的嵌入式打印終端系統(tǒng)(共19頁)_第1頁
基于ARM9和Linux的嵌入式打印終端系統(tǒng)(共19頁)_第2頁
基于ARM9和Linux的嵌入式打印終端系統(tǒng)(共19頁)_第3頁
基于ARM9和Linux的嵌入式打印終端系統(tǒng)(共19頁)_第4頁
基于ARM9和Linux的嵌入式打印終端系統(tǒng)(共19頁)_第5頁
已閱讀5頁,還剩14頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上河南理工大學計算機科學與技術學院課程設計報告2012 2013學年第 一 學期 課程名稱:嵌入式系統(tǒng)課程設計設計題目:基于ARM9和Linux的 嵌入式打印終端系統(tǒng)學生姓名: 學 號: 專業(yè)班級: 指導教師: 2012 年 12月 23 日 目 錄1 嵌入式打印終端系統(tǒng)的設計原理22 嵌入式打印終端系統(tǒng)的硬件設計3 2.1硬件開發(fā)平臺S3C2410結構 3 2.2 嵌入式開發(fā)板 3 2.3打印機與開發(fā)板接口電路的設計33 嵌入式打印終端系統(tǒng)的軟件設計5 3.1軟件選型5 3.2 打印機驅(qū)動的編寫 5 3.3 掃描儀串口的設置 7 3.4 主應用程序的設計11參考文獻

2、12附錄 12基于ARM9和Linux的嵌入式打印終端系統(tǒng)引 言 隨著開放源代碼運動的飛速發(fā)展, Linux 操作系統(tǒng)越來越受到人們的 重視。其良好的可裁減性與可移植性, 卓越的效率和穩(wěn)定性, 以及支持多種處 理 器體系架構的特點, 使得Linux 越來越廣泛的應用于嵌入式領域。同時, ARM9 處理器高主頻的處理速度、大容量的閃存芯片和MMU控制單元的支持, 使得運 行嵌入式Linux 變得穩(wěn)定而高效。本文設計與實現(xiàn)的打印終端系統(tǒng), 正是基于 這兩個軟硬件平臺搭建起來的。1 嵌入式打印終端系統(tǒng)的設計原理圖1 嵌入式移動打印終端架構嵌入式打印終端原理連接圖如圖1所示。主要由開發(fā)板、主機、打印機

3、和掃描儀四部分組成。主機是一臺PC機。開發(fā)板采用的是三星公司S3C2410開發(fā)板,ARM9的核,跑的是2.4內(nèi)核版本的嵌入式Linux操作系統(tǒng)。掃描儀為超市等用的手持掃描儀。再加一臺微型打印機接在開發(fā)板的GPIO口上。工作流程為:開發(fā)板將掃描儀的數(shù)據(jù)從串口讀出,然后通過網(wǎng)口將數(shù)據(jù)發(fā)送給主機進行檢索處理。開發(fā)板等待直至接收到主機處理完畢的數(shù)據(jù)后轉(zhuǎn)發(fā)給打印機,將信息打印出來。2 嵌入式打印終端系統(tǒng)的硬件設計2.1硬件開發(fā)平臺S3C2410結構三星公司的S3C2410開發(fā)板用的是32位RISC架構基于ARM920T核,其增強的MMU單元、AMBA總線,可以支持Win CE、 Linux等實時操作系統(tǒng)

4、。片上資源豐富接口眾多,包含LCD控制器、USB Host、CS9800A網(wǎng)絡芯片、SD卡、3個UART通用異步串行口等設備接口。 2.2 嵌入式開發(fā)板嵌入式開發(fā)板是本系統(tǒng)的核心部件,它擔負著整個系統(tǒng)中心樞紐的重擔,同時,它的選型也直接影響到上層操作系統(tǒng)和其它部件的選型。所以,在選擇這個部件時,要站在整個系統(tǒng)的高度來進行。選擇嵌入式開發(fā)板要考慮的因素非常多,但必須首先考慮下面幾個核心要素: 接口類型:在本系統(tǒng)中,嵌入式開發(fā)板連接著掃描儀、遠程服務器和微型打印機。所以,開發(fā)板上必須具備和這些部件連接的接口,如和掃描儀連接時需要的RS-232C串口,和遠程服務器連接時的網(wǎng)絡接口,和微型打印機連接時

5、的打印接口。 所支持的操作系統(tǒng):嵌入式開發(fā)和單片機開發(fā)核心的區(qū)別之一就是嵌入式開發(fā)往往基于一個操作系統(tǒng)之上來進行。嵌入式操作系統(tǒng)種類繁多,各具特色,因此,必須要選擇一個較通用和易用的操作系統(tǒng)平臺。在本開發(fā)實例中,我們選擇嵌入式Linux作為后面的平臺開發(fā)。 性價比:如果作為產(chǎn)品來開發(fā),必須要考慮產(chǎn)品在價格上的競爭要素。嵌入式開發(fā)板可以自己設計,也可以直接購買市場上已有的成熟開發(fā)板,當然這種開發(fā)板一定是能夠滿足使用的最小系統(tǒng),即裁減掉任何用不到的多余軟/硬件。如果選擇購買其他公司已有的開發(fā)板,首先要看該開發(fā)板是否穩(wěn)定,其次要看該開發(fā)板是否能夠提供所需的軟件,比如各個部件的驅(qū)動;再次要看開發(fā)板的售

6、后支持。2.3打印機與開發(fā)板接口電路的設計我們使用的微型打印機使用的是并行接口。由于開發(fā)板上沒有提供并口,所以必須自己設計一個板卡接口電路,以連接打印機的并口和我們的嵌入式開發(fā)板。查看S3C2410的電路原理圖,由于此系統(tǒng)不需要用到LCD屏,可以將板子上用于LCD連接的GPIO口進行改造,根據(jù)ARM9core的LCD電路引腳和板上的LCD插槽定義,如圖2,找到了14根空閑的GPIO口:gpio_c8gpio_d15,gpi0_d0gpio_d4。用這14根通用輸入輸出口連接微型打印機的并口。 圖2 核心core 的LCD引腳和板上LCD引腳原理圖同時查看打印機的電路手冊和管腳定義,選用其STB

7、選通線、ACK回答脈沖線、BUSY線、DATA0-DATA7數(shù)據(jù)線來與開發(fā)板的GPIO口相連,并初始化高低電平值。為了避免接線過緊互相干擾,制作一個接口板定義各引腳連接如圖3所示。至此,硬件的電路設計及連接基本完成。 圖3 打印機并口與開發(fā)板GPIO口接口板設計圖3 嵌入式打印終端系統(tǒng)的軟件設計軟件平臺采用的是基于2.4內(nèi)核的嵌入式Linux系統(tǒng)。采用的交叉編譯器工具包為CROSS2.95.3.tgz(包含arm-linux-gcc等)。 3.1軟件選型嵌入式系統(tǒng)是一個軟/硬件相結合的系統(tǒng),硬件好比人的身體,而運行在其上的軟件則好比人的靈魂。沒有軟件的駕馭,硬件只是一些廢銅爛鐵,因此,相比較硬

8、件選型而言,軟件的選擇也異常重要。在整個軟件選型中,要特別重視兩個方面的因素: 運行其上的嵌入式操作系統(tǒng):嵌入式操作系統(tǒng)是整個軟件的核心和基礎,的功能的強大與否直接影響后面整個系統(tǒng)的設計,因此必須加以重視。目前嵌入式操作系統(tǒng)有幾百種之多,它們各具特色,各有相應的用武之地。通常來說,各個嵌入式開發(fā)板提供商,在其嵌入式開發(fā)板上會提供已經(jīng)移植好的的幾個嵌入式操作系統(tǒng),這些操作系統(tǒng)通常為嵌入式Linux、Win CE、Vx Works和u CosII。uCosII是一個非常好的教學操作系統(tǒng),但由于其功能較少,在商用領域使用比較少。而Vx Works由于較昂貴的使用費用,在中小型公司中使用也較少。Win

9、CE主要用于PDA等領域,嵌入式Linux由于其源碼開放,共享資源豐富,整個系統(tǒng)功能異常強大,因此在嵌入式領域應用得也最為廣泛。 軟件驅(qū)動支持:由于不同的嵌入式開發(fā)板上提供的接口也各不相同,因此Linux內(nèi)核源碼包不可能提供所有外設接口的底層驅(qū)動。通常情況下,這些底層驅(qū)動或者由嵌入式開發(fā)板提供商做好后提供給用戶使用,或者由用戶自己開發(fā)出來。而底層驅(qū)動的開發(fā)是整個系統(tǒng)設計中比較耗時的工作,所以用戶在選擇開發(fā)板時,盡量選擇已提供自己所需要的底層驅(qū)動的開發(fā)板,這樣可以縮短項目的開發(fā)周期,減少項目投資,提高整個產(chǎn)品的競爭力。 3.2 打印機驅(qū)動的編寫Linux的設備分為塊設備,字符設備和網(wǎng)絡設備,該系

10、統(tǒng)使用到的微型打印機屬于字符設備,下面將具體說明如何設計打印機驅(qū)動。 3.2.1 定義設備名#define DEVICE_NAME weida_printer 3.2.2 模塊函數(shù)設計在該系統(tǒng)中,采用模塊化加載驅(qū)動程序的方法,因此必須實現(xiàn)模塊的初始化函數(shù)和卸載函數(shù)。采用devfs方式注冊打印機。初始化函數(shù)weida_init通過devfs_register函數(shù)向系統(tǒng)注冊設備。函數(shù)原型devfs_register(NULL, DEVICE_NAME, DEVFS_FL_DEFAULT, 0, 0, S_IFCHR | S_IRUSR | S_IWUSR, &weida_printer_f

11、ops, NULL);其中,DEVICE_NAME為主設備名,weida_printer_fops為定義的一個數(shù)據(jù)結構,用來實現(xiàn)的文件操作,包括open、close、write等。 3.2.3 初始化打印端口初始化打印機第一個要做的事情就是要對GPIO口進行初始化,初始化函數(shù)如下:static void weida_init(void)devfs_register(); /*注冊設備驅(qū)動*/set_gpio_ctrl(WEIDA_STB|GPIO_PULLUP_DIS|GPIO_MODE_OUT); /*設置STB口*/ write_gpio_bit(WEIDA_STB,1); weida_p

12、rinter_io_port_init();/*設置其它IO口,以及賦初值*/ 其中,WEIDA_STB為連接打印機選通口初始化為高電平,GPIO_PULL_DIS是設置是否需要上拉電阻,GPIO_MODE_OUT 設置GPIO口為輸出口。最后使用module_init(weida_printer_init);采用模塊方式加載驅(qū)動。 3.2.4打印機驅(qū)動測試程序設計通過上面幾個步驟,打印機驅(qū)動模塊已經(jīng)注冊到內(nèi)核,在/dev目錄下可以找到weida_printer設備。編寫如下簡單程序測試代碼。int main(void) int weida_fd,ret; char *data=“Hello,

13、welcom to use weida printer!“; weida_fd=open(“/dev/weida_printer”,O_WRONLY); /打開/dev/weida_printer設備 if(weida_fd<0) perror(“open device buttons”); exit(1);ret=write(weida_fd,data,strlen(data);/向打印機輸出數(shù)據(jù),打印“Hello”字符串if(ret!=strlen(data) perror(“print wrongn”);ioctl(weida_fd,WEIDA_IOCSLINESPACE,1);s

14、leep(1);ret=write(weida_fd,data,strlen(data);if(ret!=strlen(data) perror(“print wrongn”);close(weida_fd);return 0; 3.2.5接口函數(shù)設計 ioctl()函數(shù)主要完成打印機字體、行距等參數(shù)的設置,在設計過程中必須解決用戶數(shù)據(jù)和內(nèi)核數(shù)據(jù)之間如何傳遞。從用戶態(tài)讀取數(shù)據(jù),然后在內(nèi)核態(tài)運行,可以使用copy_from_user函數(shù)來完成傳遞數(shù)據(jù)。 weida_printer_write ( )先對打印機是否在線,是否忙,是否準備好做進一步的判斷,然后再進行打印。在打印的時候要注意每發(fā)一個字

15、符要延遲150毫秒,因為如果打印數(shù)據(jù)發(fā)得過快打印機的來不急處理,所以要設置延時。open/close函數(shù)打開/關閉文件,因為在LINUX下設備都是當作文件來操作的,所以需要open和close這兩個接口函數(shù)。 3.3 掃描儀串口的設置 嵌入式移動打印終端中使用到的掃描儀是串口掃描儀,這種掃描儀相對于USB接口的掃描儀來說,控制較簡單,在掃描儀掃描后,可以直接從串口讀取數(shù)據(jù)。 3.3.1 串口設置 設置串口速率函數(shù):set_speed(int fd, int speed),其中fd 為打開的設備文件,speed為速率。設置串口參數(shù):set_parity(int fd,int data bits,

16、int stop bits,int parity),data bits為有多少個數(shù)據(jù)位,stop bit為設置多少個停止位,parity為奇偶校驗位設置。設置串口波特率為9600,數(shù)據(jù)位為8位,一位停止位,沒有校驗位。void set_speed(int fd,int speed)int j;int status;struct termios Opt;tcgetattr(fd,&Opt);for(i=0;i<sizeof(speed_arr)/sizeof(int);i+)if(speed=name_arri)tcflush(fd,TCIOFLUSH);cfsetispeed(&

17、amp;Opt,speed_arri);cfsetospeed(&Opt,speed_arri);status=tcsetattr(fd,TCSANOW,&Opt);if(status!=0)perror(“tcsetattr fd!”);return;tcflush(fd,TCIOFLUSH); set_partity(int fd,int databits,int stopbits,int partity)用于設置串口的通信參數(shù),其中databits設置數(shù)據(jù)位位數(shù),stopbit設置停止位位數(shù),partity設置奇偶校驗位。具體的函數(shù)代碼如下:int set_partity

18、(int fd,int databits,int stopbits,int partity) struct termiios options; if(tcgetattr(fd,&options)!=0perror(“SetupSerial 1”);return FALSE;options.c_cflag &=CSIZE;switch(databits)case 7: options.c_cflag!=CS7; break;case 8: options.c_cflag|=CS8; break;default: fprintf(stderr,”Unsupported data s

19、izen”); return FALSE;switch(partity)case n:case N: options.c_cflag=PARENB;options.c_cflag=INPCK; break;case o:case O: options.c_cflag|=(PARODD|PARENB);options.c_cflag|=INPCK; break;case e:case E: options.c_cflag|=PARENB;options.c_cflag&=PARODD;options.c_cflag|=INPCK; break;case s:case S: options

20、.c_cflag&=PARENB;options.c_cflag&=CSTOP; break;default: fprintf(stderr,”Unsupported partityn”); return FALSE;switch(stopbits)case 1: options.c-cfag&=CSTOPB; break;case 2: options.c-cfag|=CSTOPB; break;default:fprintf(stderr,”Unsupported stop bitsn”); return FALSE; 3.3.2 編寫讀取掃描儀數(shù)據(jù)函數(shù) 首先打開設

21、備文件,該系統(tǒng)中使用的串口為串口2,因此打開函數(shù)為:open(“/dev/ttyS1”,O_RDWR|O_NONBLOCK|O_NDELAY);其中,O_RDWR表示可讀可寫,O_NONBLOCK表示非堵塞模式,O_NDELAY表示沒有延遲,立即發(fā)出去。 3.3.3 客戶端和服務器的socket編寫 嵌入式打印終端采用C/S的模式,把PC機作為服務器,開發(fā)板作為客戶端,通過以太網(wǎng)連接??蛻舳私⒁粋€socket連接去尋找PC機上的服務程序。PC機上同時也運行一個socket用來listen請求和綁定。采用的是TCP的連接方式。 3.4 主應用程序的設計 開發(fā)板上的應用程序Main函數(shù)注冊兩個線

22、程p1和p2,兩個全局數(shù)組c1和c2。線程p1將從串口讀到的數(shù)據(jù)放入c1中,然后sent socket直接從c1中取走數(shù)據(jù)發(fā)送給服務器。線程p2負責將received socket數(shù)據(jù)放入c2數(shù)組中,然后直接從c2取走數(shù)據(jù)交給打印機去打印。 這里對線程使用了兩個信號量,并初始化為:sem_init(&sem1,0,1); sem_init(&sem2,0,0);兩個線程的核心代碼如下:void thread1(void) 打開串口;設置串口;建立連接; while(1) sem_wait(&sem1); 從串口讀書據(jù);用clinetsocket發(fā)送出去; sem_pos

23、t(&sem2);void thread2(void) 打開打印機設備; while(1) sem_wait(&sem2); 接收數(shù)據(jù);扔給打印機; sem_post(&sem1); 如此可以使兩個線程得以同步運行,并可以執(zhí)行多次掃描和打印任務??偨Y 本文創(chuàng)新點及其經(jīng)濟效益:本系統(tǒng)具有移動性強,功耗低等特點,而且與以往傳統(tǒng)的用PC 機實現(xiàn)的打印終端相比,還具有低成本優(yōu)勢。能廣泛地應用于超市收銀系統(tǒng),銀行自動存取款機,等各種工業(yè)領域。把802.11g的無線網(wǎng)卡移植到開發(fā)板上,就可以成功實現(xiàn)和主機的無線通信,使得該系統(tǒng)更加便攜。參考文獻1 ARM嵌入式系統(tǒng)原理及應用開發(fā).譚

24、會生.,2012 .2 CORBET J, RUBINI A. LINUX設備驅(qū)動程序(第三版)M. 中國電力出社, 2006. 46-74 TP316.813 孫瓊. 嵌入式LINUX應用程序開發(fā)詳解M. 人民郵電出版社, 2006. 184-191 TP316.894 田家林,陳利學,寇向輝 LINUX嵌入式操作系統(tǒng)在ARM上的移植J. 微計算機信息, 2007,4-2:P60-62附錄:(部分程序)#define DEVICE_NAME “weida_printer”#define WEIDA_MAJOR 234 module_init(weida_printer_init);modul

25、e_exit(weida_printer_exit);MODULE_LICENSE(“GPL”);static int module_init(weida_printer_init) int ret; ret=register_chrlev(WEIDA_MAJOR,DEVICE_NAME,&weida_printer_fops); if(ret<0) printf(DEVICE_NAME ”cant register major numbern”); return ret;weida_printer_io_port_init();weida_init();printf(“weid

26、a_printer_init!n“);return ret;gpio_data_tb=GPIO_C8,GPIO_C9,GPIO_C10,GPIO_C11,GPIO_C12,GPIO_13,GPIO_C14,GPIO_C15;#define DATA_NUM(sizeof gpio_data_tab)/sizeof(gpio_data_tab0)#define WEIDA_DATA_READY GPIO_D0#define WEIDA_ACK GPIO_D1#define WEIDA_BUSY GPIO_D2#define WEIDA_SELECT GPIO_D3#define WEIDA_ER

27、ROR GPIO_D4 static void weida_printer_to_init(void) int I; unsigned gpio; for(i=0;i<DATA_NUM;i+) gpio=gpio_data_tabi; set_gpio_ctrl(gpio|GPIO_PULLUP_DIS|GPIO_MODE_OUT); write_gpio_bit(gpio,0);set_gpio_ctrl(WEIDA_DATA_READY|GPIO_PULLUP_DIS|GPIO_MODE_OUT);set_gpio_ctrl(WEIDA_ACk|GPIO_PULLUP_DIS|GPI

28、O_MODE_IN);set_gpio_ctrl(WEIDA_BUSY|GPIO_PULLUP_DIS|GPIO_MODE_IN);set_gpio_ctrl(WEIDA_SELECT|GPIO_PULLUP_EN|GPIO_MODE_IN);set_gpio_ctrl(WEIDA_ERROR|GPIO_PULLUP_EN|GPIO_MODE_IN);printf(“init port!n”);static int weida_printer_write(struct file *file,const char8 buffer,size_t count,loff_t *ppos) unsign

29、ed char *kbuf; int ready; /判斷打印機是否忙 ready=read_gpio_bit(WEIDA_BUSY); if(ready) return EBUSY;/判斷打印機是否在線 readyread_gpio_bit(WEIDA_SELECT); if(!ready) return EAGAIN; ready=read_gpio-bit(WEIDA_ERROR); if(!ready) return EINVAL; kbuf=kmalloc(count+1,GFP_KERNEL); memset(kbuf,”0”,count+1); if(copy_from_user

30、(kbuf,buffer,count) printf(“copy form user wrong!”); kfree(kbuf); return EFAULT;while(*kbuf!=”0”) type_data(*kbuf); while(read_gpio_bit(WEIDA_ACK) printf(“%c”,*kbuf); kbuf+;Kfree(kbuf);Return count;static int weida_printer_ioctl(struct inode *inode,struct file *file,unsigned int cmd,unsigned long ar

31、g) int num; switch(cmd)case WEIDA_IOCSFONTSPACE: copy_form_user(&num,&arg,sizeof num); SET_FONT_SPACE(num); break;case WEIDA_IOCSLINESPACE: copy_form_user(&num,&arg,sizeof num); SET_UNDERLINE(num); break;case WEIDA_IOCSUPLINE: copy_form_user(&num,&arg,sizeof num); SET_UPLINE(

32、num); break;case WEIDA_IOCSCHARACTER1: SELECT_CHARACTER1; break;case WEIDA_IOCSCHARACTER2: SELECT_CHARACTER2; break;case WEIDA_IOCSDOT_MATRIX: copy_form_user(&num,&arg,sizeof num); SELECT_DOT_MATRIX(num); break;case WEIDA_IOCWEIDA: INIT_WEIDA; break;case WEIDA_IOCLAMPLIFY: copy_form_user(&am

33、p;num,&arg,sizeof num); LANDSCAPE_AMPLIFY(num); break;case WEIDA_IOCVAMPLIFY: copy_form_user(&num,&arg,sizeof num); VERTICAL_AMPLIFY(num); break;case WEIDA_IOCSLANDSCAPE: SET_LANDSCAPE; break;case WEIDA_IOCSVERTICAL: SET_VERTICAL; break;case WEIDA_IOCSRIGHTLIMIT: copy_form_user(&num,

34、&arg,sizeof num); SET_RIGHT_LIMIT(num); break;case WEIDA_ IOCSLEFTLIMIT: copy_form_user(&num,&arg,sizeof num); SET_LEFT_LIMIT(num); break;case WEIDA_ IOCSHEX_PRINT: copy_form_user(&num,&arg,sizeof num); HEX_PRINT(num); break;case WEIDA_ IOCS2HANZI: SET_2_HANZI; break;case WEIDA_

35、IOCC2HANZI: CLEAR_2_HANZI; break;default: return EINVAL;printf(“ioctl!n”);return 0;void set_speed(int fd,int speed)int j;int status;struct termios Opt;tcgetattr(fd,&Opt);for(i=0;i<sizeof(speed_arr)/sizeof(int);i+)if(speed=name_arri)tcflush(fd,TCIOFLUSH);cfsetispeed(&Opt,speed_arri);cfsetospeed(&Opt,speed_arri);status=tcsetattr(fd,TCSANOW,&Opt);if(status!=0)perror(“tcsetattr fd!”);return;tcflush(fd,TCIOFLUSH); int se

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論