目 录
2.2. 应用层通过sysfs访问sunxi_dump_reg
3.3.1. 打印寄存器函数 - sunxi_dump_reg
3.3.2. 比较寄存器值函数 - sunxi_compare_regs
3.3.3. 写寄存器值函数 - sunxi_write_regs
1. 概述
驱动和应用调试过程中, 经常需要打印或者比较寄存器的值, 为此, sun6i/sun7i中增加了sunxi_dump_reg模块.
代码位于arch/arm/mach-sunxi/sunxi_dump_reg.c中.
对应头文件位于arch/arm/mach-sunxi/include/mach/sunxi_dump_reg.h.
2. sunxi_dump_reg实现功能和框架
sunxi_dump_reg有以下基本功能:
(1) 打印单个寄存器值.
(2) 打印一段连续寄存器的值.
(3) 比较单个寄存器值与期望值是否相符.
(4) 比较一组寄存器值与期望值是否相符.
(5) 写单个寄存器.
(6) 写一组寄存器.
sunxi_dump_reg框架如下:
APP: 应用层, 通过echo命令访问sunxi_dump_reg的sysfs节点, 执行相应功能.
Driver: 内核层, 调用sunxi_dump_reg导出的api, 执行相应功能.
- 应用层通过sysfs访问sunxi_dump_reg
sunxi_dump_reg实现了基于sysfs的dump, compare, write三个属性, 分别实现打印寄存器、比较寄存器, 写寄存器功能, 供用户态调用.
- 应用层通过api访问sunxi_dump_reg
sunxi_dump_reg导出了sunxi_dump_reg、sunxi_compare_regs、sunxi_write_regs三个API, 分别实现打印寄存器、比较寄存器、写寄存器功能, 供内核态程序调用.
3. sunxi_dump_reg使用说明
(1) 启动linux内核, 进入shell界面
(2) 执行”cd /sys/class/sunxi_dump”
(3) 执行”echo 0xf1c20000 > dump”
(4) 执行"cat dump", 查看寄存器值:
/ # cd /sys/class/sunxi_dump /sys/class/sunxi_dump # echo 0xf1c20000 > dump /sys/class/sunxi_dump # cat dump 0x90001410 |
(1) 启动linux内核, 进入shell界面
(2) 执行”cd /sys/class/sunxi_dump”
(3) 执行”echo 0xf1c20004,0xf1c20058 > dump”
(4) 执行"cat dump", 查看寄存器值:
/sys/class/sunxi_dump # echo 0xf1c20004,0xf1c20058 > dump /sys/class/sunxi_dump # cat dump 0xf1c20000: 0x00000000 0x90035514 0x00000000 0xf1c20010: 0x93001300 0x00000000 0x93001801 0x00000000 0xf1c20020: 0x90000911 0x00000000 0x90041811 0x00000000 0xf1c20030: 0x92000b00 0x00000000 0x90000a00 0x00000000 0xf1c20040: 0x00000502 0x93000900 0x92000b00 0x00000000 0xf1c20050: 0x00020002 0x00003080 0x01000000 |
说明:
- ”echo 0xf1c20004,0xf1c20058 > dump”中, 逗号紧接着数字, 前后不能有空格或其他字符.
- 为方便查看, 每行从16字节对齐的地址开始打印, 多余位置以空格补齐(如上图).
假设需要比较0xf1c20010寄存器值与期望值是否一致. 则:
(1) 启动linux内核, 进入shell界面
(2) 执行”cd /sys/class/sunxi_dump”
(3) 执行”echo 0xf1c20010 0x03006007 0x03000007 > compare”.
(4) 执行"cat compare"查看比较结果.
参数说明:
- 三个数字的含义:
0xf1c20010: 寄存器虚拟地址.
0x03006007: 用户期望的寄存器值.
0x03000007: 掩码, 表明用户关心的位. 比如0x03000007表示用户只关心bit0, bit1, bit2, bit24, bit25, 其他的位不影响比较结果.
- 数字之间有且仅有一个空格, 不能有多余字符. 如”echo 0xf1c20010,0x03006007 0x03000007 > compare”, ”echo 0xf1c20010 0x03006007 0x03000007 > compare”均不正确.
执行结果:
/sys/class/sunxi_dump # echo 0xf1c20010 0x03006007 0x03000007 > compare /sys/class/sunxi_dump # cat compare reg expect actual mask result 0xf1c20010 0x03006007 0x93001300 0x03000007 ERR |
(1) reg, expect, actual, mask, result栏分别对应寄存器地址, 期望值(用户输入), 实际值(程序读取), 掩码(用户输入), 比较结果(程序计算出).
(2) 关于result: 若(expect&mask) == (actual&mask), 则result为OK, 表示寄存器值与期望相符; 否则result为ERR.
假设需要比较0xf1c20010, 0xf1c20020, 0xf1c20028三个寄存器值. 则:
(1) 启动linux内核, 进入shell界面
(2) 执行”cd /sys/class/sunxi_dump”
(3) 执行”echo 0xf1c20010 0x03006207 0x03006207,0xf1c20020 0x00001000 0x00001000,0xf1c20028 0x80000000 0x80000000 > compare”.
(4) 执行"cat compare"查看比较结果.
参数说明:
- 相邻两组参数之间用逗号隔开, 逗号前后不能有多余空格或其他字符.
如”echo 0xf1c20010 0x03006207 0x03006207, 0xf1c20020 0x00001000 0x00001000 ,0xf1c20028 0x80000000 0x80000000 > compare”不正确. 因为逗号前后有空格.
- 和上节一样, 同组参数内相邻数字之间有且仅有一个空格, 不能有多余字符.
如”echo 0xf1c20010 0x03006207 0x03006207,0xf1c20020 0x00001000 0x00001000,0xf1c20028 0x80000000 0x80000000 > compare”不正确. 因为红色标记处有两个空格.
- 和上节一样, 同组参数内三个数字分别表示寄存器地址, 期望值, 掩码.
执行结果:
/sys/class/sunxi_dump # echo 0xf1c20010 0x03006207 0x03006207,0xf1c20020 0x00001 000 0x00001000,0xf1c20028 0x80000000 0x80000000 > compare /sys/class/sunxi_dump # cat compare reg expect actual mask result 0xf1c20010 0x03006207 0x93001300 0x03006207 ERR 0xf1c20020 0x00001000 0x90000911 0x00001000 ERR 0xf1c20028 0x80000000 0x90041811 0x80000000 OK |
假设需要将0xf1c20800寄存器写0x00000031. 则:
(1) 启动linux内核, 进入shell界面
(2) 执行”cd /sys/class/sunxi_dump”
(3) 执行”echo 0xf1c20800 0x00000031 > write”.
(4) 执行”cat write”查看写结果.
参数说明:
- 数字含义:
0xf1c20800: 寄存器虚拟地址.
0x00000031: 待写的值.
- 数字之间有且仅有一个空格, 不能有多余字符. 如”echo 0xf1c20800,0x00000031 > write”, ”echo 0xf1c20800 0x00000031 > write”均不正确.
执行结果:
/sys/class/sunxi_dump # echo 0xf1c20800 0x00000031 > write /sys/class/sunxi_dump # cat write reg to_write after_write 0xf1c20800 0x00000031 0x00000031 |
reg, to_write, after_write分别对应寄存器地址, 写入的值, 写完读出的值.
假设需要将0xf1c20800,0xf1c20818寄存器分别写0x00000031,0x55555555. 则:
(1) 启动linux内核, 进入shell界面
(2) 执行”cd /sys/class/sunxi_dump”
(3) 执行”echo 0xf1c20800 0x00000031,0xf1c20818 0x55555555 > write”.
相邻两组参数之间用逗号隔开, 逗号前后不能有多余空格或其他字符.
如”echo 0xf1c20800 0x00000031, 0xf1c20818 0x55555555 > write”不正确. 因为逗号前后有空格.
(4) 执行”cat write”查看写结果.
执行结果:
/sys/class/sunxi_dump # echo 0xf1c20800 0x00000031,0xf1c20818 0x55555555 > write /sys/class/sunxi_dump # cat write reg to_write after_write 0xf1c20800 0x00000031 0x00000031 0xf1c20818 0x55555555 0x00555555 |
reg, to_write, after_write分别对应寄存器地址, 写入的值, 写完读出的值.