




版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年中國嵌帶端打包邊數(shù)據(jù)監(jiān)測研究報告
- 2025至2030年中國雙人鋼床數(shù)據(jù)監(jiān)測研究報告
- 2025至2030年中國單邊弧綠玻璃面板灶具數(shù)據(jù)監(jiān)測研究報告
- 2025至2030年中國便攜型呼吸式警用酒精檢測儀數(shù)據(jù)監(jiān)測研究報告
- 2025年中國防護(hù)服裝市場調(diào)查研究報告
- 2025年中國腳踏點焊機市場調(diào)查研究報告
- 學(xué)生會秘書處工作總結(jié)
- 編輯部年終工作總結(jié)
- 人事部工作總結(jié)報告
- 行政后勤工作年終總結(jié)
- 反面典型案例剖析材料范文(通用6篇)
- 社區(qū)養(yǎng)老驛站運營方案模版
- 鐵道概論(高職)PPT完整全套教學(xué)課件
- 一年級體育課教案下冊
- 廖常初《FX系列LC編程及應(yīng)用》課后習(xí)題答案
- 輪狀病毒性腸炎
- 正大集團(tuán)大豬場開發(fā)流程
- 高中政治必修四知識體系每單元的總體框架
- GB/T 41255-2022智能工廠通用技術(shù)要求
- GB/T 41029-2021石油天然氣鉆井海洋棄井作業(yè)規(guī)程
- 深入推進(jìn)依法行政
評論
0/150
提交評論