版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
LED顯示控制+文件系統(tǒng)定制系名:專業(yè):指導教師:姓名:學號:班級:組員:科目:二○一年月目錄一、設計任務和技術要求:.二、器件介紹……………三、設計代碼:………………………….四、設計結果:..五、系統(tǒng)評價:.六、心得體會:.一、設計任務和技術要求:編寫LED驅(qū)動程序,驅(qū)動程序采用手動定義設備名稱〔自己姓名拼音_led〕和主設備號,設備號必須是系統(tǒng)尚未使用的設備號編寫對應驅(qū)動的makefile文件將驅(qū)動程序編譯成模塊,并實現(xiàn)模塊的加載及卸載編寫驅(qū)動測試程序,要求運行該測試程序后,能夠?qū)ed設備翻開成功與否做出判斷;能夠顯示led控制菜單項選擇項〔至少2個控制選項〕,例如,選擇“1〞,led等循環(huán)點亮;選擇“2〞,指定led1燈點亮編寫對應測試程序的makefile文件文件系統(tǒng)定制要求:制作文件系統(tǒng)類型為yaffs的文件系統(tǒng);文件系統(tǒng)啟動時顯示小組成員信息;文件系統(tǒng)啟動時需要按提示輸入用戶名信息;文件系統(tǒng)成功掛載后,通過串口傳送剛剛編寫的led控制程序,并運行該led控制程序,要求能夠按照規(guī)定的控制方式實現(xiàn)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:按鍵驅(qū)動:/*
*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循環(huán)。 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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 商鋪聯(lián)營合同協(xié)議范本版3篇
- 勞動合同簡化樣本公共事業(yè)3篇
- 照明課程設計實驗摘要
- 牙周護理課程設計
- 借款合同延期通知3篇
- 勞動合同管理與員工福利的創(chuàng)新3篇
- 太陽能燈課程設計
- 污水處課程設計緒言
- 氧氣探究實驗的課程設計
- 小學生微型課程設計
- 【MOOC】大學生心理學-中央財經(jīng)大學 中國大學慕課MOOC答案
- 外墻真石漆施工方案
- 計劃崗位培訓課件
- 中藥涂擦治療
- 2024年廣西普法云平臺考試答案
- 2023-2024學年廣東省深圳市福田區(qū)八年級(上)期末英語試卷
- IATF16949體系推行計劃(任務清晰版)
- 2021年高考數(shù)學試卷(上海)(春考)(解析卷)
- 石橫鎮(zhèn)衛(wèi)生院康復科建設方案
- DB11T 1553-2018 居住建筑室內(nèi)裝配式裝修工程技術規(guī)程
- 非新生兒破傷風診療
評論
0/150
提交評論