A40i/T3的sunxi_dump_reg使用说明(一)

目   录

1. 概述

2. sunxi_dump_reg实现框架

    2.1. 功能和框架 

    2.2. 应用层通过sysfs访问sunxi_dump_reg

    2.3. 内核层通过api访问sunxi_dump_reg

3. sunxi_dump_reg使用说明

    3.1. 应用层基于shell命令访问

           3.1.1. 打印单个寄存器.

           3.1.2. 打印一段连续寄存器

           3.1.3. 比较单个寄存器值

           3.1.4. 比较一组寄存器值

           3.1.5. 写单个寄存器值

           3.1.6. 写一组寄存器值

    3.2. 应用层通过C代码访问.

           3.2.1. 获取单个寄存器值

           3.2.2. 获取一组寄存器值

           3.2.3. 写单个寄存器值

           3.2.4. 写一组寄存器值

           3.2.5. 比较单个寄存器值

           3.2.6. 比较一组寄存器值

    3.3. 内核层使用说明

           3.3.1. 打印寄存器函数 - sunxi_dump_reg

           3.3.2. 比较寄存器值函数 - sunxi_compare_regs

           3.3.3. 写寄存器值函数 - sunxi_write_regs

    3.4. sunxi_dump_reg在dailybuild中的用例

4. sunxi_reg使用说明

 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_regsunxi_compare_regssunxi_write_regs三个API, 分别实现打印寄存器、比较寄存器、写寄存器功能, 供内核态程序调用.

  3. sunxi_dump_reg使用说明

    1. 应用层基于shell命令访问
      1.  打印单个寄存器

(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.  打印一段连续寄存器

(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           

说明:

  1. ”echo 0xf1c20004,0xf1c20058 > dump”中, 逗号紧接着数字, 前后不能有空格或其他字符.
  2. 为方便查看, 每行从16字节对齐的地址开始打印, 多余位置以空格补齐(如上图).
      1.  比较单个寄存器值

假设需要比较0xf1c20010寄存器值与期望值是否一致. 则:

(1) 启动linux内核, 进入shell界面

(2) 执行”cd /sys/class/sunxi_dump”

(3) 执行”echo 0xf1c20010 0x03006007 0x03000007 > compare”.

(4) 执行"cat compare"查看比较结果.

参数说明:

  1. 三个数字的含义:

0xf1c20010: 寄存器虚拟地址.

0x03006007: 用户期望的寄存器值.

0x03000007: 掩码, 表明用户关心的位. 比如0x03000007表示用户只关心bit0, bit1, bit2, bit24, bit25, 其他的位不影响比较结果.

  1. 数字之间有且仅有一个空格, 不能有多余字符. 如”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), resultOK, 表示寄存器值与期望相符; 否则result为ERR.

      1.  比较一组寄存器值

假设需要比较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"查看比较结果.

参数说明:

  1. 相邻两组参数之间用逗号隔开, 逗号前后不能有多余空格或其他字符.

如”echo 0xf1c20010 0x03006207 0x03006207, 0xf1c20020 0x00001000 0x00001000 ,0xf1c20028 0x80000000 0x80000000 > compare”不正确. 因为逗号前后有空格.

  1. 和上节一样, 同组参数内相邻数字之间有且仅有一个空格, 不能有多余字符.

如”echo 0xf1c20010 0x03006207  0x03006207,0xf1c20020 0x00001000 0x00001000,0xf1c20028 0x80000000 0x80000000 > compare”不正确. 因为红色标记处有两个空格.

  1. 和上节一样, 同组参数内三个数字分别表示寄存器地址, 期望值, 掩码.

执行结果:

/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

      1.  写单个寄存器值

假设需要将0xf1c20800寄存器写0x00000031. 则:

(1) 启动linux内核, 进入shell界面

(2) 执行”cd /sys/class/sunxi_dump”

(3) 执行”echo 0xf1c20800 0x00000031 > write”.

(4) 执行”cat write”查看写结果.

参数说明:

  1. 数字含义:

0xf1c20800: 寄存器虚拟地址.

0x00000031: 待写的值.

  1. 数字之间有且仅有一个空格, 不能有多余字符. 如”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分别对应寄存器地址, 写入的值, 写完读出的值.

      1.  写一组寄存器值

假设需要将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分别对应寄存器地址, 写入的值, 写完读出的值.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值