Linux系统下访问设备寄存器的方法

一种简单方便的读写寄存器方法:通过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;
        }


  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值