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

下載本文檔

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

文檔簡介

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

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

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

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

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

Led_Display(led_state);}什么是設(shè)備驅(qū)動(dòng)程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ū)動(dòng)程應(yīng)用程序底層驅(qū)動(dòng)程序LEDdrive硬件LEDLCD8LED…LCDdrive8LEDdrive…前/后臺(tái)結(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)時(shí),應(yīng)用程序直接調(diào)用底層驅(qū)動(dòng)程序!什么是設(shè)備驅(qū)動(dòng)程底層驅(qū)動(dòng)程序LEDdrive硬件LEDLCD8LED…LCDdrive8LEDdrive…應(yīng)用程序Key應(yīng)用編程接口(API)操作系統(tǒng)內(nèi)核設(shè)備驅(qū)動(dòng)(接口)open()read()write()ioctl()close()…有操作系統(tǒng)時(shí),應(yīng)用程序通過操系統(tǒng)的API調(diào)用底層驅(qū)動(dòng)程序!Linux驅(qū)動(dòng)程序的任務(wù)就是實(shí)現(xiàn)設(shè)備的API及底層驅(qū)動(dòng)2.LED驅(qū)動(dòng)什么是設(shè)備驅(qū)動(dòng)程(有核)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ū)動(dòng)程底層驅(qū)動(dòng)程序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ū)動(dòng)程staticints3c24xx_leds_open(structinode*inode,structfile*file){inti;//設(shè)置GPIO引腳的功能,本驅(qū)動(dòng)中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(...)時(shí),就會(huì)調(diào)用s3c24xx_leds_open函數(shù)rPCONB=rPCONB&B10<<10;B10=0rPCONB=rPCONB&B9<<9;B9=0什么是設(shè)備驅(qū)動(dòng)程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(...)時(shí),就會(huì)調(diào)用此函數(shù)leds_on()orled1_on()orled2_on()leds_off()orled1_off()orled2_off()什么是設(shè)備驅(qū)動(dòng)程/*注冊(cè)函數(shù)*//*執(zhí)行“insmod

s3c24xx_leds.ko”命令時(shí)就會(huì)調(diào)用這個(gè)函數(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ū)動(dòng)程/*執(zhí)行”rmmod

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

MODULE_DESCRIPTION(“S3C2410/S3C2440LEDDriver”);

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

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論