版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、Linux LED 設(shè)備驅(qū)動(dòng)實(shí)驗(yàn)1.1 實(shí)驗(yàn)?zāi)康?(1)了解 LED 原理及其與 S3C2410 的接口電路設(shè)計(jì) (2)了解S3C2410芯片的 I/O 端口配置方法 (3)通過S3C2410芯片的 GPF4 端口控制 Super-ARM主板上 D1 的亮滅 (4)掌握 LED 驅(qū)動(dòng)的編寫及測試過程,進(jìn)而熟悉開發(fā)簡單字符設(shè)備驅(qū)動(dòng)的方法 1.2 實(shí)驗(yàn)原理 (1)LED 接口電路 由于單只 LED 管的工作電壓低(大約在 1.52V) ,個(gè)別需達(dá)到 4V,同時(shí)工作電流僅為 15mA,因此可以用 CPU 的通用輸入輸出管腳(GPIO)直接控制 LED 的亮滅。 LED 的接口電路如下圖1所示:圖1
2、LED接口電路1.3 實(shí)驗(yàn)任務(wù) 本實(shí)驗(yàn)的最終目的是實(shí)現(xiàn)Super-ARM平臺(tái)上的 LED 驅(qū)動(dòng)。包含以下幾個(gè)任務(wù): (1)編寫 LED 設(shè)備驅(qū)動(dòng)程序,驅(qū)動(dòng)程序中手動(dòng)定義設(shè)備名稱及主設(shè)備號(hào),這個(gè)設(shè)備號(hào)必須是系統(tǒng)尚未使用的設(shè)備號(hào),筆者這里暫用 212,你也可以嘗試用別的數(shù)字。當(dāng)然最好的方法是動(dòng)態(tài)分配設(shè)備號(hào),如果使用這種方法,在/dev 目錄下為 LED 設(shè)備建立設(shè)備節(jié)點(diǎn)的時(shí)候,需要先從/proc/devices 文件中獲取該設(shè)備的主設(shè)備號(hào)。在驅(qū)動(dòng)程序中還要實(shí)現(xiàn)與 LED 相應(yīng)的 I/O 配置,以及讀寫設(shè)備的接口函數(shù)等。 (2)將驅(qū)動(dòng)編譯成模塊,并實(shí)現(xiàn)模塊的加載及卸載。 (3)編寫驅(qū)動(dòng)的測試程序,在
3、程序中實(shí)現(xiàn)打開 LED 設(shè)備,控制 LED 設(shè)備一亮一滅,關(guān)閉 LED 設(shè)備等。1.4 實(shí)驗(yàn)步驟 編寫 led.c文件 建立 led目錄: #mkdir /gdut2410/led 進(jìn)入led目錄,在該目錄下建立兩個(gè)子目錄driver 和 test ,前者用來存放驅(qū)動(dòng)程序,后者用來存放驅(qū)動(dòng)測試程序: #cd /gdut2410/led #mkdir driver test 進(jìn)入驅(qū)動(dòng)程序目錄,建立設(shè)備驅(qū)動(dòng)文件 led.c: cd driver gedit led.c LED 驅(qū)動(dòng)程序如代碼清單5-1 所示:代碼清單 5-1 LED驅(qū)動(dòng)程序 led.c /* 頭文件 * #include #inc
4、lude #include #include #include #include #include #include #include #include #include #include /* 定義設(shè)備結(jié)構(gòu)體及相關(guān)宏 * #define DEVICE_NAME led /定義設(shè)備名 #define DEVICE_MAJOR 212 /手動(dòng)定義 LED 設(shè)備的主設(shè)備號(hào)為 212 static int led_major = DEVICE_MAJOR ; #define LED1 S3C2410_GPF4 /定義LED1 對應(yīng) S3C2410 的 GPF4 端口 #define LED1_OUT
5、P S3C2410_GPF4_OUTP #define LED_ON 0 /給端口低電平(0)時(shí),LED 亮 #define LED_OFF 1 /給端口高電平(1)時(shí),LED 滅 /定義 LED 設(shè)備結(jié)構(gòu)體 struct s3c2410_led_dev struct cdev cdev; /LED 設(shè)備對應(yīng)一個(gè)字符設(shè)備結(jié)構(gòu)體 int status; /LED 狀態(tài)標(biāo)識(shí),0 代表滅,1 代表亮 ; static struct s3c2410_led_dev dev; /* 函數(shù)聲明 * void s3c2410_led_InitIO(void); /初始化 IO 端口的函數(shù)/* 函數(shù)定義 *
6、/* = s3c2410_led _InitIO() 描述 : 初始化 IO 端口 參數(shù) : 無 返回值 : 無 = */ void s3c2410_led_InitIO(void) int i; /配置 LED 對應(yīng)的端口為輸出 s3c2410_gpio_cfgpin(LED1, LED1_OUTP); /配置 LED 初始為熄滅狀態(tài) s3c2410_gpio_setpin(LED1, LED_OFF); /* = s3c2410_led_open() 描述 : 打開設(shè)備 參數(shù) : 返回值 : 0 = */ static int s3c2410_led_open(struct inode *
7、inode,struct file *filp) return 0; /* = s3c2410_led_release() 描述 : 注銷設(shè)備 參數(shù) : 返回值 : 0 = */ static int s3c2410_led_release(struct inode *inode,struct file *filp) return 0; /* = s3c2410_led_ioctl() 描述 : IO 控制函數(shù),通過 LED_ON 和 LED_OFF命令控制 LED 的亮滅 參數(shù) : cmd:用戶控制命令,包括 LED_ON 和LED_OFF 返回值 : 0 = */static int s3
8、c2410_led_ioctl(struct inode *inode,struct file *filp, unsigned int cmd,unsigned long arg) switch(cmd) case LED_ON: s3c2410_gpio_setpin(LED1, LED_ON); dev.status = 1; break; case LED_OFF: s3c2410_gpio_setpin(LED1, LED_OFF); dev.status = 0; break; default: return -EINVAL; return 0; /* = s3c2410_led_r
9、ead() 描述 : 讀函數(shù),讀取 LED 的狀態(tài) 參數(shù) : buffer: 用來存儲(chǔ)讀取的 LED 狀態(tài); count: 用來記錄用戶讀取了多少個(gè)字符 返回值 : count = */ static ssize_t s3c2410_led_read(struct file *filp,char *buffer, ize_t count,loff_t *ppos) put_user(dev.status,(int *)buffer); /讀取 LED 狀態(tài) return 1; /* = s3c2410_led_write() 描述 : 寫操作函數(shù),本實(shí)例中不做任何事 參數(shù) : 返回值 : co
10、unt = */ static ssize_t s3c2410_led_write(struct file *filp,char *buffer, size_t count,loff_t *ppos) get_user(dev.status,(int *)buffer); if(dev.status = 0) /滅 s3c2410_gpio_setpin(LED1, LED_OFF); else if(dev.status = 1)/亮 s3c2410_gpio_setpin(LED1, LED_ON); return 1; /* = s3c2410_led_fops 描述 : 文件操作結(jié)構(gòu)體
11、,實(shí)現(xiàn) s3c2410_button_open()等函數(shù)與 open()等系統(tǒng)調(diào) 用的連接 參數(shù) : 無 返回值 : 無 = */ static struct file_operations s3c2410_led_fops = .owner = THIS_MODULE, .open = s3c2410_led_open, .release = s3c2410_led_release, .ioctl = s3c2410_led_ioctl,.read = s3c2410_led_read, .write = s3c2410_led_write, ; /* = led_setup_cdev()
12、描述 : 安裝 LED 設(shè)備的功能函數(shù),在設(shè)備加載模塊里面調(diào)用 參數(shù) : 無 返回值 : 無 = */ static void led_setup_cdev(void) int err ,devno = MKDEV (led_major , 0); cdev_init(&dev.cdev,&s3c2410_led_fops); dev.cdev.owner = THIS_MODULE; dev.cdev.ops = &s3c2410_led_fops; /建立設(shè)備文件操作與系統(tǒng)調(diào)用之間的連接 err = cdev_add(&dev.cdev,devno,1); /向系統(tǒng)添加該設(shè)備 if(err
13、) printk(Error %d adding LED %d,err); /* = s3c2410_led_init() 描述 : 模塊加載,IO 及相關(guān)變量初始化 參數(shù) : 無 返回值 : 無 = */ static int s3c2410_led_init(void) int result; dev_t devno = MKDEV(led_major,0);/根據(jù)主設(shè)備號(hào)得到dev_t類型的設(shè)備號(hào) devno if(led_major) /如果手動(dòng)分配了主設(shè)備號(hào) result = register_chrdev_region(devno,1,DEVICE_NAME); /向系統(tǒng)申請?jiān)撛O(shè)備
14、號(hào) else /否則動(dòng)態(tài)獲取設(shè)備號(hào) result = alloc_chrdev_region(&devno ,0 ,1,DEVICE_NAME); led_major = MAJOR(devno); if(result 0) return result; led_setup_cdev(); / 注冊 LED 設(shè)備 s3c2410_led_InitIO(); / 初始化 IO 端口 / initialize the vals; dev.status = 0; /LED 的初始狀態(tài)是滅printk(DEVICE_NAME initializedn); return 0; /* = s3c2410_
15、led_exit() 描述 : 模塊卸載函數(shù) 參數(shù) : 無 返回值 : 無 = */ static void s3c2410_led_exit(void) cdev_del(&dev.cdev); /注銷設(shè)備 unregister_chrdev_region(MKDEV(led_major,0),1); /釋放設(shè)備號(hào) module_init(s3c2410_led_init); module_exit(s3c2410_led_exit); MODULE_LICENSE(GPL); /設(shè)備許可 編寫Makefile文件在主機(jī)的/gdut2410/led/driver 目錄下#cd /gdut24
16、10/led/driver# vi Makefile 在該文件中加入以下內(nèi)容: (其中 KDIR 是內(nèi)核目錄,讀者要根據(jù)自己的內(nèi)核所在目錄來設(shè)置)obj-m := led.o KDIR := /gdut2410/kernel/linux- PWD := $(shell pwd) default: $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules # 編譯 #make 編譯完成后,該目錄下會(huì)生成 led.ko文件,該文件就是編譯成功的模塊文件,然后把led.ko拷貝到nfs共享目錄。 創(chuàng)建設(shè)備 進(jìn)入/gdut2410/rootfs/rootfs/dev 目錄,創(chuàng)
17、建設(shè)備,設(shè)備名為 led,屬于字符型設(shè)備,主設(shè)備號(hào)是 212,次設(shè)備號(hào)是 0。 (要與 led.c文件中的定義相符) : # cd /gdut2410/rootfs/rootfs/dev # mknod led c 212 0 加載模塊 在宿主機(jī)上運(yùn)行 minicom,打開實(shí)驗(yàn)箱電源,加載完 U-Boot,內(nèi)核和文件系統(tǒng)之后按回車鍵進(jìn)入目標(biāo)機(jī) shell 控制臺(tái),在控制臺(tái)中輸入nfs掛載命令:#mount -t nfs -o nolock 192.168.1.10:/mnt/nfs /mnt/nfs /這里根據(jù)自己實(shí)際情況設(shè)置目錄然后執(zhí)行內(nèi)核模塊加載命令: #insmod mnt/nfs/le
18、d.ko 如果輸出“l(fā)ed initialized” ,表示led設(shè)備驅(qū)動(dòng)加載成功 編寫測試文件 led_test.c 進(jìn)入宿主機(jī)的/gdut2410/led/test目錄,編輯測試文件led_test.c: cd /gdut2410/led/test gedit led_test.c 在測試文件中加入代碼清單 5-2所示的內(nèi)容: 代碼清單5-2 LED 驅(qū)動(dòng)測試文件 led_test.c #include #include #include #include sys/types.h #include sys/ioctl.h #include stdlib.h #include termios
19、.h #include sys/stat.h #include fcntl.h #include sys/time.h #define LED_ON 0 #define LED_OFF 1int main() int fd,i,j; int led_status = 0; /初始狀態(tài)為熄滅 fd = open(/dev/led, O_RDWR); /打開設(shè)備 if (fd 0) /如果打開設(shè)備失敗,退出 perror(open device led failed !); exit(1); printf(led test show. press ctrl+c to exit n); ioctl(fd,LED_OFF); while(1)/主循環(huán) read (fd,&led_status,1); /讀取 LED1 的當(dāng)前狀態(tài)到 led_status if(led_status =0) /如果是滅的 ioctl(fd,LED_ON); /點(diǎn)亮 else if(led_status =1) /如果是亮的 ioctl(fd,LED_OFF); /熄滅 printf(led: on and offn); for(i=0;i300;i+) for(j=0;j10000;j
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年外研版必修1歷史上冊階段測試試卷含答案
- 2025年外研版三年級起點(diǎn)選擇性必修1歷史下冊階段測試試卷含答案
- 2025年新科版九年級生物下冊階段測試試卷含答案
- 2025年度拌合料行業(yè)市場分析與競爭情報(bào)服務(wù)合同2篇
- 技術(shù)合同范本(2篇)
- 承包水庫合同(2篇)
- 2025年度教育信息化項(xiàng)目派遣人員勞動(dòng)合同2篇
- 2025年度民間借款擔(dān)保人盡職調(diào)查合同范本4篇
- 2025年度商務(wù)寫字樓租賃與管理合同2篇
- 二零二五年度文化資產(chǎn)以物抵債拍賣執(zhí)行合同3篇
- 《天潤乳業(yè)營運(yùn)能力及風(fēng)險(xiǎn)管理問題及完善對策(7900字論文)》
- 醫(yī)院醫(yī)學(xué)倫理委員會(huì)章程
- xx單位政務(wù)云商用密碼應(yīng)用方案V2.0
- 婦科腫瘤護(hù)理新進(jìn)展Ppt
- 動(dòng)土作業(yè)專項(xiàng)安全培訓(xùn)考試試題(帶答案)
- 大學(xué)生就業(yè)指導(dǎo)(高職就業(yè)指導(dǎo)課程 )全套教學(xué)課件
- 死亡病例討論總結(jié)分析
- 第二章 會(huì)展的產(chǎn)生與發(fā)展
- 空域規(guī)劃與管理V2.0
- JGT266-2011 泡沫混凝土標(biāo)準(zhǔn)規(guī)范
- 商戶用電申請表
評論
0/150
提交評論