內部寄存器
一.應用層讀寫內部寄存器
步驟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)
參數:from,io端口的基地址;num,io端口占用的范圍;name,使用這段io地址的設備名。
歡迎轉載,歡迎指正,更歡迎點贊。轉載請附原文鏈接。