linux驅動開發前奏

2021-07-02 00:38:09 字數 1907 閱讀 3705

1.常規分類:字元裝置,塊裝置,網路裝置

字元裝置:是一種按位元組來訪問的裝置,字元驅動則負責驅動字元裝置,這樣的驅動通常實現open,close,read等系統呼叫,例如:串列埠,led,按鍵

塊裝置:在大部分unix系統中,塊裝置定義為:以塊(通常是512位元組)為最小傳輸單位的裝置,塊裝置不能按位元組處理資料。

而linux則允許塊裝置傳送任意數目的位元組。因此,塊和字元裝置的區別僅僅是驅動的與核心的介面不同。常見的塊裝置包括硬碟,flash,sd卡等。

網路裝置:網路裝置可以是乙個硬體裝置,如網絡卡等;也可以是乙個純粹的軟體裝置,如回環介面lo,乙個網路介面負責傳送和接收資料報文。

2.匯流排分類法

usb裝置,pci裝置,平台匯流排裝置

硬體訪問實質

驅動程式控制裝置,主要是通過訪問裝置內的暫存器來達到控制目的,因此我們討論如何訪問硬體,就成了如何訪問這些暫存器。

位址對映

在linux系統中,不論是核心程式還是應用程式,都智慧型使用虛擬位址,而晶元手冊給出的暫存器位址或ram位址等都是實體地址,無法直接使用,因此我們讀寫暫存器的第一步就是講物理位址對映為虛擬位址。

1.動態對映

在驅動程式中採用

ioremap函式將物理位址對映為虛擬位址

函式原型: void *ioremap(physaddr, size);

2.靜態對映

所謂靜態對映,是指linux系統根據使用者事先指定的對映關係,在核心啟動後,自動的將物理位址對映為虛擬位址。

問題1:如何事先指定對映關係?

在靜態對映中,使用者是通過map_desc結構來指明實體地址與虛擬位址的對映關係。

struct map_desc ;
pfn:利用_phys_to_pfn(實體地址)可以計算出實體地址所在的物理頁幀號

問題2:核心啟動時,在什麼地方完成自動對映?

以s3c6410cpu為例:在arch/arm/mach-s3c64xx目錄下有乙個結構陣列

static struct map_desc s3c_iodesc __initdata = ;
裡面儲存的全是這種對映關係,目錄下還有個初始化函式如下:

void __init s3c64xx_init_io(struct map_desc *mach_desc, int size)

內部呼叫iotable_init完成對映

暫存器讀寫

在完成位址對映後,就可以讀寫暫存器了,linux核心提供了一系列的函式用來讀寫暫存器。

unsigned ioread8(void *addr)

unsigned ioread16(void *addr)

unsigned ioread32(void *addr)

unsigned readb(address)

unsigned readw(address)

unsigned readw(address)

unsigned readl(address)

void iowrite8(u8 value, 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驅動開發前奏

硬體訪問技術 暫存器讀寫 驅動分類 常規分類法 字元裝置,塊裝置,網路裝置。驅動分類 匯流排分類法 usb裝置,pci裝置,平台匯流排裝置。字元裝置 字元裝置是一種按位元組來訪問的裝置,字元驅動則負責驅動字元裝置,這樣的驅動通常支援open,close,read,write系統呼叫。例如 串列埠,l...

R O R 開發前奏

裝好ruby以後,開啟命令列視窗輸入 ruby v 如果出現ruby的版本號 1.8.5 最新 就為安裝成功 出現版本號 1.2.2 最新 就為安裝成功,rails安裝在ruby目錄下 lib ruby gems 1.8 gems rails 1.2.2 如果你選用的開發ide是radrails的話...

linux驅動開發

這兩天在公司由於一直沒有太過於繁重的任務,於是便給分配了驅動開發的任務,之前一直不明白驅動開發和普通的嵌入式開發到底有什麼區別,然後有沒有經過系統的學習,於是就一直愣在那裡。不過慢慢的還是經過查資料,雖然 沒有編寫出來,但是對於系統的一些東西學習的終於有了一定的了解,感覺這個十分的重要,也為了給自己...