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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

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

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

Led_Display(0x0);}rPDATB=0x7FF;LED1LED2PB9PB10VDD3344B0X什么是設(shè)備驅(qū)動程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什么是設(shè)備驅(qū)動程voidled1_on(){ led_state=led_state|0x1; Led_Display(led_state);}voidled2_on(){ led_state=led_state|0x2;

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

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

Led_Display(led_state);}什么是設(shè)備驅(qū)動程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();}什么是設(shè)備驅(qū)動程應(yīng)用程序底層驅(qū)動程序LEDdrive硬件LEDLCD8LED…LCDdrive8LEDdrive…前/后臺結(jié)構(gòu)單任務(wù)結(jié)構(gòu)大循環(huán)結(jié)構(gòu)voidMain(void){sys_init(); for(;;)//while(1) {

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

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

s3c24xx_leds.ko”命令時就會調(diào)用這個函數(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;}什么是設(shè)備驅(qū)動程/*執(zhí)行”rmmod

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

MODULE_DESCRIPTION(“S3C2410/S3C2440LEDDriver”);

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

溫馨提示

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

最新文檔

評論

0/150

提交評論