ARM字符驅(qū)動實例最新培訓(xùn)課件(共47張PPT)_第1頁
ARM字符驅(qū)動實例最新培訓(xùn)課件(共47張PPT)_第2頁
ARM字符驅(qū)動實例最新培訓(xùn)課件(共47張PPT)_第3頁
ARM字符驅(qū)動實例最新培訓(xùn)課件(共47張PPT)_第4頁
ARM字符驅(qū)動實例最新培訓(xùn)課件(共47張PPT)_第5頁
已閱讀5頁,還剩42頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

字符驅(qū)動(qūdònɡ)實例第一頁,共四十七頁。本實驗(shíyàn)電路圖4個LED指示燈的接口電路第二頁,共四十七頁。驅(qū)動程序#include<linux/kernel.h>#include<linux/module.h>#include<linux/init.h>#include<linux/fs.h>#include<linux/cdev.h>#include<linux/ioport.h>#include<asm-arm/io.h>#include<linux/ioctl.h>#include<linux/interrupt.h>#include<linux/delay.h>#include<linux/timer.h>#include<asm/irq.h>#include<linux/param.h>#include<linux/sched.h>#include<linux/errno.h>#include<asm/signal.h>定義(dìngyì)request_mem_region所需的頭文件定義I/O讀寫,I/O內(nèi)存讀寫所需的頭文件定義ioctl函數(shù)所需的頭文件定義ioctl函數(shù)所需的頭文件定義延遲與定時器函數(shù)所需的頭文件定義中斷函數(shù)所需的頭文件第三頁,共四十七頁。#defineCDRIVER_NAME"LED_chrdev"#defineGPFCON(0X56000050)#defineGPFDAT(0X56000054)#defineGPFUP(0X56000058)staticvoid*gpfcon;staticvoid*gpfdat;staticvoid*gpfup;intCDRIVER_MAJOR=0;intCDRIVER_MINOR=0;intcount=1;定義(dìngyì)物理地址定義映射后的虛擬地址指針第四頁,共四十七頁。loff_tLED_llseek(structfile*filp,loff_toff,intwhence);intLED_ioctl(structinode*inode,structfile*filp,unsignedintcmd,unsignedlongarg);intLED_open(structinode*inode,structfile*filp);intLED_release(structinode*inode,structfile*filp);externstructfile_operationsLED_fops;structcdev*LED_cdev;dev_tLED_dev;structfile_operationsLED_fops={.owner=THIS_MODULE,.llseek=LED_llseek,.open=LED_open,.release=LED_release,};第五頁,共四十七頁。staticint__initLED_init(void){……if(!request_mem_region(GPFCON,12,CDRIVER_NAME)){ printk(KERN_ERR"LED:io%Xisnotfree.\n",GPFCON); return-EBUSY; } gpfcon=ioremap_nocache(GPFCON,4); gpfdat=ioremap_nocache(GPFDAT,4); gpfup=ioremap_nocache(GPFUP,4); if(!gpfcon){ printk(KERN_ERR"LED:ioremapfailed\n");

iounmap(gpfcon); return-EINVAL; }申請(shēnqǐng)I/O內(nèi)存I/O內(nèi)存映射假設(shè)映射不成功,釋放第六頁,共四十七頁。

if(!gpfdat){ printk(KERN_ERR"LED:ioremapfailed\n");

iounmap(gpfdat); return-EINVAL; } if(!gpfup){ printk(KERN_ERR"LED:ioremapfailed\n");

iounmap(gpfup); return-EINVAL; } return0;}假設(shè)(jiǎshè)映射不成功,釋放假設(shè)映射不成功,釋放第七頁,共四十七頁。intLED_open(structinode*inode,structfile*filp){ printk("LEDDeviceisopened\n"); writel((readl(gpfcon)&(1<<14)),gpfcon); writel((readl(gpfup)&(1<<7)),gpfup); writel((readl(gpfdat)&(0<<7)),gpfdat); ssleep(1);writel((readl(gpfdat)&(1<<7)),gpfdat); ssleep(1);writel((readl(gpfdat)&(0<<7)),gpfdat); try_module_get(THIS_MODULE); return0;}設(shè)為輸出(shūchū)端口上拉禁止輸出低電平,燈亮輸出高電平,燈滅第八頁,共四十七頁。/*Release*/intLED_release(structinode*inode,structfile*filp){ printk("LEDDeciceisreleased!\n"); writel((readl(gpfcon)&(0<<14)),4); writel((readl(gpfup)&(1<<7)),4); writel((readl(gpfdat)&(0<<7)),4); module_put(THIS_MODULE); return0;}第九頁,共四十七頁。staticvoid__exitLED_exit(void) {printk("UnloadingLED_cdevnow...\n");

iounmap(gpfcon); iounmap(gpfdat); iounmap(gpfup); cdev_del(LED_cdev); unregister_chrdev_region(LED_dev,count); }釋放(shìfàng)內(nèi)存第十頁,共四十七頁。makefileifneq($(KERNELRELEASE),)obj-m:=LED_chrdev.o else KERNELDIR?=/usr/src/fs2410_2.6.8/ PWD:=$(shellpwd)default: $(MAKE)-C$(KERNELDIR)M=$(PWD)endif最終(zuìzhōnɡ)生成LED_chrdev.ko的可執(zhí)行文件第十一頁,共四十七頁。應(yīng)用程序#include<stdio.h>#include<stdlib.h>#include<fcntl.h>#include<errno.h>#include<unistd.h>#include<linux/delay.h>#include<sys/ioctl.h>#defineDEVICE_GPIOTEST"/dev/LED_chrdev"intmain(intargc,char*argv[]){intfd;fd=open(DEVICE_GPIOTEST,O_RDONLY);提供對文件(wénjiàn)控制的函數(shù)open等

提供對I/O控制的函數(shù)提供錯誤號errno的定義,用于錯誤處理linux/unix的系統(tǒng)調(diào)用,包含了許多系統(tǒng)效勞的函數(shù)原型,例如read,write等函數(shù)。第十二頁,共四十七頁。if(fd<0){perror("cannotopendevice");exit(1);}close(fd);return0;}第十三頁,共四十七頁。makefileCC=/usr/local/3.3.2/bin/arm-linux-gccLD=/usr/local/3.3.2/bin/arm-linux-ldINCLUDE=/usr/local/3.3.2/include/LIB=/usr/local/3.3.2/lib/TEST_LED:TEST_LED.o $(LD)-rTEST_LED.o-oTEST_LEDTEST_LED.o:TEST_LED.c

$(CC)-O2-Wall-I$(INCLUDE)-L$(LIB)-cTEST_LED.c-oTEST_LED.o最終(zuìzhōnɡ)生成TEST_LED的可執(zhí)行文件第十四頁,共四十七頁。將驅(qū)動程序編譯(biānyì)進(jìn)內(nèi)核在超級終端下將驅(qū)動程序LED_chrdev.ko和應(yīng)用程序TEST_LED下載到/tmp路徑下執(zhí)行Chmod755LED_chrdev.koChmod755TEST_LEDInsmodLED_chrdev.ko./TEST_LED觀察燈的情況!第十五頁,共四十七頁。將驅(qū)動程序編譯(biānyì)進(jìn)內(nèi)核一.將驅(qū)動程序LED_chrdev.c放在相應(yīng)的目錄下,比方對于字符設(shè)備,就放置在fs2410/drivers/char/;二.修改drivers/…/Makefile文件三.修改drivers/…/Kconfig配置文件四.重新編譯內(nèi)核,下載第十六頁,共四十七頁。將驅(qū)動程序放在相應(yīng)(xiāngyīng)的目錄下第十七頁,共四十七頁。修改(xiūgǎi)drivers/char/Makefile第十八頁,共四十七頁。修改(xiūgǎi)drivers/char/Makefile第十九頁,共四十七頁。修改(xiūgǎi)drivers/char/Kconfig這些將出現(xiàn)在內(nèi)核的編譯配置中第二十頁,共四十七頁。簡化我們(wǒmen)的設(shè)計對I/O端口定義的簡化,參加頭文件#include<asm/arch/regs-gpio.h>對I/O端口操作的簡化,參加頭文件#include<asm/arch/hardware.h>第二十一頁,共四十七頁。#include<asm/arch/regs-gpio.h>第二十二頁,共四十七頁。#include<asm/arch/regs-gpio.h>I/O端口不同(bùtónɡ)功能的定義對特殊功能存放器的定義第二十三頁,共四十七頁。#include<asm/arch/hardware.h>在<asm/arch/hardware.h>中包含(bāohán)了對I/O端口操作的函數(shù)externvoids3c2410_gpio_cfgpin(unsignedintpin,unsignedintfunction);externvoids3c2410_gpio_pullup(unsignedintpin,unsignedintto);externvoids3c2410_gpio_setpin(unsignedintpin,unsignedintto);externunsignedints3c2410_gpio_getpin(unsignedintpin);函數(shù)在arch/arm/mach-s3c2410/gpio.c中定義第二十四頁,共四十七頁。/*s3c2410_gpio_cfgpin:設(shè)定(shèdìnɡ)特定端口的功能*eg:*s3c2410_gpio_cfgpin(S3C2410_GPA0,S3C2410_GPA0_ADDR0);*s3c2410_gpio_cfgpin(S3C2410_GPF7,S3C2410_GPF7_OUTP);*/將GPF7設(shè)置成輸出端口第二十五頁,共四十七頁。s3c2410_gpio_cfgpinvoids3c2410_gpio_cfgpin(unsignedintpin,unsignedintfunction){staticvoid*base; unsignedlongmask; unsignedlongcon; unsignedlongflags; base=ioremap_nocache(S3C2410_GPIO_PA_BASE(pin),0x0000004); if(pin<S3C2410_GPIO_BANKB){ mask=1<<S3C2410_GPIO_OFFSET(pin); }else{ mask=3<<S3C2410_GPIO_OFFSET(pin)*2; } local_irq_save(flags); con=__raw_readl(base+0x00); con&=~mask; con|=function; __raw_writel(con,base+0x00); local_irq_restore(flags);}將端口對應(yīng)的GPnCON存放器進(jìn)行(jìnxíng)I/O內(nèi)存映射根據(jù)相應(yīng)的功能對GPnCON存放器的對應(yīng)位寫入相應(yīng)的值第二十六頁,共四十七頁。externvoids3c2410_gpio_pullup(unsignedintpin,unsignedintto);/*s3c2410_gpio_pullup**設(shè)置(shèzhì)特定端口的上拉**to=1=>disablethepull-up*0=>enablethepull-up**例子:**s3c2410_gpio_pullup(S3C2410_GPB0,0);*s3c2410_gpio_pullup(S3C2410_GPF7,1);*/第二十七頁,共四十七頁。s3c2410_gpio_getpinunsignedints3c2410_gpio_getpin(unsignedintpin);**設(shè)置特定輸入(shūrù)端口的值**返回非0=>高電平*0=>低電平**例子:**s3c2410_gpio_getpin

(S3C2410_GPB0);*s3c2410_gpio_getpin(S3C2410_GPE8);*/第二十八頁,共四十七頁。s3c2410_gpio_getpinunsignedints3c2410_gpio_getpin(unsignedintpin){ staticvoid*data; unsignedlongoffs=S3C2410_GPIO_OFFSET(pin); data=ioremap_nocache(S3C2410_GPIO_PA_BASE(pin)+0x04,0x0000004); return__raw_readl(data)&(1<<offs);}將端口對應(yīng)的GPnDAT存放器進(jìn)行I/O內(nèi)存(nèicún)映射讀入GPnDAT存放器中對應(yīng)位的值第二十九頁,共四十七頁。s3c2410_gpio_setpinexternvoids3c2410_gpio_setpin(unsignedintpin,unsignedintto);/**設(shè)置特定輸出(shūchū)端口的高/低電平**to=1=>高電平*0=>低電平**例子:**s3c2410_gpio_setpin(S3C2410_GPB0,0);*s3c2410_gpio_setpin(S3C2410_GPF7,0);*/第三十頁,共四十七頁。對驅(qū)動程序的修改(xiūgǎi)……#include<asm/arch/regs-gpio.h>#include<asm/arch/hardware.h>對I/O端口定義的頭文件對I/O端口操作的頭文件第三十一頁,共四十七頁。staticint__initLED_init(void){……

s3c2410_gpio_cfgpin(S3C2410_GPF7,S3C2410_GPF7_OUTP);

s3c2410_gpio_pullup(S3C2410_GPF7,1);

s3c2410_gpio_setpin(S3C2410_GPF7,0); return-EINVAL; }第三十二頁,共四十七頁。intLED_open(structinode*inode,structfile*filp){ printk("LEDDeviceisopened\n");

s3c2410_gpio_setpin(S3C2410_GPF7,0);ssleep(1);s3c2410_gpio_setpin(S3C2410_GPF7,1);ssleep(1);

s3c2410_gpio_setpin(S3C2410_GPF7,0); try_module_get(THIS_MODULE); return0;}第三十三頁,共四十七頁。/*Release*/intLED_release(structinode*inode,structfile*filp){ printk("LEDDeciceisreleased!\n");s3c2410_gpio_cfgpin(S3C2410_GPF7,S3C2410_GPF7_INP);

s3c2410_gpio_pullup(S3C2410_GPF7,0);

s3c2410_gpio_setpin(S3C2410_GPF7,1); module_put(THIS_MODULE); return0;}第三十四頁,共四十七頁。中斷(zhōngduàn)驅(qū)動程序的簡化……#include<asm/arch/irq.h>#include<asm/arch/regs-irq.h>對各個中斷號的定義對中斷存放器定義的頭文件第三十五頁,共四十七頁。asm-arm/arch-s3c2410/irq.hIrq:表示(biǎoshì)所要申請的中斷號;中斷號在include/asm-arm/arch-s3c2410/irq.h中定義第三十六頁,共四十七頁。asm-arm/arch-s3c2410/irq.h第三十七頁,共四十七頁。#include<asm/arch/regs-irq.h>第三十八頁,共四十七頁。<arch/arm/math-s3c2410/irq.c>在<arch/arm/math-s3c2410/irq.c>中定義有中斷操作(cāozuò)的相關(guān)函數(shù),可以通過extern語句參加這些函數(shù)第三十九頁,共四十七頁。在<arch/arm/math-s3c2410/irq.c>中定義有中斷操作的相關(guān)函數(shù)s3c_irq_mask(unsignedintirqno)//中斷屏蔽(píngbì)s3c_irq_unmask(unsignedintirqno)//中斷使能s3c_irq_ack

(unsignedintirqno)//清中斷掛起void__inits3c2410_init_irq(void)//中斷初始化s3c_irqext_mask(unsignedintirqno)//外部中斷屏蔽s3c_irqext_ack(unsignedintirqno)//清外部中斷掛起s3c_irqext_unmask(unsignedintirqno)//外部中斷使能第四十頁,共四十七頁。<arch/arm/math-s3c2410/irq.c>函數(shù):s3c_irq_mask(unsignedintirqno)參數(shù):irqno表示中斷號作用:屏蔽特定(tèdìng)中斷例子:s3c_irq_mask〔IRQ_EINT0〕s3c_irq_mask(unsignedintirqno)

{

unsignedlongmask;

irqno-=IRQ_EINT0;

mask=__raw_readl(S3C2410_INTMSK);

mask|=1UL<<irqno;

__raw_writel(mask,S3C2410_INTMSK);

}

第四十一頁,共四十七頁。函數(shù)(hánshù):s3c_irq_unmask(unsignedintirqno)參數(shù):irqno表示中斷號作用:屏蔽特定中斷例子:s3c_ir

溫馨提示

  • 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

提交評論