【问题标题】:Getting ARM/WM8350 audio and power management working in linux让 ARM/WM8350 音频和电源管理在 linux 中工作
【发布时间】:2014-08-19 07:46:18
【问题描述】:

我有一个 root 的 Sony prs900,运行 linux 2.6.23 #2 PREEMPT 内核,用于 ARMv6。 (Montavista linux 内核)。我在弄清楚电源管理如何工作时遇到问题,无论是运行系统还是打开和关闭音频端口。 我既不知道如何读取电池/电源线状态信息,也不知道如何让音频芯片播放声音等......虽然我已经研究了一段时间的内核模块......

对于第一个能够向我解释如何做到作品。 例如:读取电池状态,并更改一些电源模式,例如让音频放大器开机/关机,以便播放到/dev/dsp(oss 仿真)的音频实际上以声音的形式出现,而不仅仅是被芯片消耗并被忽略。 ..

实际的索尼内核和交叉编译工具的二进制包位于main pageActual kernel sourcecode 也可以。


到目前为止我自己学到了什么:

索尼使用 wolfson micro WM8350 音频驱动器和电池充电器/电源管理芯片为系统提供所有电源;例如:它可以关闭/打开 SD 存储卡,向 cpu 发送更多功率,打开音频放大器等。参见:WM8350 Datasheet

差不多,整个问题都围绕着让 WM8350 内核驱动程序工作...... 尽管该公司吹嘘它在 linux 下的支持,但除了数据表之外,他们没有任何我能找到的实际有用的应用说明或示例。我怀疑我拥有的内核驱动程序是测试版代码,因为它们似乎表现不佳(内核日志中关于 wm8350 寄存器不可读的几条错误消息在每次启动时都会发生,即使仅运行索尼的本机软件也是如此...... )。

最感兴趣的内核驱动程序源代码在:linux-2.6.23_091126/drivers/mxc/pmic/{core,wm8350} 请注意,wm8350 是 MC14783 的竞争对手,但 linux 内核驱动程序对两个芯片使用相同的 {core} 驱动程序源代码;索尼只有 wm8350,没有 MC14783。

我最想了解如何操作的代码在子目录{wm8350}中,例如:wm8350/wm8350pm/power_supply_sysfs.c。

我也希望音频启动,但我不太确定相关的音频放大器代码在哪里...

很明显,wm8350pm 代码是为了导出 /sys 目录接口而设计的;现在 /sys 已安装并在系统上运行;但我对这些新型接口的语义不是很熟悉……它们与 Linux 笔记本电脑的旧 APM 电源接口不太一样……

首先我检查了明显的: 如果我执行“cat /sys/power/state”,它会返回单词“mem”,仅此而已。 该文件具有-rw-r--r-- 权限,因此可能会被写入——但我不知道用什么。 wm8350pm 驱动程序的源代码中不存在字符串“mem”,所以我什至不知道 /sys/power/state 是否是源代码的一部分。

执行 find /sys -iname "wm8350" 会显示一些具有以下模式的目录: wm8350-rtc , wm8350-pmic , wm8350-bl , wm8350-power , wm8350-led wm8350-hifi-dai , wm8350-codec wm8350-imx32ads.0

所以,我在每个目录上执行 ls-l,并查找实际文件而不是符号链接或子目录,我发现的是库存无用的可写文件:bind、unbind、uevent,

还有一些只读文件:pmic_reg、dapm_widget、modalias、codec_reg,它们不是很有帮助。

这并不奇怪:

做:cat /sys/devices/platform/wm8350-ebx5016-audi/modalias 给出“wm8350-ebx5016-audio”

正在做:cat /sys/devices/platform/wm8350-imx32ads.0/modalias 给出“wm8350-imx32ads”

并且由于音频已关闭...正在执行: cat /sys/devices/platform/wm8350-ebx5016-audi/dapm_widget 显示音频状态:

Headphone Jack: Off
Line In Jack: On
Mic Bias: Off
Left DAC: Off
Right DAC: Off
... (all else off and omitted except )...
EBX5016-hifi: PM State: D3hot

最后两个文件,我希望应该做 wm8350 芯片寄存器转储......并且一个做了。 这样做: cat /sys/devices/wm8350-pmic/pmic-reg 会导致长时间的停顿,然后什么都不会打印。 但: 这样做: cat /sys/devices/wm8350/platform/wm8350-ebx5016-audi/wm8350-codec/codec_reg 确实打印了一个最多 e8 的寄存器列表,该列表仅比数据表所说的芯片应该大几个字节(0x00 到0xe6)。

我尝试使用 python 程序播放 wav 文件(在我的台式计算机上工作),我注意到 /dev/dsp 确实打开了,混音器 DO 设置了音量,但什么也没有出去。所以——音频驱动程序无法自动启用声音放大器。

/dev 中没有 alsa 声音文件,嵌入式机器上也没有任何 alsa 工具...所以我假设 Sony 严格使用 OSS /dev/dsp 和 /dev/mixer。

我只能找到 ws8350 的另一个接入点: IS 有一个设备驱动程序 /dev/wm8350。

由子目录 wm8350/wm8350_reg.c 中的源代码创建的驱动程序;从理论上讲,它应该能够使用来自用户空间的 ioctls() 调用读取和写入所有寄存器。但是,它似乎有些严重错误,因为我编写了一个测试程序来读取 wm8350 寄存器......并且大多数寄存器返回错误消息而不是允许读取,包括最常用的 ID 寄存器(0x00、0x01)等.

所以,我很困惑。指针、想法、提示是非常需要的。

【问题讨论】:

  • 要获得声音,请使用 alsamixer 打开 Left DACRight DAC。您必须取消静音 PCM 音频等。应该有一个route 文件iirc。从源路由到接收器(扬声器)的所有元素都必须打开才能获得声音。
  • 虽然该公司吹嘘它在 linux 下的支持... 在我看来,在支持 Linux 和编写清晰的文档方面,很少有公司比 Wolfson 更好.现在,Sony 和他们的 Linux 版本就完全不同了。
  • 另外,索尼似乎违反了 GPL?他们需要提供用于为您的 PRS900 生成 Linux 内核的 .config 文件。即,构建项目的一切。我在 Linux tarball 中看不到 .config。你知道它的位置吗?

标签: linux arm linux-device-driver alsa batterylevel


【解决方案1】:

我想稍微改变一下你的问题。

Linux ASOC(alsa system on chip)电源管理是如何工作的?

我会回答这个问题,然后给出一些使用这个特定芯片的提示。


.. 如果我执行cat /sys/power/state,它会返回单词“mem”,仅此而已。该文件具有权限-rw-r--r--,因此可能可以写入-但我不知道用什么。 wm8350pm 驱动程序的源代码中不存在字符串“mem”,所以我什至不知道 /sys/power/state 是否是源代码的一部分。

您需要了解Linux driver model。 Linux 中的硬件结构类似于树。合理的是,事物必须以特定的顺序通电/断电。例如,您不应该在关闭 PCI 外围设备之前关闭 PCI 总线控制器。 Linux 构建了一个硬件树,每个驱动程序(代码)和设备(数据/实际硬件)都有 specific call backs/function pointers 处理一些特定的任务。

  1. probe - 你在吗?确定实际的硬件/设备是否存在。
  2. remove - 关闭设备。模块拆卸、断电等
  3. suspend - 去睡觉了。
  4. resume - 醒了。

三和四对你来说可能看起来很有趣。现在,阅读/sys/power/state is about 的内容。文本mem,表示您的系统支持suspend to memory。在这种模式下,Linux 会执行这些步骤,

  1. 找到第一个最低级别的活动总线。
  2. suspend 该总线上的设备。
  3. suspend 总线并停用。
  4. 如果总线处于活动状态,请转到步骤 1
  5. 将 CPU 设置为低功耗状态 (suspend to RAM)

这还不是全部。一些设备可能支持唤醒。他们将有额外的回调来将系统从睡眠模式中唤醒。阅读文档以了解这一点。


这是一般的电源管理驱动程序/设备结构。现在,ASOC(alsa system on chip)是如何构成的?

通常有三个驱动程序/设备拼接在一起。

  1. 编解码器 - 你的情况是 wm8350。这包括音频放大器驱动电路,并且可以包括混音和源控制。支持数字到模拟模拟到数字,通常通过i2s interfacei2s 不是唯一的接口。通常一个寄存器组是通过一个辅助接口来控制的; i2cwm8350 的情况下。
  2. DAI - 参考chapter 1.2.18.1 of the iMx31 reference manual;该硬件被飞思卡尔称为SSIAUDMUX 的下一章也有助于了解 iMx31/32 上的音频支持。
  3. Machine file - 这是特定于电路板的路由。它将 DAI 连接到 codec 并且是两者的 parent。它提供电路板时钟信息和其他特定配置。例如,它可以使用 AUDMUX 将物理管脚路由到 SSI 模块。
  4. 一个来自编解码器驱动程序的 i2c(或 SPI)接口,用于向编码芯片发送控制命令。某些芯片可能使用古怪 i2s 接口或其他东西进行控制(但在您的情况下不是)。

现在如果您理解了这一点,您会发现 wm8350 的某些功能似乎打破了 Linux 模型。 DAI 接口可以停止(数字音频),但 i2c 接口必须保持活动状态才能对 codec中与电源功能相关的寄存器进行编程>/PMIC(电源管理 IC)。

最新的WM8350称IC为multi-function devicesupport was introduced in 2.6.35。最初的支持可能不包括 WM8350 功能。不幸的是,如果没有关于 Sony prs900 板 布局的一些细节,就很难知道如何使用 WM8350 PMIC 功能。代码将涉及 iMx31 CPU、WM8350、i2c 连接,可能还有一些电源电路。

当然,您可以试试echo mem > /sys/power/state 看看会发生什么。如果它有效,那么你很幸运。睡眠中的功耗/电流消耗可能不是最佳的,但可能很难用 2.6.23 内核修复。您将需要在 /sys 目录中查看唤醒源,并可能在发出 suspend to memory 命令之前注册它们。

我无法弄清楚如何读取电池/电源线状态信息,也无法让音频芯片播放声音等......虽然我已经研究了一段时间的内核模块......

从上面的讨论中,batterypowerline 状态可能会通过另一个设备找到。但是,如果电路板上的连接正确,pmic_reg 文件实际上可能会给出状态。

音频芯片将使用 ALSA。您需要使用 alsamixer 或命令行 amixer 通过编解码器设置音频路由,因此 DAI 通道(来自 iMx32 的 PCM)被路由并发送到扬声器.为了最大限度地降低功耗,默认情况下通常会关闭。 /dev/dsp 文件只是 OSS 兼容性。此配置将原生支持 ALSA。如果可能,您最好使用 ALSA。

Donate to the OSF 并获取税单,如果这足够有用的话。

【讨论】:

  • Linux 设备型号上的另一个 x-y type question
  • 我突然想到 电源管理 是一个非常重的短语。所有电子设备都使用电源。 SOC dapm doc 提供了有关为什么需要激活 ALSA 控件的更多信息。此外,请参阅所有 ASOC docs 以供一般参考。 wm8350 通过添加 PMIC 支持(另一种类型的电源)使事情变得混乱。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多