[Linux驱动炼成记] 11-快速修改芯片驱动中寄存器的值
实际项目的调试中,往往需要快速修改驱动芯片(只针对IIC通讯)中对应寄存器的值,传统的方式一般是编译驱动 -> 烧录固件 -> 测试,而这样的方式往往很繁琐。这里介绍使用i2c-tools快速修改驱动芯片的寄存器方式1
使用工具的前提:
- 驱动芯片是用IIC通讯的,一般的常用的芯片基本都是IIC控制(电源,音频,光感等等)
- 交叉编译好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"
使用过程中有疑问的可以留言或关注我的公众号程序手艺人留言
http://dannysun-unknown.blogspot.com/2018/03/i2c-tools-i2cdetect-i2cdumpi2cset.html ↩︎
[Linux驱动炼成记] 11-快速修改芯片驱动中寄存器的值相关推荐
- [Linux驱动炼成记] 10 -光感ISL29035调试/IIO子系统
简介 项目中需要加入光感检测功能,需求一到,就打算自己写驱动,意外的发现最新内核中已经支持该驱动ISL29035.配置好DTS应该初步可以使用.看代码过程中发现isl29035的实现主要是采用IIO子 ...
- [ Linux驱动炼成记 ] 15 - 存储器EMMC中Ext4文件系统 中 磁盘空间占用率100%
产品现象 : 设备(Linux 系统) 运行一段时间后,其中某一个分区 /et/config 突然占用率为100%,而实际空间可能1%都不到. 这种问题百思不得其解.谷歌/百度 所遇到的解决方案都是嵌 ...
- 【转】雄鹰计划-卓越工程师炼成记
原文网址:http://bbs.elecfans.com/jishu_400775_1_1.html 注意: 雄鹰计划所有信息都将有朱兆祺ForARM进行实时更新,注意不良人士的骗局.这个计划全程免费 ...
- 证券一哥炼成记——郭树清
证券一哥炼成记--郭树清 富凯摘要:改革力度超过所有前任的郭树清,在亿万股民中有着种种争议.不过只有读懂自"整体改革理论"以来的郭树清,才能读懂中国资本市场改革真实的行进路线. 从 ...
- PPT炼成记 高效能PPT达人的10堂必修课pdf
下载地址:网盘下载 内容简介 <PPT炼成记>一书主要讲解的内容包括:了解真正的PPT是怎样的,懂得PPT的基本理念和操作规则,文字设计和编排,如何利用图片来突出自己的PPT,巧用颜色才能 ...
- 前沿|PaddlePaddle开源项目DeepNav“无人船”炼成记(二)
前言:本篇继续讲述DeepNav自动驾驶船项目,本次讲解无人船的设计思路和硬件搭建过程.文章素材来源于百度美国研究院王益老师的知乎专栏,欢迎小伙伴们持续关注. 同时,对项目理论基础感兴趣的小伙伴,可以 ...
- 全球首颗量子卫星炼成记:“墨子号”打造保密通信新产业
"墨子号"炼成记 对于我们普通卫星而言,只要顺利升空就意味着至少成功了一半.麻麻不用太操心. 但对于我们量子卫星来说,发射升空后,卫星还要在太空中与地面机构光学实验站进行" ...
- golang修改结构体中的切片值
golang修改结构体中的切片值,直接传结构体地址就可以 package mainimport "fmt"type rspInfo struct {KeyWords string ...
- go在方法中修改结构体的值_golang修改结构体中的切片值方法
golang修改结构体中的切片值方法,结构,切片,站长站,文章,相关文章 golang修改结构体中的切片值方法 易采站长站,站长之家为您整理了golang修改结构体中的切片值方法的相关内容. gola ...
最新文章
- 2016 、12 、11本周
- PMP-【第8章 项目质量管理】-2021-2-12(180页-199页)
- python写一个app接收摄像头传输的视频_使用Python的Flask框架实现视频的流媒体传输...
- MATLAB图像处理与数字信号处理资料分享来袭
- vim 使用中的一些错误[omnifunc未设置错误]
- IE低版本(6-9)CSS hack
- java继承的作用_Java继承概述以及Java继承案例和继承的好处
- python逐行写入文件_python逐行读写txt文件的实例讲解
- (转)C# Enum,Int,String的互相转换 枚举转换
- 一对一直播app大热,使用源码或自主开发一对一APP需要了解哪些技术?
- 资产负债表 公式总结
- Linux镜像下载及虚拟机中安装
- 《软件质量保证与测试》学习笔记【第一章 软件测试基本概念】
- tp框架like模糊查询报错
- 成长小记-老天为我又设了一道大坎
- Flutter 电子签名
- LIN雨量传感器:吉利雨量感应器拆解 MLX75308开发与应用
- 撤销commit操作
- Linux学习(Kali为蓝本)
- arduino平衡车超声波_Arduino Nano DIY超声波测距平衡小车源码与资料分享