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地址的设备名。

 

 

 

 

 


 

 欢迎转载,欢迎指正,更欢迎点赞。转载请附原文链接。

 

posted @ 2021-01-23 19:23  Aaron看世界  阅读(6163)  评论(0编辑  收藏  举报