




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、河南理工大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院課程設(shè)計(jì)報(bào)告2012 2013學(xué)年第 一 學(xué)期 課程名稱(chēng):嵌入式系統(tǒng)課程設(shè)計(jì)設(shè)計(jì)題目:基于ARM9和Linux的 嵌入式打印終端系統(tǒng)學(xué)生姓名: 學(xué) 號(hào): 專(zhuān)業(yè)班級(jí): 指導(dǎo)教師: 2012 年 12月 23 日 目 錄1 嵌入式打印終端系統(tǒng)的設(shè)計(jì)原理22 嵌入式打印終端系統(tǒng)的硬件設(shè)計(jì)3 2.1硬件開(kāi)發(fā)平臺(tái)S3C2410結(jié)構(gòu) 3 2.2 嵌入式開(kāi)發(fā)板 3 2.3打印機(jī)與開(kāi)發(fā)板接口電路的設(shè)計(jì)33 嵌入式打印終端系統(tǒng)的軟件設(shè)計(jì)5 3.1軟件選型5 3.2 打印機(jī)驅(qū)動(dòng)的編寫(xiě) 5 3.3 掃描儀串口的設(shè)置 7 3.4 主應(yīng)用程序的設(shè)計(jì)11參考文獻(xiàn) 12附錄 12基于ARM9
2、和Linux的嵌入式打印終端系統(tǒng)引 言 隨著開(kāi)放源代碼運(yùn)動(dòng)的飛速發(fā)展, Linux 操作系統(tǒng)越來(lái)越受到人們的 重視。其良好的可裁減性與可移植性, 卓越的效率和穩(wěn)定性, 以及支持多種處 理 器體系架構(gòu)的特點(diǎn), 使得Linux 越來(lái)越廣泛的應(yīng)用于嵌入式領(lǐng)域。同時(shí), ARM9 處理器高主頻的處理速度、大容量的閃存芯片和MMU控制單元的支持, 使得運(yùn) 行嵌入式Linux 變得穩(wěn)定而高效。本文設(shè)計(jì)與實(shí)現(xiàn)的打印終端系統(tǒng), 正是基于 這兩個(gè)軟硬件平臺(tái)搭建起來(lái)的。1 嵌入式打印終端系統(tǒng)的設(shè)計(jì)原理圖1 嵌入式移動(dòng)打印終端架構(gòu)嵌入式打印終端原理連接圖如圖1所示。主要由開(kāi)發(fā)板、主機(jī)、打印機(jī)和掃描儀四部分組成。主機(jī)是
3、一臺(tái)PC機(jī)。開(kāi)發(fā)板采用的是三星公司S3C2410開(kāi)發(fā)板,ARM9的核,跑的是2.4內(nèi)核版本的嵌入式Linux操作系統(tǒng)。掃描儀為超市等用的手持掃描儀。再加一臺(tái)微型打印機(jī)接在開(kāi)發(fā)板的GPIO口上。工作流程為:開(kāi)發(fā)板將掃描儀的數(shù)據(jù)從串口讀出,然后通過(guò)網(wǎng)口將數(shù)據(jù)發(fā)送給主機(jī)進(jìn)行檢索處理。開(kāi)發(fā)板等待直至接收到主機(jī)處理完畢的數(shù)據(jù)后轉(zhuǎn)發(fā)給打印機(jī),將信息打印出來(lái)。2 嵌入式打印終端系統(tǒng)的硬件設(shè)計(jì)2.1硬件開(kāi)發(fā)平臺(tái)S3C2410結(jié)構(gòu)三星公司的S3C2410開(kāi)發(fā)板用的是32位RISC架構(gòu)基于ARM920T核,其增強(qiáng)的MMU單元、AMBA總線,可以支持Win CE、 Linux等實(shí)時(shí)操作系統(tǒng)。片上資源豐富接口眾多,包
4、含LCD控制器、USB Host、CS9800A網(wǎng)絡(luò)芯片、SD卡、3個(gè)UART通用異步串行口等設(shè)備接口。 2.2 嵌入式開(kāi)發(fā)板嵌入式開(kāi)發(fā)板是本系統(tǒng)的核心部件,它擔(dān)負(fù)著整個(gè)系統(tǒng)中心樞紐的重?fù)?dān),同時(shí),它的選型也直接影響到上層操作系統(tǒng)和其它部件的選型。所以,在選擇這個(gè)部件時(shí),要站在整個(gè)系統(tǒng)的高度來(lái)進(jìn)行。選擇嵌入式開(kāi)發(fā)板要考慮的因素非常多,但必須首先考慮下面幾個(gè)核心要素: 接口類(lèi)型:在本系統(tǒng)中,嵌入式開(kāi)發(fā)板連接著掃描儀、遠(yuǎn)程服務(wù)器和微型打印機(jī)。所以,開(kāi)發(fā)板上必須具備和這些部件連接的接口,如和掃描儀連接時(shí)需要的RS-232C串口,和遠(yuǎn)程服務(wù)器連接時(shí)的網(wǎng)絡(luò)接口,和微型打印機(jī)連接時(shí)的打印接口。 所支持的操作
5、系統(tǒng):嵌入式開(kāi)發(fā)和單片機(jī)開(kāi)發(fā)核心的區(qū)別之一就是嵌入式開(kāi)發(fā)往往基于一個(gè)操作系統(tǒng)之上來(lái)進(jìn)行。嵌入式操作系統(tǒng)種類(lèi)繁多,各具特色,因此,必須要選擇一個(gè)較通用和易用的操作系統(tǒng)平臺(tái)。在本開(kāi)發(fā)實(shí)例中,我們選擇嵌入式Linux作為后面的平臺(tái)開(kāi)發(fā)。 性?xún)r(jià)比:如果作為產(chǎn)品來(lái)開(kāi)發(fā),必須要考慮產(chǎn)品在價(jià)格上的競(jìng)爭(zhēng)要素。嵌入式開(kāi)發(fā)板可以自己設(shè)計(jì),也可以直接購(gòu)買(mǎi)市場(chǎng)上已有的成熟開(kāi)發(fā)板,當(dāng)然這種開(kāi)發(fā)板一定是能夠滿足使用的最小系統(tǒng),即裁減掉任何用不到的多余軟/硬件。如果選擇購(gòu)買(mǎi)其他公司已有的開(kāi)發(fā)板,首先要看該開(kāi)發(fā)板是否穩(wěn)定,其次要看該開(kāi)發(fā)板是否能夠提供所需的軟件,比如各個(gè)部件的驅(qū)動(dòng);再次要看開(kāi)發(fā)板的售后支持。2.3打印機(jī)與開(kāi)發(fā)
6、板接口電路的設(shè)計(jì)我們使用的微型打印機(jī)使用的是并行接口。由于開(kāi)發(fā)板上沒(méi)有提供并口,所以必須自己設(shè)計(jì)一個(gè)板卡接口電路,以連接打印機(jī)的并口和我們的嵌入式開(kāi)發(fā)板。查看S3C2410的電路原理圖,由于此系統(tǒng)不需要用到LCD屏,可以將板子上用于LCD連接的GPIO口進(jìn)行改造,根據(jù)ARM9core的LCD電路引腳和板上的LCD插槽定義,如圖2,找到了14根空閑的GPIO口:gpio_c8gpio_d15,gpi0_d0gpio_d4。用這14根通用輸入輸出口連接微型打印機(jī)的并口。 圖2 核心core 的LCD引腳和板上LCD引腳原理圖同時(shí)查看打印機(jī)的電路手冊(cè)和管腳定義,選用其STB選通線、ACK回答脈沖線、
7、BUSY線、DATA0-DATA7數(shù)據(jù)線來(lái)與開(kāi)發(fā)板的GPIO口相連,并初始化高低電平值。為了避免接線過(guò)緊互相干擾,制作一個(gè)接口板定義各引腳連接如圖3所示。至此,硬件的電路設(shè)計(jì)及連接基本完成。 圖3 打印機(jī)并口與開(kāi)發(fā)板GPIO口接口板設(shè)計(jì)圖3 嵌入式打印終端系統(tǒng)的軟件設(shè)計(jì)軟件平臺(tái)采用的是基于2.4內(nèi)核的嵌入式Linux系統(tǒng)。采用的交叉編譯器工具包為CROSS2.95.3.tgz(包含arm-linux-gcc等)。 3.1軟件選型嵌入式系統(tǒng)是一個(gè)軟/硬件相結(jié)合的系統(tǒng),硬件好比人的身體,而運(yùn)行在其上的軟件則好比人的靈魂。沒(méi)有軟件的駕馭,硬件只是一些廢銅爛鐵,因此,相比較硬件選型而言,軟件的選擇也異
8、常重要。在整個(gè)軟件選型中,要特別重視兩個(gè)方面的因素: 運(yùn)行其上的嵌入式操作系統(tǒng):嵌入式操作系統(tǒng)是整個(gè)軟件的核心和基礎(chǔ),的功能的強(qiáng)大與否直接影響后面整個(gè)系統(tǒng)的設(shè)計(jì),因此必須加以重視。目前嵌入式操作系統(tǒng)有幾百種之多,它們各具特色,各有相應(yīng)的用武之地。通常來(lái)說(shuō),各個(gè)嵌入式開(kāi)發(fā)板提供商,在其嵌入式開(kāi)發(fā)板上會(huì)提供已經(jīng)移植好的的幾個(gè)嵌入式操作系統(tǒng),這些操作系統(tǒng)通常為嵌入式Linux、Win CE、Vx Works和u CosII。uCosII是一個(gè)非常好的教學(xué)操作系統(tǒng),但由于其功能較少,在商用領(lǐng)域使用比較少。而Vx Works由于較昂貴的使用費(fèi)用,在中小型公司中使用也較少。WinCE主要用于PDA等領(lǐng)域,
9、嵌入式Linux由于其源碼開(kāi)放,共享資源豐富,整個(gè)系統(tǒng)功能異常強(qiáng)大,因此在嵌入式領(lǐng)域應(yīng)用得也最為廣泛。 軟件驅(qū)動(dòng)支持:由于不同的嵌入式開(kāi)發(fā)板上提供的接口也各不相同,因此Linux內(nèi)核源碼包不可能提供所有外設(shè)接口的底層驅(qū)動(dòng)。通常情況下,這些底層驅(qū)動(dòng)或者由嵌入式開(kāi)發(fā)板提供商做好后提供給用戶使用,或者由用戶自己開(kāi)發(fā)出來(lái)。而底層驅(qū)動(dòng)的開(kāi)發(fā)是整個(gè)系統(tǒng)設(shè)計(jì)中比較耗時(shí)的工作,所以用戶在選擇開(kāi)發(fā)板時(shí),盡量選擇已提供自己所需要的底層驅(qū)動(dòng)的開(kāi)發(fā)板,這樣可以縮短項(xiàng)目的開(kāi)發(fā)周期,減少項(xiàng)目投資,提高整個(gè)產(chǎn)品的競(jìng)爭(zhēng)力。 3.2 打印機(jī)驅(qū)動(dòng)的編寫(xiě)Linux的設(shè)備分為塊設(shè)備,字符設(shè)備和網(wǎng)絡(luò)設(shè)備,該系統(tǒng)使用到的微型打印機(jī)屬于字
10、符設(shè)備,下面將具體說(shuō)明如何設(shè)計(jì)打印機(jī)驅(qū)動(dòng)。 3.2.1 定義設(shè)備名#define DEVICE_NAME weida_printer 3.2.2 模塊函數(shù)設(shè)計(jì)在該系統(tǒng)中,采用模塊化加載驅(qū)動(dòng)程序的方法,因此必須實(shí)現(xiàn)模塊的初始化函數(shù)和卸載函數(shù)。采用devfs方式注冊(cè)打印機(jī)。初始化函數(shù)weida_init通過(guò)devfs_register函數(shù)向系統(tǒng)注冊(cè)設(shè)備。函數(shù)原型devfs_register(NULL, DEVICE_NAME, DEVFS_FL_DEFAULT, 0, 0, S_IFCHR | S_IRUSR | S_IWUSR, &weida_printer_fops, NULL);其中,DEV
11、ICE_NAME為主設(shè)備名,weida_printer_fops為定義的一個(gè)數(shù)據(jù)結(jié)構(gòu),用來(lái)實(shí)現(xiàn)的文件操作,包括open、close、write等。 3.2.3 初始化打印端口初始化打印機(jī)第一個(gè)要做的事情就是要對(duì)GPIO口進(jìn)行初始化,初始化函數(shù)如下:static void weida_init(void)devfs_register(); /*注冊(cè)設(shè)備驅(qū)動(dòng)*/set_gpio_ctrl(WEIDA_STB|GPIO_PULLUP_DIS|GPIO_MODE_OUT); /*設(shè)置STB口*/ write_gpio_bit(WEIDA_STB,1); weida_printer_io_port_in
12、it();/*設(shè)置其它IO口,以及賦初值*/ 其中,WEIDA_STB為連接打印機(jī)選通口初始化為高電平,GPIO_PULL_DIS是設(shè)置是否需要上拉電阻,GPIO_MODE_OUT 設(shè)置GPIO口為輸出口。最后使用module_init(weida_printer_init);采用模塊方式加載驅(qū)動(dòng)。 3.2.4打印機(jī)驅(qū)動(dòng)測(cè)試程序設(shè)計(jì)通過(guò)上面幾個(gè)步驟,打印機(jī)驅(qū)動(dòng)模塊已經(jīng)注冊(cè)到內(nèi)核,在/dev目錄下可以找到weida_printer設(shè)備。編寫(xiě)如下簡(jiǎn)單程序測(cè)試代碼。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); /打開(kāi)/dev/weida_printer設(shè)備 if(weida_fd0) perror(“open device buttons”); exit(1);ret=write(weida_fd,data,strlen(data);/向打印機(jī)輸出數(shù)據(jù),打印“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接口函數(shù)設(shè)計(jì) ioctl()函數(shù)主要完成打印機(jī)字體、行距等參數(shù)的設(shè)置,在設(shè)計(jì)過(guò)程中必須解決用戶數(shù)據(jù)和內(nèi)核數(shù)據(jù)之間如何傳遞。從用戶態(tài)讀取數(shù)據(jù),然后在內(nèi)核態(tài)運(yùn)行,可以使用copy_from_user函數(shù)來(lái)完成傳遞數(shù)據(jù)。 weida_printer_write ( )先對(duì)打印機(jī)是否在線,是否忙,是否準(zhǔn)備好做進(jìn)一步的判斷,然后再進(jìn)行打印。在打印的時(shí)候要注意每發(fā)一個(gè)字符要延遲150毫秒,因?yàn)槿绻蛴?shù)據(jù)發(fā)得過(guò)
15、快打印機(jī)的來(lái)不急處理,所以要設(shè)置延時(shí)。open/close函數(shù)打開(kāi)/關(guān)閉文件,因?yàn)樵贚INUX下設(shè)備都是當(dāng)作文件來(lái)操作的,所以需要open和close這兩個(gè)接口函數(shù)。 3.3 掃描儀串口的設(shè)置 嵌入式移動(dòng)打印終端中使用到的掃描儀是串口掃描儀,這種掃描儀相對(duì)于USB接口的掃描儀來(lái)說(shuō),控制較簡(jiǎn)單,在掃描儀掃描后,可以直接從串口讀取數(shù)據(jù)。 3.3.1 串口設(shè)置 設(shè)置串口速率函數(shù):set_speed(int fd, int speed),其中fd 為打開(kāi)的設(shè)備文件,speed為速率。設(shè)置串口參數(shù):set_parity(int fd,int data bits,int stop bits,int par
16、ity),data bits為有多少個(gè)數(shù)據(jù)位,stop bit為設(shè)置多少個(gè)停止位,parity為奇偶校驗(yàn)位設(shè)置。設(shè)置串口波特率為9600,數(shù)據(jù)位為8位,一位停止位,沒(méi)有校驗(yàn)位。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)用于設(shè)置串口的通信參數(shù),其中databits設(shè)置數(shù)據(jù)位位數(shù),stopbit設(shè)置停止位位數(shù),partity設(shè)置奇偶校驗(yàn)位。具體的函數(shù)代碼如下: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 編寫(xiě)讀取掃描儀數(shù)據(jù)函數(shù) 首先打開(kāi)設(shè)備文件,該系統(tǒng)中使用的串口為串口2,因此打開(kāi)函數(shù)為:open(“/dev/ttyS1”,O_RDWR|O_NONBLOCK|O_N
21、DELAY);其中,O_RDWR表示可讀可寫(xiě),O_NONBLOCK表示非堵塞模式,O_NDELAY表示沒(méi)有延遲,立即發(fā)出去。 3.3.3 客戶端和服務(wù)器的socket編寫(xiě) 嵌入式打印終端采用C/S的模式,把PC機(jī)作為服務(wù)器,開(kāi)發(fā)板作為客戶端,通過(guò)以太網(wǎng)連接??蛻舳私⒁粋€(gè)socket連接去尋找PC機(jī)上的服務(wù)程序。PC機(jī)上同時(shí)也運(yùn)行一個(gè)socket用來(lái)listen請(qǐng)求和綁定。采用的是TCP的連接方式。 3.4 主應(yīng)用程序的設(shè)計(jì) 開(kāi)發(fā)板上的應(yīng)用程序Main函數(shù)注冊(cè)兩個(gè)線程p1和p2,兩個(gè)全局?jǐn)?shù)組c1和c2。線程p1將從串口讀到的數(shù)據(jù)放入c1中,然后sent socket直接從c1中取走數(shù)據(jù)發(fā)送給服
22、務(wù)器。線程p2負(fù)責(zé)將received socket數(shù)據(jù)放入c2數(shù)組中,然后直接從c2取走數(shù)據(jù)交給打印機(jī)去打印。 這里對(duì)線程使用了兩個(gè)信號(hào)量,并初始化為:sem_init(&sem1,0,1); sem_init(&sem2,0,0);兩個(gè)線程的核心代碼如下:void thread1(void) 打開(kāi)串口;設(shè)置串口;建立連接; while(1) sem_wait(&sem1); 從串口讀書(shū)據(jù);用clinetsocket發(fā)送出去; sem_post(&sem2);void thread2(void) 打開(kāi)打印機(jī)設(shè)備; while(1) sem_wait(&sem2); 接收數(shù)據(jù);扔給打印機(jī); se
23、m_post(&sem1); 如此可以使兩個(gè)線程得以同步運(yùn)行,并可以執(zhí)行多次掃描和打印任務(wù)。總結(jié) 本文創(chuàng)新點(diǎn)及其經(jīng)濟(jì)效益:本系統(tǒng)具有移動(dòng)性強(qiáng),功耗低等特點(diǎn),而且與以往傳統(tǒng)的用PC 機(jī)實(shí)現(xiàn)的打印終端相比,還具有低成本優(yōu)勢(shì)。能廣泛地應(yīng)用于超市收銀系統(tǒng),銀行自動(dòng)存取款機(jī),等各種工業(yè)領(lǐng)域。把802.11g的無(wú)線網(wǎng)卡移植到開(kāi)發(fā)板上,就可以成功實(shí)現(xiàn)和主機(jī)的無(wú)線通信,使得該系統(tǒng)更加便攜。參考文獻(xiàn)1 ARM嵌入式系統(tǒng)原理及應(yīng)用開(kāi)發(fā).譚會(huì)生.西安電子科技大學(xué)出版社,2012 .2 CORBET J, RUBINI A. LINUX設(shè)備驅(qū)動(dòng)程序(第三版)M. 中國(guó)電力出社, 2006. 46-74 TP316.8
24、13 孫瓊. 嵌入式LINUX應(yīng)用程序開(kāi)發(fā)詳解M. 人民郵電出版社, 2006. 184-191 TP316.894 田家林,陳利學(xué),寇向輝 LINUX嵌入式操作系統(tǒng)在ARM上的移植J. 微計(jì)算機(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; /判斷打印機(jī)是否忙 ready=read_gpio_bit(WEIDA_BUSY); if(ready) return EBUS
29、Y;/判斷打印機(jī)是否在線 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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年西寧貨運(yùn)從業(yè)資格證題庫(kù)年答案
- 《巴斯奎特涂鴉》幼兒園小學(xué)少兒美術(shù)教育繪畫(huà)課件創(chuàng)意教程教案
- 快遞公司常用合同
- 合伙開(kāi)辦工廠經(jīng)營(yíng)協(xié)議書(shū)
- 會(huì)員消費(fèi)記錄及積分兌換統(tǒng)計(jì)表
- 幼兒園運(yùn)動(dòng)員發(fā)言稿
- Galanganone-B-生命科學(xué)試劑-MCE
- CKP-25-生命科學(xué)試劑-MCE
- 生態(tài)學(xué)環(huán)境保護(hù)原理知識(shí)測(cè)試卷
- 小學(xué)競(jìng)選班干部發(fā)言稿
- 國(guó)考斷面水站建設(shè)及運(yùn)維技術(shù)要求參考
- Q∕GDW 10799.7-2020 國(guó)家電網(wǎng)有限公司電力安全工作規(guī)程 第7部分:調(diào)相機(jī)部分
- 熱工學(xué)后題答案
- 南陽(yáng)理工學(xué)院畢業(yè)論文格式規(guī)范
- 不吸煙不喝酒課件
- 奧數(shù)知識(shí)點(diǎn) 間隔問(wèn)題
- 簡(jiǎn)易旋轉(zhuǎn)倒立擺及控制裝置
- 深圳大學(xué)《數(shù)字信號(hào)處理》2009年期末考試試卷A卷
- 2019寧波地產(chǎn)品牌半程馬拉松 (海景風(fēng)情 健康寧波主題)活動(dòng)策劃方案-41P
- BMC缺陷以及原因
- 《腦出血的護(hù)理》課件.ppt
評(píng)論
0/150
提交評(píng)論