ARM字符驱动实例_第1页
ARM字符驱动实例_第2页
ARM字符驱动实例_第3页
ARM字符驱动实例_第4页
ARM字符驱动实例_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、字符驱动实例本实验电电路图4个LED指示灯的的接口电电路驱动程序序#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include定义request_mem_region所需的头头文件定义I/O读写,I/O内存读写写所需的的头文件件定义ioctl函数所需需的头文文件定义ioctl函数所需需的头文文件定义延迟迟与定时时器函数数所需的的头文件件定义中断断函数所所需的头头文件#define CDRIVER_NA

2、MELED_chrdev#define GPFCON(0X56000050)#define GPFDAT(0X56000054)#define GPFUP (0X56000058)staticvoid*gpfcon;staticvoid*gpfdat;staticvoid*gpfup;intCDRIVER_MAJOR=0;intCDRIVER_MINOR=0;intcount=1;定义物理理地址定义映射射后的虚虚拟地址址指针loff_tLED_llseek(structfile *filp,loff_toff,intwhence);intLED_ioctl(structinode*inode,

3、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,

4、.release=LED_release,;staticint_initLED_init(void)if(!request_mem_region(GPFCON,12,CDRIVER_NAME)printk(KERN_ERRLED: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_ERRLED:ioremapfailedn);iounm

5、ap(gpfcon);return-EINVAL;申请I/O内存I/O内存映射射若映射不不成功,释放if(!gpfdat)printk(KERN_ERRLED:ioremapfailedn);iounmap(gpfdat);return-EINVAL;if(!gpfup)printk(KERN_ERRLED:ioremapfailedn);iounmap(gpfup);return-EINVAL;return0;若映射不不成功,释放若映射不不成功,释放intLED_open(structinode*inode,structfile*filp)printk(LEDDeviceisopenedn)

6、;writel(readl(gpfcon)&(114),gpfcon);writel(readl(gpfup)&(17),gpfup);writel(readl(gpfdat)&(07),gpfdat);ssleep(1);writel(readl(gpfdat)&(17),gpfdat);ssleep(1);writel(readl(gpfdat)&(07),gpfdat);try_module_get(THIS_MODULE);return0;设为输出出端口上拉禁止止输出低电电平,灯亮输出高电电平,灯灭/*Release*/intLED_release(structinode*inode,

7、structfile *filp)printk(LEDDeciceisreleased!n);writel(readl(gpfcon)&(014),4);writel(readl(gpfup)&(17),4);writel(readl(gpfdat)&(07),4);module_put(THIS_MODULE);return0;staticvoid_exitLED_exit(void)printk(UnloadingLED_cdevnow.n);iounmap(gpfcon);iounmap(gpfdat);iounmap(gpfup);cdev_del(LED_cdev);unregist

8、er_chrdev_region(LED_dev,count);释放内存存makefileifneq($(KERNELRELEASE),)obj-m:=LED_chrdev.oelseKERNELDIR?=/usr/src/fs2410_2.6.8/PWD:=$(shellpwd)default:$(MAKE) -C $(KERNELDIR)M=$(PWD)endif最终生成成LED_chrdev.ko的可执行行文件应用程序序#include#include#include#include#include#include#include#define DEVICE_GPIOTEST/dev/L

9、ED_chrdevintmain(intargc, char*argv)intfd;fd=open(DEVICE_GPIOTEST,O_RDONLY);提供对文文件控制制的函数数open等提供对I/O控制的函函数提供错误误号errno的定义,用于错错误处理理linux/unix的系统调调用,包包含了许许多系统统服务的的函数原原型,例如read,write等函数。if(fd0)perror(cannotopendevice);exit(1);close(fd);return0;makefileCC=/usr/local/3.3.2/bin/arm-linux-gccLD=/usr/local/3

10、.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最终生成成TEST_LED的可执行行文件将驱动程程序编译译进内核核在超级终终端下将将驱动程程序LED_chrdev.ko和应用程程序TEST_LED下载到/tmp路径下执执行Chmod755

11、LED_chrdev.koChmod755TEST_LEDInsmodLED_chrdev.ko./TEST_LED观察灯的的情况!将驱动程程序编译译进内核核一.将驱动程程序LED_chrdev.c放在相应应的目录录下,比如对于于字符设设备,就放置在在fs2410/drivers/char/;二.修改drivers/Makefile文件三.修改drivers/Kconfig配置文件件四.重新编译译内核,下载将驱动程程序放在在相应的的目录下下修改drivers/char/Makefile修改drivers/char/Makefile修改drivers/char/Kconfig这些将出出现在内内核

12、的编编译配置置中简化我们们的设计计对I/O端口定义义的简化化,加入头文文件#include对I/O端口操作作的简化化,加入头文文件#include#include#includeI/O端口不同同功能的的定义对特殊功功能寄存存器的定定义#include在中包含了了对I/O端口操作作的函数数externvoids3c2410_gpio_cfgpin(unsignedintpin, unsignedintfunction);externvoids3c2410_gpio_pullup(unsignedintpin, unsignedintto);externvoids3c2410_gpio_setpi

13、n(unsignedintpin, unsignedintto);externunsignedints3c2410_gpio_getpin(unsignedintpin);函数在arch/arm/mach-s3c2410/gpio.c中定义/*s3c2410_gpio_cfgpin:设定特定定端口的的功能*eg:*s3c2410_gpio_cfgpin(S3C2410_GPA0,S3C2410_GPA0_ADDR0);*s3c2410_gpio_cfgpin(S3C2410_GPF7,S3C2410_GPF7_OUTP);*/将GPF7设置成输输出端口口s3c2410_gpio_cfgpinv

14、oid s3c2410_gpio_cfgpin(unsignedintpin, unsignedintfunction)staticvoid *base ;unsignedlong mask;unsignedlong con;unsignedlong flags;base =ioremap_nocache(S3C2410_GPIO_PA_BASE(pin),0 x0000004);if(pin S3C2410_GPIO_BANKB)mask =1S3C2410_GPIO_OFFSET(pin); elsemask =3disable thepull-up*0=enablethe pull-up

15、 *例子: *s3c2410_gpio_pullup(S3C2410_GPB0,0);*s3c2410_gpio_pullup(S3C2410_GPF7, 1);*/s3c2410_gpio_getpinunsignedints3c2410_gpio_getpin(unsignedintpin); *设置特定定输入端端口的值值 *返回非0=高电平*0=低电平 *例子: *s3c2410_gpio_getpin(S3C2410_GPB0);*s3c2410_gpio_getpin(S3C2410_GPE8);*/s3c2410_gpio_getpinunsignedints3c2410_gpio

16、_getpin(unsignedintpin)staticvoid*data;unsignedlong offs=S3C2410_GPIO_OFFSET(pin);data =ioremap_nocache(S3C2410_GPIO_PA_BASE(pin)+0 x04 ,0 x0000004);return_raw_readl(data) &(1高电平*0=低电平 *例子: *s3c2410_gpio_setpin(S3C2410_GPB0,0);*s3c2410_gpio_setpin(S3C2410_GPF7,0);*/对驱动程程序的修修改#include#include对I/O端口定义

17、义的头文文件对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(LEDDeviceisopenedn);s3c2410_gpio_setpin(S3C2410_GPF7,0);sslee

18、p(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)

19、;s3c2410_gpio_setpin(S3C2410_GPF7,1);module_put(THIS_MODULE);return0;中断驱动动程序的的简化#include#include对各个中中断号的的定义对中断寄寄存器定定义的头头文件asm-arm/arch-s3c2410/irq.hIrq:表示所所要申请请的中断断号;中断号在在include/asm-arm/arch-s3c2410/irq.h中定义asm-arm/arch-s3c2410/irq.h#include在中定义有有中断操操作的相相关函数数,可以通过过extern语句加入入这些函函数在中定义有有中断操操作的相相关函数数

20、s3c_irq_mask(unsignedintirqno)/中断屏蔽蔽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)/外部中断断使能函数:s3c_irq_mask(unsignedintirqno)参数:irqno表示中断断号作用:屏蔽特定定中断例子:s3c_irq_mask(IRQ_EINT0)s3c_irq_mask(unsignedintirqno)unsignedlong mask;irqno-=IRQ_EINT0;mask =_raw_readl(S3C2410_INTMSK);mask |= 1ULirqno;_raw_writel(mask, S3C2410_INTMSK);函数:s3c

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论