This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TLV320AIC3104:使用 I2C 读取错误的寄存器

Guru**** 2459000 points
Other Parts Discussed in Thread: TLV320AIC3104, TCA9534

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/audio-group/audio/f/audio-forum/1292534/tlv320aic3104-wrong-reg-read-by-using-i2c

器件型号:TLV320AIC3104
主题中讨论的其他器件: TCA9534

尊敬的 TI 技术支持团队:

我在从 TLV320AIC3104中读取寄存器 vale 时遇到一个问题。

我们的产品出现问题、因此我尝试了对它进行调试、发现有时 CPU 读取的寄存器值错误。

CPU 正在使用 Linux (ubuntu)并使用"regmap (...)" 适用于 I2C 访问。

CPU 的 I2C 端口有两个器件。  

两个设备用于音频,一个是 FM8802 Forte 介质,另一个是 TLV320AirC3~。

操作首先写入具有突发模式的 FM8802

其次是访问 TLV320~。 FM8802 I2C 访问的最后一部分在许多情况下与 TLV320 I2C 重叠。

但是、到目前为止、我尚未发现由于 regmap 内部总线锁定而导致的 I2C 访问发生任何错误冲突。

下面的内容可能有误读。

您可以看到源零件和 osc-示波器屏幕。

寄存器 R88 (0x58)必须为0x04。 但是、第一次读取显示0x7F。  

我添加了第二次读取用于调试。 然后、第二次读取显示正常值。  

我无法找到问题发生的原因。

根据我的来源、在我将 R88 (0x58)替换  为 其他寄存器地址后、我再次生成了这个问题。

无论寄存器地址如何、结果都会显示相同的错误值(0x7F)、

您能解释一下问题发生的原因吗?

非常感谢

孙炳熙

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Byunghee:

    我对您提到的 I2C 访问"重叠"很好奇。 您能告诉我或告诉我这是什么意思吗? 这两个器件具有不同的地址是否正确?

    您还提到、这种情况只会在某些时候发生。 是否存在导致问题出现的模式、例如在 FM8802突发中进行特定写入而触发问题? 如果跳过 FM8802突发而仅写入 AIC3104突发、是否会发生该问题?

    谢谢。
    J·麦克弗森

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Jeff McPherson

    感谢您的回复。

    我将更多地检查问题、以便获得更多数据以及问题是什么。

    我将提供有关这方面的其他信息。

    错误读取的原因 与主机器件同一 I2C 端口上的另一个 i2c 器件有关。  

    重叠是  

    -我们写入 fm8802 bust 与712bytes。  

    -然后我们开始读取和写入 AIC3104 I2C 在 fm8802 bust 写入结束时。  

     在详细视图中、我可以看到 AIC3104使用不同 i2c 地址(fm8802、ktd2027)在2或3字节单元 i2c 之间进行访问。

    addr 为0x60(8位地址)。 但是,这是我的错。 它是另一个 I2C 器件、LED 驱动器 ktd2027。

    器件地址为0x30、即7位地址。

    我们仅使用 i2c 写入 LED 驱动器 ktd2027。 由于 LED 驱动器的原因、我们不会读取该器件。

    我知道即使我们没有读取 ktd2027、如果读取条件命中器件、器件将输出8位数据。

    下面我已选中了。

    - SCL/SDA 时钟/斜率是否被电阻器降级,电容使用 OSC -示波器,但我认为它是正常的电平。

    -我阻止了 ktd2027的 SCL/SDA 线不读取 ktd2027。 结果显示 regmap_read (..) 返回-6 ("无此类器件或地址") 并显示读取失败。 数据值显示我声明的变量的初始值。

    所以似乎 regmap_read (...) AIC3104将读取 ktd2027。

    AIC3104 7位地址为0x18,ktd2027 7位地址为0x30。 这是一位差异。  

    但是、我没有发现 任何硬接线问题或其他 软件问题。  

    有一点很重要、  

    ktd2027正在使用"i2c_smbus_write_byte_data (...)" 用于 I2C 访问的函数。

    AIC3104正在使用"regmap_read (...)。

    这些 i2c 驱动器差异是否存在任何问题?

    而"有时"我提到的是,我不能复制任何时间。

    大约是2%、我试着进行测试。 1031次、问题显示24次读取错误。

    在访问 AIC3104 i2c 之前、我尝试应用一些延迟(5ms)或再应用一个读取 I2C。 那么问题就消失了。

    当两次读取该值时、我可以看到具有相同概率的错误读取值。

    你能告诉我这件事吗?

    非常感谢

    孙炳熙

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Byunghee:

    感谢您的评分 我同意问题可能与器件的寻址有关。 LED 驱动器和编解码器不仅具有一位的不同、而且会相互移动(0x18 = 001 1000;0x30 = 011 0000;)。 这使我认为在某个地方存在一个错误触发 KTD2027的偏移。 KTD2027不是 TI 器件、因此很难缩小发生这种情况的原因、因为两个读取命令之间的示波器屏幕截图几乎是相同的。 我能想到的唯一一件事是您可能违反了 KTD2027的时序规格。

    否则、我建议使用

    1) 1)添加您看到有效的延迟(或读取两次并丢弃第一个返回值)、前提是该延迟符合您的系统要求。

    2) 2)删除了 I2C 地址之间的移位关系。 查看 KTD2027数据表、您可以购买 KTD2027B、它是相同的、只是它具有0x31的 I2C 地址。 这可能会通过引入看起来不像移位的位差而导致出现问题的任何行为。

    3) 3)如果有另一个 I2C 端口/总线可用、则可以通过使用不同的 SDA/SCL 线路将两个器件分开。

    4)不那么理想、因为它需要另一部分、但您可以使用具有主机 GPIO 驱动的使能功能的数字逻辑缓冲器、在写入完成时将 I2C 总线中断到 KTD2027、从而使编解码器无法正确读取、因为 LED 驱动器不会进行干扰。 此部件可实现此功能: https://www.ti.com/product/SN74AHC1G126-Q1

    此致、
    J·麦克弗森

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Jeff、您好!  

    感谢您的推荐。

    但是、我们目前对更改硬件有限制。

    当前的工作是、我为我们已在销售的产品的新设计更改软件。

    我们需要从该电压源更改几个器件。 TLV320aic3104就是这些器件之一。

    因此、新软件必须与现有客户正在使用的旧产品兼容。

    因此更改硬件并不容易。 我们的计划几乎是最后一步。

    顺便说一下、  

    我发现了有关 ktd2027 (led 驱动器)和 aic3104之间的 i2c 访问的新问题。

    您可以在下面看到两个尖叫声。

    问题与条件情形一致。

    当 ktd2027访问 I2C 时、没有停止 I2C。 SDA 线仍为低电平。

    此时、AIC3104开始访问 I2C 来读取 AIC3104的寄存器。

    但是,由于没有停止条件,ktd2027正在抓住 i2c。

    起初、我想知道 aic3104为什么无法识别从主机读取的 I2C。

    现在、从这个角度、我可以理解 aic3104无法识别 i2c 的原因。

    有什么想法吗?

    我已经联系了 kdt2027供应商。 但我无法获得有关这方面的有用信息。

    我在前面提到过、我认为它与处理两个器件的 i2c 驱动器差异有关。

    - ktd2027 : i2c_smbus_write_byte_data (..). --->在过去写

    - AIC3104 : regmap_read (.)

    我怀疑在两个驱动器之间建立总线锁定是否有区别。  

    您能对此提供建议吗?  

    非常感谢

    孙炳熙

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Byunghee:

    明白需要进行软件修复。 添加延迟或添加虚拟读取以获取 KTD2027以释放 I2C 总线的功能在这里仍然可以正常工作?

    我不是 i2c 驱动器专家。 您能否为我确认两个 I2C 函数(regmap_read 和 i2c_smbus_write_byte_data)都是在 AIC3104驱动程序(https://www.ti.com/tool/TLV320AIC31XX-DRIVERS)中定义的。 如果是、我可以在我们的软件专家中循环、以阐明两个函数之间是否存在冲突。 但是、我想您发现了停止条件没有发生在编解码器需要 I2C 线路之前的根本原因。

    此致、
    J·麦克弗森

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Jeff、您好!

    我有另一个症状这.

    首先、到目前为止、我需要在下面进行说明。

    1.ktd2027 led 驱动程序(0x30 dev addr)连接到与 tlv320aic3104相同的端口

    2. OSC 示波器显示问题与 ktd2027冲突。

    3.当我断开连接 ktd2027后,读取命令返回-6 (No device ~),而不是错误的读取(0x7F)。

    -->所以我认为 ktd2027和 aic3104之间存在 i2c 仲裁问题或冲突。

    今天、我在下面查看了更多并进行了测试

    a.我断开 ktd2027的 SCL/SDA 连接

    b.我删除了 Linux dts 文件中的 ktd2027并在 ktd2027_probe (..)中添加返回代码 以消除主机 CPU 的影响;

    c.我已经对同一个寄存器读取两次时的不同值进行了测试  

    结果表明、  

    无论 ktd2027如何、问题仍然存在。

    读取错误时,regmap_read()返回0 (正常)。 但值错误,0xf8@0x58。  它必须为0x04@0x58。

    我可以使用两个 似乎错误的脉冲。 在发出的 i2c 端口上、aic3104没有相同的 i2c 地址。

    您可以看到我附加的示波器。

    我还添加了示波器原始数据。  

    最后、添加了我的 ti 驱动器源。 是否有任何额外的配置?

    请告知我此问题。

    看起来它只涉及 TI 器件。

    我需要尽快解决此问题 。

    到目前为止、我们对该产品还没有遇到相同的问题。

    旧设备是 wm8978,使用 regmap_read()代替 aic3104。 旧版本没有问题。

    非常感谢  

    孙炳熙

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Jepp

    在代码中,"static int set_route_tlv320aic3x (struct aic3x_priv* aic3x,char* name,u8 value)"函数将解析来自用户层的寄存器集。

    然后首先执行"regmap_update_bits (aic3x->regmap、mixer->reg、mixer->mask、val);"。

    目前、我将其替换为"my_update_bits (...)" 调试。

    在大多数情况下、两次读取的两个值是相同的。  

    但是、大约2%、第一次读取错误。

    如前所述、我可以在没有 LED 驱动器(KTD2027)的情况下重现问题。

    AIC3104是否有任何读取模式?

    如果您需要解决问题的方案、请告诉我  

    非常感谢

    孙炳熙

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Jeff、您好!

    我有更新为您。

    在两个 ACK 后、寄存器 addr 不是0x58。 所以我认为两个包中的一个不是一个包。  

    可能是因为 sda 线太短了? 请告诉我这个.

    非常感谢

    BH

    上周五,有一个我错过了。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    除了  

    我们在当前发布的端口上使用以下器件。

    -。 tlv320aic3104 (ti)- 0x18地址

    - tusb4041 (ti )- 0x47

    - tca9534 (ti)- 0x27

    - fm8802 - 0xc0

    - ktd2027 - 0x30

    此致

    孙炳熙

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Byunghee:

    感谢您在我们在美国度假时耐心等待、我怀疑 I2C 控制器看到了两个 ACK。 任何原因导致过早脉冲可能会影响读取命令看到的器件地址、从而提供不良的值。 删除 KTD2027并不能完全解决该问题、因此您是否已尝试从有问题的 I2C 端口删除所有器件? 如果问题是 I2C 线路上的干扰或 AIC3104本身内部的干扰、这将有助于减轻问题。 如果它消失、您可以逐个添加设备、直至其重新出现。  

    2%的重现性非常棘手。 您是否注意到导致这种现象的原因? 例如在特定的时间窗口内读取 x 次?

    谢谢。
    J·麦克弗森  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Jeff、您好!

    感谢您的回复。

    我将在移除除 TIV320aic3104之外的其他器件后测试该问题。  

    完成后、我很快就会告诉您。

    顺便说一下、我将发送新的分析。 您可以从随附的中看到两个工作表(*。pdf)。

    第一页是我之前发送的文档。 带有两个插件的寄存器字节为0x18。 实际上、我要读取的寄存器 addr 是0x58。

    针对该问题、tlv320aic3104输出值0x18。 所有寄存器值都与值为0x18 reg 匹配。

    在本例中、我在检测 Ktd2027 LED 驱动器为空载的情况下进行了测试。 (或断开了 ktd2027的 SCL/sda)。

    似乎,tlv320aic3104输出错误。 或者器件出于某种原因识别出错误的寄存器地址。

    你可以看到案例#1页(第二页). 工作表显示了详细信息。

    最后、我们的产品是基于 Android 的 IPPhone。 (使用 Linux)。

    当我在扬声器电话上摘机时出现问题。 这意味着我只需通过切换、开/关方式按下扬声器按钮即可)

    然后电话在摘机(扬声器电话模式)和挂机(空闲)之间运行。

    此时、tlv320aic3104提供耳机音频路径、听筒路径和扬声器模式路径。

    每条路径都设置了 tlv320aic3104寄存器和 IDLE 状态。  

    我连接了两组(空闲模式、扬声器电话模式)。 其他寄存器组的值不同,但结构相同。

    tlv320aic3104驱动程序不知道哪个是扬声器电话模式。 驱动程序只是寄存器组的一部分。 以及写入寄存器值。

    到目前为止、该问题仅在从空闲状态转至扬声器手机模式时发生。 实际上、从 lv320aic3104驱动器的角度来看、

     扬声器寄存器组与 其他寄存器组没有区别。

    到目前为止、第1个寄存器0x58只有问题。 所以我在更改了寄存器设置顺序后进行了测试。

    结果显示只有第1个寄存器有问题。 它不取决于0x58寄存器。

    我将更新我的测试。

    非常感谢  

    孙炳熙

    似乎与前面的 i2c 访问有关。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Byunghee:

    我想您已经验证过、出于某种原因、SDA 线在地址字节的第二位被拉低。 这会将0x58变为0x18、实际上有1位不同(0x58 - 0x18 = 0x40 = 0100 0000)。 这是您从0x18中看到正确值的原因:读取正常工作、因为有事物干扰地址字节、导致编解码器看到不想要的地址。 我仍不确定发生这种情况的原因、这就是为什么我想知道移除其他 I2C 器件是否带来了任何改变。 在 I2C 协议的这一点上、主机处理器是总线的控制权、因此我不相信这是编解码器内部的问题。

    我不确定自己是否理解了扬声器模式的问题。 我们拥有不同的编解码器驱动程序专家。 在我们处理 I2C 问题时、您最大的兴趣是提出另一个 TT、以便专家评估您的驱动程序相关问题。

    此致、
    J·麦克弗森

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Jeff、您好!

    感谢您的回复、  

    TI 能否支持有关编解码器驱动程序的某些内容? 因为您对编解码器驱动程序具有不同的导出功能?

    我将在删除其他文件后检查该问题。 之后、我很快就会更新。

    顺便说一下、我不小心点击了"这解决了我的问题"。 你能恢复它吗?

    我上传了许多附加文件。 出于安全性考虑、至少我想删除附加的文件。  

    但我不能这样做。 如何删除附加的文件。 我想您已经查看了这些建议。  

    现在它们不可用。  

    非常感谢  

    BH

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    此外、在使用 tlv320~之前、我们使用了不同的编解码器。  

    通过使用 regmap_read()/regmao_write()驱动程序,该编解码器还具有 i2c 接口。

    但是、没有问题。 该端口上的 I2C 接口之间没有差异。

    我们只使用 tlv320~而不是其他编解码器。

    BH

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Jeff、您好!

    您能将这张票转发或分享给我们的 i2c Linux 驱动程序专家吗?

     关于删除除 tlv320aic3104之外的其他器件、

    到目前为止、根据我的测试、FM8802是该问题的主要原因。

    如果我连接 FM8802、无论其他器件连接(scl/sda)如何、都会发生问题。

    相反、我断开 fm8802 (scl/sda)连接、无论其他器件如何、都不会重现问题。

    此时、 fm8802存在两个问题。

      1. I2C 访问本身

      2.计时室 i2c 突发写入(712字节)。 无延迟、针对 tlv320~ i2c 访问。  

    我无法确定两个问题的主要问题是什么。

    从此时起、ktd2027间接影响到 tlv320~ i2c。

    我发现了一个新的令人惊讶的情况。

    如前所述、当从空闲状态的音频路径切换到扬声器模式路径时、会发生问题。

    此时、扬声器模式寄存器组的第一个寄存器(0x58)存在问题。

    在发生该问题的开头、 我 在将 扬声器模式寄存器组的第一个 reg (0x58)更改为其他寄存器 addr 后测试了该问题。

    但问题是一样的。  

    先前测试数据中的0x18寄存器从0x58改变。  我想0x18 reg 地址与 tlv320~的设备地址(0x18)相同  

    然后、另一种情况是我们的 led 驱动器(ktd2017)尝试向相同的 i2c 端口写入一些数据。

    从这个原理中我们可以看出、

    (1)我更改了扬声器模式设置的调节阶。 因此、第一个寄存器是0x11、而不是0x58。

    (2)我删除 i2c 写入的 led 驱动器(ktd2027)。

    在此测试中、我找到了两个振幅。

    1)该问题未被复制。 我测试了超过1000次。 我看不到 这个问题。

       -->当0x58是第一注册,似乎驱动程序与 tlv320aic~ 0x18设备 addr 冲突。 是不是?

    2)。 即使更改了寄存器集顺序、再次添加 ktd2027 i2c 写入、也会出现问题。

        --> regmap_read()与 ktd2027访问冲突,值为0x7F,而不是值0x11。  

    有什么想法吗?

    非常感谢

    BH

    ---------------- 扬声器模式寄存器设置-------------------------------------------------------

    const 结构 config_control tlv320aic3x_speaker_voip_controls[]={
    {
       .ctl_name ="左侧音频 HF 开关"、//0x58
       .int_val ={on}、
    }、
    {
        .ctl_name ="AuxL 左侧 ADC 开关音量"、// 0x11
        .int_val ={0xF}、
    }、
    {.}

    ...

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Byunghee:

    我已删除您之前的附件、并将该请求单重新分配给我们的驾驶员专家进行跟进。  

    谢谢!
    J·麦克弗森

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    请告诉我您为 tlv320~和 TLV320AIC3104使用了哪个驱动程序代码?

    对于其他 i2c 设备驱动程序、它们使用哪种 i2c 接口? 还是 regmap_read/regmap_write?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的丁圣浩

    我~的 tlv320 μ m 是全部 tlv320aic3104 ,这是我们在 OUT 产品上组装的设备之一。

    我正在为 tlv320aic3104使用 regmap_read()和 regmap_write()。

    但正如我在此票证上提到的、主机 CPU 的一个 i2c 端口上有5个 i2c 器件。

    请查看第一个问题中的该 TT。  

    我附上了我的文档,包括 Linux 开源的 tlv320aic3104驱动程序代码。 我为我们的目的修改了该驱动器。

    不过、大多数器件都与原始驱动程序代码相同。 如果 Jeff 直到现在才删除、您可以从他那里获取它们。

    到目前为止、我可以安排如下内容。

    1.如果我删除 fm8802 burst write (712字节),没有问题。

    2.在 fm8802突发写入活动状态下,tlv320aic3104似乎与 i2c 上的 ktd2027 (0x30 device addr)冲突。

       2-1) 激活 ktd2027时,tlv320aic3104通过 remap_read()产生 i2c 读取错误。

           我 再次附上了我的测试数据-"i2c_conflict_w_ktd2027.zip"e2e.ti.com/.../i2c_5F00_conflict_5F00_w_5F00_ktd2027.zip

       2-2)在阻止 ktd2027后、从 tlv320aic3104读取0x58 reg、出于某种原因、读取的值是从0x18 reg 中读取的值。

          在这一点上、0x58与0x18 tlv320aic3104器件地址存在一位差异。 (仅100~200次试验)。

          因此、在将寄存器地址而不是0x58更改为0x11后、读取值是正常的。 (1000次测试无错误)

          --> 相关测试数据为 i2c_conflict_tlv320aic3104_itself.zip

    最后,我认为从 regmap_~() API 到主机 CPU i2c 块有一个问题。

    您能告知我这个问题吗?

    如果您需要检查或其他人、请告诉我

    非常感谢

    BH

    e2e.ti.com/.../i2c_5F00_conflict_5F00_w_5F00_ktd2027.zipe2e.ti.com/.../i2c_5F00_conflict_5F00_tlv320aic3104_5F00_itself.zip

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我有以下问题向您提出:

    1) 1)平台中每次突发写入的最大字节数?

    2) tlv320aic3104驱动程序使用  snd_soc_component_write/snd_soc_component_write/snd_soc_component_upd_bit、是否将其替换为 regmap_xxx?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,圣浩

    1.我提到的突发写入是为了在 tlv320aic3104之前访问 FM8802。 将传输712个字节。

      在使用 tlv320aic3104的情况下,我们读取/写入 tlv320aic3104 i2c 一个字节。 因此,它是 用于写入的3字节 i2c 访问(设备 addr + reg addr + data )。

         读取 i2c 存取为4字节(设备 addr + reg addr、设备 addr +读取数据 )

    2.我们的产品不需要使用 snd_soc_component~. 所以我们只使用 regmap_read ()/ regmap_write ()。

        对于 tlv320aic3104,regmap_read()和 regmap_write()是否存在任何问题?

    我认为它们使用相同的内核 i2c 驱动器。

    非常感谢

    BH

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!  

       2-2)在阻止 ktd2027后、从 tlv320aic3104读取0x58 reg、出于某种原因、读取的值是从0x18 reg 中读取的值。

          在这一点上、0x58与0x18 tlv320aic3104器件地址存在一位差异。 (仅100~200次试验)。

          因此、在将寄存器地址而不是0x58更改为0x11后、读取值是正常的。 (1000次测试无错误)

          --> 相关测试数据为 i2c_conflict_tlv320aic3104_itself.zip

    [/报价]

    我想知道0x58 reg 是否是7位 i2c 地址。

    请使用 i2cdetect 检查可以检测多少 i2c 器件?

    另外、您是否有 i2c 分析器来捕获所有 i2c 通信?

    这似乎是一个硬件冲突问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    i2c 端口上没有具有0x58设备地址的 i2c 设备。

    看似、具有1位差异的0x30是 ktd2027、该问题似乎与 ktd2027发生地址冲突。

    我已经将此票证上的 i2c 器件介绍如下。 5个器件

    -。 tlv320aic3104 (ti)- 0x18地址

    - tusb4041 (ti )- 0x47

    - tca9534 (ti)- 0x27

    - FM8802 - 0xc0、读取命令0x60

    - ktd2027 - 0x30

    我想您没有查看这个 TT。 Jeff 已经提到了 tlv320aic3104设备正常工作。  

    我还认为该问题与 i2c 驱动器有关。  

    我已经检查了 i2c SCL/sda HW 脉冲、显示正常电平。

    我们没有 i2c 分析器。  

    非常感谢

    BH

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    所以、您的意思是 i2cset -f -y 1 0x18 xxx xxxx、将同时设置 ktd2027和 aic3104的寄存器、AM Iright?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的快速回复

    正如我前面提到的,当 ktd2027访问 i2c 时, tlv320aic3104也同时访问 i2c。

    起初、我基本无法理解这一点、因为它们使用相同的 i2c 端口。 因此我认为 i2c 有捕捉 i2c 的锁定系统。

    2次、您可以在下面看到我已经上传了这个 TT。

    当 ktd2027未释放 i2c 时、tlv320aic3104开始访问 i2c (读取)。  

    tlv320aic3104读出错误值(0x7f)。 这是另一个问题

    第3期、

    因此我暂时阻止了 ktd2027。 在这种情况下、tlv320aic3104读取0x18 reg address 而不是0x58寄存器的值。

    这是一个小差别。 看似0x58的寄存器地址与0x18器件地址有一位差异。

    当然、此测试表明0x18是寄存器地址。  

    第四步、我将寄存器地址0x58更改为0x11 (与0x18器件地址有许多不同)

    然后结果显示正常值 ( 0x11 reg 的值)

    当我检查第3个问题结果时、tlv320aic~器件地址(0x18)存在一位差异问题。  

    非常感谢

    BH

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    除了第二个问题,当时,如果我删除了 ktd2027在板上, regmap_read()为 tlv320aic~ reg read(0x59)返回-6 (无设备).

    但并非总是如此。 约为2%。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您能否确认硬件正常、例如电源? 发生此问题时、您可以 i2cdump tlv320aic 吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    到目前为止,我无法找到任何硬件问题。 您可以在 osc~示波器上看到 SCL/sda 脉冲。 此脉冲的斜率为正常电平。

    您提到的电源意味着什么? 电压电平还是电路图?

    正如我之前提到的、发生问题的几率约为2%。 当它发生时,我如何点击,执行"i2cdump"外壳屏幕上?

    非常感谢

    BH

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    到现在为止,我写的代码与读两次相同的寄存器 tlv320aic。 然后,当读取的两个值 是不同的,我控制 GPIO .

    以便我可以使用示波器触发函数查看 SCL/sda。 但我认为、当该问题发生时、执行"i2cdump"会很困难。

    您能告诉我这方面的信息吗?

    非常感谢

    BH

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在 tlv320aic 驱动程序代码中,添加

    static bool aic31xx_volatile (struct device *dev,unsigned int reg){ return true;} 

    remove aic31xx_writeable callback.
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的快速回复

    很抱歉、您的指南无法理解。

    您能解释一下代码的工作原理吗? 该代码如何生成 i2cdump?

    BH

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    将所有寄存器设置为易失性、以便系统使 regmap 缓存和寄存器以相同的速度位于内部、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的快速回复。

    我已禁用 tlv320aic 的所有缓存~。 因为实时硬件更新很有必要。

    我可以看到三个与缓存相关的部分。

    1. static bool aic3x_volatile_reg (struct device *dev, unsigned int reg )--> default false return。

    2. 静态常量结构 regmap_config aic3x_regmap ={

        ...

        .cache_type = REGCACHE_none、}

    3. static int aic3x_i2c_probe (struct i2c_client *i2c, const struct i2c_device_id *id){

       ...

       regcache_cache_only (aic3x->regmap,错误);}

     

    这3个部分是否配置为 true、 REGCACHE_RBTREE、true?

    实际上,我检查了所有必须是假的, REGCACHE_NONE。 以便 tlv320~可以进行实际读取/写入。

    非常感谢

    BH

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    很高兴听到您修复了您的问题。 享受 Linux 开发带来的乐趣。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    此问题未得到解决。 请保持此 TT 处于未结状态

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    正如我之前所说的、它以大约2%的精度发生。

    因此、我可以通过在以下情况下触发 GPIO 来测试该问题

      ret0 = regmap_read (map、reg、&orig0);
      RET = regmap_read (map、reg、&orig);

    我读取了寄存器值两次。 如果正常工作、两个读取值必须相同。

    但是、我可以看到2%的读取值错误。

    即使我在发生 i2cdump 时检查它、转储数据也会在第二次读取时更新。

    或者、就像用户空间中的系统调用一样、当发生这种情况时、我必须在内核驱动程序中执行"i2cdump -f -y 1 0x18"。

    是否有任何简单的方法来检查 i2cdump?

    非常感谢

    BH

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    当您首次读取或写入寄存器时、返回值是否异常?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

     这方面有两个问题。

    第一个是与 ktd2027 led 驱动器(0x30 id)冲突。 如前所述、当 主机 CPU 写入 ktd2027时、tlv320~的 reg (0x058)的读取访问 会像下面的屏幕帽那样插入。

    此时、如果我删除 ktd2027 (物理断开 ktd2027的 SCL/sda)、则 tlv320~寄存器(0x58)的读取访问返回-6 (无设备~)。

    显然、主机 CPU 继续访问 ktd2027。  

    第22个问题、如果我卸载 ktd2027 (通过在 dtsi 文件中删除 ktd2027)、主机 CPU 读取错误的0x18寄存器而不是0x58寄存器、我打算首先从 tlv320~读取。

    显然、主机 CPU 不访问 ktd2027。 当主机 CPU 正常返回0 (零)时。

    Jeff 和我认为这与主机 i2c 驱动程序问题有关。 这就是 Jeff 为您分配这个职位的原因。

    您知道我的问题了吗?

    您是否审核过此 TT 的问题?

    BH

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    对于第一个问题、您可以尝试删除与 ktd2027相关的代码。 当您描述 主机 CPU 继续访问 ktd2027时、该映像中似乎仍有 ktd2027代码。

    因为这是硬件冲突、我不知道软件人员可以为您做些什么。

    对于第二个问题、是否将 regcache 设置为 none?   您有多少个 tlv320~? 可以尝试使用其他 tlv320~?

    Br

    丁圣豪

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在第一个问题中、是的、正确。 即使移除 ktd2027的 SCL/SDA 接口、SW 映像也正在访问。 但还是失败了。

    但是、我不能认为是硬件冲突。 事情是、主机 CPU 在 ktd2027抓住 i2c 线时开始读取0x58 tlv320aic3104寄存器。

    如果是正常情况、由于 ktd2027和 tlv320aic3104具有不同的器件地址、主机 CPU 不应读取 tlv320aic3104的寄存器。  

    I2C 驱动程序需要仲裁 i2c 总线占用。 硬件只能影响 SCL/sda 脉冲的斜率或最小时序裕度。 它们是正常的。

    SPI、I2C、UART 等大多数串行接口均由软件实现。

    第二,我略去了全文。 tlv320aic3104字太长而无法键入。 在当前 i2c 端口上、有一个 tlv320aic3104。  

    关于"regcache"的信息

    我的设置是".cache_type = REGCACHE_NONE,"。 我已经测试了".cache_type = REGCACHE_RBTREE "、您的意思是。

    据我所知、高速缓存设置与读取寄存器有关。 发生问题的概率会降低。  

     另一个高速缓存设置为"regcache_cache_only (aic3x->regmap、false);"  

    我知道这与编写寄存器有关。 因此这不是当前的问题。  

    BH

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    ~主机 CPU 在同一 i2c 端口上访问 ktd2027时、主机 CPU 为什么开始读取 tlv320 μ s 的0x58寄存器。

    此外、如果我读取 tlv320~的0x11寄存器而不是0x58、则问题消失。 我认为0x58与 tlv320的0x18器件地址存在1位差异。

    我认为这是驱动器问题。 那么、Jeff 为您分配了驾驶员专家。

    BH

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、

    这属于系统问题。 因为您在我们的驱动器中没有找到任何线索。 我不知道这一点。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    什么是"我们的驱动程序"? 在主机 CPU 抓住相同的 i2c 时、tlv320aic~ i2c 驱动程序是否可以访问 i2c?

    BH  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    让我来请求我们的编解码器专家提供支持、或许他可以提供不同的方式来帮助您。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的支持。

    我会等他的。

    BH

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、BH:

    我简单地和盛豪谈过、我们同意这个问题源于您的 CPU 集成、特别是因为当您的 CPU 被认为从代码中删除时、仍在尝试访问 KTD2027。 您可能还需要咨询 KTD2027的供应商、因为我们认为该器件一直使 SDA 保持低电平。 我们将看不到这个问题专门来自 TI 器件。

    如果您仍有关于 TLV320AIC3104 I2C 驱动器的具体问题、请加以说明。 我认为他们可能已经失去了,因为对话采取了几个不同的回合。

    谢谢。
    J·麦克弗森

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Jeff、您好!

    感谢您的回复

    您提到的问题如下  

    在本问题中、可能存在 KTD2027问题。 但是、在另一侧、在访问 ktd2027时插入了 tlv320aic3104驱动程序中的 regmap_read (0x58)。

    顺便说一下、以下问题是 tlv320aic3104本身。

    如前所述、scl/sda 已断开连接并且不加载 ktd2027驱动程序(删除 dtsi 文件)、并且阻止初始化 ktd2027。 -->已仔细检查

    如果我在 tlv320aic3104中读取0x58寄存器,结果为0x18寄存器的值。 在向0x18寄存器写入几个值后、我再次检查了这个问题。

    0x58 reg 与0x18 (tlv320aic3104器件地址)有一位差异。 因此、我在更改其他寄存器而不是0x58后对其进行了测试。

    寄存器不是像0x11那样有一个位差。 那么问题就消失了。

    总之、我认为 tlv320aic3104驱动程序存在问题。

    非常感谢

    BH

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    请分享 tlv320aic3104的 DTS 设置。

    tlv320aic3x-i2c.c 中的"static int aic3x_i2c_probe (struct i2c_client *i2c)"中  、请 pls print i2c->addr、我想知道值是0x58还是0x18。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,圣浩

    首先、我要附加下面 tlv320aic3104的 dtsi 设置。  

    我在 进行修改后使用 tlv320aic3x.c。 明天我会让你知道 i2c->addr 的值。 今天我在家工作。

    非常感谢

    BH

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    有更新吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我很抱歉迟到了。

    昨天我是因为我的私人问题的休息日。

    今天、我将尽快更新

    BH