版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、設備驅(qū)動程序創(chuàng)新設計實驗目的學習Linux下進行驅(qū)動程序設計的原理掌握Linux設備驅(qū)動程序開發(fā)的根本過程和設計方法實驗內(nèi)容內(nèi)核驅(qū)動設計入門模塊方式驅(qū)動程序5.1內(nèi)核驅(qū)動設計實驗觸摸屏驅(qū)動5.2寫一個簡單的應用程序,顯示觸摸位置的坐標x,y開發(fā)一個LED數(shù)碼管驅(qū)動程序,并編寫一個應用程序?qū)λ_發(fā)的驅(qū)動程序進行測試大作業(yè)實驗實現(xiàn)的功能是上電復位后,數(shù)碼管顯示數(shù)字0-7,然后每一個數(shù)字依次閃爍一次,小數(shù)點也要點亮,即: 0.1.2.3.4.5.6.7.Linux的設備驅(qū)動程序硬件設備與應用程序之間的一個中間軟件層它使得某個特定硬件能夠響應一個定義良好的內(nèi)部編程接口,同時完全隱蔽了設備的工作細節(jié)用戶
2、通過一組與具體設備無關的標準化的調(diào)用來完成相應的操作驅(qū)動程序的任務就是把這些標準化的系統(tǒng)調(diào)用映射到具體設備對于實際硬件的特定操作上驅(qū)動程序是內(nèi)核的一局部,可以使用中斷、DMA等操作驅(qū)動程序在用戶態(tài)和內(nèi)核態(tài)之間傳遞數(shù)據(jù)設備驅(qū)動程序的分類字符設備所有能夠象字節(jié)流一樣訪問的設備都通過字符設備來實現(xiàn)它們被映射為文件系統(tǒng)中的節(jié)點,通常在/dev/目錄下面一般要包含open read write close等系統(tǒng)調(diào)用的實現(xiàn)塊設備通常是指諸如磁盤、內(nèi)存、Flash等可以容納文件系統(tǒng)的存儲設備。塊設備也是通過文件系統(tǒng)來訪問,與字符設備的區(qū)別是:內(nèi)核管理數(shù)據(jù)的方式不同它允許象字符設備一樣以字節(jié)流的方式來訪問,也
3、可一次傳遞任意多的字節(jié)。網(wǎng)絡接口設備通常它指的是硬件設備,但有時也可能是一個軟件設備(如回環(huán)接口loopback),它們由內(nèi)核中網(wǎng)絡子系統(tǒng)驅(qū)動,負責發(fā)送和接收數(shù)據(jù)包。它們的數(shù)據(jù)傳送往往不是面向流的,因此很難將它們映射到一個文件系統(tǒng)的節(jié)點上。根本概念主設備號和次設備號主設備號和次設備號能夠唯一地標識一個設備128V2.0以前), 256(V2.0以后)主設備號相同的設備使用相同的驅(qū)動程序,次設備號用于區(qū)分具體設備的實例動態(tài)獲取主設備號Linux下對設備號的分配請參考Documentation/devices.txt設備文件 Linux使用設備文件來統(tǒng)一對設備的訪問接口,將設備文件放在/dev/目
4、錄下設備的命名一般為設備文件名+數(shù)字或者字母表示的子類,例如/dev/hda1, /dev/hda2等Linux 2.4以后引入了設備文件系統(tǒng)devfs的概念,所有的設備文件作為一個可以掛裝的文件系統(tǒng),這樣就可以被文件系統(tǒng)統(tǒng)一管理,從而設備文件就可以掛裝到任何需要的地方。一般將主設備建立一個目錄,再將具體的子設備文件建立在此目錄下。例如,/dev/mtdblock0根本概念驅(qū)動程序使用的2個重要結(jié)構(gòu)struct filestruct file_operations根本概念struct file根本概念struct file數(shù)據(jù)結(jié)構(gòu)定義位于include/fs.hstruct file結(jié)構(gòu)與驅(qū)動
5、相關的成員mode_t f_mode標識文件的讀寫權(quán)限loff_t f_pos當前讀寫位置unsigned int_f_flag文件標志,主要進行阻塞/非阻塞型操作時檢查struct file_operation * f_op 文件操作的結(jié)構(gòu)指針void * private_data驅(qū)動程序一般將它指向已經(jīng)分配的數(shù)據(jù)struct dentry* f_dentry 文件對應的目錄項結(jié)構(gòu)根本概念設備驅(qū)動程序接口( struct file_operations), 標記化方法:static struct file_operations demo_fops = owner: THIS_MODULE,w
6、rite: demo_write,read: demo_read,ioctl: demo_ioctl,open: demo_open,release: demo_release,;根本概念設備驅(qū)動程序接口 struct file_operations 通常所說的設備驅(qū)動程序接口是指struct file_operations ,它的定義位于include/linux/fs.h中。在嵌入式系統(tǒng)的開發(fā)中,通常只要實現(xiàn)如下幾個接口函數(shù)就能完成系統(tǒng)所需要的功能init加載驅(qū)動程序時,內(nèi)核自動調(diào)用read從設備中讀取數(shù)據(jù)write向字符設備中寫數(shù)據(jù)ioctl控制設備,實現(xiàn)除讀寫操作以外的其他控制命令op
7、en翻開設備并進行初始化release關閉設備并釋放資源exit 卸載驅(qū)動程序時,內(nèi)核自動調(diào)用根本概念驅(qū)動程序注冊過程動態(tài)分配主設備號insmod module_name ;加載驅(qū)動程序,運行init函數(shù)(register_chrdev(dev_Major, “module_name, * fs )查看/proc/devicesmknod /dev/module_name c/b 主設備號 次設備號rmmod module_name ;卸載驅(qū)動,運行 exit函數(shù)unregister_chrdev(dev_Major, “module_name, * fs )用戶程序調(diào)用Open(“/dev/
8、module_name, mode) ;O_RDWRIoctl()Write()Read()Close()開發(fā)驅(qū)動程序時須注意的事項中斷處理中斷是現(xiàn)代微處理器的一個重要功能Linux驅(qū)動程序中的中斷處理函數(shù)extern int request_irq(unsigned int irq, void(*handler)(int, void*, struct pt_regs *), unsigned long flag, const char *dev_name, void *dev_id);/請求為中斷號irq分配中斷處理函數(shù)extern void free_irq(unsigned int, v
9、oid*);/釋放中斷 本卷須知不能向用戶空間發(fā)送或者接收數(shù)據(jù)不能執(zhí)行有睡眠操作的函數(shù)不能調(diào)用調(diào)度函數(shù)謹慎使用全局變量可重入自旋鎖的使用根本概念字符設備的管理驅(qū)動程序模塊通過函數(shù)int register_chrdev(unsigned int major, const char *name, struct file_operations *fops) 完成向內(nèi)核的注冊,其中major是主設備號,name是設備名,fops是針對該設備的驅(qū)動程序的接口。在系統(tǒng)中為驅(qū)動程序模塊建立一個設備節(jié)點minjunRedHatAS $ mknod /dev/demo c 254 0其中/dev/demo標識設
10、備名為demo,“c說明是字符設備,254是指定的主設備號, 0是次設備號根本概念驅(qū)動程序的編譯以demo.c為例Makefile的形式參考實驗指導書命令行的形式minjunRedHatAS $ armv4l-unknown-linux-gcc -Wall -c -O -D_KERNEL_ -I/home/minjun/embedded/kernel-2410s/include demo.c -o demo.o加載驅(qū)動minjunRedHatAS $ insmod demo.o卸載驅(qū)動minjunRedHatAS $ rmmod demo.o根本概念測試程序?qū)嵗?test.c#include#
11、include#includeint main()int fd;fd=open(/dev/demo, O_RDWR);if(fd 0)exit(fd);/your code hereread(fd, buffer, size);write(fd, buffer, size);.close(fd);return 0;驅(qū)動程序的實現(xiàn)驅(qū)動程序框架#include #include #include #include /* printk() */#include /* everything. */#include /* error codes */#include /* size_t */#inclu
12、de #include /* O_ACCMODE */#include /* COPY_TO_USER */#include /* cli(), *_flags */#define DEVICE_NAMEdemo#define demo_MAJOR 250#define demo_MINOR 0static ssize_t demo_write(struct file *filp,const char *buffer, size_t count) copy_from_user(drv_buf , buffer, count);WRI_LENGTH = count;printk(user wri
13、te data to drivern);/your code herereturn count;驅(qū)動程序的實現(xiàn)驅(qū)動程序框架static ssize_t demo_read(struct file *filp, char *buffer, size_t count, loff_t *ppos)if(count MAX_BUF_LEN)count=MAX_BUF_LEN;copy_to_user(buffer, drv_buf,count);printk(user read data from drivern);return count;static int demo_ioctl(struct i
14、node *inode, struct file *file, unsigned int cmd, unsigned long arg)printk(ioctl runingn);switch(cmd)case 1:printk(runing command 1 n);break;case 2:printk(runing command 2 n);break;default:printk(error cmd numbern);break;return 0;static int demo_open(struct inode *inode, struct file *file)MOD_INC_US
15、E_COUNT;sprintf(drv_buf,device open sucess!n);printk(device open sucess!n);return 0;驅(qū)動程序的實現(xiàn)驅(qū)動程序框架static int demo_release(struct inode *inode, struct file *filp)MOD_DEC_USE_COUNT;printk(device releasen);return 0; static struct file_operations demo_fops = owner:THIS_MODULE,write:demo_write,read:demo_r
16、ead,ioctl:demo_ioctl,open:demo_open,release:demo_release,; static int _init demo_init(void) SET_MODULE_OWNER(&demo_fops); result = register_chrdev(demo_MAJOR, demo, &demo_fops); if (result private_data中的數(shù)據(jù)release與open正好相反釋放由open分配的filp-private_data中的數(shù)據(jù)在最后一次關閉操作時關閉設備使用計數(shù)減一驅(qū)動程序的實現(xiàn)驅(qū)動程序框架read和writeread將
17、數(shù)據(jù)從內(nèi)核拷貝到應用程序空間,write那么將數(shù)據(jù)從應用程序空間拷貝到內(nèi)核。由于用戶空間和內(nèi)核空間的內(nèi)存映射方式不同,所以在內(nèi)核和用戶空間傳輸數(shù)據(jù)的時候需要使用如下的函數(shù)unsigned long copy_to_user(void *to, const void* from, unsigned long count);unsigned long copy_from_user(void *to, const void *from, unsigned long count);在阻塞型IO中,read和write調(diào)用可能會出現(xiàn)阻塞read調(diào)用當前無數(shù)據(jù)可讀,而又沒有數(shù)據(jù)馬上可讀,這時會睡眠并且等待
18、,write調(diào)用也會出現(xiàn)這樣的情況等待隊列機制wait_queue_head_t;(定義在中)如果聲明了等待隊列并完成初始化,進程就可以睡眠,可以調(diào)用sleep_on的不同變體來完成睡眠(函數(shù)聲明位于中)大多數(shù)情況下應使用“可中斷的函數(shù),如interruptible_sleep_on。睡眠進程被喚醒并不一定代表有數(shù)據(jù),也有可能是被其他的信號喚醒,所以醒來后需要測試condition.8段LED顯示器外形原理圖 一個數(shù)碼管LED由一個8位的字節(jié)控制當該位為“1時點亮,為“0時滅acbdefhgLED連接原理圖LED顯示驅(qū)動器ZLG7290 I2C LED/鍵盤 驅(qū)動器I2C 串行接口提供鍵盤中斷
19、信號方便與處理器接口可驅(qū)動8 位共陰數(shù)碼管或64 只獨立LED 和64 個按鍵可控掃描位數(shù)可控任一數(shù)碼管閃爍提供數(shù)據(jù)譯碼和循環(huán)移位段尋址等控制8 個功能鍵可檢測任一鍵的連擊次數(shù)無需外接元件即直接驅(qū)LED 可擴展驅(qū)動電流和驅(qū)動電壓詳細資料參加課程網(wǎng)站上的:zlg7290.pdfzlg7290_led.pdf圖1 ZLG7290引腳圖LED顯示驅(qū)動器功能框圖IIC基地址是0 x70有24個8位存放器0 x00 x17,通過IIC總線訪問,必須是字節(jié)操作主要存放器 SystemReg 0 x0 FlashOnOff 0 x0c ScanNum 0 x0d DpRam07 0 x10-0 x17 Cm
20、dBuf01 0 x7-0 x8兩種控制方式:-存放器映象控制-命令解釋控制參考zlg7290.pdfLED驅(qū)動程序的主要函數(shù)static int led_write(struct file* filp, const char* buffer, size_t count, loff_t* ppos) static int led_ioctl(struct inode *inode, struct file*file, unsigned int cmd, unsigned long arg) static int led_open(struct inode* inode, struct file
21、* filp) static int led_release(struct inode* inode, struct file* filp) static int _init led_init(void) static void _exit led_exit(void) static struct file_operations led_fops = owner:THIS_MODULE,open:led_open,release:led_release,write:led_write,ioctl:led_ioctl,;可以使用IIC_Write(char baseAddr, char offS
22、et, char data)來設置存放器的值字節(jié)操作,該函數(shù)在iic.h文件中定義。LED測試應用程序框架#include #include #include #include #include int main()int fd;int ret;if(fd=open(/dev/led, O_RDWR) 0)printf(open led device failed!n);exit(fd);ioctl(int fd, int cmd,); write(int fd, char* buf, int length);close(fd);return 0;實驗內(nèi)容內(nèi)核驅(qū)動設計入門模塊方式驅(qū)動程序5.1
23、在PC linux和開發(fā)平臺上運行通過內(nèi)核驅(qū)動設計實驗觸摸屏驅(qū)動5.2寫一個簡單的應用程序,顯示觸摸位置的坐標x,y在開發(fā)平臺上裝載驅(qū)動程序,運行編寫的測試應用程序開發(fā)一個LED數(shù)碼管驅(qū)動程序,并編寫一個應用程序?qū)λ_發(fā)的驅(qū)動程序進行測試(如果做不完,可以在下下次實驗接著做)開發(fā)led_driver.c開發(fā)led_test.c實驗步驟-demo驅(qū)動程序閱讀和理解源代碼進入/arm2410s/exp/drivers/demo, 閱讀理解源代碼編譯驅(qū)動模塊修改Makefile文件, 編譯實驗平臺運行的驅(qū)動程序測試驅(qū)動程序裝載驅(qū)動程序和建立設備文件節(jié)點insmod demo.o mknod /dev/demo c 254 0編譯測試程序并運行 a
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 感恩節(jié)講話稿集合15篇
- 師德標兵先進事跡材料集合15篇
- 年度考核個人述職報告15篇
- 抖音全課程培訓
- 房產(chǎn)基礎知識培訓
- 企業(yè)安全知識競賽
- 提升資金管理效率
- 2024年婦聯(lián)業(yè)務知識
- 幸福終點站觀后感10篇
- (高清版)DB21∕T 3298-2020 特種設備技術檔案管理規(guī)范
- 江蘇省蘇州市2024-2025學年高三上學期1月期末生物試題(有答案)
- 銷售與銷售目標管理制度
- 2025年第一次工地開工會議主要議程開工大吉模板
- 第16課抗日戰(zhàn)爭課件-人教版高中歷史必修一
- 對口升學語文模擬試卷(9)-江西省(解析版)
- 糖尿病高滲昏迷指南
- 壁壘加筑未來可期:2024年短保面包行業(yè)白皮書
- 環(huán)保局社會管理創(chuàng)新方案市環(huán)保局督察環(huán)保工作方案
- 2024至2030年中國水質(zhì)監(jiān)測系統(tǒng)行業(yè)市場調(diào)查分析及產(chǎn)業(yè)前景規(guī)劃報告
- 運動技能學習
- 單側(cè)雙通道內(nèi)鏡下腰椎間盤摘除術手術護理配合1
評論
0/150
提交評論