专栏首页程序手艺人[Linux驱动炼成记] 11-快速修改芯片驱动中寄存器的值

[Linux驱动炼成记] 11-快速修改芯片驱动中寄存器的值

实际项目的调试中,往往需要快速修改驱动芯片(只针对IIC通讯)中对应寄存器的值,传统的方式一般是编译驱动 -> 烧录固件 -> 测试,而这样的方式往往很繁琐。这里介绍使用i2c-tools快速修改驱动芯片的寄存器方式1

使用工具的前提:

  1. 驱动芯片是用IIC通讯的,一般的常用的芯片基本都是IIC控制(电源,音频,光感等等)
  2. 交叉编译好i2c-tools

本文以TI音频芯片TAS5754驱动为例 , 内核版本为: Linux buildroot 4.9.68 , 前一篇文章[Linux驱动炼成记] 04-功放TAS5754,已经说了一些设备地址的配置,参数等等。

工具下载

i2c-tools这个工具的源码是开放的,可以修改源码包中的Makefile编译成不通平台的可执行文件, 下载地址: 这里

这里为了快速构建直接使用buildroot 中自带的/buildroot/package/i2c-tools编译

工具使用
  • i2cdetect : 罗列出 i2c的 Bus上所有的Device
  • i2cdump : 罗列出 Device上所有的 Register值
  • i2cset : 修改Bus上的某个 Device上的 Register值

罗列出设备上共有的i2c总线

# i2cdetect -l
i2c-1   i2c             Meson I2C adapter                       I2C adapter
i2c-0   i2c             Meson I2C adapter                       I2C adapter

查看i2c0上挂载的设备

# i2cdetect -r -y 0
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- UU -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --       

参数含义:

-y     Disable interactive(交互) mode 
-r     Use smbus read byte commands for probing

可以看到i2c0总线上上挂载了一个从机地址为0x4e设备,正好对应内核dts中

    tas575x_37: tas575x_37@37 {
                 compatible = "ti,tas575x"
                 reg = <0x4e>;  对应这里的设备地址
                 status = "okay";
                 mute_pin  = <&gpio_ao GPIOAO_3 0>;
                 mic_pin = <&gpio_ao GPIOAO_6 0>;
             };

继续看一下i2c1总线上挂载的设备:
# i2cdetect -r -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --   

可以看到i2c1总线上的设备地址为0x44,正好对应dts中isl29018光感的配置
    isl29018@44 {
        compatible = "isil,isl29035";
        reg = <0x44>;
        //interrupt-parent = <&gpio>;
        //interrupts = <TEGRA_GPIO(A, 20) IRQ_TYPE_LEVEL_LOW>;
    };

罗列出设备上寄存器的值

# i2cdump -f -y 0 0x4e
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: 00 00 00 00 01 11 00 00 00 00 00 01 7c 00 00 00    ....??.....?|...
10: 00 00 00 10 00 00 00 00 00 00 80 00 00 00 00 04    ...?......?....?
20: 00 00 00 01 00 00 f3 04 00 00 22 01 00 00 00 00    ...?..??.."?....
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 44 44 22    .............ll"
40: 02 04 14 05 00 00 00 00 55 00 00 00 00 00 00 00    ????....U.......
50: 00 00 00 00 00 00 00 00 81 11 00 36 00 40 00 00    ........??.6.@..
60: 01 10 00 00 00 01 0f 03 07 10 ff d3 33 00 02 02    ??...?????.?3.??
70: 81 81 03 00 04 00 85 21 00 00 00 00 00 00 00 00    ???.?.?!........
80: 00 00 00 00 01 11 00 00 00 00 00 01 7c 00 00 00    ....??.....?|...
90: 00 00 00 10 00 00 00 00 00 00 80 00 00 00 00 04    ...?......?....?
a0: 00 00 00 01 00 00 f3 04 00 00 22 01 00 00 00 00    ...?..??.."?....
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 6c 6c 22    .............ll"
c0: 02 04 14 05 00 00 00 00 55 00 00 00 00 00 00 00    ????....U.......
d0: 00 00 00 00 00 00 00 00 81 11 00 36 00 40 00 00    ........??.6.@..
e0: 01 10 00 00 00 01 0f 03 07 10 ff d3 33 00 02 02    ??...?????.?3.??
f0: 81 81 03 00 04 00 85 21 00 00 00 00 00 00 00 00    ???.?.?!........

参数含义
-f      Force access
-y      Disable interactive mode

使用i2cdump就可以罗列处所有寄存器的值,这里以0x3d 0x3e为例,可以看出0x3d和0x3e寄存器对应的值为0x44, 然后我们去驱动中看一下是否可以对应上: 

#define TAS575X_CH_B_DIG_VOL	61 -> 十六进制 0x3d
#define TAS575X_CH_A_DIG_VOL	62 -> 十六进制 0x3e

static int tas575x_probe(struct snd_soc_codec *codec)
{
	/* set stanby mode */
	snd_soc_write(codec, TAS575X_STANDBY, 0x10);
	/* reset */
	snd_soc_write(codec, TAS575X_RESET, 0x01);
	/* set for DAC path */
	snd_soc_write(codec, TAS575X_DATA_PATH, 0x22);
	//0x3d,0x3e对应的就是这里,可以发现驱动中就是写的0x44的值
	snd_soc_write(codec, TAS575X_CH_B_DIG_VOL, 0x44);
	snd_soc_write(codec, TAS575X_CH_A_DIG_VOL, 0x44);

	/* exit stanby mode */
	snd_soc_write(codec, TAS575X_STANDBY, 0x0);
	return 0;
}

修改寄存器的值

# i2cset -y <bus> <device> <register> <value>
devices : 代表设备的从机地址
# i2cset -y 0 0x4e 0x3d  0x6c
i2cset: can't set address to 0x4e: Device or resource busy
提示设备处于忙状态,这个时候需要添加-f参数,强制修改
# i2cset -y -f 0 0x4e 0x3d  0x6c
可以看到0x3d值的已经变为6c
# i2cdump -y -f 0 0x4e
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: 00 00 00 00 01 11 00 00 00 00 00 01 7c 00 00 00    ....??.....?|...
10: 00 00 00 10 00 00 00 00 00 00 80 00 00 00 00 04    ...?......?....?
20: 00 00 00 01 00 00 f3 04 00 00 22 01 00 00 00 00    ...?..??.."?....
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 6c 44 22    .............lD"

使用过程中有疑问的可以留言或关注我的公众号程序手艺人留言


  1. http://dannysun-unknown.blogspot.com/2018/03/i2c-tools-i2cdetect-i2cdumpi2cset.html ↩︎

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • [ Shell篇 ] - AWK征服数据处理

    实际过程中一些从软件导出来的配置文件格式格式比较混乱,一般需要整理成特定的格式,才好处理,场景如下:

    程序手艺人
  • [ 物联网篇 ] 20 - aplay Segmentation fault

    程序手艺人
  • git commit 删除中间提交的错误commit id

    经常会遇到提交多个commit ,最后发现版本有问题,需要删除中间的一个commit, git 中并没有提供现成的命令,需要多个命令组合完成该功能.

    程序手艺人
  • windows 为什么驱动模块加载后可以删除而应用模块不可以

    MmFlushImageSection,如果返回True,则可以删除,该函数在WRK中的说明是

    kkindof
  • AkShare-股票数据-科创板报告

    科创板(The Science and Technology Innovation Board; STAR Market) [1] ,是由国家主席习近平于20...

    AkShare
  • 高效的选择:将键盘上的大小写锁定键 CapsLock 与退出键 Esc 交换位置

    如果你习惯使用 Shift 切换大小写,那么在你左手小指处的 caps lock 大小写锁定键几乎没有用武之地。

    Piper蛋窝
  • 私人订制属于自己的Linux系统

    init通过调用/etc/inittab这个配置文件,然后再去执行/etc/rc.d/rc.sysinit的系统初始化脚本

    常见_youmen
  • AkShare-股票数据-注册制审核-创业板

    深交所10日消息,近日,深交所在做好常态化疫情防控基础上,举办注册制首期改制上市实务研讨培训班,来自25家拟上市企业的36位董事长、总经理、实际控制人等参加。深...

    AkShare
  • 基于web页面开发串口程序界面---代码实现

    后台web框架和串口操作采用的是Python语言,其中web框架使用的是tornado。

    MiaoGIS
  • mysql datetime查询异常

    异常:Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp (201...

    WindWant

扫码关注云+社区

领取腾讯云代金券