國嵌攻略 111 硬體訪問技術

2022-07-20 23:45:17 字數 1289 閱讀 9326

硬體訪問實質

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

訪問流程

1.位址對映

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

1.1.動態對映

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

原型:void *ioremap(physaddr, size)

引數:physaddr:待對映的實體地址

size:對映的區域長度

返回值:對映後的虛擬位址

1.2.靜態對映

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

對映關係:

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

struct map_desc{

unsigned long virtual;   //對映後的實體地址

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

unsigned long long;      //對映長度

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

pfn:利用__phys_to_pfn(實體地址)可以計算實體地址所在的物理頁幀號

2.暫存器讀寫

在完成位址對映後,就可以讀寫暫存器了,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 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)

國嵌攻略 161 USB匯流排介紹

usb發展史 usb universal serial bus 通用序列匯流排,是一種外部匯流排標準。用於規範電腦與外部裝置的連線和通訊。usb是在1994年底由英特爾 康柏 ibm microsoft等多家公司聯合提出的。自1996年堆出後,已經成功替代了串列埠和並口。成為當今個人電腦和大量智慧型...

國嵌攻略 159 SPI子系統

spi 子系統架構 1.spi core核心 用於連線spi客戶驅動和spi主控制器驅動,並且提供了對應的註冊和登出的介面。2.spi controller driver主控制器驅動 用來驅動spi控制器。3.spi protocol drvier客戶驅動 用來驅動spi裝置 spi控制器驅動分析 ...

國嵌攻略 148 MTD系統架構

mtd裝置概述 flash在嵌入式系統中是必不可少的,它是bootloader linux核心和檔案系統的最佳載體。在linux核心中引入了mtd子系統為nor flash和nand flash裝置提供了統一的介面,從而使得flash驅動的設計大為簡化。mtd使用體驗 把系統燒寫到nand flas...