每一个带有音频播放的产品,设备初期的时候都会调试设备的EQ参数。EQ通过将声音中各频率的组成泛音等级加以修改,专为某一类音乐进行优化,增强人们的感觉。常见包括:正常、摇滚、流行、舞曲、古典、柔和、爵士、金属、重低音和自定义。1

调节音频芯片EQ参数一般是专业音响公司做的,必须有专业的设备和调音师完成,最终输出芯片配套的文件,供驱动写入。这里以TAS5754为例:

EQ参数

专业的音响设备调好EQ后给的文件,简要如下:

//可以发现都是芯片内部寄存器的一些值
reg_value base_main_Rate48_REG_xxx_program[] = {{0x00,0x00},{0x00,0x01},
//          # reg[1][3] = 0x4{0x03,0x04},{0x00,0x00},
//          # reg[0][0x3] = 0x11{0x03,0x11},
//          # reg[0][2] = 0x10{0x02,0x10},{0xFF,0x04},{0xFF,0x05},{0x00,0x00},
//          # reg[0][0x2b] = 0x1f{0x2B,0x1F},{0x00,0x2C},
....
};

tas5754音频芯片调完EQ参数后的值需要做简单的修改:

reg_value base_main_Rate48_REG_Section_program[] = {{0x00,0x00},{0x00,0x01},
//          # reg[1][3] = 0x4{0x03,0x04},{0x00,0x00},
//          # reg[0][0x3] = 0x11{0x03,0x11},
//          # reg[0][2] = 0x10{0x02,0x10},{0xFF,0x04},    // 1. 写ADC数据{0xFF,0x04},   //  2. 写DAC数据{0x00,0x00},文件中提供了两个数组的数据,base_main_Rate48_REG_Section_program, tas5754_reg_values, 在第2处(写DAC数据),插入第二个数组的数据,同时把 {0xFF,0x04},  {0xFF,0x05}, 删掉,第二个数组就是DAC的EQ数据,因为TAS5754没有ADC,所以 {0xFF,0x04}的数据为空,不用写。
驱动写入EQ

EQ参数实际对应的都是芯片寄存器值,驱动中需要通过IIC写入到音频芯片中,由于音频芯片的EQ参数很多,需要单独在线程中写入,而不影响驱动的正常加载,这就需要内核中Workqueue机制2

  • tas5754的私有数据
// 私有数据
struct tas575x_private {struct snd_soc_codec *codec;... struct workqueue_struct *workqueue;struct delayed_work      dwork;....
};
  • 创建工作队列
static int tas575x_set_dai_fmt(struct snd_soc_dai *dai, unsigned int format)
{struct tas575x_private *priv = snd_soc_codec_get_drvdata(dai->codec);priv->codec = dai->codec;priv->format = format;//创建工作队列priv->workqueue = create_singlethread_workqueue("tas575x_workqueue");// 创建工作,调用函数是tas575x_taskINIT_DELAYED_WORK(&priv->dwork,tas575x_task);//延时5s去执行queue_delayed_work(priv->workqueue,&priv->dwork,5);return 0;
}
  • 工作队列的处理函数
    处理函数中巧妙之处是使用了container_of这个宏来从而避免了全局变量的使用,该宏的作用就是可以根据一个结构体变量中的一个成员变量的指针来获取指向整个结构体变量的指针。
static void tas575x_task(struct work_struct *work)
{int i = 0;struct tas575x_private *priv;struct delayed_work *dwork = to_delayed_work(work);int cnt = sizeof(tas5754_reg_values)/sizeof(tas5754_reg_values[0]);pr_info("%s, reg cnt:%d\n", __func__, cnt);priv = container_of(dwork, struct tas575x_private, dwork);for(i = 0; i<cnt; i++){snd_soc_write(priv->codec, tas5754_reg_values[i].reg,tas5754_reg_values[i].val);}
}
  • create_singlethread_workqueue in linux

  1. EQ均衡器 ↩︎

  2. workqueue 机制 ↩︎

[ Linux驱动炼成记 ] 12 -音频驱动TAS5754添加EQ参数相关推荐

  1. [Linux驱动炼成记] 11-快速修改芯片驱动中寄存器的值

    实际项目的调试中,往往需要快速修改驱动芯片(只针对IIC通讯)中对应寄存器的值,传统的方式一般是编译驱动 -> 烧录固件 -> 测试,而这样的方式往往很繁琐.这里介绍使用i2c-tools ...

  2. [Linux驱动炼成记] 10 -光感ISL29035调试/IIO子系统

    简介 项目中需要加入光感检测功能,需求一到,就打算自己写驱动,意外的发现最新内核中已经支持该驱动ISL29035.配置好DTS应该初步可以使用.看代码过程中发现isl29035的实现主要是采用IIO子 ...

  3. [ Linux驱动炼成记 ] 15 - 存储器EMMC中Ext4文件系统 中 磁盘空间占用率100%

    产品现象 : 设备(Linux 系统) 运行一段时间后,其中某一个分区 /et/config 突然占用率为100%,而实际空间可能1%都不到. 这种问题百思不得其解.谷歌/百度 所遇到的解决方案都是嵌 ...

  4. 【转】雄鹰计划-卓越工程师炼成记

    原文网址:http://bbs.elecfans.com/jishu_400775_1_1.html 注意: 雄鹰计划所有信息都将有朱兆祺ForARM进行实时更新,注意不良人士的骗局.这个计划全程免费 ...

  5. 证券一哥炼成记——郭树清

    证券一哥炼成记--郭树清 富凯摘要:改革力度超过所有前任的郭树清,在亿万股民中有着种种争议.不过只有读懂自"整体改革理论"以来的郭树清,才能读懂中国资本市场改革真实的行进路线. 从 ...

  6. 前沿|PaddlePaddle开源项目DeepNav“无人船”炼成记(二)

    前言:本篇继续讲述DeepNav自动驾驶船项目,本次讲解无人船的设计思路和硬件搭建过程.文章素材来源于百度美国研究院王益老师的知乎专栏,欢迎小伙伴们持续关注. 同时,对项目理论基础感兴趣的小伙伴,可以 ...

  7. 全球首颗量子卫星炼成记:“墨子号”打造保密通信新产业

    "墨子号"炼成记 对于我们普通卫星而言,只要顺利升空就意味着至少成功了一半.麻麻不用太操心. 但对于我们量子卫星来说,发射升空后,卫星还要在太空中与地面机构光学实验站进行" ...

  8. PPT炼成记 高效能PPT达人的10堂必修课pdf

    下载地址:网盘下载 内容简介 <PPT炼成记>一书主要讲解的内容包括:了解真正的PPT是怎样的,懂得PPT的基本理念和操作规则,文字设计和编排,如何利用图片来突出自己的PPT,巧用颜色才能 ...

  9. Linux驱动开发-编写VS1053芯片音频驱动

    1. 前言 VS1053是一款硬件编解码的音频芯片,提供SPI接口和IIS接口两种通信协议,这篇文章是介绍在Linux下如果模拟SPI时序来操作VS1053完成录音.播放音频歌曲功能.但是没有注册标准 ...

  10. 巴川数据科学炼成记_【脑王直通车】小小记忆高手炼成记

    " 记住150个随机数字,你需要多久? [脑王直通车]第8站到来, 杨老师将他在<最强大脑>比赛中运用的 记忆方法倾囊相授, 孩子们变身小小记忆高手! "记忆探秘 你们 ...

最新文章

  1. PHP使用GD库封装验证码类
  2. ARM开发板上iconv调用失败的解决方法
  3. 关于java内容_关于java一些概念性的内容
  4. Polynomial(HDU-6668)
  5. php 怎么查看原生方法源码_你的2020搜索账单地址入口 你的2020搜索账单怎么查看查看方法...
  6. DBCC DBREINDEX重建索引提高SQL Server性能
  7. java云服务器怎么上传文件大小,java云服务器怎么上传文件大小
  8. 4步带你从Web前端小白到入门!
  9. 机器学习实践中的 7 种常见错误
  10. idea 添加 golang 项目的 gopath
  11. 分享一个很好的dll查看器
  12. Webpack打包UMD的export要带default访问问题
  13. 域名在国外注册的服务器能查到吗,对于国外域名查询,你还需要知道这些!
  14. python中什么是不等长编码_2021学堂云计算机科学和Python编程导论(自主模式)期末答案...
  15. java程序员的名言_收集53个程序员励志名言
  16. Android实现资源动态加载的两种方式
  17. 《向上生长》九边 读后感
  18. 带你全面解析Android框架体系架构view篇,全网疯传
  19. 普通高中计算机装备标准,福建省普通高中信息技术装备标准.doc
  20. 子域名查询、DNS记录查询

热门文章

  1. 生物信息相关国家自然科学基金汇总(持续更新中)
  2. 人工智能 深度学习 机器学习
  3. 坐标正反算例题_坐标正算公式例题
  4. 软件定义网络入门学习笔记3-学习第一个ryu app-simple_switch_13.py
  5. unity webgl踩坑指南
  6. 应变式传感器的原理与优点
  7. 怎样找到win7系统默认的微信缓存文件夹路径
  8. EndNote如何自定义添加新的样式
  9. The size of tensor a (4) must match the size of tensor b (2) at non-singleton dimension 1
  10. 怎样看开源代码版权_版权声明在开源代码中泛滥成灾