前言

  • Step1. 修改.ko驱动代码
  • Step2. 修改中间层 sample_common的代码 *
  • Step3. 修改应用程序sample_audio 的代码 *
  • 其他

Hisi3531芯片公板设计,使用了tlv320aic31作为音频输出芯片。实际画板时硬件人员
使用了wm8978。

四年前,为了最快速地驱动芯片发声,对mpp\extdrv_hi3531\tlv320aic31中的
tlv_320aic31.ko
做了改造,主要是对soft_reset部分的代码进行了修改。将wm8978寄存器设置为一组固
定值。

本轮修改中,新需求要求添加播放声音时的音量调节功能。
通过检索wm8978的芯片手册,发现要设置的寄存器是:

0x0bH … bit0:7(0 == digital mute, 0xff = 0dB)
bit8(DACVU, write protect bit)
0x0cH … same as above;

为了完成这个修改,查看.ko的代码,最简便的方法是使用ioctl机制。

Step1. 修改.ko驱动代码

代码位置:mpp\extdrv_hi3531\tlv320aic31

我们修改了既有的ioctrl代码:

        case LEFT_DAC_VOL_CTRL: //no break{adc_pga_dac_gain_ctrl.b16 = tlv320aic31_read(IIC_device_addr[chip_num], WM8978_LEFT_DAC_DIGITAL_VOLUME);adc_pga_dac_gain_ctrl.bit.wb = audio_ctrl->if_mute_route; adc_pga_dac_gain_ctrl.bit.input_vol_level_ctrl = audio_ctrl->input_level;tlv320aic31_write(IIC_device_addr[chip_num],WM8978_LEFT_DAC_DIGITAL_VOLUME,adc_pga_dac_gain_ctrl.b16);DPRINTK(0,"tlv320aic31(chip%d) left volumn:(%d - %d)", chip_num, audio_ctrl->if_mute_route, audio_ctrl->input_level);}break;case RIGHT_DAC_VOL_CTRL:{adc_pga_dac_gain_ctrl.b16 = tlv320aic31_read(IIC_device_addr[chip_num], WM8978_RIGHT_DAC_DIGITAL_VOLUME);         adc_pga_dac_gain_ctrl.bit.wb = audio_ctrl->if_mute_route; adc_pga_dac_gain_ctrl.bit.input_vol_level_ctrl = audio_ctrl->input_level;tlv320aic31_write(IIC_device_addr[chip_num],WM8978_RIGHT_DAC_DIGITAL_VOLUME,adc_pga_dac_gain_ctrl.b16);DPRINTK(0,"tlv320aic31(chip%d) right volumn:(%d - %d)", chip_num, audio_ctrl->if_mute_route, audio_ctrl->input_level);}break;

注意:
原有的增益控制结构
Adc_Pga_Dac_Gain_Ctrl adc_pga_dac_gain_ctrl;
是8个Bits.wm8978中使用的是9Bits结构。
为此,我修改了这个结构体的定义。这个结构体仅用于.ko工程

同样的,我也修改了ioctl中用于传递音量的结构体,将其由7Bits => 8Bits.
此时,注意,因为这个结构体会影响上位机的代码;编译时要留神,要进行全编译。

Step2. 修改中间层 sample_common的代码 *

注意,因为我们已经修改了mpp的基础芯片,
原有的代码位置:mpp\最好整体备份一下,然后创建一个同级目录。
common中有部分与驱动接触的代码要改。
我们在sample_comm_audio.c中增加了两个函数:

HI_S32 SAMPLE_Wm8978_VolumeCtrl(int volLeft, int volRight)
{Audio_Ctrl audio_ctrl;int s_fdTlv = -1;s_fdTlv = open(TLV320_FILE,O_RDWR);if (s_fdTlv < 0){printf("can't open tlv320,%s\n", TLV320_FILE);return -1;   }audio_ctrl.chip_num = 0;/*set volume control of left and right DAC */audio_ctrl.if_mute_route = 1;audio_ctrl.input_level = volLeft;ioctl(s_fdTlv,LEFT_DAC_VOL_CTRL,&audio_ctrl);ioctl(s_fdTlv,RIGHT_DAC_VOL_CTRL, &audio_ctrl);close(s_fdTlv);printf("tlv320 volumn set to ...(%d - %d)\n", volLeft, volRight);return 0;
}HI_S32 SAMPLE_COMM_AUDIO_VolumeCtrl(int volLeft, int volRight)
{return SAMPLE_Wm8978_VolumeCtrl(volLeft, volRight);
}

然后将SAMPLE_COMM_AUDIO_VolumeCtrl加入头文件。sample_comm.h
硬件部分是支持左右声道分别调节的,实际输出时,我们同时设置两个输出通道。

Step3. 修改应用程序sample_audio 的代码 *

定义全局变量:giAudioVolumn来存储音量设置:
注意,WM8978的音量衰减速度很快,建议默认值设置在250(max 255);

然后修改file -> ai ->ao的那个实例,添加如下代码:
在打开音频文件前,添加音量调节。

//....printf("volume adjust to: %d\n", giAudioVolume);SAMPLE_COMM_AUDIO_VolumeCtrl(giAudioVolume, giAudioVolume);pfd = SAMPLE_AUDIO_OpenAdecFile(AdChn, gs_enPayloadType);
//....

为了能够在界面中调节音量,为主菜单添加一个额外的menu item:

     case '5':{printf("please input volume(0~255):");scanf("%d", &giAudioVolume);s32Ret = SAMPLE_COMM_AUDIO_VolumeCtrl(giAudioVolume, giAudioVolume);break;}

音量调节部分和最终的文件音频输出共享同一个音量调节变量:giAudioVolume.

至此,修改完毕。

其他

Hi3531的播放的音频文件,推荐使用.adpcm格式,这个文件可以由RAW格式的音频文件
,使用SDK中\Hi3511_VOICESDK_V1.0.0.4\HisiVoiceEngine\src中的源码生成的.exe
文件,将.RAW格式的音频文件encode得到。

音频文件 =>RAW格式的转换工具有很多,我使用的是Moo0 AudioConverter 1.32

在Hisi3531环境中为wm8978芯片添加音量调节功能及测试相关推荐

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

    最近在搞一个RK3568的项目,用到了codec的录音放音功能.使用aplay来播放wav,差点把我耳朵震聋.于是我打算使用alsamixer来调小音量,结果给我整了这么一出: 没有音量条也就无法调节 ...

  2. Linux环境中MySQL主从同步--添加新的从库

    当前我认为数据库主从有两大应用价值: 1.从库相当于主库的备份.虽然数据库的主从并不能代替/取代备份,例如错误的数据可能毁掉所有的数据库,但主从也是在一种可读的状态下保持备份的一种实现方式. 2.从库 ...

  3. 各种编译环境中如何为C++添加命令行参数(Command-line parameter)

    本篇文章引用自 http://blog.csdn.net/whb923/article/details/42964441 因恐其内容丢失所以重新编辑到本博文中 在实际的编程中,我们经常使用命令行参数. ...

  4. 如何在gazebo仿真环境中给sumit_xl模型添加多线激光雷达

    一 :下载以sumit_xl模型 $ cd ~/catkin_ws/src $ git clone https://TheConstruct@bitbucket.org/theconstructcor ...

  5. 在虚拟宿主环境中承载 Active Directory 域控制器时需要考虑的事项

    在虚拟宿主环境中承载 Active Directory 域控制器时需要考虑的事项 2020/09/08 本文介绍了影响在虚拟托管环境中作为来宾操作系统运行的基于 Microsoft Windows S ...

  6. 敏捷环境中的TMMi之6-测试绩效指标(TPI)

    衡量测试及过程改进是否取得效果的测试绩效指标(TPI)不在多,在乎"精",在乎"价值". 测试方针中定义的测试改进目标需要转化为一组关键测试绩效指标(TPI), ...

  7. 【vscode】python工作目录添加到环境中

    问题描述: 出错原因,packageA没有配置到运行环境中 解决办法 同级目录下新建 __init__.py, 里面代码如下: # !/user/bin/env python # -*- coding ...

  8. 在Simscape中创建虚拟机器人环境(二):添加物理、对象交互和自主

    在Simscape中创建虚拟机器人环境:添加物理.对象交互和自主 由阿列克莎·桑切斯, (2020年8月31日),转载博客地址:https://blogs.mathworks.com/racing-l ...

  9. gazebo仿真环境中添加robotiq 2f 140的gripper_controller控制器

    gazebo仿真环境中添加robotiq 2f 140的gripper_controller控制器 搭建环境: ubuntu: 20.04 ros: Nonetic sensor: robotiq_f ...

  10. 【LaTeX技巧】 | LaTeX数学公式环境中添加删除线

    LaTeX数学公式环境中添加删除线 LaTeX数学公式环境中添加删除线 LaTeX数学公式环境中添加删除线 作者:刘兴禄,清华大学,博士在读 cancel包 下面是一个例子. \documentcla ...

最新文章

  1. 使用IIS组建PHP服务器
  2. 领取Virmach免费Minecraft主机搭建“我的世界”服务器
  3. 硬盘接口的类型介绍和比较
  4. Python--day43--增删改查补充和limit以及order by
  5. 从0到1建立一张评分卡之模型建立
  6. netty系列之:中国加油
  7. IIS 5.0 和 6.0 的 ASP.NET 应用程序生命周期概述
  8. html中label的寬度無法修改,如何设置HTML span、label 的宽度
  9. python异常处理try判断整数_Python 异常处理 try、except、raise
  10. android 菜鸟面单打印_1.0 Android基础入门教程
  11. 大并发下Timeout waiting for connection from pool 解决方案
  12. pandas滑动窗口滑动整个dataframe
  13. Ubuntu 放弃支持 32 位应用程序实属乌龙
  14. 一步一步学习Servlet之ServletContext对象
  15. 前端干货:教你轻松去除inline-block元素空隙
  16. android框架xUtils使用介绍
  17. php解决时间超过2038年
  18. 评分卡模型构建(含泪总结精华!!)
  19. 离散数学——容斥原理
  20. OWASP Top 10 2022介绍

热门文章

  1. 关于平面束方程的理解
  2. wps页眉怎么设置不同页码_wps页眉的页码和页脚的页码不同怎么设置?
  3. 清洁机器人--屏幕显示LCD方案之MCU GD32F470及其液晶RGB接口的LCD驱动代码
  4. Linux软件安装方法之rpm包安装
  5. 大数据Hadoop入门
  6. C语言交换两个变量数值的几种方法
  7. 微信小程序-云开发数据库基础操作(自用)
  8. 你知道有哪些超级好用的网盘存储吗?
  9. 【一】机器学习在网络空间安全研究中的应用
  10. ubuntu server 20.04安装vnc远程桌面xfce4