【RK3568调试记】给RK809添加音量调节功能

这篇具有很好参考价值的文章主要介绍了【RK3568调试记】给RK809添加音量调节功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近在搞一个RK3568的项目,用到了codec的录音放音功能。使用aplay来播放wav,差点把我耳朵震聋。于是我打算使用alsamixer来调小音量,结果给我整了这么一出:
rk809,RK3568调试记,linux,驱动开发,音频,嵌入式硬件
没有音量条也就无法调节音量,使用amixer命令看一下:
rk809,RK3568调试记,linux,驱动开发,音频,嵌入式硬件
仅有两个控件,而这两个控件也不是调音量的,难道说RK3568的codec不支持音量调节吗?
RK3568使用的codec芯片是rk809,同时也是PMIC(就很神奇)。带着问题百度了下,发现可以通过修改设备树来调节音量:

rk809_codec: codec {
			#sound-dai-cells = <0>;
			compatible = "rockchip,rk809-codec", "rockchip,rk817-codec";
			clocks = <&cru I2S1_MCLKOUT>;
			clock-names = "mclk";
			assigned-clocks = <&cru I2S1_MCLKOUT>, <&cru I2S1_MCLK_TX_IOE>;
			assigned-clock-rates = <12288000>;
			assigned-clock-parents = <&cru I2S1_MCLKOUT_TX>, <&cru I2S1_MCLKOUT_TX>;
			pinctrl-names = "default";
			pinctrl-0 = <&i2s1m0_mclk>;
			hp-volume = <20>;  //此处修改耳机音量,3~255即1.125db~-95db,0.375db/step
			spk-volume = <3>;  //此处修改喇叭音量,3~255即1.125db~-95db,0.375db/step
			mic-in-differential;
			status = "okay";
		};

修改后再播放果然生效,证明rk809是具备调节音量的功能的。

但问题还是没有解决,总不能听个音乐想调下音量,于是修改设备树,重新编译,烧写到产品中…正确的做法是把音量调节控件添加到codec驱动中使其支持音量调节功能。

根据设备树rk809的compatible属性找到它的驱动源码sound/soc/codecs/rk817_codec.c。找到它的控件注册位置:

static int rk817_probe(struct snd_soc_component *component)
{
	/* 省略 */
	snd_soc_add_component_controls(component, rk817_snd_path_controls,
				       ARRAY_SIZE(rk817_snd_path_controls));
	return 0;
}

rk817_snd_path_controls就是控件对象了,它的定义也在本文件中:

static struct snd_kcontrol_new rk817_snd_path_controls[] = {
	SOC_ENUM_EXT("Playback Path", rk817_playback_path_type,
		     rk817_playback_path_get, rk817_playback_path_put),

	SOC_ENUM_EXT("Capture MIC Path", rk817_capture_path_type,
		     rk817_capture_path_get, rk817_capture_path_put),
};

这两个控件与amixer命令查找出了两个控件相吻合。需要添加第三个控件用于音量调节。

这里我的做法是参考一个比较熟悉的codec的驱动wm8960(sound/soc/codecs/wm8960.c),它是这样添加音量调节控件的:
rk809,RK3568调试记,linux,驱动开发,音频,嵌入式硬件
这个宏的原型:

include/sound/soc.h
SOC_DOUBLE_R_TLV(xname, reg_left, reg_right, xshift, xmax, xinvert, tlv_array)
参数:
xname: 控件件名称,
reg_left: 左声道寄存器地址
reg_right: 右声道寄存器地址
xshift: 控件功能在寄存器中需要修改第几个bit
xmax: 寄存器可写入的最大值
xinvert: 写入寄存器的值是否需要反转(0:0就是0; 1:0为xmax-0)
tlv_array: 控制元数据(就是一个容器),alsa以此来定义dB范围/比例

宏展开SOC_DOUBLE_R_TLV(“Playback Volume”, WM8960_LDAC, WM8960_RDAC,
0, 255, 0, dac_tlv),

SOC_DOUBLE_R_TLV("Playback Volume", WM8960_LDAC, WM8960_RDAC, 0, 255, 0, dac_tlv),
{
	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
	.name = ("Playback Volume"),
	.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | SNDRV_CTL_ELEM_ACCESS_READWRITE,
	.tlv.p = (dac_tlv),  //控制元数据
	.info = snd_soc_info_volsw,
	.get = snd_soc_get_volsw,  //amixer的sget或cget的回调
	.put = snd_soc_put_volsw,  //amixer的sset或cset的回调
	.private_value = SOC_DOUBLE_R_VALUE( WM8960_LDAC,   WM8960_RDAC,             0,        255,                0)
  //.private_value = SOC_DOUBLE_R_VALUE(左声道音量reg,  右声道音量reg, 寄存器位offset, 寄存器最大值, 设置的值是否反转)
},

再看它的元数据dac_tlv的定义:

static const DECLARE_TLV_DB_SCALE(dac_tlv, -12750, 50, 1);
dac_tlv: 元数据变量
-12750: 最小增益(单位0.01dB),即最小音量为-127.5dB,需要参考codec datasheet
50: 调节音量的步长(单位0.01dB),0.5dB 0~255-127.5dB~0dB,127.5/256约为0.5
1: 音量最小是是否需要静音(0:; 1: 是)

rk809的道理基本一样,只是需要确定音量调节的寄存器地址,查看rk809的datasheet:
rk809,RK3568调试记,linux,驱动开发,音频,嵌入式硬件
二者在sound/soc/codecs/rk817_codec.h中有定义:

#define RK817_CODEC_DDAC_VOLL		(RK817_CODEC_BASE + 0x31)
#define RK817_CODEC_DDAC_VOLR		(RK817_CODEC_BASE + 0x32)

最后照猫画虎,添加音量调节控件:

#include <sound/tlv.h>  //+ 头文件。否则编译找不到宏DECLARE_TLV_DB_SCALE
/* 省略 */
static const DECLARE_TLV_DB_SCALE(dac_tlv, -9500, 37, 1);  //+ 音量调节控件元数据,根据rk809datasheet -1.125db~-95db,0.375db/step

static struct snd_kcontrol_new rk817_snd_path_controls[] = {
	SOC_ENUM_EXT("Playback Path", rk817_playback_path_type,
		     rk817_playback_path_get, rk817_playback_path_put),

	SOC_ENUM_EXT("Capture MIC Path", rk817_capture_path_type,
		     rk817_capture_path_get, rk817_capture_path_put),
	
	SOC_DOUBLE_R_TLV("Playback Volume", RK817_CODEC_DDAC_VOLL,  RK817_CODEC_DDAC_VOLR,
		 0, 255, 0, dac_tlv),  //+ 音量调节控件
};

编译烧写内核,alsamixer成功出现音量条:
rk809,RK3568调试记,linux,驱动开发,音频,嵌入式硬件
amixer查看,出现音量控件’Playback’:
rk809,RK3568调试记,linux,驱动开发,音频,嵌入式硬件
使用amixer contents查看详情:
rk809,RK3568调试记,linux,驱动开发,音频,嵌入式硬件
分别用amixer sset Playback 0,0以及amixer sset Playback 255,255测试最大和最小音量:
rk809,RK3568调试记,linux,驱动开发,音频,嵌入式硬件
然后使用aplay放歌出现了一个小bug,使用amixer sset Playback 0,0原本表示静音却放出了最大音量,而amixer sset Playback 255,255是最小音量,这与标定值相反。控件的配置是照搬wm8960的,对比wm8960和rk809的datasheet得到答案:
rk809:
rk809,RK3568调试记,linux,驱动开发,音频,嵌入式硬件
wm8960:
rk809,RK3568调试记,linux,驱动开发,音频,嵌入式硬件
wm8960音量与寄存器值对应关系为255对应最大值0dB,而rk809 255对应最小值-95dB,正好相反!因此需要修改控件参数:

static struct snd_kcontrol_new rk817_snd_path_controls[] = {
	SOC_ENUM_EXT("Playback Path", rk817_playback_path_type,
		     rk817_playback_path_get, rk817_playback_path_put),

	SOC_ENUM_EXT("Capture MIC Path", rk817_capture_path_type,
		     rk817_capture_path_get, rk817_capture_path_put),
	
	SOC_DOUBLE_R_TLV("Playback Volume", RK817_CODEC_DDAC_VOLL,  RK817_CODEC_DDAC_VOLR,
		 0, 255, 1/*这里把0修改为1,表示寄存器写入x,实际值为255-x*/, dac_tlv),
};

成功修复bug!文章来源地址https://www.toymoban.com/news/detail-619677.html

到了这里,关于【RK3568调试记】给RK809添加音量调节功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • RK3568平台开发系列讲解(调试篇)Linux 性能调试工具汇总

    🚀返回专栏总目录 沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将汇总介绍 Linux 调试优化的工具。 我们来看 Linux 的性能工具。首先还是要推荐下面这张图,也就是 Brendan Gregg 整理的性能工具谱图。我在专栏中多次提到过,你肯定也已经参考过。 这张图从

    2023年04月15日
    浏览(83)
  • rk3568_linux5.10 调试6275p pcie wifi

    a : config 部分必须选择 Device Drivers --- Network device support --- Wireless LAN --- Rockchip Wireless LAN support --- [*] build wifi ko modules [*] Broadcom Wireless Device Driver Support --- 选择好路径: (/system/etc/firmware/fw_bcm43752a2_pcie_ag.bin) Firmware path (/system/etc/firmware/nvram_ap6275p.txt) NVRAM path Enable Chip Interface (

    2024年02月08日
    浏览(76)
  • RK3568串口调试

    目录 前言 一、代码位置 二、硬件原理图 三、设备树配置 四、设备注册 五、串口调试功能 六、驱动调试  总结 本文主要讲解如何移植RK3568的串口 并且测试连通性 在 Linux kernel 中,使用 8250 串口通用驱动,以下为主要驱动文件: drivers/tty/serial/8250/8250_core.c # 8250 串口驱动核

    2024年02月16日
    浏览(53)
  • RK3568调试HDMI-IN之双RK628D

    本文是基于RK3568平台,HDMI-IN调试总结。 视频桥接芯片:双RK628D 驱动代码:“kerneldriversmediai2crk628”(驱动用的是rk628-for-all-v21版本) 本次调试的方案功能:HDMI-IN信号通过RK628D转换成MIPI-CSI传到主控SOC 参考文档:“RKDocscommonRK628Rockchip_RK628D_For_All_Porting_Guide_CN_V21.pdf” 场景描

    2024年02月05日
    浏览(61)
  • RK3568调试lt6911c

    记录在rk3568上调试龙讯芯片lt6911c的笔记,因为在这个平台上是第一次调试这个芯片,遇到的一些问题比较多,做一次笔记 6911c芯片内部有MCU,这个可以去找龙讯要对应的工具和固件。 这里我总结了一下发布在网盘上,有需求的可以自取 链接:https://pan.baidu.com/s/16C3HGj60rNmzXc

    2024年02月11日
    浏览(107)
  • [RK3568]音频ES8388调试

    本文是基于RK3568平台,音频芯片ES8388调试总结。 外接声卡:ES8388 步骤 ① dts配置 步骤 ② 编译烧写,调试 系统声音配置:

    2024年03月20日
    浏览(119)
  • Rockchip基于RK3566/RK3568 WiFi AP6256调试笔记

    CPU:RK3566 编译环境:Ubuntu18.04 内核版本:kernel 4.19 因为RK3566/RK3568支持SDIO3.0并且向下兼有SDIO2.0接口,由于核心板在VCC_IO6上将电压定为了3.3V,无法改变为1.8V,所以没有办法支持SDIO3.0,所以这次需要调试SDIO2.0模式下的WiFi。 从Rockchip软件包中的 Rockchip_Developer_Guide_Linux_WIFI_BT_CN.pd

    2024年01月16日
    浏览(70)
  • RK3568/RK3566 mipi双摄调试(gc2093+gc2053)

    这篇文章给大家介绍一下RK3568双摄的调试,RK3568有一个4lane的mipi dphy,最高支持2.5G/bps每lane,ISP自带csi host,最高处理8M的图像,rk3568这个mipi dphy还有一个处理方法,就是拆分成2个2lane的使用,其中一个连接到单独的csi host,另一个连接到isp内部自带的csi host,这样就可以支持双

    2023年04月08日
    浏览(146)
  • RK3568 安卓11系统EDP屏调试

    目录 一.lcd屏解析: 二.EDP配置 2.1 硬件原理分析 2.2 datasheet分析 2.3 完整DTS配置如下:  一般屏的规格书都会给出,但需要注意的是,有些规格书是错误的;有一些未给出(需要单独找厂商要);还有一些是给出总的,HFP+HS+HBP, VFP+VS+VBP。 clock-frequency: 提供给lcd的时钟频率,一般屏

    2024年02月09日
    浏览(92)
  • RK3568平台 LT9211转接芯片调试笔记

    龙讯LT9211是一个高性能转换器,支持MIPI LVDS TTL两两之间转换。 使用此款芯片大部分为MIPI与LVDS进行互相转换。 下图为LT9211的典型应用图: (1)insmod加载ko文件后,ls /dev 查看是否生成新的video节点。 -如果没有生成video节点,查看ko是否加载失败,dts配置是否正确。 (2)查看

    2024年01月20日
    浏览(97)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包