Linux 驅動分類 與訪問技術

2022-09-02 19:51:11 字數 1832 閱讀 5474

驅動開發概述

1.驅動分類

1.1 常規分析法

1.1.1  字元裝置 

字元裝置是一種按位元組來訪問的裝置,字元驅動則負責驅動字元裝置,

這樣的驅動通常實現open, close, read和write 系統呼叫。例:串列埠,led,按鍵。

1.1.2  塊裝置 

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

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

1.1.3  網路裝置

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

1.2 匯流排分類法

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

2.驅動學習方法  

2.1 驅動模型

2.2 驅動操作

硬體訪問技術

1. 訪問流程

1.1 位址對映 

在linux系統中,無論是核心程式還是應用程式,都只能使用虛擬位址,而晶元手冊中給出的硬體暫存器位址或者ram位址則是實體地址,無法直接使用,因       此,我們讀寫暫存器的第1步就是將它的物理位址對映為虛擬位址。

1.2 讀寫暫存器

2. 位址對映

2.1 動態對映  

所謂動態對映,是指在驅動程式中採用ioremap函式將物理位址對映為虛擬位址。

原型:void * ioremap(physaddr, size)

2.2 靜態對映

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

1.如何事先指定對映關係?

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

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

struct map_desc

unsigned long virtual; /* 對映後的虛擬位址*/

unsigned long pfn; /* 實體地址所在的頁幀號*/

unsigned long pfn; /* 實體地址所在的頁幀號*/

unsigned long length;/* 對映長度*/

unsigned int type;/* 對映的裝置型別*/

pfn: 利用__phys_to_pfn(實體地址)可以計算出實體地址所在的物理頁幀號在靜態對映中,

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

3. 暫存器讀寫

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

unsignedioread8(void *addr)

unsignedioread16(void *addr)

unsignedioread32(void *addr)

unsignedreadb(address)

unsignedreadw(address)

unsignedreadl(address)

voidiowrite8(u8 value, void *addr)

voidiowrite16(u16 value, void *addr)

voidiowrite32(u32 value, void *addr)

voidwriteb(unsigned value, address)

voidwritew(unsigned value, address)

voidwritel(unsigned value, address)

linux驅動分類

眾所周知linux驅動分為三個類,分別為 字元裝置驅動 塊裝置驅動 網路裝置驅動 這三種驅動之前有什麼聯絡或者說有什麼差異點呢,可能很多人都不了解,我在研究過程中為了更好的理解,所以做了乙個總結。首先我們來看看字元裝置驅動和塊裝置驅動是怎麼定義的 字元裝置驅動是以不定長度的字元來傳送資料,字元裝置是...

Linux驅動技術 二 訪問I O記憶體

arm是對記憶體空間和io空間統一編址的,所以,通過讀寫sfr來控制硬體也就變成了通過讀寫相應的sfr位址來控制硬體。這部分位址也被稱為i o記憶體。x86中對i o位址和記憶體位址是分開編址的,這樣的io位址被稱為i o埠。本文只討論io記憶體的訪問。io記憶體訪問流程 我們知道,為了管理最重要的...

Linux驅動裝置分類

1.字元驅動裝置 指訪問時沒有快取的裝置,採用位元組流訪問的裝置,如按鍵,串列埠,音效卡,觸控螢幕等 2.塊驅動裝置 有快取來支援,塊裝置必須能夠隨機訪問 random access 字元裝置則沒有這個要求。unix下,採用乙個資料塊來進行訪問,資料塊一般為512位元組,1k等,linux下,可以採...