嵌入式Linux設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā).ppt
《嵌入式Linux設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā).ppt》由會(huì)員分享,可在線閱讀,更多相關(guān)《嵌入式Linux設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā).ppt(58頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
嵌入式Linux設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā) 電子信息工程學(xué)院楊昕欣 本講主要內(nèi)容 交叉編譯環(huán)境Makefile簡(jiǎn)介設(shè)備驅(qū)動(dòng)相關(guān)概念設(shè)備驅(qū)動(dòng)程序的開(kāi)發(fā)流程I2C驅(qū)動(dòng)程序?qū)嵗?交叉編譯環(huán)境 嵌入式系統(tǒng)的開(kāi)發(fā)需要宿主機(jī) Hostpc 因?yàn)榍度胧较到y(tǒng)一般沒(méi)有大容量的存儲(chǔ)設(shè)備 由于hostpc的處理器與嵌入式微處理器通常不同 為了生成能夠在嵌入式系統(tǒng)中運(yùn)行的代碼 需要進(jìn)行交叉編譯 交叉編譯 在宿主機(jī)上編譯可以在目標(biāo)系統(tǒng)上運(yùn)行的二進(jìn)制文件 交叉編譯環(huán)境 一般包括 Gcc編譯器 forc c Binutil 一些輔助工具 包括objdump 可反編譯二進(jìn)制文件 as 匯編器 ld 鏈接器 等Glibc 提供系統(tǒng)調(diào)用和基本函數(shù)的c庫(kù)CheaderGdb調(diào)試器 交叉編譯環(huán)境的建立 以root用戶登陸linux系統(tǒng)將 usr local目錄備份 然后清空將BSP0 3 6 Toolchain 中的armLinuxXToolChain01 tar gzglibc2 1 3 tar gzinst glibc2 1 3ftp上傳到 usr local執(zhí)行 tarxvfzarmLinuxXToolChain01 tar gz tarxvfzglibc2 1 3 tar gz rm rfarm elf linux lib cp Rarm gnu release arm linux libarm elf linux 嵌入式Linux一般調(diào)試方法 使用Gdbserver和gdb在目標(biāo)系統(tǒng)上運(yùn)行g(shù)dbserver在主機(jī)上運(yùn)行g(shù)db一般通過(guò)以太網(wǎng)建立連接 Makefile簡(jiǎn)介 Linux開(kāi)發(fā)一般有大量源代碼 為了避免大量重復(fù)的鍵入gcc進(jìn)行編譯 定義了Makefile文件 用于自動(dòng)編譯 make該操作會(huì)調(diào)用MakefileMakefile一般定義了 Gcc編譯工具編譯命令目標(biāo)文件依賴關(guān)系 Makefile簡(jiǎn)介 例 test o test ctest hgcc c gtest c g生成調(diào)試信息 c只編譯不鏈接成為可執(zhí)行文件 o確定輸出文件名稱 O優(yōu)化 w禁止警告信息 Wall打開(kāi)所有類型警告信息 Makefile變量 makefile變量 預(yù)定義變量 不包含擴(kuò)展名的目標(biāo)文件名 所有的依賴文件 以空格分開(kāi) 并以出現(xiàn)的先后為序 可能包含重復(fù)的依賴文件 第一個(gè)依賴文件的名稱 所有的依賴文件 以空格分開(kāi) 這些依賴文件的修改日期比目標(biāo)的創(chuàng)建日期晚 目標(biāo)的完整名稱 所有的依賴文件 以空格分開(kāi) 不包含重復(fù)的依賴文件 簡(jiǎn)單Make指令說(shuō)明 Makeclean 清除編譯過(guò)程的中間文件 makedep 設(shè)置Makefile文件中各個(gè)目標(biāo)所依賴的文件列表 使用Makefile方法 嵌入式Linux中Makefile更加復(fù)雜可在已有Makefile文件基礎(chǔ)上更改 Linux系統(tǒng)中的設(shè)備文件 Linux將所有外部設(shè)備看成是一類特殊文件 稱之為 設(shè)備文件 如果說(shuō)系統(tǒng)調(diào)用是Linux內(nèi)核和應(yīng)用程序之間的接口 那么設(shè)備驅(qū)動(dòng)程序則可以看成是Linux內(nèi)核與外部設(shè)備之間的接口 設(shè)備驅(qū)動(dòng)程序向應(yīng)用程序屏蔽了硬件在實(shí)現(xiàn)上的細(xì)節(jié) 使得應(yīng)用程序可以像操作普通文件一樣來(lái)操作外部設(shè)備 設(shè)備驅(qū)動(dòng)程序是內(nèi)核重要部分 內(nèi)核簡(jiǎn)略結(jié)構(gòu) 設(shè)備驅(qū)動(dòng)的大致結(jié)構(gòu) 設(shè)備驅(qū)動(dòng)的作用 設(shè)備驅(qū)動(dòng)是位于應(yīng)用和物理設(shè)備之間的軟件層 負(fù)責(zé)完成二者間的I O操作 在LINUX系統(tǒng)里 對(duì)用戶程序 設(shè)備驅(qū)動(dòng)隱藏了設(shè)備的具體細(xì)節(jié) 為不同設(shè)備提供了一致的接口 設(shè)備驅(qū)動(dòng)是嵌入式系統(tǒng)開(kāi)發(fā)的重要內(nèi)容之一 設(shè)備驅(qū)動(dòng)完成的工作 對(duì)設(shè)備初始化和釋放把數(shù)據(jù)從內(nèi)核傳送到硬件和從硬件讀取數(shù)據(jù)讀取應(yīng)用程序傳送給設(shè)備文件的數(shù)據(jù)和回送應(yīng)用程序請(qǐng)求的數(shù)據(jù)檢測(cè)和處理設(shè)備出現(xiàn)的錯(cuò)誤 設(shè)備文件類型 通常有字符設(shè)備 塊設(shè)備 網(wǎng)絡(luò)設(shè)備三種字符設(shè)備字符設(shè)備是能夠像字節(jié)流一樣被訪問(wèn)的設(shè)備 例如字符終端 串口 鍵盤(pán) 聲卡 LCD 觸摸屏 掃描儀 打印機(jī) 并口 鼠標(biāo) 游戲桿等 塊設(shè)備塊設(shè)備是指支持面向塊訪問(wèn)的設(shè)備 每塊包含2的N次冪字節(jié)數(shù)據(jù) 例如IDE設(shè)備 磁盤(pán) floppydisk CD ROM Ramdisk等 塊設(shè)備接口必須支持掛裝文件系統(tǒng) 網(wǎng)絡(luò)設(shè)備 即能夠和其他主機(jī)交換數(shù)據(jù)的設(shè)備接口 主設(shè)備號(hào)與次設(shè)備號(hào) LINUX系統(tǒng)中 設(shè)備由一個(gè)主設(shè)備號(hào)和一個(gè)次設(shè)備號(hào)來(lái)標(biāo)識(shí) 主設(shè)備號(hào)唯一標(biāo)識(shí)了設(shè)備類型 即設(shè)備驅(qū)動(dòng)程序類型 它是塊設(shè)備表或字符設(shè)備表中設(shè)備表項(xiàng)的索引 次設(shè)備號(hào)僅由設(shè)備驅(qū)動(dòng)程序解釋 一般用于識(shí)別在若干可能的硬件設(shè)備中 I O請(qǐng)求所涉及到的那個(gè)設(shè)備 主設(shè)備號(hào)與次設(shè)備號(hào) 主設(shè)備號(hào) MajorNumber 相同的設(shè)備使用相同的驅(qū)動(dòng)程序 而次設(shè)備號(hào) minorNumber 用來(lái)區(qū)分該類型不同的設(shè)備實(shí)例 內(nèi)核設(shè)備驅(qū)動(dòng)模塊 設(shè)備驅(qū)動(dòng)程序以兩種方式添加到內(nèi)核 Buildin直接把驅(qū)動(dòng)程序編譯到內(nèi)核代碼中Module以模塊的方式加載驅(qū)動(dòng)程序 Linux設(shè)備節(jié)點(diǎn)的添加 設(shè)備在 dev路徑下可用如下命令添加dev節(jié)點(diǎn) b代表塊設(shè)備 C表示字符設(shè)備mknod dev hda1b1271塊設(shè)備 主設(shè)備號(hào)127 次設(shè)備號(hào)1 設(shè)備驅(qū)動(dòng)大致構(gòu)成 Linux的設(shè)備驅(qū)動(dòng)程序大致可以分為如下幾個(gè)部分 驅(qū)動(dòng)程序的注冊(cè)與注銷 設(shè)備的打開(kāi)與釋放 設(shè)備的讀寫(xiě)操作 設(shè)備的控制操作 設(shè)備的中斷和輪詢處理 設(shè)備驅(qū)動(dòng)構(gòu)成 設(shè)備驅(qū)動(dòng)構(gòu)成 驅(qū)動(dòng)程序的注冊(cè)與注銷register chrdev 或者register blkdev unregister chrdev 或unregister blkdev 設(shè)備的打開(kāi)與釋放通過(guò)調(diào)用file operations結(jié)構(gòu)中的函數(shù)open file operations結(jié)構(gòu)中的函數(shù)release 設(shè)備驅(qū)動(dòng)構(gòu)成 設(shè)備的讀寫(xiě)操作Read Write 設(shè)備的控制操作ioctl 設(shè)備的中斷和輪詢處理對(duì)于不支持中斷的硬件設(shè)備 讀寫(xiě)時(shí)需要輪流查詢?cè)O(shè)備狀態(tài) 以便決定是否繼續(xù)進(jìn)行數(shù)據(jù)傳輸 如果設(shè)備支持中斷 則可以按中斷方式進(jìn)行操作 模塊化的字符設(shè)備驅(qū)動(dòng)程序框架 intinit module void 硬件初始化 注冊(cè)設(shè)備 注冊(cè)中斷 voidcleanup module void 釋放中斷資源 釋放該設(shè)備 釋放其他的系統(tǒng)資源 file operations結(jié)構(gòu) structfile operationsdriver fops open driver open release driver release read driver read write driver write poll driver poll ioctl driver ioctl fasync driver fasync file operations結(jié)構(gòu) open 用于打開(kāi)文件設(shè)備release 在關(guān)閉文件的調(diào)用read 用于從設(shè)備中讀取數(shù)據(jù)write 向設(shè)備發(fā)送數(shù)據(jù)poll 查詢?cè)O(shè)備是否可讀或可寫(xiě)ioctl 提供執(zhí)行設(shè)備特定命令的方法fasync 用于設(shè)備的異步通知操作 設(shè)備的注冊(cè)與注銷 devfs 注冊(cè) result devfs register chrdev 0 MOD NAME 該方法的優(yōu)點(diǎn) 無(wú)需創(chuàng)建設(shè)備節(jié)點(diǎn) 由系統(tǒng)自動(dòng)完成 設(shè)備的注冊(cè)與注銷 devfs 注銷 devfs unregister chrdev MAJOR MOD NAME devfs unregister devfs handle 設(shè)備的注冊(cè)與注銷 方法二 注冊(cè) result register chrdev 0 MOD NAME rm dev MOD NAME 中斷的申請(qǐng)與釋放 申請(qǐng) request irq irq irq handler flag dev name dev id dev id用于共享中斷信號(hào)線 釋放 free irq irq dev id 用戶空間與內(nèi)核空間的數(shù)據(jù)拷貝 方法一 copy to user void to constvoid from unsignedlongcount copy from user void to constvoid from unsignedlongcount 方法二 copy to user copy from user 上述2種方法功能類似 區(qū)別在第一種方法會(huì)進(jìn)行用戶地址空間指針的有效性檢查 設(shè)備驅(qū)動(dòng)模塊的安裝與卸載 安裝驅(qū)動(dòng)模塊insmoddriver name o卸載驅(qū)動(dòng)模塊rmmoddriver name瀏覽系統(tǒng)中的模塊lsmod 驅(qū)動(dòng)程序?qū)嵗?I2C I2C總線用兩根線串接多個(gè)設(shè)備支持多設(shè)備之間的隨機(jī)訪問(wèn)提供沖突檢測(cè)機(jī)制 實(shí)現(xiàn)對(duì)設(shè)備的管理1992年1 0版規(guī)定的快速模式的數(shù)據(jù)率達(dá)到400Kbps1998年2 0版規(guī)定的高速模式數(shù)據(jù)率達(dá)到3 4Mbps MC9328MX1的I2C模塊特性 1 符合I2C總線規(guī)范2 支持3v 5v兼容模式3 多重Master操作方式4 通過(guò)軟件編程 可支持64種不同的時(shí)鐘5 通過(guò)軟件控制應(yīng)答位的產(chǎn)生與否6 基于中斷的驅(qū)動(dòng)方式 逐字節(jié)傳輸數(shù)據(jù)7 支持起始位和終止位的產(chǎn)生和探測(cè)8 能夠產(chǎn)生重復(fù)起始位9 支持呼叫地址識(shí)別10 能夠獲知應(yīng)答位11 能夠獲知總線是否為 忙 狀態(tài) MC9328MX1的I2C模塊結(jié)構(gòu) MC9328MX1協(xié)議時(shí)序 起始信號(hào) 當(dāng)SCL為邏輯1時(shí) SDA由1到0的轉(zhuǎn)變表示了起始位 表示一次數(shù)據(jù)傳輸?shù)拈_(kāi)始 并喚醒所有在I2C總線上的設(shè)備數(shù)據(jù)源 目的地址 Master發(fā)出一個(gè)7位的地址 即Slave設(shè)備的I2C總線地址 每個(gè)Slave有一個(gè)唯一地址 這個(gè)地址不是Master的地址數(shù)據(jù)傳輸方向位 表明是從Slave讀數(shù)據(jù)還是向Slave寫(xiě)數(shù)據(jù) MC9328MX1協(xié)議時(shí)序 D 應(yīng)答位 被選址的Slave設(shè)備通過(guò)返回一個(gè)應(yīng)答位向Master告知其已經(jīng)接收到了數(shù)據(jù) 通過(guò)將SDA線在起始位之后第9個(gè)時(shí)鐘周期從邏輯1變?yōu)檫壿?來(lái)實(shí)現(xiàn)的 此應(yīng)答位不受控制寄存器I2CR中TXAK或者狀態(tài)寄存器中I2CSR中RXAK的影響 E 數(shù)據(jù) I2C按照數(shù)據(jù)傳輸方向逐字節(jié)的完成數(shù)據(jù)傳輸 在SCL時(shí)鐘周期的中 SCL 0時(shí)可以改變數(shù)據(jù) 而SCL 1則必須保持?jǐn)?shù)據(jù)不變 F 應(yīng)答位 接收方接受到數(shù)據(jù)后將SDA線置0表示接收到數(shù)據(jù)的應(yīng)答信號(hào) 在多字節(jié)傳輸中 如果不將SDA位置0 則表示所有數(shù)據(jù)已經(jīng)傳輸完成 G 終止位 表明一次數(shù)據(jù)傳輸?shù)慕Y(jié)束或Master設(shè)備中止通信 SCL為邏輯1時(shí) SDA從0到1的一次變化表示了中止位的發(fā)出 H 重復(fù)起始位 Master在結(jié)束位周期可以不發(fā)中止信號(hào) 而重復(fù)發(fā)起始位信號(hào) 如果起始位信號(hào)產(chǎn)生先于中止位信號(hào)的產(chǎn)生 稱為重復(fù)起始位 這時(shí)Master設(shè)備可以不釋放總線 而重新開(kāi)始一次獨(dú)立的數(shù)據(jù)傳輸過(guò)程 MC9328MX1I2C寄存器 MC9328MX1I2C寄存器 1 I2C地址寄存器IADR 如果MC9328是I2C總線上的Slave設(shè)備 則此寄存器中存放相應(yīng)的地址 2 I2C分頻寄存器IFDR 用來(lái)控制I2C總線的時(shí)鐘頻率 支持多達(dá)64種的頻率 最快數(shù)據(jù)率為400Kbps3 I2C控制寄存器 控制I2C的中斷 設(shè)置Maser Slave模式 接收 傳輸模式 傳輸應(yīng)答使能等位等4 I2C狀態(tài)寄存器I2CSR 表明當(dāng)前I2C總線的狀態(tài) 如有無(wú)中斷產(chǎn)生 是否接收到了應(yīng)答信號(hào) 總線是否忙等5 I2C數(shù)據(jù)I O寄存器I2DR 存放需要發(fā)送的數(shù)據(jù)或接收到的數(shù)據(jù) 在傳輸模式下 接收方發(fā)回的地址選中應(yīng)答位信號(hào) 觸發(fā)I2C模塊發(fā)送本寄存器中的數(shù)據(jù) 在接收模式下 對(duì)該寄存器的讀操作可以觸發(fā)下一個(gè)數(shù)據(jù)傳輸過(guò)程 I2C模塊初始化 1 設(shè)定頻率2 如果工作在Slave模式 則將地址寫(xiě)入IADR寄存器中3 通過(guò)設(shè)置I2CR寄存器中的IEN位 使能I2C模塊 4 修改I2CR中的模式位 選擇Master或Slave模式 傳輸或者接收模式 設(shè)置中斷使能位等 I2C總線操作流程 1 模塊初始化2 產(chǎn)生起始位總線空閑 通過(guò)對(duì)I2DR寄存器的讀 寫(xiě)來(lái)發(fā)出START信號(hào)3 數(shù)據(jù)傳輸中斷方式 檢測(cè)ICF位來(lái)確定當(dāng)前字節(jié)是否被傳輸完 檢測(cè)IIF位檢測(cè)是否接收到一個(gè)字節(jié)輪詢方式 禁用中斷使能位 輪詢IIF位 查看是否完成傳輸 I2C總線操作流程 4 產(chǎn)生停止位如果Master處于接收狀態(tài) 接收來(lái)自Slave的數(shù)據(jù) 如果Master要結(jié)束本次傳輸 必須保證不在最后一個(gè)數(shù)據(jù)字節(jié)傳輸完后的第9個(gè)SCL時(shí)鐘產(chǎn)生應(yīng)答信號(hào) 在讀取倒數(shù)第2個(gè)字節(jié)之前將I2CR寄存器的TXAK位置位來(lái)實(shí)現(xiàn) 在讀取最后一個(gè)字節(jié)之前必須產(chǎn)生一個(gè)中止位信號(hào) I2C總線操作流程 5 產(chǎn)生重復(fù)起始位如果Master要繼續(xù)占用總線 可以發(fā)出一個(gè)重復(fù)起始位 開(kāi)啟一個(gè)新的數(shù)據(jù)傳輸6 Slave模式檢測(cè)I2CSR寄存器的IAAS位判斷是否被選中 在Slave數(shù)據(jù)傳輸周期中 IAAS 0 在定址周期通過(guò)SRW可以確定Slave是發(fā)送還是接受 并且要相應(yīng)設(shè)置MTX位 在數(shù)據(jù)傳輸周期中 IAAS 0 SRW位無(wú)效 釋放總線的方式 如果是Slave發(fā)送模式 則將Slave設(shè)置為接收模式 進(jìn)行一次啞讀操作 如果是Slave接受模式 則將Slave設(shè)置為發(fā)送模式 進(jìn)行一次啞寫(xiě)操作 I2C總線操作流程 7 仲裁淘汰如果一個(gè)設(shè)備試圖占用總線而失敗 則該設(shè)備將被設(shè)為Slave模式 而且IAL被置位 Slave程序首先要檢測(cè)IAL位以判斷 本設(shè)備進(jìn)入Slave狀態(tài)是否是由于仲裁淘汰引起的 I2C總線驅(qū)動(dòng)程序分析 1 I2C總線驅(qū)動(dòng)程序?qū)崿F(xiàn)I2C的時(shí)序2 I2C設(shè)備驅(qū)動(dòng)程序調(diào)用I2C總線驅(qū)動(dòng)提供的接口 實(shí)現(xiàn)對(duì)設(shè)備的操作 首先實(shí)現(xiàn)I2C總線驅(qū)動(dòng) 對(duì)于每一個(gè)具體的I2C設(shè)備 需要單獨(dú)實(shí)現(xiàn)其驅(qū)動(dòng) I2C總線驅(qū)動(dòng)程序分析 1 關(guān)鍵結(jié)構(gòu)體 i2c adapter提供I2C總線驅(qū)動(dòng)接口的模版 對(duì)每一個(gè)具體的總線設(shè)備 要根據(jù)這個(gè)模版定義自己的相應(yīng)結(jié)構(gòu)體及接口 I2C總線驅(qū)動(dòng)程序分析 2 關(guān)鍵結(jié)構(gòu)體i2c algorithm定義訪問(wèn)總線的函數(shù)接口 I2C總線驅(qū)動(dòng)程序分析 3 核心函數(shù) i2c aa init void 4 關(guān)鍵函數(shù) i2c aa xfer I2C總線驅(qū)動(dòng)程序分析 5 其他關(guān)鍵函數(shù) i2c aa ioctl 設(shè)置總線頻率 讀取總線狀態(tài)I2c aa cleanup 釋放中斷 從設(shè)備列表數(shù)組中刪除當(dāng)前i2c設(shè)備 I2C設(shè)備驅(qū)動(dòng)程序分析 1 關(guān)鍵結(jié)構(gòu)體 i2c client I2C設(shè)備驅(qū)動(dòng)程序分析 2 關(guān)鍵結(jié)構(gòu)體 i2c driver I2C設(shè)備驅(qū)動(dòng)程序分析 3 關(guān)鍵函數(shù) i2c klcd init void I2C設(shè)備驅(qū)動(dòng)程序分析 4 關(guān)鍵函數(shù) i2c klcd attach adapter I2C設(shè)備驅(qū)動(dòng)程序分析 接口函數(shù)映射 函數(shù)調(diào)用路徑 I2c control i2c klcd client i2c client i2c adapter i2c algorithm i2c ioctlI2c transfer i2c klcd client adapter msg 1 i2c adapter i2c algorithm i2c xfer I2C設(shè)備驅(qū)動(dòng)程序分析 本例驅(qū)動(dòng)程序沒(méi)有提供通用的文件操作接口 不是一般意義上的驅(qū)動(dòng) 但體現(xiàn)了驅(qū)動(dòng)程序中最重要的兩個(gè)概念 設(shè)備信息結(jié)構(gòu)體 底層訪問(wèn)接口結(jié)構(gòu)體本例的驅(qū)動(dòng)同時(shí)也體現(xiàn)了一種常見(jiàn)的驅(qū)動(dòng)開(kāi)發(fā)模式 總線驅(qū)動(dòng)與具體掛載設(shè)備的驅(qū)動(dòng)分別單獨(dú)實(shí)現(xiàn) 類似的驅(qū)動(dòng)包括串口驅(qū)動(dòng)與串口設(shè)備驅(qū)動(dòng)等- 1.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來(lái)的問(wèn)題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐng)點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
14.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁(yè)顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開(kāi)word文檔。
- 特殊限制:
部分文檔作品中含有的國(guó)旗、國(guó)徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 嵌入式 Linux 設(shè)備 驅(qū)動(dòng)程序 開(kāi)發(fā)
鏈接地址:http://www.hcyjhs8.com/p-7341598.html