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)
参数:from,io端口的基地址;num,io端口占用的范围;name,使用这段io地址的设备名。
欢迎转载,欢迎指正,更欢迎点赞。转载请附原文链接。