一. 驅動開發概述
1. 驅動分類
1.1常規分類法
1.1.1字元裝置
字元裝置是一種一位元組為最小訪問單位的裝置,字元驅動負責驅動字元裝置,系統按照操作檔案的方式來對字元裝置進行訪問,這樣的驅動通常支援open,close,read、和write系統呼叫。例如:串列埠,led,按鍵。
1.1.2塊裝置
在大部分的unix系統中,塊裝置定義為:以塊(通常是512位元組)為最小傳輸單位的裝置,塊裝置不能按位元組處理資料,而linux則允許塊裝置傳輸任意數目的位元組,因此塊和字元裝置的區別僅僅是驅動的裝置與核心的介面不同。常見的塊裝置包括硬碟,flash,sd卡等。
1.1.3網路裝置
網路介面可以是乙個硬體裝置,如網絡卡eth0,也可以是乙個純粹的軟體裝置,如回環介面lo,乙個網路介面負責傳送和接受資料報文。
1.2匯流排分類法
usb裝置,pci裝置,平台匯流排裝置(如usb網絡卡)。
2. 驅動學習方法
先弄清某驅動的驅動模型,建立驅動**框架,再網框架中新增硬體相關的操作**。
1)驅動模型
分析範例**,總結出某類裝置的驅動模型,完成**框架。
2)硬體操作
把裸機中的硬體操作移植到linux驅動中。
3)驅動程式測試
編譯驅動模組,放入根檔案系統,編寫應用程式,載入模組進行測試。
//驅動學習初期,不需要過多的去閱讀核心**。
二. 硬體訪問技術
1. 硬體訪問流程
驅動程式控制裝置,主要通過訪問裝置內的暫存器來達到控制目的。
2. linux系統位址對映
linux系統中,無論是核心程式還是應用程式,都只能使用虛擬位址,而晶元手冊中給出的硬體暫存器位址或ram位址確實實體地址。因此,要對暫存器進行讀寫,就要把物 理位址對映為虛擬位址。linux系統的位址對映方式分為動態對映和靜態對映。
2.1 動態對映
動態對映是指在驅動程式中採用ioremap函式將物理位址對映為虛擬位址。函式原型為void * ioremap(physaddr, size)。引數physaddr為待對映的實體地址,size為對映的區域長度(若是四個位元組,即為4),返回值為對映後的虛擬位址。
2.2 靜態對映
靜態對映是指linux系統根據使用者事先指定的對映關係,在核心啟動時自動地把物理位址對映為虛擬位址。
1)在靜態對映中,使用者通過map_desc結構來指明實體地址與虛擬位址的對映關係。
struct map_desc;
pfn:利用_phys_to_pfn(實體地址)可以計算出實體地址所在的物理頁幀號。
2)把該結構填充至位於核心原始碼\arch\arm\cpu.c中的struct map_desc結構陣列中。
3. 暫存器讀寫
在完成位址對映後,就可以讀寫暫存器了,linux核心提供了一系列函式,來對暫存器進行讀寫。
unsigned ioread8(void *addr)
unsigned ioread16(void *addr)
unsigned ioread32(void *addr)
unsigned readb(address)
unsigned readw(address)
unsigned readl(address)
void iowrite8(u8 balue, void *addr)
void iowrite16(u16 value, void *addr)
void iowrite32(u32 value, void *addr)
void writeb(unsigned value, address)
void writew(unsigned value, address)
void writel(unsigned value, address)
Linux字元裝置驅動初探
一 裝置驅動之資料結構 1 dev t 裝置編號,包含主裝置號 次裝置號。dev t是乙個32位的數,12位表示主裝置號,20為表示次裝置號 1 主裝置號 major dev t dev 2 次裝置號 minor dev t dev 3 裝置編號 mkdev int major,int minor ...
USB驅動初探
調了n久68013,最後還是放棄了,使用stm32的usb 調到驅動,建立驅動環境,win7調驅動總感覺格格不入,在xp下建立開發環境 vc6,xpddk 2600,driverstudio 3.2 先安裝vc6,安裝ddk,最後安裝driverstudio 安裝完後,開啟vc6,設定ddk bui...
Linux裝置驅動初探 準備Linux原始碼樹
剛看 o reilly 寫的 linux 裝置驅動程式 時。作者一再強調在編寫驅動程式時必須 建立核心樹。所謂核心樹,我的理解和網上資料說的一致就是核心原始碼的一種邏輯形式。那怎麼建立呢?為此上網 翻雲覆雨 起來而結果卻是 慘敗而歸 為 此託了一天又4個小時 當然包括吃飯睡覺的時間 連個簡單的 he...