嵌入式实训-LED显示+文件系统定制实验报告_第1页
嵌入式实训-LED显示+文件系统定制实验报告_第2页
嵌入式实训-LED显示+文件系统定制实验报告_第3页
嵌入式实训-LED显示+文件系统定制实验报告_第4页
嵌入式实训-LED显示+文件系统定制实验报告_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论