1. 程式人生 > >Linux硬件訪問技術

Linux硬件訪問技術

動態映射 參數 blog tel 應用程序 address virt 返回值 硬件

Linux系統中,無論是內核程序還是應用程序,都只能使用虛擬地址,而芯片手冊中給出的硬件寄存器地址或者RAM地址則是物理地址,無法直接使用,因此,我們讀寫寄存器的第1步就是將將它的物理地址映射為虛擬地址。

所以我們要用到靜態映射和動態映射 ,用得比較多的是動態映射

所謂動態映射,是指在驅動程序中采用ioremap函數將物理地址映射為虛擬地址。
原型:void * ioremap(physaddr, size)
參數:
Physaddr:待映射的物理地址
Size: 映射的區域長度
返回值:映射後的虛擬地址


在靜態映射中,用戶是通過map_desc結構來指明物理地址與虛擬地址的映射關系。
struct map_desc {
  unsigned long virtual; /* 映射後的虛擬地址 */
  unsigned long pfn; /* 物理地址所在的頁幀號 */
  unsigned long length; /* 映射長度 */
  unsigned int type; /* 映射的設備類型 */
};
pfn: 利用__phys_to_pfn(物理地址)可以計算出物理地址所在的物理頁幀號



靜態映射事先應該填充結構,然後再告訴內核

在完成地址映射後,就可以讀寫寄存器了,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)
id writel(unsigned value, address)

Linux硬件訪問技術