嵌入式學(xué)習(xí)下午led模塊驅(qū)動實驗_第1頁
嵌入式學(xué)習(xí)下午led模塊驅(qū)動實驗_第2頁
嵌入式學(xué)習(xí)下午led模塊驅(qū)動實驗_第3頁
嵌入式學(xué)習(xí)下午led模塊驅(qū)動實驗_第4頁
嵌入式學(xué)習(xí)下午led模塊驅(qū)動實驗_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

ledled設(shè)備驅(qū)動編 一 實驗內(nèi) 二 實驗原 1、硬件原 2、驅(qū)動實 三 源代碼分 1、驅(qū)動程序分 2、應(yīng)用程序分 3、Makefile工程文件分 四 實驗步 1、獲得源 2、修改Makefile規(guī)則文 3、編 4、5、測 led UP-CUPIOT6410-II型平臺Version:Author:

一、實驗內(nèi)悉驅(qū)動的過程。二、實驗原1 硬件原LEDLED5LED6410處理器GPQ2~6LEDLED燈滅。管腳寄存主要需要設(shè)置的寄存器為GPQCONGPQDAT,如下所示,具體可查看S3C6410X_UM_Rev1.10_080822.pdf2.6.38內(nèi)核配置管腳函intexternints3c_gpio_cfgpin(unsignedintpinunsignedint頭文件:t/gpio-pinto#defineS3C_GPIO_INPUT(S3C_GPIO_SPECIAL(0))#defineS3C_GPIO_OUTPUT(S3C_GPIO_SPECIAL(1))#defineS3C_GPIO_SFN(x)(S3C_GPIO_SPECIAL(x))函數(shù)原型:staticinlinevoidgpio_set_value(unsignedgpioint參數(shù):pin為管腳,value函數(shù)原型:staticinlineintgpio_direction_output(unsignedgpioint參數(shù):pin為管腳,valuepinIOvalueIO口設(shè)置為輸出方式,其等同s3c_gpio_cfgpin()gpio_set_value(。2 驅(qū)動實設(shè)備編MAJOR(dev_tdev)MINOR(dev_t--獲得設(shè)備在<linux/fs.h>中,主要有register_chrdev_region()和alloc_chrdev_region()unregister_chrdev_region()釋放設(shè)備編號。name是和該編號范圍關(guān)聯(lián)的設(shè)備名稱,它將出現(xiàn)在/proc/devices文件函數(shù)原型:intregister_chrdev_region(dev_tfirst,unsignedintcount,char函數(shù)參數(shù):first為第一個設(shè)備號,count為申請的設(shè)備數(shù)量,name為設(shè)備名。函數(shù)功能:靜態(tài)分配指定的設(shè)備號intalloc_chrdev_region(dev_t*dev,unsignedintfirstminor,unsignedintcount,char*函數(shù)參數(shù):該函數(shù)需要傳遞給它指定的第一個次設(shè)備號firstminor(一般為0)和要分配的設(shè)備數(shù)count,以及設(shè)備名,調(diào)用該函數(shù)后自動分配得到的設(shè)備號保存在dev中。函數(shù)功能:動態(tài)申請設(shè)備號函數(shù)原型:voidunregister_chrdev_region(dev_tfirst,unsignedint頭文件:函數(shù)參數(shù):first為第一個設(shè)備號,count為申請的設(shè)備數(shù)量函數(shù)功能:釋放設(shè)備號在調(diào)用cdev_del()函數(shù)從系統(tǒng)注銷字符設(shè)備之后,應(yīng)該被調(diào)用以釋放原先申請的設(shè)備號。與釋放內(nèi)核structcdev結(jié)構(gòu)來表示字符設(shè)備。在內(nèi)核調(diào)用設(shè)備的操作之前,必須分配并一個或多個structcdev。代碼應(yīng)包含<linux/cdev.h>,它定義了structcdevcdev1structcdevstructcdev 2structvoidcdev_init(structcdev*cdevconststructfile_operations*fops)3cdev.owner4、cdevstructcdevintcdev_add(structcdev*p,dev_tdev,unsigned5、從系統(tǒng)中移除一個字符設(shè)備:voidcdev_del(structcdev函數(shù)原型:intcdev_add(structcdev*dev,dev_tnum,unsignedint頭文件:函數(shù)參數(shù):devcdev結(jié)構(gòu)num是這個設(shè)備響應(yīng)的第一個設(shè)備號count是應(yīng)當(dāng)關(guān)聯(lián)到設(shè)備的設(shè)備號的數(shù)目.常常count是1,函數(shù)功能:字符設(shè)備函數(shù)原型:voidcdev_del(structcdev頭文件:函數(shù)參數(shù):devcdev結(jié)構(gòu)函數(shù)功能:注銷字符設(shè)備驅(qū)動和函數(shù)staticstructfile_operationsuptech_leds_fops=staticstructfile_operationsuptech_leds_fops= CGNU編譯器的一種特殊擴(kuò)展,Ioctl說ioctl方法來支持。ioctl在用戶空間的原型intioctl(intfd,unsignedlongcmd,來定,如果cmd不需要參數(shù),那么...就不會被使用,如果cmd需要參數(shù),則就會使用...char*argp來定義。這里使用...ioctl命令為了方便程序員唯一的創(chuàng)建ioctl命令編號,內(nèi)核中作了如下規(guī)定傳輸方向。_IOC_NONE(沒有數(shù)據(jù)傳輸_IOC_READ_IOC_WRITE以及 #define //8#define //8Letanyarchitectureoverrideeitherofthefollowingincludingthis#ifndef //size#define_IOC_SIZEBITS14#ifndefdefine //direction內(nèi)核中給出了創(chuàng)建ioctl命令的宏/*usedtocreatenumbers#define #define_IOR(type,nr,size) #define_IOW(type,nr,size) #define_IOR_BAD(type,nr,size)_IOC(_IOC_READ,(type),(nr),sizeof(size))#define_IOW_BAD(type,nr,size)_IOC(_IOC_WRITE,(type),(nr),sizeof(size))三、源代碼分1 驅(qū)動程序分具體驅(qū)動實#include /*Dynamicloadingofmodules#include /*Dynamicloadingofmodulesintothekernel#include /*printk()#include /*file_operations#include#include#include<linux/cdev.h>/*cdev結(jié)構(gòu)相關(guān)#include #include<asm/irq.h> #include<mach/regs-gpio.h>/*與寄存器相關(guān)*/#include< /*與IO配置相關(guān)*/#include<linux/gpio.h> /*與IO相關(guān)*/#include<linux/slab.h>#include /* /*表式開放源碼,在linux/module.h中定義*/#defineDEVICE_NAME #defineDEVICE_MAJOR #define /*IOCTLcommands#define #defineLED_IOC_WR_ON_IOW(LED_IOC_MAGIC0x80,unsignedint)//LEDioctl命令#defineLED_IOC_WR_OFF_IOW(LED_IOC_MAGIC,0x81,unsignedint)//LEDioctl命structcdev*mycdev; structclass*myclass; /*定義class*/dev_tdevno; staticunsignedlongled_table/io列表名稱:uptech_leds功能:對應(yīng)用戶空間的ioctl系統(tǒng)調(diào)用,對用戶空間傳遞過來 令進(jìn)行swith判斷,并進(jìn)行相應(yīng)處理,本函數(shù)會對LED 令進(jìn)行判斷,進(jìn)行相應(yīng)LED亮滅的控制參數(shù):*filpID,cmdcmd,arg對應(yīng)用戶空0defaultstaticlonguptech_leds_ioctl(structfile*file,unsignedintcmd,unsignedlong{intunsigned /*Checktypeandcommandnumberif(_IOC_TYPE(cmd)!=LED_IOC_MAGIC)//判斷是不是針對此驅(qū) return-if(arg>4){return-}buf(unsignedlong*)kmalloc(sizeof(*bufGFP_KERNEL)申請內(nèi)存if(buf==NULL)return-ret=copy_from_user(buf,&arg,sizeof(unsignedlong));//從用戶空間將參數(shù)拷貝到//printk("ret=%x\n",ret);if(ret!=0){ return-}switch(cmd)case//printk("kernel:setledoncmdnum:%lx\n",gpio_set_value(led_table[*buf]0);//IOcase//printk("kernel:setledoffcmdnum:%lx\n",gpio_set_value(led_table[*buf],1IO}

return-return}名稱:uptech_leds_fopsstaticstructfile_operationsuptech_leds_fops={ 名稱:staticvoiduptech_leds_init 函數(shù),通過通過register_chrdev_region函數(shù)向系統(tǒng)申請固定設(shè)備號通過cdev_add()函數(shù)向系統(tǒng) 字符設(shè)備(這兩個函數(shù)在<linux/fs.h>中定義,通過class_create()及device_create()動態(tài)創(chuàng)建設(shè)備文件*參數(shù):*staticintinituptech_leds_init(void){intintdevno=MKDEV(DEVICE_MAJOR,DEVICE_MINOR);//dev_t號mycdevcdev_alloc();//cdevmycdev->ops=&uptech_leds_fops;//ops初始化mycdev->ownerTHIS_MODULE;//owner初始化err=cdev_add(mycdev,devno,1);//字符設(shè)備if(err!=0)printk("s3c6410ledsdeviceregistermyclassclass_create(THIS_MODULE,DEVICE_NAME);//classif(IS_ERR(myclass)){printk("Err:failedincreatingclass.\n");return-1;}AME);//創(chuàng)建設(shè)備文件for(i=0;i<5;i++)s3c_gpio_cfgpin(led_table[i],S3C_GPIO_SFN(1));//式}printk(DEVICE_NAME"initialized\n");return0;}staticvoidexit{//class_destroy(myclass);//class}2 應(yīng)用程序分#include#include#include<stdlib.h>#include#include /*ioctl函數(shù)頭文件/*IOCTLcommands#define#define _IOW(LED_IOC_MAGIC0x80,unsigned #define _IOW(LED_IOC_MAGIC0x81,unsignedint) intmain(intargc,char{intintintled_number;intfd;if(argc!=3||sscanf(argv[1],"%d",&led_number)!=1||&on)!=1on<0||on>1||led_number<0||led_number>5){fprintf(stderr,"Usage:\n");fprintf(stderr,"\t./ledled_numberon|off\n");fprintf(stderr,"Options:\n");fprintf(stderr,"\tled_numberfrom0to4\n");fprintf(stderr,"\ton:1 off:0\n");}fdopen("/dev/leds0);//打開/dev/ledif(fd<0)perror("opendevice/dev/leds");}if(on==ioctl(fdLED_IOC_WR_ONled_number);//}elseif(on==,,}return}TARGET=PILE=arm-ifeqTARGET=PILE=arm-ifeq#Assumethesourcetreeiswheretherunningkernelwas#YoushouldsetKERNELDIRintheenvironmentifit'selsewhereKERNELDIR?=/home/uptech/kernel/linux-/#Thecurrentdirectoryispassedtosub-makesasargumentPWD:=$(s $(CC)-o$(TARGET)$(MAKE)-C$(KERNELDIR)M=$(PWD)$(MAKE)-C$(KERNELDIR)M=$(PWD)rm-rf*.o*~core.depend.*.cmd*.ko*.mod.c*.symvers*.order===-#calledfromkernelbuildsystem:justdeclarewhatourmodulesareobj-m:=s3c-leds.o,KERNELRELEASE宏的值是否為空。$(KERNELRELEASE)Makefile中定義的一個變量,在第一次讀Makefile時,KERNELRELEASE沒有被定義。PWD$(spwd)PWD變量進(jìn)行賦值,作用是將$(spwd)的返回結(jié)果(既求得當(dāng)前的路徑)PWD,這個變量在后面指代要編譯的驅(qū)動程序$(MAKE)-C$(KERNELDIR)M=$(PWD)工作轉(zhuǎn)移到你所指定的位置?!癕=”選項的作用是,當(dāng)用戶需要以某個內(nèi)核為基礎(chǔ)編譯一個外部模塊的話,需要在makemodules命令中加入“M=dir”,程序會自動dirKO文件。.PHONY:modulesmodules_installclean這句話是的作用是保證modules,modules_install,clean這三個命令能正常完成。.PHONY這是一個特殊目標(biāo)名稱obj-ms3c-leds.oobj-$(CONFIG_TCtc.o的語句是用來定義編譯的目標(biāo),是子Makefile中最重要的部分。編譯目標(biāo)定義那些在本子下,需要編Linux內(nèi)核中的目標(biāo)文件列表。為了只在用戶選擇了此功能后才編譯,所有的Kconfig設(shè)置變量的判斷。Kconfig設(shè)置變量取值范圍是:y,n,m和空,obj-$(CONFIG_TC)分別對應(yīng)著obj-y,obj-n,obj-m,obj-CONFIG_TCytc.oobj-y列表。obj-yLinuxvmlinux中的目標(biāo)文件列表;obj-m為編譯成模塊的目標(biāo)文件列表;obj-nobj-中的文件列表被忽略。設(shè)置系統(tǒng)就根據(jù)這些列表Makefile的執(zhí)行過程:KERNELRELEASEMakefile中定義的一將執(zhí)行else之前的內(nèi)容。執(zhí)行all這條規(guī)則->執(zhí)行$(TARGET)規(guī)則編譯生成應(yīng)用程序->執(zhí)行modules規(guī)則,-C$(KERNELDIR)指明跳轉(zhuǎn)到內(nèi)核源碼下那里Makefile;M=$(PWD)表明然后返回到當(dāng)前Makefile當(dāng)從內(nèi)核源碼返回時,KERNELRELEASE已被被定義,kbuild也被啟動去解析kbuild語法的語句,make將繼續(xù)else之后的內(nèi)容。else之后的內(nèi)容為kbuild語四、實驗步1 獲得源測試程序

[root@localhostuptech]#mkdirdriver_char[root@localhostuptech]#cd[root@localhostdriver_char]#mkdir拷貝源碼到通過samba服務(wù)將 下的源文件,拷貝到虛擬機(jī)fedora系[root@localhostdriver_char]#cddriver_led/[root@localhostdriver_led]#ls 2 修改Makefile規(guī)則文[root@localhostdriver_demo]#vi更改KERNELDIR?=/home/uptech/kernel/linux- 為自己的內(nèi)核源(確保此內(nèi)核已經(jīng)編譯過一次3 編makecleanmakes3c-leds.ko及應(yīng)用程test_led,具體步驟如下:rm-rf*.o*~rm-rf*.o*~core.depend.*.cmd*.ko*.mod.c*.symvers*.order.tmp_versions[root@localhostdriver_led]#arm-linux-gccarm-linux-gcc-otest_ledmak

溫馨提示

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

評論

0/150

提交評論