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