实际项目的调试中,往往需要快速修改驱动芯片(只针对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 00  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 10  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 0x4e0  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 -> 十六进制 0x3estatic 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 0x4e0  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 ↩︎

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

  1. [Linux驱动炼成记] 10 -光感ISL29035调试/IIO子系统

    简介 项目中需要加入光感检测功能,需求一到,就打算自己写驱动,意外的发现最新内核中已经支持该驱动ISL29035.配置好DTS应该初步可以使用.看代码过程中发现isl29035的实现主要是采用IIO子 ...

  2. [ Linux驱动炼成记 ] 15 - 存储器EMMC中Ext4文件系统 中 磁盘空间占用率100%

    产品现象 : 设备(Linux 系统) 运行一段时间后,其中某一个分区 /et/config 突然占用率为100%,而实际空间可能1%都不到. 这种问题百思不得其解.谷歌/百度 所遇到的解决方案都是嵌 ...

  3. 【转】雄鹰计划-卓越工程师炼成记

    原文网址:http://bbs.elecfans.com/jishu_400775_1_1.html 注意: 雄鹰计划所有信息都将有朱兆祺ForARM进行实时更新,注意不良人士的骗局.这个计划全程免费 ...

  4. 证券一哥炼成记——郭树清

    证券一哥炼成记--郭树清 富凯摘要:改革力度超过所有前任的郭树清,在亿万股民中有着种种争议.不过只有读懂自"整体改革理论"以来的郭树清,才能读懂中国资本市场改革真实的行进路线. 从 ...

  5. PPT炼成记 高效能PPT达人的10堂必修课pdf

    下载地址:网盘下载 内容简介 <PPT炼成记>一书主要讲解的内容包括:了解真正的PPT是怎样的,懂得PPT的基本理念和操作规则,文字设计和编排,如何利用图片来突出自己的PPT,巧用颜色才能 ...

  6. 前沿|PaddlePaddle开源项目DeepNav“无人船”炼成记(二)

    前言:本篇继续讲述DeepNav自动驾驶船项目,本次讲解无人船的设计思路和硬件搭建过程.文章素材来源于百度美国研究院王益老师的知乎专栏,欢迎小伙伴们持续关注. 同时,对项目理论基础感兴趣的小伙伴,可以 ...

  7. 全球首颗量子卫星炼成记:“墨子号”打造保密通信新产业

    "墨子号"炼成记 对于我们普通卫星而言,只要顺利升空就意味着至少成功了一半.麻麻不用太操心. 但对于我们量子卫星来说,发射升空后,卫星还要在太空中与地面机构光学实验站进行" ...

  8. golang修改结构体中的切片值

    golang修改结构体中的切片值,直接传结构体地址就可以 package mainimport "fmt"type rspInfo struct {KeyWords string ...

  9. go在方法中修改结构体的值_golang修改结构体中的切片值方法

    golang修改结构体中的切片值方法,结构,切片,站长站,文章,相关文章 golang修改结构体中的切片值方法 易采站长站,站长之家为您整理了golang修改结构体中的切片值方法的相关内容. gola ...

最新文章

  1. 2016 、12 、11本周
  2. PMP-【第8章 项目质量管理】-2021-2-12(180页-199页)
  3. python写一个app接收摄像头传输的视频_使用Python的Flask框架实现视频的流媒体传输...
  4. MATLAB图像处理与数字信号处理资料分享来袭
  5. vim 使用中的一些错误[omnifunc未设置错误]
  6. IE低版本(6-9)CSS hack
  7. java继承的作用_Java继承概述以及Java继承案例和继承的好处
  8. python逐行写入文件_python逐行读写txt文件的实例讲解
  9. (转)C# Enum,Int,String的互相转换 枚举转换
  10. 一对一直播app大热,使用源码或自主开发一对一APP需要了解哪些技术?
  11. 资产负债表 公式总结
  12. Linux镜像下载及虚拟机中安装
  13. 《软件质量保证与测试》学习笔记【第一章 软件测试基本概念】
  14. tp框架like模糊查询报错
  15. 成长小记-老天为我又设了一道大坎
  16. Flutter 电子签名
  17. LIN雨量传感器:吉利雨量感应器拆解 MLX75308开发与应用
  18. 撤销commit操作
  19. Linux学习(Kali为蓝本)
  20. arduino平衡车超声波_Arduino Nano DIY超声波测距平衡小车源码与资料分享

热门文章

  1. 转大数据开发,适合什么岗位?
  2. 【Educoder作业】问题求解——while 循环
  3. 物联网卡设置_物联网卡这样设置一下上网全程4G!建议收藏!
  4. 2022中国人力资源管理年度观察
  5. Qt写入读取txt文本文件
  6. 《商业2.0》评最佳非美国Web2.0 中国3家入选
  7. Mixly 触摸开关的使用
  8. 如何使用串口调试工具测试HX530串口RFID读卡器读取IC卡卡号
  9. 清明节全网灰色主题实现原理
  10. 犹如“笼中困兽”的中国半导体,正在冒着敌人的炮火“匍匐前进”