一、用途介绍
读写soc相关寄存器的值,就是应用程序通过mmap函数对/dev/mem驱动中的mmap方法的使用,映射了设备的内存到用户空间,实现对这些物理地址的读写操作
二、配置
内核中对devmem的支持,进行如下配置 读取soc相关寄存器的值,某些寄存器的值是不可以进行读取的,因此在读取时会发生错误 Symbol: DEVMEM [=y] │ │ Type : bool │ │ Prompt: /dev/mem virtual device support │ │ Location: │ │ -> Device Drivers │ │ (1) -> Character devices │ │ Defined at drivers/char/Kconfig:10
备注: 内核进行配置该选项:CONFIG_DEVMEM=y,验证是否配置成功会生成/dev/mem节点
busybox中对devmem的支持,进行如下配置: Symbol: DEVMEM [=y] │ │ Prompt: devmem (2.5 kb) │ │ Defined at miscutils/Config.in:326 │ │ Location: │ │ -> Miscellaneous Utilities
备注: busybox中配置该选项CONFIG_DEVMEM=y,验证是否配置成功会生成应用程序devmem
三、读和写
读取:在地址0x97000000读取32bit值(WIDTH默认等于32, 可选值为[8, 16, 32, 64])
/dev # devmem 0x97000000
0x11111111
读取:在地址0x97000000读取16bit值
/dev # devmem 0x97000000 16
0x1111
写入:在地址0x97000000写入32bit值0x7777ABCD
/dev # devmem 0x97000000 32 0x7777ABCD
/dev # devmem 0x97000000
0x7777ABCD
注意:如果/dev下没有mem这个node,会出现错误:
/dev # devmem 0x97000000
devmem: can’t open ‘/dev/mem’: No such file or directory
这时可以在Host系统中手动创建一个(例如在NFS root filesystem模式):
host@host-laptop:~/embedded/tftpboot/nfsroot/dev$ sudo mknod mem -m666 c 1 1
注意这里的权限是666,允许任何人任意读写,可以很好的配合程序debug。
devmem的使用方式 语法: devmem ADDRESS [WIDTH [VALUE]] ●ADDRESS :要直接读写的地址 ●WIDTH :指定读写资料的位数(8/16/32... ●VALUE :要写入的资料 读 ●读32位: devmem 0x98000000 ●读16位: devmem 0x98000000 16 ●读8位: devmem 0x98000000 8 写 ●写32位: devmem 0x98000000 32 0x12345678 ●写16位: devmem 0x98000000 16 0x1234 ●写8位: devmem 0x98000000 8 0x12