第1章 設備驅動程序簡介_第1頁
第1章 設備驅動程序簡介_第2頁
第1章 設備驅動程序簡介_第3頁
第1章 設備驅動程序簡介_第4頁
第1章 設備驅動程序簡介_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

說在前面Linux設備驅動只有專著,沒有教材,高校幾乎均未開設此課,僅少數(shù)社會培訓機構開展過培訓,培訓費天價涉及內核,內容多,難理解,難表達,屬費力不討好的課,中國高校往往重科研輕教學,象這類需花費太多力氣的課沒人愿開嵌入式系統(tǒng)的價值在軟件,軟件的核心在驅動嵌入式系統(tǒng)方向不開Linux設備驅動不夠深入,前幾屆未開主要缺人手,看到部分同學自學時總感到遺憾課難,要有思想準備,有不懂正常,不求全懂,先打下點基礎,以后有機再深入進去說在前面強調Linux內核基礎知識與驅動程序設計方法,不在于某一具體設備的驅動程序的編寫,授人以“漁”,而不是授人以“魚”如以太網(wǎng)卡、USB等設備,數(shù)據(jù)手冊上百頁,寄存器上百個,講透一個設備的驅動就需一門課時間本書使用“虛擬設備”,避開處理復雜的實際設備,將重點放在內核知識與驅動設計方法上本書是一本公認的非常權威的專著,翻譯也不錯,跟著書走總不會錯要讀書,讀懂過的書即使10年也能輕易重新拾起增加隨堂考試,課堂討論,課堂讀書參考書深入理解Linux內核,第3版,陳莉君等譯深入理解Linux內核架構,郭旭譯Linux內核設計與實現(xiàn),陳莉君等譯精通Linux設備驅動程開發(fā),宋寶華等譯Linux設備驅動開發(fā)詳解,宋寶華編著132第1章設備驅動程序簡介什么是設備驅動程序內核功能劃分可裝載模塊3設備和模塊的分類什么是設備驅動程設備驅動程序是對設備直接進行操作控制的程序操作包括初始化、讀、寫等LED1LED2PB9PB10VDD3344B0XLED1LED2PB9PB10VDD3344B0XrPDATB=0x1FF;LED1、LED2亮rPDATB=0x7FF;LED1、LED2滅#definerPCONB(*(volatileunsigned*)0x1d20008)#definerPDATB(*(volatileunsigned*)0x1d2000c)1.LED底層驅動/裸驅初始化leds_on()封裝leds_off()封裝控制(寫)rPCONB=rPCONB&B10<<10;B10=0,設為輸出rPCONB=rPCONB&B9<<9;B9=0,設為輸出什么是設備驅動程(1)雙亮驅動voidleds_on(){

Led_Display(0x3);}rPDATB=0x1FF;LED1LED2PB9PB10VDD3344B0X什么是設備驅動程(2)雙滅驅動voidleds_off(){

Led_Display(0x0);}rPDATB=0x7FF;LED1LED2PB9PB10VDD3344B0X什么是設備驅動程voidLed_Display(intLedStatus){ led_state=LedStatus;

if((LedStatus&0x01)==0x01)

rPDATB=rPDATB&0x5ff; else

rPDATB=rPDATB|0x200;

if((LedStatus&0x02)==0x02)

rPDATB=rPDATB&0x3ff; else

rPDATB=rPDATB|0x400;}LED1LED2PB9PB10VDD3344B0X什么是設備驅動程voidled1_on(){ led_state=led_state|0x1; Led_Display(led_state);}voidled2_on(){ led_state=led_state|0x2;

Led_Display(led_state);}什么是設備驅動程voidled1_off(){ led_state=led_state&0xfe;

Led_Display(led_state);}voidled2_off(){ led_state=led_state&0xfd;

Led_Display(led_state);}什么是設備驅動程voidMain(void){sys_init(); for(;;)//while(1) {

Led_Test(); }}voidLed_Test(){ leds_off(); Delay(1000); led1_on(); Delay(1000); led1_off(); led2_on(); Delay(1000); leds_on(); Delay(1000); led2_off(); Delay(1000); led1_off();}什么是設備驅動程應用程序底層驅動程序LEDdrive硬件LEDLCD8LED…LCDdrive8LEDdrive…前/后臺結構單任務結構大循環(huán)結構voidMain(void){sys_init(); for(;;)//while(1) {

Led_Test(); }}無核結構無操作系統(tǒng)時,應用程序直接調用底層驅動程序!什么是設備驅動程底層驅動程序LEDdrive硬件LEDLCD8LED…LCDdrive8LEDdrive…應用程序Key應用編程接口(API)操作系統(tǒng)內核設備驅動(接口)open()read()write()ioctl()close()…有操作系統(tǒng)時,應用程序通過操系統(tǒng)的API調用底層驅動程序!Linux驅動程序的任務就是實現(xiàn)設備的API及底層驅動2.LED驅動什么是設備驅動程(有核)intmain(intargc,char**argv){…

fd=open(“/dev/leds”,0);//打開設備….if(!strcmp(argv[2],"on"))

ioctl(fd,IOCTL_LED_ON,led_no);

elseif(!strcmp(argv[2],"off"))

ioctl(fd,IOCTL_LED_OFF,led_no);

elsegotoerr;close(fd);return0;}什么是設備驅動程底層驅動程序LEDdrive硬件LED8LED…8LEDdrive…open()read()write()ioctl()…應用程序操作系統(tǒng)內核LCDLCDdrive硬件staticstructfile_operationss3c24xx_leds_fops={.owner=THIS_MODULE,.open=s3c24xx_leds_open,.ioctl=s3c24xx_leds_ioctl,…..};什么是設備驅動程staticints3c24xx_leds_open(structinode*inode,structfile*file){inti;//設置GPIO引腳的功能,本驅動中LED所涉及的GPIO引腳設為輸出功能for(i=0;i<2;i++){s3c2410_gpio_cfgpin(led_table[i],led_cfg_table[i]);}return0;}應用程序對設備文件/dev/leds執(zhí)行open(...)時,就會調用s3c24xx_leds_open函數(shù)rPCONB=rPCONB&B10<<10;B10=0rPCONB=rPCONB&B9<<9;B9=0什么是設備驅動程staticints3c24xx_leds_ioctl(structinode*inode,structfile*file,unsignedintcmd,unsignedlongarg){if(arg>4){return-EINVAL;}switch(cmd){caseIOCTL_LED_ON://設置指定引腳的輸出電平為0s3c2410_gpio_setpin(led_table[arg],0);return0;caseIOCTL_LED_OFF://設置指定引腳的輸出電平為1s3c2410_gpio_setpin(led_table[arg],1);return0;default:return-EINVAL;}}應用程序對設備文件/dev/leds執(zhí)行ioclt(...)時,就會調用此函數(shù)leds_on()orled1_on()orled2_on()leds_off()orled1_off()orled2_off()什么是設備驅動程/*注冊函數(shù)*//*執(zhí)行“insmod

s3c24xx_leds.ko”命令時就會調用這個函數(shù)*/staticint__inits3c24xx_leds_init(void){intret;ret=register_chrdev(LED_MAJOR,DEVICE_NAME,&s3c24xx_leds_fops);if(ret<0){printk(DEVICE_NAME"can'tregistermajornumber\n");returnret;}printk(DEVICE_NAME"initialized\n");return0;}什么是設備驅動程/*執(zhí)行”rmmod

s3c24xx_leds.ko”命令時就會調用這個函數(shù)*/staticvoid__exits3c24xx_leds_exit(void){unregister_chrdev(LED_MAJOR,DEVICE_NAME);}/*卸載函數(shù)*/什么是設備驅動程/*這兩行指定驅動程序的初始化函數(shù)和卸載函數(shù)*/module_init(s3c24xx_leds_init);module_exit(s3c24xx_leds_exit);/*描述驅動程序的一些信息,不是必須的*/MODULE_AUTHOR(“”);

MODULE_DESCRIPTION(“S3C2410/S3C2440LEDDriver”);

MODULE_LICENSE("GPL");//遵循的協(xié)議什么是設備驅動程設備驅動程序是操作系統(tǒng)中直接控制硬件設備的程序,是內核的一部分,約占Linux內核源程序的60%~80%Linux內核采用可加載的模塊化設計(LKMs,LoadableKernelModules)。將最基本的核心代碼編譯在內核中,其他的代碼則往往編譯為內核模塊,在需要時才動態(tài)加載到內核中通常CPU、PCI、TCP/IP、APM、VFS等的驅動直接編譯在內核文件中,其它驅動(聲卡、網(wǎng)卡等)則作為模塊動態(tài)加載。什么是設備驅動程設備驅動程的作用在于提供機制,而不是策略機制-功能策略-如何使用功能驅動程序應該處理如何使硬件可用的問題,而將怎樣使用硬件的問題留給上層應用程序什么是設備驅動程132第1章設備驅動程序簡介什么是設備驅動程序內核功能劃分可裝載模塊3設備和模塊的分類進程管理:CPU是計算機系統(tǒng)中的最重要的資源,進程管理也稱CPU管理,進程管理的任務包括進程的創(chuàng)建、銷毀、阻塞、調度及進程間的通信等內存管理:內存也是計算機系統(tǒng)中的主要資源,內存管理的任務主要是內存的分配與回收及虛擬內存的實現(xiàn)文件系統(tǒng):文件系統(tǒng)是計算機中的軟件資源,Linux中將設備也當作文件處理,幾乎是“一切皆文件”設備控制:幾乎每個系統(tǒng)操作最終都會映射到物理設備上。內核必須為系統(tǒng)中的每件外設嵌入相應的驅動程序,這包括硬盤驅動器、鍵盤和磁帶驅動器等網(wǎng)絡功能:網(wǎng)絡功能也必須由操作系統(tǒng)來管理,因為大部分網(wǎng)絡操作和具體進程無關:進入系統(tǒng)的報文是異步事件.報文在某一個進程接手之前必須被收集,識別,分發(fā).系統(tǒng)負責在程序和網(wǎng)絡接口之間遞送數(shù)據(jù)報文,它必須根據(jù)程序的網(wǎng)絡活動來控制程序的執(zhí)行.另外,所有的路由和地址解析問題都在內核中實現(xiàn)132第1章設備驅動程序簡介什么是設備驅動程序內核功能劃分可裝載模塊3設備和模塊的分類可裝載模塊可裝載模塊是Linux最吸引人的一個特性,用戶可將一時不用或很少使用的功能(包括設備驅動程序)編譯為模塊,需要時再裝載,不用時卸載,這樣可以有效地減小內核。當操作系統(tǒng)內核需要的擴展功能不存在時,內核模塊管理守護進程kmod自動執(zhí)行modprobe命令加載所需的內核模塊用戶也可在命令行執(zhí)行modprobe/insmod命令將模塊連接到運行中的內核中(裝載),執(zhí)行rmmod程序移除連接(卸載)132第1章設備驅動程序簡介什么是設備驅動程序內核功能劃分可裝載模塊3設備和模塊的分類設備和模塊的分類Linux設備可分為3種基本類型:字符設備、塊設備與網(wǎng)絡接口,相應地,設備驅動模塊也有3種類型字符設備字符(char)設備是一種可以當作字節(jié)流來存取的設備(如同一個文件);字符驅動負責實現(xiàn)這種行為。這樣的驅動常常至少實現(xiàn)open,close,read,和write系統(tǒng)調用字符終端(/dev/console)和串口(/dev/ttyS0等)是字符設備的例子,因為它們很好地展現(xiàn)了流的抽象字符設備通過文件系統(tǒng)結點來存取,例如/dev/tty1和/dev/lp0字符設備文件和普通文件之間的唯一不同在于對普通文件的訪問可以前后移動位置,但是大部分字符設備只能順序存取設備和模塊的分類塊設備與字符設備類似,塊設備也通過位于/dev目錄下的文件系統(tǒng)結點來存取。但塊設備(例如一個磁盤)上能夠容納文件系統(tǒng)。在Unix系統(tǒng),進行I/O操作時塊設備每次只能傳送一個或多個完整的塊,每塊包含512字節(jié)(或一個更大的2的冪的數(shù)據(jù))的整塊。Linux可以讓應用程序象讀寫字符設備一樣地讀寫塊設備,一次可傳送任意數(shù)目的字節(jié)。因而塊和字符設備的區(qū)別僅僅在于內核內部管理數(shù)據(jù)的方式,也就是在于內核與驅動程序之間的軟件接口上,即塊驅動和字符驅動的不同在內核接口上.設備和模塊的分類網(wǎng)絡接口任何網(wǎng)絡事務都通過一個網(wǎng)絡接口來進行。網(wǎng)絡接口是一個能夠與其他主機交換數(shù)據(jù)的設備。通常,網(wǎng)絡接口是個硬件設備,但是也可能是個純軟件設備,比如環(huán)回(loopback)接口。網(wǎng)絡接口負責發(fā)送和接收數(shù)據(jù)報文,在內核網(wǎng)絡子系統(tǒng)的驅動下,不必知道單個事務是如何映射到實際的被發(fā)送的報文上的。很多網(wǎng)絡連接(特別那些使用TCP的)是面向流的,但是網(wǎng)絡設備卻常常設計成處理報文的發(fā)送和接收。一個網(wǎng)絡驅動對單個連接一無所知,它只處理報文.設備和模塊的分類既然不是一個面向流的設備,一個網(wǎng)絡接口就不能象/dev/tty1那樣容易映射到文件系統(tǒng)的一個結點上。Unix提供的對接口的存取的方式仍然是通過分配一個名字給它們(例如eth0),但是這個名字在文件系統(tǒng)中沒有對應的入口.內核與網(wǎng)絡設備驅動間的通訊與字符和塊設備驅動所用的完全不同。內核調用一套和報文傳遞相關的函數(shù)而不是read和write.安全問題驅動程序屬于內核,如果內核有安全漏洞,整個系統(tǒng)就會有安全漏洞,故只有授權用戶

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論