嵌入式linu簡(jiǎn)單程序_第1頁(yè)
嵌入式linu簡(jiǎn)單程序_第2頁(yè)
嵌入式linu簡(jiǎn)單程序_第3頁(yè)
嵌入式linu簡(jiǎn)單程序_第4頁(yè)
嵌入式linu簡(jiǎn)單程序_第5頁(yè)
已閱讀5頁(yè),還剩5頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、demodemo.c#ifndef_KERNEL_#define_KERNEL_#endif#ifndefMODULE#defineMODULE#endif#includeclinux/config.h>#include<linux/module.h>//模塊相關(guān)#include<linux/kernel.h>//內(nèi)核相關(guān)#ineludeclinux/fs.h>//file_operations#include<linux/types.h>//ssize_t定義文件#include<linux/init.h>//_init和_exit相關(guān)#inelude<linux/errno.h>#inelude<linux/cdev.h>#include<asm/uaccess.h>//copy_to_user()^Dcopy_from_user()在此定義#include<asm/system.h>/*相關(guān)宏定義-7#defineDEVICE_NAME"demo11//設(shè)備名稱#definedemo_MAJOR88〃主設(shè)備號(hào)#definedemo_MINOR0〃次設(shè)備號(hào)#defineERROR-1staticintMAX_BUF_LEN=1024;〃數(shù)值的最人值staticintWRI_LENGTH=O;廠結(jié)構(gòu)體的定義*/staticintdemo_major=demo_MAJOR;structdemo_dev{structcdevcdev;chardrv_buf[1024];};structdemo_dev*demo_devp;/*demo設(shè)備文件打開(kāi)*/intdemo_open(structinode*inodezstructfile*filp)filp->private_data=demo_devp;sprintf(demo_devp->drv_buf/,deviceopensucess!\n”);printk("deviceopensucess!\nM);return0;}*//*demo設(shè)備文件關(guān)閉舟/intdemo_release(structinode*inode,structfile*filp)return0;*/廠逆序排列緩沖區(qū)數(shù)據(jù)staticvoiddo_write(char*drv_buf)inti;intlen二WRI_LENGT比chartmp;for(i=0;i<len;i++」en—){tmp=drv_buf[len?l];drv_buf[len-l]=drv_buf[i);drv_buf[i]=tmp;}*/staticssize_tdemo_write(structfile*filp,constchar*buffer,size_tcountjoff_t*ppos){structdemo_dev*dev=filp->private_data;if(count>MAX_BUF_LEN)count=MAX_BUF_LEN;copy_from_user(dev->drv_bufrbuffer,count);WRI_LENGTH=count;printk(Huserwritedatatodriver\nJ;do_write(dev->drv_buf);returncount;}*/staticssize_tdemo_read(structfile*filp,char沐buffer,size_tcount,loff_t*ppos)

structdemo_dev*dev=fiIp->private_data;if(count>MAX_BUF_LEN)count=MAX_BUF_LEN;copy_to_user(bufferzdev->drv_buf,count);printk(Huserreaddatafromdriver\nH);returncount;}4c)tm*/staticintdemojoctl(structinode專node,structfile*file,unsignedintcmd,unsignedlongarg)printk(Mioctlruning'n");switch(cmd){casel:printkf'runingcommand1\n”);break;case2:printkf'runingcommand2\n”);break;default:printk(Herrorcmdnumber\n");break;}return0;}4c)tm*/4c)tm*//*demo的模塊加載函數(shù)staticconststructfile_operationsdemo_fops={?owner?二THISJVIODULE,read=demo_read,write=demo_write,.ioctl=demo」octl,open二demo_open,release=demo_release,};4c)tm*//*demo的模塊加載函數(shù)int_initdemo」nit(void)intresult;interr;dev_tdevno=MKDEV(demo_MAJOR,demo_MINOR);if(demo_MAJOR){result=register_chrdev_region(devno"demo”);}else{result二alloc_chrdev_region(&devnoQl「demo");demo_major=MAJOR(devno);}if(result<0){returnresult;}demo_devp=kmalloc(sizeof(structdemo_dev),GFP_KERNEL);if(!demo_devp){printk("空間申請(qǐng)失敗\n”);returnERROR;}printk(Hstartdemoinit!\n");cdevjnit(&demo_devp?>cdey&demo_fops);demo_devp->cdev.owner二THIS_MODULE;err=cdev_add(&demo_devp?>cdev,devgl);if(err){printk(“注冊(cè)設(shè)備失敗”);unregister_chrdev_region(MKDEV(demo_MAJOR,demo_MINOR)/l);returnerr;}printk(Hdemoinitseccess!\nH);return0;/*demo的模塊卸載函數(shù)*/void_exitdemo_exit(void)cdev_del(&demo_devp->cdev);kfree(demo_devp);unregister_chrdev_region(MKDEV(demo_MAJOR,demo_MINOR),l);}MODULE_AUTHOR(HLiangBaoqiangM);MODULE_LICENSE「DualBSD/GPLM);module」nit(demo」nit);module_exit(demo_exit);Makefileobj-m+=demo.o#modl-y:=mod_a.oKVERSION=$(shelluname-r)all:make-C/lib/modules/$(KVERSION)/buildM=$(PWD)modulesclean:make-C/lib/modules/$(KVERSION)/buildM=$(PWD)cleanrm-f*.o*.ko*.cmdtest_demo.c#include<stdio.h>#include<stdlib.h>#inelude<fcntl.h>#inelude<unistd.h>#inelude<sys/ioctl.h>voidshowbuf(char*buf);intMAX_LEN=32;intmain(){intfd;inti;charbuf[255];for(i=0;i<MAX_LEN;i++){buf[i]=i;}fd=open(,,/dev/demo,,,O_RDWR);if(fd<0)printf("####DEMOdeviceopenfail####\n");return(-1);

printf(”write%dbytesdatato/dev/demo\nH,MAX_LEN);showbuf(buf);write(fd,buf,MAX_LEN);printfC'Read%dbytesdatafrom/dev/demo\n",MAX_LEN);read(fdzbuf,MAX_LEN);showbuf(buf);ioctl(fdlNULL);ioctl(fdANULL);close(fd);return0;}voidshowbuf(char*buf){inti,j=0;for(i=0;i<MAX_LEN;i++){if(i%4==0)printf("\n%4d:"J++);printf(,,%4d舄buf[i]);printf(Hprintf(H\n2、hello.c#include<linux/init.h>#include<linux/module.h>MODULE_LICENSE「DualBSD/GPLM);staticinthello」nit(void){printk(KERN_ALERT,,Hello,initthemodule!11);return0;}staticvoidhello_exit(void){printk(KERN_ALERT"Goodbye,exitthemodule!11);}module」nit(hello」nit);module_exit(hello_exit);LINUX驅(qū)動(dòng)版本的helloworld終于下決心好好學(xué)習(xí)LINUX內(nèi)核和驅(qū)動(dòng)開(kāi)發(fā)了,不怕千萬(wàn)人恥笑,勇敢將自己的學(xué)習(xí)過(guò)程寫(xiě)出來(lái):1、關(guān)于目錄/lib/modules/2.6.9-42.ELsmp/build/ 這個(gè)是內(nèi)核源碼所在的目錄一般使用這樣的命令進(jìn)入這個(gè)目錄:cd/lib/modules/$(uname-r)/build/這個(gè)目錄實(shí)際上指向了:/usr/src/kernels/2.6.9-42.EL-smp-i6862、 編譯驅(qū)動(dòng)所使用的makefile實(shí)際上編譯驅(qū)動(dòng)的時(shí)候是使用預(yù)先提供的一個(gè)makefile的,位置在:/lib/modules/$(uname-r)/build/Makefile注意:M是大寫(xiě)的3、 網(wǎng)上抄錄的Linux驅(qū)動(dòng)Helloworld的源碼://hello.c#inelude<linux/init.h>#inelude<linux/module.h>MODULE_LICENSE「DualBSD/GPLM);staticinthelloit(void){printk(KERN_ALERT"helloworld!\nH);return0;}staticvoidhello_exit(void){printk(KERN_ALERT”goodbye!\n“);}module」nit(hello」nit);module_exit(hello_exit);4、 寫(xiě)個(gè)makefile來(lái)編譯這個(gè)驅(qū)動(dòng):(版本一,最簡(jiǎn)單的)#下面這行是文件Makefile的內(nèi)容,注意M是人寫(xiě)的obj-m:=hello.o把hello.c和Makefile保存在同一目錄,然后執(zhí)行:make-C/lib/modules/'uname-r'/buildSUBDIRS=$PWDmodules這樣驅(qū)動(dòng)就編譯好了,成果是hello.ko文件。注意:makefile—定要寫(xiě)成Makefile,如果寫(xiě)成makefile就編譯不過(guò)。(折騰啊,就這一步耗了N多時(shí)間)5、 再寫(xiě)另一種Makefile:(版本二:最省事的)#以下是Makefile文件的內(nèi)容obj-m:=hello.oKERNEL_DIR:=/lib/modules/$(shelluname-r)/buildPWD:=$(shellpwd)all:make-C$(KERNEL_DIR)SUBDIRS=$(PWD)modulesclean:rm*.o*.ko然后執(zhí)行:make就編譯成功了,命令行不再加參數(shù),很省爭(zhēng)。注意:all:和clean:F面的行,前面是一個(gè)TAB鍵6、 加載驅(qū)動(dòng):執(zhí)行insmod./hello.ko屏幕上沒(méi)反應(yīng)。(因?yàn)槲沂窃赪INDOWS上用遠(yuǎn)程終端連上去的嘛)0K,先讓時(shí)光倒流,回到加載驅(qū)動(dòng)以前,先另開(kāi)一個(gè)窗II,執(zhí)行:tail?f/var/log/message然后在原來(lái)的窗11里執(zhí)行:insmod./hello.ko哈哈,/var/log/message文件里面看見(jiàn)了盼望已久的helloworld!7、查看驅(qū)動(dòng):Ismod看見(jiàn)hello這個(gè)驅(qū)動(dòng)在其中&卸載驅(qū)動(dòng):rmmodhello看見(jiàn)/var/log/message里顯示了goodbye經(jīng)過(guò)兩周的摸索,終于對(duì)Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)有了個(gè)初步的認(rèn)識(shí),下面對(duì)Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)環(huán)境的搭建做個(gè)小結(jié),以方便自己以后查詢,同時(shí)也能給同道的初學(xué)者一點(diǎn)幫助。剛接觸Linux設(shè)備驅(qū)動(dòng)時(shí),初學(xué)者往往連如何編譯驅(qū)動(dòng)程序都不懂,更別說(shuō)編譯進(jìn)內(nèi)核或加載測(cè)試了。一般都是在網(wǎng)上找個(gè)最簡(jiǎn)單的helloworld驅(qū)動(dòng)程序,然后嚴(yán)格按照網(wǎng)上所說(shuō)的步驟編譯,結(jié)呆卻得到一大堆見(jiàn)都沒(méi)見(jiàn)過(guò)的錯(cuò)誤,更不要說(shuō)根據(jù)錯(cuò)誤信息來(lái)解決問(wèn)題了,很多人到這里就不知道如何往下進(jìn)行了。十幾天前我也卡在這里很長(zhǎng)時(shí)間,現(xiàn)在知道所以然了就記下來(lái),些許對(duì)一些同道者有幫助。一個(gè)基本的Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)環(huán)境由宿主機(jī)和目標(biāo)機(jī)組成,宿主機(jī)就是用來(lái)做驅(qū)動(dòng)開(kāi)發(fā)工作的主機(jī),目標(biāo)機(jī)就是用來(lái)運(yùn)行和測(cè)試設(shè)備驅(qū)動(dòng)的主機(jī),在宿主機(jī)上需要有開(kāi)發(fā)工具(gcc,gdb,make等)和linux源碼(版本要對(duì)應(yīng)目標(biāo)機(jī)上的linux內(nèi)核),而目標(biāo)機(jī)上只要運(yùn)行l(wèi)inux即可。由于步驟有所不同,下面分為普通Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)和嵌入式Linux設(shè)別驅(qū)動(dòng)開(kāi)發(fā)兩種情況來(lái)講述壞境的搭建和驅(qū)動(dòng)程序的編譯:(一)普通Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)普通Linux主要是區(qū)分于嵌入式Linux(一般指uClinux),在這種開(kāi)發(fā)中宿主機(jī)和目標(biāo)機(jī)可以是一臺(tái)主機(jī),即在本機(jī)上開(kāi)發(fā)編譯然后在本機(jī)上加載運(yùn)行(Linux設(shè)備驅(qū)動(dòng)也可以直接編譯進(jìn)內(nèi)核,但為了開(kāi)發(fā)工作方便,一般采用動(dòng)態(tài)加載的方式),當(dāng)然也可以是兩臺(tái)主機(jī),如果是兩臺(tái)主機(jī)的話,要保證宿主機(jī)上的linux源碼的版本號(hào)與目標(biāo)機(jī)中的linux內(nèi)核版本一致。普通Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)的步驟如下:在宿主機(jī)上安裝開(kāi)發(fā)工具和卞載linux源碼(要求版本號(hào)和目標(biāo)機(jī)上的linux內(nèi)核版本一致)。開(kāi)發(fā)工具主要有g(shù)cc、gdb、make等,這些工具在redhat或fc中默認(rèn)就安裝了,在debian或Ubuntu中可以通過(guò)下面這個(gè)命令安裝:apt-getinstallbuild-essentiallinux源碼可以通過(guò)以下幾種途徑獲得:直接去卜?載通過(guò)包管理工具下載源碼,在debian和Ubuntu中可以通過(guò)下面這個(gè)命令卞載,apt-getinstalllinux-source-(版本號(hào)),F載后的文件在/usr/src目錄中,解壓到該目錄即可將源碼解壓到/usr/src/目錄后,進(jìn)入linux-source-(版本號(hào))目錄中執(zhí)行下面幾個(gè)命令:makeoldconfigmakepreparemakescripts編寫(xiě)Linux驅(qū)動(dòng)程序,以一個(gè)最簡(jiǎn)單的hello.c為例,hello.c的內(nèi)容如卞:#include"linux/init.h"#include"linux/module.h"staticinthello_init(void)printk(KERN_ALERT"HelloWorldlinux_driver_module\n");return0;}staticvoidhello_exit(void){printk(KERN_ALERT"Goodbeylinux_driver_module\nH);}module」nit(hello」nit);module_exit(hello_exit);MODULE_UCENSE(,IGPLM);MODULE_AUTHOR(,Ilpjn);寫(xiě)Makefile文件,一個(gè)示例如卞,里面各項(xiàng)參數(shù)根據(jù)實(shí)際情況更改:#sampledrivermoduleobj-m:=hello.oKDIR=/usr/src/linux-source-2.6.24/all:$(MAKE)-C$(KDIR)M=$(PWD).PHONY:cleanclean:rm-f*.mod.c*.mod.o*.ko*.o*.tmp_versions編譯,在hello.c和Makefile所在目錄下執(zhí)行make即可,編譯后在當(dāng)前目錄生成hello.ko文件加載并測(cè)試:加載使用insmod或modprobe命令來(lái)實(shí)現(xiàn),如在當(dāng)前路徑執(zhí)行如下代碼:insmodhello.ko或modprobehello注意,如呆在虛擬終端加載內(nèi)核的話,將看不到內(nèi)核打印信息,因?yàn)閮?nèi)核打印信息不會(huì)輸出到虛擬終端,而是輸出到/proc/kmsg文件中,所以可以通過(guò)以下方式查看內(nèi)核信息:cat/proc/kmsg會(huì)一直打印,需要Ctrl—C手動(dòng)終止dmesg或dmesg|tail-N,N為一數(shù)字,表示顯示最后N行卸載:使用rmmod命令卸載驅(qū)動(dòng)模塊,如rmmodhello(二)嵌入式Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)這種開(kāi)發(fā)中一般目標(biāo)機(jī)為帶有嵌入式處理器的開(kāi)發(fā)板,而宿主機(jī)為PC,開(kāi)發(fā)環(huán)境需要在宿主機(jī)上搭建,嵌入式Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)的步驟如下:在宿主機(jī)上卞載嵌入式Linux的源碼,并安裝嵌入式Linux開(kāi)發(fā)工具(針對(duì)于不同的嵌入式處理器,工具也有所不同,如對(duì)應(yīng)于Arm的arm-gcc系列,針對(duì)nios2處理器的nios2-cc系列)編寫(xiě)Linux設(shè)備驅(qū)動(dòng)驅(qū)動(dòng)程序,還以上面給出的hello.c為例,將該文件復(fù)制到(linux源碼目錄)/drivers/(目標(biāo)文件夾)/中在(目標(biāo)文件夾)中創(chuàng)建Makefile和Kconfig(菜單配置文件),內(nèi)容分別如下:#makefileobj?$(CONFIG_HELLODRV)+=hello.o#KconfigmenuUSER_DEVICE_DRIVERSconfigHELLODRVtristate"Hello"—help—Thisisasampledriverprogramme.endmenu注意,如果Kconfig文件中的"tristate"寫(xiě)成,

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論