I O記憶體記憶體操作

2021-08-25 10:40:20 字數 926 閱讀 5242

i/o記憶體記憶體操作

訪問暫存器和訪問普通的sdram是不同的。

特殊暫存器在2410上對映在虛擬位址的0xf0000000開始的地方。

具體可以參考map.h的定義。

#define ioread8(p) ()

#define ioread16(p) ()

#define ioread32(p) ()

#define iowrite8(v,p) __raw_writeb(v, p)

#define iowrite16(v,p) __raw_writew(cpu_to_le16(v), p)

#define iowrite32(v,p) __raw_writel(cpu_to_le32(v), p)

(1)所有的讀寫指令所賦的位址必須都是虛擬位址,你有兩種選擇:使用核心已經定義好的位址,如

s3c2440_gpjcon等等,這些都是核心定義好的虛擬位址,有興趣的可以看原始碼。還有一種方法就是使用自己用ioremap對映的虛擬位址。絕對

不能使用實際的實體地址,否則會因為核心無法處理位址而出現oops。

(2)在使用i/o指令時,可以不使用request_region和request_mem_region,而直接使用outb、ioread等指令。因為request的功能只是告訴核心埠被誰占用了,如再次request,核心會制止。

(3)在使用i/o指令時,所賦的位址資料有時必須通過強制型別轉換為 unsigned long ,不然會有警告(具體原因請看linux裝置驅動程式學習(7)-核心的資料型別) 。雖然你的程式可能也可以使用,但是最好還是不要有警告為妙。

(4)在include\asm-arm\arch-s3c2410\hardware.h中定義了很多io口的操作函式,有需要可以在驅動中直接使用,很方便。

另外乙個方式是採用ioremap,為了以後相容性的考慮,我覺得最好採用這個方式。

關於IO記憶體

外設的sfr 特殊功能暫存器 編址與記憶體的編址是同乙個位址空間,叫做io記憶體。linux 核心執行後,開啟了mmu 記憶體管理單元 所以不能直接訪問 cpu 的實體地址,也就是說,不能直接使用實體地址訪問系統的 io 記憶體。必須將實體地址轉換為虛擬位址,核心通過虛擬位址來訪問系統的 io 記憶...

I O埠和I O記憶體

每種外設都通過讀寫暫存器進行控制,大部分外設都有幾個暫存器,不管在記憶體位址空間還是在i o位址空間,這些暫存器的訪問位址是連續的。在硬體層,記憶體區域和io區域沒有概念上的區別 他們都通過向位址匯流排和控制匯流排傳送電平訊號進行訪問,再通過資料匯流排讀寫資料。儘管硬體暫存器和記憶體非常相似,但程式...

I O埠與I O記憶體

埠的概念 裝置通過系統匯流排上的介面與cpu相連,介面電路中含有多種暫存器,cpu向裝置讀寫資料實際上是向介面上的暫存器讀寫資料,這些暫存器稱為i o埠。乙個介面通常包含控制埠,資料埠,狀態埠。對於x86平台,實體地址就是匯流排位址。linux中,程序中的4gb虛擬記憶體分為使用者空間和核心空間,使...