嵌入式實訓-LED顯示+文件系統(tǒng)定制實驗報告_第1頁
嵌入式實訓-LED顯示+文件系統(tǒng)定制實驗報告_第2頁
嵌入式實訓-LED顯示+文件系統(tǒng)定制實驗報告_第3頁
嵌入式實訓-LED顯示+文件系統(tǒng)定制實驗報告_第4頁
嵌入式實訓-LED顯示+文件系統(tǒng)定制實驗報告_第5頁
已閱讀5頁,還剩11頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論