Linux下讀寫寄存器方法概括


內部寄存器

一.應用層讀寫內部寄存器

步驟1打開linux系統dev目錄下的/dev/mem文件

dev_fd = open("/dev/mem", O_RDWR|O_SYNC);

步驟2將寄存器地址映射到用戶空間

unsigned char *map_base=(unsigned char * )mmap(NULL, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, dev_fd, AUDIO_REG_BASE );

步驟3用戶空間讀寫寄存器

*(volatile unsigned int *)(map_base+0x38);

*(volatile unsigned int *)(map_base + 0x30) = 0x208121bc;

步驟4解除映射關系

munmap(map_base,MAP_SIZE);

二.驅動層讀寫內部寄存器

步驟1將寄存器物理地址映射到內核空間虛擬地址上

our_card->regs = ioremap(S3C2410_PA_IIS, 0x100); 

步驟2驅動層讀寫寄存器

readl(our_card->regs );

writel(value, our_card->regs);

外部寄存器

一、統一編址-IO內存方式

步驟1向內核申請並分配一段內存

request_mem_region(0x56000014,0x4,"led");

步驟2將IO外設的物理地址映射到內核的虛擬地址中

ioremap(0x56000014,0x4);

步驟3對外部寄存器讀寫

value = ioread32(led->base);

iowrite32( value & ~(1<<led->offset), led->base);

步驟4取消映射

iounmap(led[i].base);

步驟5注銷釋放該段區域內存

release_mem_region(0x56000014,0x4);

二、獨立編址-IO端口方式

步驟1申請一段區域

request_region(0x56000014,0x4,"led");

步驟2讀寫寄存器

inb/outb/inw/outw/inl/outl

value = inl((unsigned)(S3C2410_GPBDAT));

outl(value | 1<<led->offset,(unsigned)(S3C2410_GPBDAT));

步驟3注銷釋放該區域

release_region(0x56000014,0x4);

 

函數使用說明

1.mmap函數使用說明

 

用法:#include <sys/mman.h>

void *mmap(void *start,size_t length,int prot,int flags,int fd,off_t offset);

int munmap(void *start, size_t length);

 

參數:

start:映射區的開始地址;length:映射區的長度;prot:期望的內存保護標志,不能與文件的打開模式沖突,PROT_EXEC //頁內容可以被執行,PROT_READ //頁內容可以被讀取,PROT_WRITE //頁可以被寫入,PROT_NONE //頁不可訪問;flags:指定映射對象的類型,映射選項和映射頁是否可以共享;fd:有效的文件描述詞;offset:被映射對象內容的起點,內部寄存器物理地址。

 

函數釋義:

將物理地址映射到用戶空間的虛擬地址上,在用戶空間完成對設備寄存器的操作。

 

2.ioremap函數使用說明

用法:

#include <io.h>

void *ioremap(unsigned long phys_addr, unsigned long size)

 

參數:

phys_addr:是要映射的物理地址;size:是要映射的長度,單位是字節。

 

函數釋義:將物理地址轉換為內核虛擬地址,通常內核態設備驅動程序會使用這個虛擬地址訪問寄存器。

 

3.request_mem_region函數使用說明

用法: start 開始,分配一個 len 字節的內存區域

#ioport.h
struct resource *request_mem_region(unsigned long start, unsigned long len, char*name)

 

參數:start,I/O外設寄存器的物理地址;len,分配內存的大小。

 

函數釋義:請求分配指定的I/O內存資源,任務是檢查你申請的資源是否可用,如果可用則申請成功,並標志為已經使用,其它driver再申請這資源時則不會再成功。

 

4.request_region函數使用說明

用法:

#ioport.h

void request_region(unsigned long from, unsigned long num, const char *name) 

 

參數:fromio端口的基地址;numio端口占用的范圍;name,使用這段io地址的設備名。

 

 

 

 

 


 

 歡迎轉載,歡迎指正,更歡迎點贊。轉載請附原文鏈接。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM