版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
LED显示控制+文件系统定制系名:专业:指导教师:姓名:学号:班级:组员:科目:二○一年月目录一、设计任务和技术要求:.二、器件介绍……………三、设计代码:………………………….四、设计结果:..五、系统评价:.六、心得体会:.一、设计任务和技术要求:编写LED驱动程序,驱动程序采用手动定义设备名称〔自己姓名拼音_led〕和主设备号,设备号必须是系统尚未使用的设备号编写对应驱动的makefile文件将驱动程序编译成模块,并实现模块的加载及卸载编写驱动测试程序,要求运行该测试程序后,能够对led设备翻开成功与否做出判断;能够显示led控制菜单项选择项〔至少2个控制选项〕,例如,选择“1〞,led等循环点亮;选择“2〞,指定led1灯点亮编写对应测试程序的makefile文件文件系统定制要求:制作文件系统类型为yaffs的文件系统;文件系统启动时显示小组成员信息;文件系统启动时需要按提示输入用户名信息;文件系统成功挂载后,通过串口传送刚刚编写的led控制程序,并运行该led控制程序,要求能够按照规定的控制方式实现led灯的控制二、设计代码程序清单:应用程序测试leds_test.c如下:#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<sys/ioctl.h>#defineIOCTL_LED_ON1#defineIOCTL_LED_OFF5#defineIOCTL_LED_RUN3voidusage(char*exename){ printf("Usage:\n"); printf("%s<led_no><on/off>\n",exename); printf("led_no=1,2,3or4\n");}intmain(intargc,char**argv){ unsignedintled_no; intfd=-1;unsignedintcount=10; if(argc>3||argc==1) gotoerr; fd=open("/dev/cylled",0);//翻开设备 if(fd<0){ printf("Can'topen/dev/fdwled,\n"); return-1; } if(argc==2){ if(!strcmp(argv[1],"run")) { ioctl(fd,IOCTL_LED_RUN,count);//运行跑马灯}else{ gotoerr; } } if(argc==3){ led_no=strtoul(argv[1],NULL,0)-1;//操作哪个LED? if(led_no>3) gotoerr; if(!strcmp(argv[2],"on")){ ioctl(fd,IOCTL_LED_ON,led_no);//点亮 }elseif(!strcmp(argv[2],"off")){ ioctl(fd,IOCTL_LED_OFF,led_no);//熄灭 }else{ gotoerr; } } close(fd); return0;err:按键驱动:/*
*linux/drivers/char/mini210_buttons.c
*
*Thisprogramisfreesoftware;youcanredistributeitand/ormodify
*itunderthetermsoftheGNUGeneralPublicLicenseversion2as
*publishedbytheFreeSoftwareFoundation.
*/
#include<linux/module.h>
#include<linux/kernel.h>
#include<linux/fs.h>
#include<linux/init.h>
#include<linux/delay.h>
#include<linux/poll.h>
#include<linux/irq.h>
#include<asm/irq.h>
#include<asm/io.h>
#include<linux/interrupt.h>
#include<asm/uaccess.h>
#include<mach/hardware.h>
#include<linux/platform_device.h>
#include<linux/cdev.h>
#include<linux/miscdevice.h>
#include<mach/map.h>
#include<mach/gpio.h>
#include<mach/regs-clock.h>
#include<mach/regs-gpio.h>
#defineDEVICE_NAME"buttons"
structbutton_desc{
intgpio;
intnumber;
char*name;
structtimer_listtimer;
};
staticstructbutton_descbuttons[]={
{S5PV210_GPH2(0),0,"KEY0"},
{S5PV210_GPH2(1),1,"KEY1"},
{S5PV210_GPH2(2),2,"KEY2"},
{S5PV210_GPH2(3),3,"KEY3"},
{S5PV210_GPH3(0),4,"KEY4"},
{S5PV210_GPH3(1),5,"KEY5"},
{S5PV210_GPH3(2),6,"KEY6"},
{S5PV210_GPH3(3),7,"KEY7"},
};
staticvolatilecharkey_values[]={
'0','0','0','0','0','0','0','0'
};
staticDECLARE_WAIT_QUEUE_HEAD(button_waitq);
staticvolatileintev_press=0;
staticvoidmini210_buttons_timer(unsignedlong_data)
{
structbutton_desc*bdata=(structbutton_desc*)_data;
intdown;
intnumber;
unsignedtmp;
tmp=gpio_get_value(bdata->gpio);
/*activelow*/
down=!tmp;
printk("KEY%d:%08x\n",bdata->number,down);
number=bdata->number;
if(down!=(key_values[number]&1)){
key_values[number]='0'+down;
ev_press=1;
wake_up_interruptible(&button_waitq);
}
}
staticirqreturn_tbutton_interrupt(intirq,void*dev_id)
{
structbutton_desc*bdata=(structbutton_desc*)dev_id;
mod_timer(&bdata->timer,jiffies+msecs_to_jiffies(40));
returnIRQ_HANDLED;
}
staticintmini210_buttons_open(structinode*inode,structfile*file)
{
intirq;
inti;
interr=0;
for(i=0;i<ARRAY_SIZE(buttons);i++){
if(!buttons[i].gpio)
continue;
setup_timer(&buttons[i].timer,mini210_buttons_timer,
(unsignedlong)&buttons[i]);
irq=gpio_to_irq(buttons[i].gpio);
err=request_irq(irq,button_interrupt,IRQ_TYPE_EDGE_BOTH,
buttons[i].name,(void*)&buttons[i]);
if(err)
break;
}
if(err){
i--;
for(;i>=0;i--){
if(!buttons[i].gpio)
continue;
irq=gpio_to_irq(buttons[i].gpio);
disable_irq(irq);
free_irq(irq,(void*)&buttons[i]);
del_timer_sync(&buttons[i].timer);
}
return-EBUSY;
}
ev_press=1;
return0;
}
staticintmini210_buttons_close(structinode*inode,structfile*file)
{
intirq,i;
for(i=0;i<ARRAY_SIZE(buttons);i++){
if(!buttons[i].gpio)
continue;
irq=gpio_to_irq(buttons[i].gpio);
free_irq(irq,(void*)&buttons[i]);
del_timer_sync(&buttons[i].timer);
}
return0;
}
staticintmini210_buttons_read(structfile*filp,char__user*buff,
size_tcount,loff_t*offp)
{
unsignedlongerr;
if(!ev_press){
if(filp->f_flags&O_NONBLOCK)
return-EAGAIN;
else
wait_event_interruptible(button_waitq,ev_press);
}
ev_press=0;
err=copy_to_user((void*)buff,(constvoid*)(&key_values),
min(sizeof(key_values),count));
returnerr?-EFAULT:min(sizeof(key_values),count);
}
staticunsignedintmini210_buttons_poll(structfile*file,
structpoll_table_struct*wait)
{
unsignedintmask=0;
poll_wait(file,&button_waitq,wait);
if(ev_press)
mask|=POLLIN|POLLRDNORM;
returnmask;
}
staticstructfile_operationsdev_fops={
.owner=THIS_MODULE,
.open=mini210_buttons_open,
.release=mini210_buttons_close,
.read=mini210_buttons_read,
.poll=mini210_buttons_poll,
};
staticstructmiscdevicemisc={
.minor=MISC_DYNAMIC_MINOR,
.name=DEVICE_NAME,
.fops=&dev_fops,
};
staticint__initbutton_dev_init(void)
{
intret;
ret=misc_register(&misc);
printk(DEVICE_NAME"\tinitialized\n");
returnret;
}
staticvoid__exitbutton_dev_exit(void)
{
misc_deregister(&misc);
}
module_init(button_dev_init);
module_exit(button_dev_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("FriendlyARMInc.");程序cylled.c如下〔基于实验11的代码进行更改〕:#include<linux/kernel.h>#include<linux/module.h>#include<linux/miscdevice.h>#include<linux/fs.h>#include<linux/types.h>#include<linux/moduleparam.h>#include<linux/slab.h>#include<linux/ioctl.h>#include<linux/cdev.h>#include<linux/delay.h>#include<mach/gpio.h>#include<mach/regs-gpio.h>#include<plat/gpio-cfg.h>#defineDEVICE_NAME"cylled"#defineLED_MAJOR222#defineIOCTL_LED_ON1#defineIOCTL_LED_OFF5#defineIOCTL_LED_RUN3%定义三个宏#defineLED_NUM ARRAY_SIZE(led_gpios)staticintled_gpios[]={ S5PV210_GPJ2(0), S5PV210_GPJ2(1), S5PV210_GPJ2(2), S5PV210_GPJ2(3),};staticlongmini210_leds_ioctl(structfile*filp,unsignedintcmd,unsignedlongarg){ inti; intj; switch(cmd) { caseIOCTL_LED_RUN:%定义RUN,用了两个for循环。 for(i=0;i<arg;i++) { for(j=0;j<4;j++) { gpio_set_value(led_gpios[j],0); msleep(100); gpio_set_value(led_gpios[j],1); } } break; caseIOCTL_LED_ON: if(arg>LED_NUM) { return-EINVAL; } gpio_set_value(led_gpios[arg],0); break; caseIOCTL_LED_OFF: if(arg>LED_NUM) { return-EINVAL; } gpio_set_value(led_gpios[arg],1); break; default: return-EINVAL; } return0;}staticstructfile_operationsmini210_led_dev_fops={ .owner =THIS_MODULE, .unlocked_ioctl=mini210_leds_ioctl,};staticint__initmini210_led_dev_init(void){ intret; inti; for(i=0;i<LED_NUM;i++) { ret=gpio_request(led_gpios[i],"LED"); if(ret) { printk("%s:requestGPIO%dforLEDfailed,ret=%d\n",DEVICE_NAME,led_gpios[i],ret); returnret; } s3c_gpio_cfgpin(led_gpios[i],S3C_GPIO_OUTPUT); gpio_set_value(led_gpios[i],1); } ret=register_chrdev(LED_MAJOR,DEVICE_NAME,&mini210_led_dev_fops); if(ret<0) { printk("%scan'tregi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 湖南申论模拟108
- 湖南申论模拟215
- 2024年银行个人商业用房贷款抵押借款合同范本
- 2013年6月29日上午面试真题
- 甘肃省公务员面试真题汇编3
- 建筑工程有限公司年度责任目标任务及考核方案
- 山西公务员面试模拟27
- 2024年工资集体协商要约书(范本)
- 地方公务员浙江申论171
- 河北省公务员面试模拟127
- 产教融合校企合作方案
- 安全生产的合理化建议(6篇)
- 初中部体育运动损伤现状调查研究
- 中华全国总工会办公厅印发《加快工会数字化建设工作方案》
- (2024年)网约车培训课件共5文档
- 基础教育课程教学改革深化行动方案解读
- 小学数学计算专项训练之乘法分配律(提公因数)
- 广东省揭阳市揭西县2023-2024学年高二上学期期末数学试题
- 救护车使用培训课件
- 幼儿园市场调查报告
- 逾期付款违约赔偿金承诺书
评论
0/150
提交评论