一种简单方便的读写寄存器方法:通过devmem读写寄存器。
devmem的方式是提供给驱动开发人员,在应用层能够侦测内存地址中的数据变化,以此来检测驱动中对内存或者相关配置的正确性验证。devmem本质就是应用程序通过mmap函数实现对/dev/mem驱动中mmap方法的使用,映射了设备的内存到用户空间,实现对这些物理地址的读写操作。
“/dev/mem”是linux系统的一个虚拟字符设备,无论是标准linux系统还是嵌入式linux系统,都支持该设备。/dev/mem 是物理内存的全映像,可以用来访问物理内存,一般用法是open("/dev/mem",O_RDWR|O_SYNC),然后mmap,接着就可以用mmap的地址来访问物理内存,这实际上就是实现用户空间驱动的一种方法。
例子:longnix系统下读写7A2000配置空间寄存器
读7A2000的桥片标识寄存器 :
busybox devmem 0x10013ff8
写7A2000桥片的引脚复用配置寄存器:
busybox devmem 0x10010440 w 0xcccc3ce0
读写命令标准格式
读寄存器 busybox devmem address b/h/w (默认类型为w)
写寄存器 busybox devmem address b/h/w value
shell中关于busybox devmem用法的说明:
Usage: devmem ADDRESS [WIDTH [VALUE]]
Read/write from physical address
ADDRESS Address to act upon
WIDTH Access operation type : [b]yte, [h]alfword, [w]ord\n"
VALUE Data to be written
关于devmem源码的参考链接:
https://blog.csdn.net/xy010902100449/article/details/47028497
if((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1) FATAL;
//获取待读写的address地址
target = strtoul(argv[1], 0, 0);
/* Map one page */ //将内核空间映射到用户空间
map_base = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, target & ~MAP_MASK);
//virt_addr = address地址映射的实际虚拟内存地址
virt_addr = map_base + (target & MAP_MASK);
//获取数据读写宽度,默认为w。
if(argc > 2)
access_type = tolower(argv[2][0]);
...
//若参数大于3个,则说明为写入操作,针对不同参数写入不同类型的数据
if(argc > 3) {
writeval = strtoul(argv[3], 0, 0);
switch(access_type) {
case 'b':
*((unsigned char *) virt_addr) = writeval;
read_result = *((unsigned char *) virt_addr);
break;
case 'h':
*((unsigned short *) virt_addr) = writeval;
read_result = *((unsigned short *) virt_addr);
break;
case 'w':
*((unsigned long *) virt_addr) = writeval;
read_result = *((unsigned long *) virt_addr);
break;
}