按键开关和LED驱动编程 ——061180118 郁敏 一. 实验目的 了解FR-V400.docx_第1页
按键开关和LED驱动编程 ——061180118 郁敏 一. 实验目的 了解FR-V400.docx_第2页
按键开关和LED驱动编程 ——061180118 郁敏 一. 实验目的 了解FR-V400.docx_第3页
按键开关和LED驱动编程 ——061180118 郁敏 一. 实验目的 了解FR-V400.docx_第4页
按键开关和LED驱动编程 ——061180118 郁敏 一. 实验目的 了解FR-V400.docx_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

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

文档简介

按键开关和LED驱动编程 061180118 郁敏一. 实验目的 了解FR-V400嵌入式系统板上按键和LED的资源配置 进一步掌握嵌入式系统中驱动模块的编写与使用二. 实验仪器计算机 FRV实验板三. 实验内容与要求1根据现有的按键驱动,设计实验方案,确定按键和对应键值的关系;2 根据资料给出的资源配置,参考现有的驱动程序,独立编写驱动模块。用insmod加载,实现简单的按键读取和LED显示功能。四.实验设计实验中的过程主要有:修改内核文件 编译内核 原有程序控制LCD 控制LED 内核程序 键值关系从系统中找出FRV源码目录下的driver/char/switch.c并做参考,由于同时switch.c又调用了switch.h,一并查看。由实验手册上查到,由于操作系统内核中有LED定时刷新功能,因此在用户程序使用LED时,会被内核干扰。为了用户程序能控制LED,必须修改源码。到linux/arch/frvnommu/platform/fr400pdk2-board/led.c,查看led.c的有关内容,发现这是让LED在系统启动后从有往左的闪烁,将其中的“ #define ON_HEARTBEAT ”注释掉,此文件就不会被include了。然后重新编译内核,与第一次实验的内容一样,先配置内核,然后编译,生成dev等。最后有linuxromrd.mhx生成,这是要用的。将linuxromrd.mhx放入tftpboot中,用redboot传入实验板上并加载启动,配置好实验板的IP地址,将计算机的/opt目录挂载到/mnt下。这样实验的准备工作就完成了。为了能够通过按键控制LED,必须找到按键在FPGA的对应关系。在实验手册上没有找到键值,所以只能编写程序来测。程序为:int main()int fd,key;fd =open(keyled,O_RDONLY);if(fd0x7bff SW70x77ff SW80x6fff SW90x5fff SW100x3fffSW4up0x7e7f SW4press0x7dff SW4down0x7f9f SW6up0x7ff3SW6pres 0x7fef SW6down0x7ffc则可以把这些键值依次定义SW5等,在用户程序中应用switch函数来分辨。程序的编写:通过阅读switch.c和switch,h,发现与控制LED有关的语句#defineFPGA_SW_IOC_MAGIC0xdc#defineFPGA_SW_READ_IOR(FPGA_SW_IOC_MAGIC, 0, int)#defineFPGA_PUSW_READ_IOR(FPGA_SW_IOC_MAGIC, 1, int)是读键值和控制LED的语句。所以在内核程序中改成#defineFPGA_READ_IOR(FPGA_SW_IOC,0,int)#defineFPGA_CTL_IOW(FPGA_SW_IOC,1,int)在用户程序与内核通信的时候来执行其中的一条。即当在用户程序中出现ioctl(fd,FPGA_READ,&key);ioctl(fd,FPGA_CTL,0xff);时,调用内核中的static int keyled_ioctl(struct inode *inode,struct file *file,unsigned int cmd ,unsigned long arg)switch(cmd)case FPGA_READ:*(int*) arg=*SW_ADDR;break;case FPGA_CTL:*LED_ADDR=arg;break;default:break;当ioctl(fd,FPGA_READ,&key)时,按照switch语句,*(int*) arg=*SW_ADDR,即将键值赋给key,这样就能依照key的值来判断所按下的键是哪个了。其中的SW_ADDR和LED_ADDR由查FRV的FPGA内部寄存器映射表可以得到为#defineLED_ADDR(volatile unsigned short *)0x20000022#defineSW_ADDR(volatile unsigned short *)0x20000028其中用户程序中的函数和内核程序的函数有如下对应关系:static struct file_operations fops= open:keyled_open,release:keyled_release,ioctl:keyled_ioctl,;再在内核程序中假如必要的内核的启动和释放模块,还有与用户程序的open、close对应的keyled_open、keyled_close函数,内核就基本上编写完了。用户程序中,主要有字符设备的打开和关闭,LED的控制这三个部分。打开:fd =open(keyled,O_RDONLY);关闭:close(fd);控制:ioctl(fd,FPGA_SWITCH_READ,&key);switch (key)case SW5:ioctl(fd,FPGA_LED,0xff);break;case SW7:ioctl(fd,FPGA_LED,0xfe);break;case SW8: ioctl(fd,FPGA_LED,0xfd);break;case SW9: ioctl(fd,FPGA_LED,0xfc);break;case SW10: ioctl(fd,FPGA_LED,0xfb);break;case SW4up: ioctl(fd,FPGA_LED,0xfa);break;case SW4press: ioctl(fd,FPGA_LED,0xf9);break;case SWdown: ioctl(fd,FPGA_LED,0xf8);break;case SWup: ioctl(fd,FPGA_LED,0xf7);break;case SWpress: ioctl(fd,FPGA_LED,0xf6);break;case SWdown: ioctl(fd,FPGA_LED,0xf5);break;default:printf(No key is pressed!n);break;发现在控制LED时,0xff为1111111111111111(16个1)这样理论上就可以控制实验板上的15个LED,不过试下来,发现只能控制左边的7个灯。当0xff时灯都亮;当0xfe时最左边的灯不亮;;故而设从左边开始算不亮的灯为1,则可以得出以下规律0xff=0,0xfe=1,0xfd=2,0xf5=10。基本的控制LED的程序就此实现。不过考虑到在之前的实验中实现过控制屏幕,所以设想在控制LED的同时也控制LCD,让屏幕上也显示出图形来。这要加入控制LCD的程序,在用户程序中调用它,再一起编译就行了。在用户程序中加入我的启动屏幕的子程序start(),在控制LED的指令后面加上case SW5:ioctl(fd,FPGA_LED,0xff);num(0);break;case SW7:ioctl(fd,FPGA_LED,0xfe);num(1);break;如此,在LED显示我定义的0(1,2,3,4,)时,屏幕上也会显示0(1,2,3,4,)。在内核程序和用户程序都编好后,就是编译这个步骤了。我所编的这两个程序是在实验板上运行的,故而需要交叉编译来实现。对于用户程序的交叉编译,有指令frv400-flt-gcc -o app app.c,而对于内核程序的交叉编译,则有frv-elf-gcc -mcpu=fr400 -DMODULE -D_KERNEL_ -G 0 -msoft-float -D_linux_ -c kern.c -o kern.o -I /usr/local/frv-linux/frv-axlinux/include因为这条指令很长,且极容易在键入的时候按错键,

温馨提示

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

评论

0/150

提交评论