【发布时间】:2014-08-19 07:46:18
【问题描述】:
我有一个 root 的 Sony prs900,运行 linux 2.6.23 #2 PREEMPT 内核,用于 ARMv6。 (Montavista linux 内核)。我在弄清楚电源管理如何工作时遇到问题,无论是运行系统还是打开和关闭音频端口。 我既不知道如何读取电池/电源线状态信息,也不知道如何让音频芯片播放声音等......虽然我已经研究了一段时间的内核模块......
对于第一个能够向我解释如何做到作品。
例如:读取电池状态,并更改一些电源模式,例如让音频放大器开机/关机,以便播放到/dev/dsp(oss 仿真)的音频实际上以声音的形式出现,而不仅仅是被芯片消耗并被忽略。 ..
实际的索尼内核和交叉编译工具的二进制包位于main page。 Actual 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 DAC 和 Right DAC。您必须取消静音 PCM 音频等。应该有一个route 文件iirc。从源路由到接收器(扬声器)的所有元素都必须打开才能获得声音。
-
虽然该公司吹嘘它在 linux 下的支持... 在我看来,在支持 Linux 和编写清晰的文档方面,很少有公司比 Wolfson 更好.现在,Sony 和他们的 Linux 版本就完全不同了。
-
另外,索尼似乎违反了 GPL?他们需要提供用于为您的 PRS900 生成 Linux 内核的 .config 文件。即,构建项目的一切。我在 Linux tarball 中看不到 .config。你知道它的位置吗?
标签: linux arm linux-device-driver alsa batterylevel