




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、河南理工大學計算機科學與技術學院課程設計報告2012 2013學年第 一 學期 課程名稱:嵌入式系統課程設計設計題目:基于ARM9和Linux的 嵌入式打印終端系統學生姓名: 學 號: 專業班級: 指導教師: 2012 年 12月 23 日 目 錄1 嵌入式打印終端系統的設計原理22 嵌入式打印終端系統的硬件設計3 2.1硬件開發平臺S3C2410結構 3 2.2 嵌入式開發板 3 2.3打印機與開發板接口電路的設計33 嵌入式打印終端系統的軟件設計5 3.1軟件選型5 3.2 打印機驅動的編寫 5 3.3 掃描儀串口的設置 7 3.4 主應用程序的設計11參考文獻 12附錄 12基于ARM9
2、和Linux的嵌入式打印終端系統引 言 隨著開放源代碼運動的飛速發展, Linux 操作系統越來越受到人們的 重視。其良好的可裁減性與可移植性, 卓越的效率和穩定性, 以及支持多種處 理 器體系架構的特點, 使得Linux 越來越廣泛的應用于嵌入式領域。同時, ARM9 處理器高主頻的處理速度、大容量的閃存芯片和MMU控制單元的支持, 使得運 行嵌入式Linux 變得穩定而高效。本文設計與實現的打印終端系統, 正是基于 這兩個軟硬件平臺搭建起來的。1 嵌入式打印終端系統的設計原理圖1 嵌入式移動打印終端架構嵌入式打印終端原理連接圖如圖1所示。主要由開發板、主機、打印機和掃描儀四部分組成。主機是
3、一臺PC機。開發板采用的是三星公司S3C2410開發板,ARM9的核,跑的是2.4內核版本的嵌入式Linux操作系統。掃描儀為超市等用的手持掃描儀。再加一臺微型打印機接在開發板的GPIO口上。工作流程為:開發板將掃描儀的數據從串口讀出,然后通過網口將數據發送給主機進行檢索處理。開發板等待直至接收到主機處理完畢的數據后轉發給打印機,將信息打印出來。2 嵌入式打印終端系統的硬件設計2.1硬件開發平臺S3C2410結構三星公司的S3C2410開發板用的是32位RISC架構基于ARM920T核,其增強的MMU單元、AMBA總線,可以支持Win CE、 Linux等實時操作系統。片上資源豐富接口眾多,包
4、含LCD控制器、USB Host、CS9800A網絡芯片、SD卡、3個UART通用異步串行口等設備接口。 2.2 嵌入式開發板嵌入式開發板是本系統的核心部件,它擔負著整個系統中心樞紐的重擔,同時,它的選型也直接影響到上層操作系統和其它部件的選型。所以,在選擇這個部件時,要站在整個系統的高度來進行。選擇嵌入式開發板要考慮的因素非常多,但必須首先考慮下面幾個核心要素: 接口類型:在本系統中,嵌入式開發板連接著掃描儀、遠程服務器和微型打印機。所以,開發板上必須具備和這些部件連接的接口,如和掃描儀連接時需要的RS-232C串口,和遠程服務器連接時的網絡接口,和微型打印機連接時的打印接口。 所支持的操作
5、系統:嵌入式開發和單片機開發核心的區別之一就是嵌入式開發往往基于一個操作系統之上來進行。嵌入式操作系統種類繁多,各具特色,因此,必須要選擇一個較通用和易用的操作系統平臺。在本開發實例中,我們選擇嵌入式Linux作為后面的平臺開發。 性價比:如果作為產品來開發,必須要考慮產品在價格上的競爭要素。嵌入式開發板可以自己設計,也可以直接購買市場上已有的成熟開發板,當然這種開發板一定是能夠滿足使用的最小系統,即裁減掉任何用不到的多余軟/硬件。如果選擇購買其他公司已有的開發板,首先要看該開發板是否穩定,其次要看該開發板是否能夠提供所需的軟件,比如各個部件的驅動;再次要看開發板的售后支持。2.3打印機與開發
6、板接口電路的設計我們使用的微型打印機使用的是并行接口。由于開發板上沒有提供并口,所以必須自己設計一個板卡接口電路,以連接打印機的并口和我們的嵌入式開發板。查看S3C2410的電路原理圖,由于此系統不需要用到LCD屏,可以將板子上用于LCD連接的GPIO口進行改造,根據ARM9core的LCD電路引腳和板上的LCD插槽定義,如圖2,找到了14根空閑的GPIO口:gpio_c8gpio_d15,gpi0_d0gpio_d4。用這14根通用輸入輸出口連接微型打印機的并口。 圖2 核心core 的LCD引腳和板上LCD引腳原理圖同時查看打印機的電路手冊和管腳定義,選用其STB選通線、ACK回答脈沖線、
7、BUSY線、DATA0-DATA7數據線來與開發板的GPIO口相連,并初始化高低電平值。為了避免接線過緊互相干擾,制作一個接口板定義各引腳連接如圖3所示。至此,硬件的電路設計及連接基本完成。 圖3 打印機并口與開發板GPIO口接口板設計圖3 嵌入式打印終端系統的軟件設計軟件平臺采用的是基于2.4內核的嵌入式Linux系統。采用的交叉編譯器工具包為CROSS2.95.3.tgz(包含arm-linux-gcc等)。 3.1軟件選型嵌入式系統是一個軟/硬件相結合的系統,硬件好比人的身體,而運行在其上的軟件則好比人的靈魂。沒有軟件的駕馭,硬件只是一些廢銅爛鐵,因此,相比較硬件選型而言,軟件的選擇也異
8、常重要。在整個軟件選型中,要特別重視兩個方面的因素: 運行其上的嵌入式操作系統:嵌入式操作系統是整個軟件的核心和基礎,的功能的強大與否直接影響后面整個系統的設計,因此必須加以重視。目前嵌入式操作系統有幾百種之多,它們各具特色,各有相應的用武之地。通常來說,各個嵌入式開發板提供商,在其嵌入式開發板上會提供已經移植好的的幾個嵌入式操作系統,這些操作系統通常為嵌入式Linux、Win CE、Vx Works和u CosII。uCosII是一個非常好的教學操作系統,但由于其功能較少,在商用領域使用比較少。而Vx Works由于較昂貴的使用費用,在中小型公司中使用也較少。WinCE主要用于PDA等領域,
9、嵌入式Linux由于其源碼開放,共享資源豐富,整個系統功能異常強大,因此在嵌入式領域應用得也最為廣泛。 軟件驅動支持:由于不同的嵌入式開發板上提供的接口也各不相同,因此Linux內核源碼包不可能提供所有外設接口的底層驅動。通常情況下,這些底層驅動或者由嵌入式開發板提供商做好后提供給用戶使用,或者由用戶自己開發出來。而底層驅動的開發是整個系統設計中比較耗時的工作,所以用戶在選擇開發板時,盡量選擇已提供自己所需要的底層驅動的開發板,這樣可以縮短項目的開發周期,減少項目投資,提高整個產品的競爭力。 3.2 打印機驅動的編寫Linux的設備分為塊設備,字符設備和網絡設備,該系統使用到的微型打印機屬于字
10、符設備,下面將具體說明如何設計打印機驅動。 3.2.1 定義設備名#define DEVICE_NAME weida_printer 3.2.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);其中,DEV
11、ICE_NAME為主設備名,weida_printer_fops為定義的一個數據結構,用來實現的文件操作,包括open、close、write等。 3.2.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_in
12、it();/*設置其它IO口,以及賦初值*/ 其中,WEIDA_STB為連接打印機選通口初始化為高電平,GPIO_PULL_DIS是設置是否需要上拉電阻,GPIO_MODE_OUT 設置GPIO口為輸出口。最后使用module_init(weida_printer_init);采用模塊方式加載驅動。 3.2.4打印機驅動測試程序設計通過上面幾個步驟,打印機驅動模塊已經注冊到內核,在/dev目錄下可以找到weida_printer設備。編寫如下簡單程序測試代碼。int main(void) int weida_fd,ret; char *data=“Hello,welcom to use wei
13、da printer!“; weida_fd=open(“/dev/weida_printer”,O_WRONLY); /打開/dev/weida_printer設備 if(weida_fd0) perror(“open device buttons”); exit(1);ret=write(weida_fd,data,strlen(data);/向打印機輸出數據,打印“Hello”字符串if(ret!=strlen(data) perror(“print wrongn”);ioctl(weida_fd,WEIDA_IOCSLINESPACE,1);sleep(1);ret=write(wei
14、da_fd,data,strlen(data);if(ret!=strlen(data) perror(“print wrongn”);close(weida_fd);return 0; 3.2.5接口函數設計 ioctl()函數主要完成打印機字體、行距等參數的設置,在設計過程中必須解決用戶數據和內核數據之間如何傳遞。從用戶態讀取數據,然后在內核態運行,可以使用copy_from_user函數來完成傳遞數據。 weida_printer_write ( )先對打印機是否在線,是否忙,是否準備好做進一步的判斷,然后再進行打印。在打印的時候要注意每發一個字符要延遲150毫秒,因為如果打印數據發得過
15、快打印機的來不急處理,所以要設置延時。open/close函數打開/關閉文件,因為在LINUX下設備都是當作文件來操作的,所以需要open和close這兩個接口函數。 3.3 掃描儀串口的設置 嵌入式移動打印終端中使用到的掃描儀是串口掃描儀,這種掃描儀相對于USB接口的掃描儀來說,控制較簡單,在掃描儀掃描后,可以直接從串口讀取數據。 3.3.1 串口設置 設置串口速率函數:set_speed(int fd, int speed),其中fd 為打開的設備文件,speed為速率。設置串口參數:set_parity(int fd,int data bits,int stop bits,int par
16、ity),data bits為有多少個數據位,stop bit為設置多少個停止位,parity為奇偶校驗位設置。設置串口波特率為9600,數據位為8位,一位停止位,沒有校驗位。void set_speed(int fd,int speed)int j;int status;struct termios Opt;tcgetattr(fd,&Opt);for(i=0;isizeof(speed_arr)/sizeof(int);i+)if(speed=name_arri)tcflush(fd,TCIOFLUSH);cfsetispeed(&Opt,speed_arri);cfsetospeed(&
17、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)用于設置串口的通信參數,其中databits設置數據位位數,stopbit設置停止位位數,partity設置奇偶校驗位。具體的函數代碼如下:int set_partity(int fd,int databits,int stopbits,int par
18、tity) 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 sizen”); return FALSE;switch(partity)case n:case N
19、: 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.c_cflag&=PARENB;options.c_cflag&=CSTOP; break;defaul
20、t: 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 編寫讀取掃描儀數據函數 首先打開設備文件,該系統中使用的串口為串口2,因此打開函數為:open(“/dev/ttyS1”,O_RDWR|O_NONBLOCK|O_N
21、DELAY);其中,O_RDWR表示可讀可寫,O_NONBLOCK表示非堵塞模式,O_NDELAY表示沒有延遲,立即發出去。 3.3.3 客戶端和服務器的socket編寫 嵌入式打印終端采用C/S的模式,把PC機作為服務器,開發板作為客戶端,通過以太網連接。客戶端建立一個socket連接去尋找PC機上的服務程序。PC機上同時也運行一個socket用來listen請求和綁定。采用的是TCP的連接方式。 3.4 主應用程序的設計 開發板上的應用程序Main函數注冊兩個線程p1和p2,兩個全局數組c1和c2。線程p1將從串口讀到的數據放入c1中,然后sent socket直接從c1中取走數據發送給服
22、務器。線程p2負責將received socket數據放入c2數組中,然后直接從c2取走數據交給打印機去打印。 這里對線程使用了兩個信號量,并初始化為:sem_init(&sem1,0,1); sem_init(&sem2,0,0);兩個線程的核心代碼如下:void thread1(void) 打開串口;設置串口;建立連接; while(1) sem_wait(&sem1); 從串口讀書據;用clinetsocket發送出去; sem_post(&sem2);void thread2(void) 打開打印機設備; while(1) sem_wait(&sem2); 接收數據;扔給打印機; se
23、m_post(&sem1); 如此可以使兩個線程得以同步運行,并可以執行多次掃描和打印任務。總結 本文創新點及其經濟效益:本系統具有移動性強,功耗低等特點,而且與以往傳統的用PC 機實現的打印終端相比,還具有低成本優勢。能廣泛地應用于超市收銀系統,銀行自動存取款機,等各種工業領域。把802.11g的無線網卡移植到開發板上,就可以成功實現和主機的無線通信,使得該系統更加便攜。參考文獻1 ARM嵌入式系統原理及應用開發.譚會生.西安電子科技大學出版社,2012 .2 CORBET J, RUBINI A. LINUX設備驅動程序(第三版)M. 中國電力出社, 2006. 46-74 TP316.8
24、13 孫瓊. 嵌入式LINUX應用程序開發詳解M. 人民郵電出版社, 2006. 184-191 TP316.894 田家林,陳利學,寇向輝 LINUX嵌入式操作系統在ARM上的移植J. 微計算機信息, 2007,4-2:P60-62附錄:(部分程序)#define DEVICE_NAME “weida_printer”#define WEIDA_MAJOR 234 module_init(weida_printer_init);module_exit(weida_printer_exit);MODULE_LICENSE(“GPL”);static int module_init(weida_
25、printer_init) int ret; ret=register_chrlev(WEIDA_MAJOR,DEVICE_NAME,&weida_printer_fops); if(ret0) printf(DEVICE_NAME ”cant register major numbern”); return ret;weida_printer_io_port_init();weida_init();printf(“weida_printer_init!n“);return ret;gpio_data_tb=GPIO_C8,GPIO_C9,GPIO_C10,GPIO_C11,GPIO_C12,
26、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_ERROR GPIO_D4 static void weida_printer_to_init(void) int I; unsigned gpio; for(i=0;iDAT
27、A_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|GPIO_MODE_IN);set_gpio_ctrl(WEIDA_BUSY|GPIO_PULLUP_DIS|GPIO_MODE_IN);set_gpio_ctrl(WEIDA_SELE
28、CT|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) unsigned char *kbuf; int ready; /判斷打印機是否忙 ready=read_gpio_bit(WEIDA_BUSY); if(ready) return EBUS
29、Y;/判斷打印機是否在線 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(kbuf,buffer,count) printf(“copy form user wrong!”); kfree(kbuf); return EFAULT;while(*kbu
30、f!=”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 arg) int num; switch(cmd)case WEIDA_IOCSFONTSPACE: copy_form_user(&num,&arg,sizeof num); SET
31、_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(num); break;case WEIDA_IOCSCHARACTER1: SELECT_CHARACTER1; break;case WEIDA_IOCSCHARACTER2: SELECT_CHARACTER2; brea
32、k;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(&num,&arg,sizeof num); LANDSCAPE_AMPLIFY(num); break;case WEIDA_IOCVAMPLIFY: copy_form_user(&num,&arg,sizeof num); VERTICAL_A
33、MPLIFY(num); break;case WEIDA_IOCSLANDSCAPE: SET_LANDSCAPE; break;case WEIDA_IOCSVERTICAL: SET_VERTICAL; break;case WEIDA_IOCSRIGHTLIMIT: copy_form_user(&num,&arg,sizeof num); SET_RIGHT_LIMIT(num); break;case WEIDA_ IOCSLEFTLIMIT: copy_form_user(&num,&arg,sizeof num); SET_LEFT_LIMIT(num); break;case
34、 WEIDA_ IOCSHEX_PRINT: copy_form_user(&num,&arg,sizeof num); HEX_PRINT(num); break;case WEIDA_ IOCS2HANZI: SET_2_HANZI; break;case WEIDA_ 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;isizeof(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(f
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025深圳市汽車租賃合同書范文
- 技術總監聘用合同書范文二零二五年
- 合同作廢協議
- 二零二五版全新貨物外包運輸合同書
- 知識產權業務合作合同二零二五年
- 二零二五版土地及廠房租賃合同范例
- 2025標準股權投資合同模板
- 2025修訂版大學生實習實踐合同協議范本參考模板
- 2025標準酒店員工勞動合同
- 2025授權合同(標準)
- 交房通知短信(5篇)
- 高中英語 A precious family dinner說課課件
- 工藝聯鎖圖識讀
- 2023年中南大學湘雅二醫院康復醫學與技術崗位招聘考試歷年高頻考點試題含答案解析
- GB/T 21567-2008危險品爆炸品撞擊感度試驗方法
- 衛生人才培養方案計劃
- DB64-T 1684-2020 智慧工地建設技術標準-(高清可復制)
- 婚喪嫁娶事宜備案表
- “三級”安全安全教育記錄卡
- 風生水起博主的投資周記
- 賽艇賽事活動推廣方案
評論
0/150
提交評論