DA9063版本和寄存器映射

15个岗位/ 0个新岗位
最后发表
pinkpr
离线
最后看到:2年6个月前
加入:2017-11-14 08:34
DA9063版本和寄存器映射

你好,

我是一名嵌入式系统工程师,为我公司自行设计的电路板之一开发BSP,我们使用Dialog DA9063-3FHK1 PMIC。雷电竞下载app

在实现对PMIC调节器监视的Linux支持时,我发现不同的版本
DA9063 PMIC存在。它们没有相同的寄存器映射。

由于我不知道我的PMIC版本属于哪个寄存器映射,我在这里发帖以便知道
如何找出在DA9063-3FHK1版本中实现的确切寄存器映射。

最好的问候,

PinkPR

设备:
ED_Dialog
离线
最后看到:1个月1周前
工作人员
加入:2017-09-18 54所以

你好

检查寄存器值的最佳方法是使用DA9063 GUI,这将允许您检查每个寄存器及其功能。-3FHK1代码描述了包装,3F是变体编号(OTP), HK1是物理包装详细信息。

3F改型正在被82改型取代,但是这个改型还在发布的过程中。我建议将来使用82版本。

亲切的问候,

艾略特德克斯特

点击在这里为DA9063 GUI的链接。

pinkpr
离线
最后看到:2年6个月前
加入:2017-11-14 08:34
你好,艾略特,谢谢

你好,埃利奥特,谢谢你的回答。

据我所知,DA9063 GUI是为了与DA9063 Eval板一起使用。
我没有这个评估板,加上我在网上找不到DA9063的GUI。

实际上,我并没有试图找到OTP中的内容,只是想检查PMIC版本上的寄存器地址是否与Linux源文件中所写的内容兼容。
我特别想检查一下ADC部分。在Linux内核中没有为DA9063实现ADC特性,这就是我正在做的工作。

PinkPR

ED_Dialog
离线
最后看到:1个月1周前
工作人员
加入:2017-09-18 54所以

你好PinkPR,

DA9063 GUI

GUI本身可以在没有性能或评估板的情况下使用,这将允许用户检查和编辑OTP寄存器设置,但不允许用户使用PMIC检查OTP。

点击在这里查看DA9063支持页面。这个GUI被称为PowerCommander

芯片ID和变体

在DA9063驱动程序中有两个寄存器映射。AD表和BB表,BB表用于DA9063驱动。

芯片ID和可变寄存器值用于检测芯片类型。这些寄存器是:

#定义DA9063_REG_CHIP_ID 0x181

#定义DA9063_REG_CHIP_VARIANT 0x182

ADC的映射

https://support.dialog-semiconductor.com/pmic-audio/device/da9063?qt-pmic_device=1#qt-pmic_device

文档>飞思卡尔BSP >

有DA9063 Android集成。这些包含了DA9063的HWMON驱动程序集成到飞思卡尔/恩智浦Android版本的示例。

最新的版本,DA9063 i.m mx 6 Lollipop Android L5.1.1 2.1.0 BSP有一个ZIP文件,这是DA9063 i.m x6 Lollipop Android L5.1.1 2.1.0 BSP.zip,其中包含DA9063的hwmon示例。

亲切的问候,
艾略特德克斯特

pinkpr
离线
最后看到:2年6个月前
加入:2017-11-14 08:34
嗨,艾略特,

嗨,艾略特,

你知道为什么内部调节器监控没有在hwmon驱动程序中实现吗?这正是我想要的特性。
我将尝试在您提供的基本驱动程序之上添加此功能。

PinkPR

ED_Dialog
离线
最后看到:1个月1周前
工作人员
加入:2017-09-18 54所以

嗨Pierre-Olivier,

在过去,过/欠电压中断处理程序太特定了,不能包含在一般的Linux驱动程序中,内核维护人员也不支持添加它们。Android实现中的示例展示了如何在Dialog PEBIX参考平台上实现Android版本的监控,但相信任何实现都将包含特定于平台的组件。

亲切的问候,
艾略特德克斯特

pinkpr
离线
最后看到:2年6个月前
加入:2017-11-14 08:34
嗨,艾略特,

嗨,艾略特,

谢谢你的回答。我仍然找不到如何在内部调节器上执行ADC手动转换。

我真的遵循了《监测输出电压—>手动测量稳压器输出电压》第6.4部分(第13页)AN-PM-024 DA9063电压监控文档,但它似乎根本不起作用。
另外,我注意到这个文档内容和数据表内容之间的一些差异。

例如,文档告诉设置Mon_a8_idx = 0选择BUCKCORE1监控。但根据数据表,你应该设置Mon_a8_idx = 1

那么什么是真的,什么是假的呢?

PinkPR

pinkpr
离线
最后看到:2年6个月前
加入:2017-11-14 08:34
顺便说一下,什么是

顺便问一下,3F和82版本有什么不同?

ED_Dialog
离线
最后看到:1个月1周前
工作人员
加入:2017-09-18 54所以

嗨Pierre-Olivier,

数据表和应用说明:

DA9063数据表规定BUCKCORE1的寄存器值为1,而AN-PM-024主要规定BUCKCORE1的寄存器值为1。然而,在AN-PM-024的一个表中有一个拼写错误,表12,它表示0h,这也应该是一个1,以正确和与另一个表一致。谢谢你指出这一点,我们会更新文件。

变型3F和82:

变种3F和变种82非常相似;对某些稳压器电压、电流限制和启动槽有一些小的变化。对次要寄存器也有一些更改,但不会对其操作或目的产生重大更改。这些更改是由客户和客户需求推荐的。

ADC

你说你按照文件做了但根本没用,你是什么意思?

亲切的问候,
艾略特德克斯特

pinkpr
离线
最后看到:2年6个月前
加入:2017-11-14 08:34
我其实是想求一个

我实际上是想为每个稳压器获得一个adc测量的电压值。

1.我通过在ADC_MAN寄存器中写入值ADC_MUX来重置ADC(根据测量的调节器所属的组,8,9或10)。
2.我将与调节器相关的索引写在MON_REG_5或MON_REG_6中。
3.我在ADC_MAN寄存器中写入ADC_MAN位(1 << 4)。
4.我通过等待EVENT_A寄存器中的E_ADC_RDY位(1 << 3)来等待值准备好。
5.我得到ADC_RES_H和ADC_RES_L,并合并它们以重新构建转换结果。

问题是,对于属于A8或A10组的每个调节器,我得到一个充满高位(OxFF)的ADC_RES_H和ADC_RES_L。
在A9的情况下,根据调节器的不同,我得到了不同的值,但它们根本不符合逻辑。

例如,我有(在现实中)LDO1电压> LDO2电压。但我的ADC转换告诉我相反的情况。

这些不合逻辑的行为让我认为我的算法有一个大问题,它可能来自我的数据表/应用程序注释中的坏信息。
这就是为什么我来找你寻求帮助:-)

PinkPR

ED_Dialog
离线
最后看到:1个月1周前
工作人员
加入:2017-09-18 54所以

嗨Pierre-Olivier,

我按照申请说明上的说明做了,没有任何问题。雷竞技安卓下载我将列出我的步骤,从变体3F开始;我将以LD05设置为2.8 V为例:

  1. 将ADC_MUX设置为所需通道。对于LDO 5, ADC_MUX设置为0x1001。
  2. 将Mon_A9_IDX设置为所需的索引。对于LDO5,将MON_A9_IDX设置为索引6。
  3. 现在需要触发手动转换。对于手动转换为ADC_MAN = 1,当转换完成时,该寄存器将重置回0。
  4. 这个操作的结果现在应该在ADC_RES_H和ADC_RES_L中,我从这个操作中得到的结果是2.8 V

注册分类:

  1. 寄存器034h = 09,这将用0x1001设置ADC_MUX。
  2. 寄存器11Eh = 60,这将设置索引为6的MON_A9_IDX。
  3. 寄存器034h = 19,这将触发手动测量。
  4. ADC_RES_H寄存器将包含10位结果的前8位;寄存器38将读取8F,即10001111。
  5. ADC_RES_L寄存器将包含2个LSB(最低有效位),寄存器37将读0。
  6. 合并ADC_RES_H和ADC_RES_L,这将给出1000111100,转换为小数得到572,乘以4.883 mV。

我使用了带有标准I2C接口的GUI来读取和写入命令,我没有使用它的任何其他功能或更改任何其他寄存器值。我还用不同的调节器测试了所有三个ADC通道,没有任何问题。

亲切的问候,

艾略特德克斯特

ED_Dialog
离线
最后看到:1个月1周前
工作人员
加入:2017-09-18 54所以

你好Pierre-Olivier,

ADC_RES_H和ADC_RES_L寄存器充满高位(OxFF)的潜在原因是您试图测量的调节器未启用。我在关闭稳压器的情况下重新尝试了手动测量,得到了与您相同的结果,但是当我启用稳压器时,ADC测量了稳压器的正确输出电压。

亲切的问候,

艾略特德克斯特

pinkpr
离线
最后看到:2年6个月前
加入:2017-11-14 08:34
嗨,艾略特

嗨,艾略特

我终于找到了问题所在。
我用示波器探测了I2C线,发现我们对MON_REG_5和MON_REG_6没有做写操作。
我实际上是在用regmap_writeLinux内核的功能。这个函数验证要写入的寄存器是否实际存在。
我不知道为什么,但是DA9063 Linux驱动注册范围不包括MON_REG_5和MON_REG_6
我只是将寄存器范围扩展到MON_REG_6,一切正常。

一旦一切都清理干净,我可能会向Linux驱动程序提交一个补丁。

非常感谢你抽出时间来帮助我:-)

PinkPR

ED_Dialog
离线
最后看到:1个月1周前
工作人员
加入:2017-09-18 54所以
你好Pierre-Olivier,

你好Pierre-Olivier,

没问题,很乐意帮忙。

亲切的问候,

艾略特德克斯特

ED_Dialog
离线
最后看到:1个月1周前
工作人员
加入:2017-09-18 54所以
嗨Pierre-Oliver,

嗨Pierre-Oliver,

关于你的最后一个问题,我已经和Driver应用团队谈过了,回雷竞技安卓下载复如下:

自Linux mainline v3.16-rc1以来,DA9063 Linux设备驱动程序已经使用标准的Linux regmap框架来访问PMIC的寄存器。

Regmap是寄存器I/O的一种常用方法,通常由Linux内核中的设备驱动程序使用来执行这些标准访问操作。但是,regmap与其他操作系统I/O方法不同。部分差异是由于regmap使用寄存器访问权限表来创建芯片模型。

DA9063设备驱动程序定义了寄存器访问权限,根据设备驱动程序中预定义的表列出了对DA9063 PMIC寄存器的所有可能的I2C访问。这些桌子可以容纳寄存器->{可读,可写,易失}映射和在文件中静态定义司机/打码/ da9063-i2c.c.因此,Linux内核regmap核心I/O函数可以根据编码到这些表中的权限限制任何PMIC寄存器访问。

要小心。当在Linux设备驱动程序中添加将使用Linux核心regmap函数访问寄存器的新功能时:相关的regmap访问表应该相应更新。如果将新组件添加到现有的启用regmap的设备驱动程序中,在制定寄存器的访问权限条目时,应该仔细考虑要访问的每个新寄存器中的每个位。使用regmap的原因不仅仅是为了加强寄存器访问限制;性能改进、默认值以及挂起和恢复操作的简化也是regmap设计的一部分。”

亲切的问候,

艾略特德克斯特