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