QNX系统下sgtl5000音频解码器的调试
调试环境:QNX7.0    BSP版本:SabreARD  CODEC:SGTL5000
本板所使用的arm芯片是imx6q,原bsp开发包所使用的音频芯片是CS42448,并且使用接口是EASI,与我们开发板是完全不同。我的开发板的CODEC硬件原理图:
sgtl5000 通过I2S接口与IMX6的SSI总线完成音频数据的交换;cpu通过I2C或者SPI完成对CODEC的控制,由于
硬件设计是I2C的接口,所以我们通过I2C来完成对CODEC的控制。
在调试过程中,我们从mx6q-sabrelite版本中将sgtl5000的驱动拷贝了过来进行调试。需要注意的是I2S的协议,
I2S协议类似于I2C协议,需要指定主备模式,主设备将会为备设备提供I2S的Bit时钟和声道选择时钟。在startup初
始化过程中,需要调试ssi模块的初始化。
SSI、AUDIO与CODEC之间的关系以及数据的流向?
对于IMX6Q来讲:AUDIO模块分为internal port和external port两种端口类型。internal port是硬连接于ssi的,
不可以更改,其对应关系是:inter_port1<-->SSI1,inter_port2<--->SSI2,inter_port7<--->SSI3;而external port
对应的是3-6,对应的外部管脚AUDIO3-AUDIO6。内外部端口结构图如下:
我们可以通过配置audio1-7的寄存器完成内外部端口之间的映射,比如可以配置port3的数据源以及TXFS和TXC
的方向和源。需要特别注意的是,这个配置需要和I2S两端配置的主备模式要协调一致。在调试过程中最早出现的问题
就是由于该内外部端口的主备模式相反,导致一直没有声音。例如若CODEC配置为MASTER模式,则I2S协议中用到
的TXC和TXFS时钟信号都是由COEC提供的,则AUDIO模块内的external port应该配置为output模式,也就是
master模式,否则相反。
与internal port硬连接的SSI模块需要配置为I2S模式,该模式的配置是在CODEC中的ssi的初始化接口中完成,
移植过来的代码可以直接使用,无需更改。需要特备注意的是,我们需要在startup中完成ssi模块正常工作的时钟配置。
代码如下:
//#define CODEC_SLAVE 1#if defined (CODEC_SLAVE) //imx6q:master, codec:slave{/** Note that bits [20:19] are defined differently by the i.MX6 Quad/Dual compared to the i.MX6 DualLite/Solo* The i.MX6 Solo/DualLite use bits 20:19 to control a PLL post-divider, whereas the Quad/Dual use bits 20:19* for testing purposes.*/#define PLL_AUDIO_CTRL_POST_DIV_1            (0x3 << 19)#define PLL_AUDIO_CTRL_BYPASS              (1 << 16)#define PLL_AUDIO_CTRL_ENABLE                (1 << 13)#define PLL_AUDIO_CTRL_POWERDOWN         (1 << 12)#define PLL_AUDIO_CTRL_MFI_MASK              (0x7F << 0)   /* In the docs these bits are labeled DIV_SELECT */#define CCM_ANALOG_PLL_AUDIO_CTRL                0x70#define CCM_ANALOG_PLL_AUDIO_CTRL_SET           0x74#define CCM_ANALOG_PLL_AUDIO_CTRL_CLR           0x78#define CCM_ANALOG_PLL_AUDIO_NUM                0x80#define CCM_ANALOG_PLL_AUDIO_DENOM              0x90//This register contains the numerator (A) of Audio PLL fractional loop divider.out32(MX6X_ANATOP_BASE + CCM_ANALOG_PLL_AUDIO_NUM, 0x2a0);//This register contains the Denominator (B) of Audio PLL fractional loop dividerout32(MX6X_ANATOP_BASE + CCM_ANALOG_PLL_AUDIO_DENOM, 0x3e8);//The control register provides control for the audio PLL.//This field controls the pll loop divider. Valid range for DIV_SELECT divider value: 27~54.out32(MX6X_ANATOP_BASE + CCM_ANALOG_PLL_AUDIO_CTRL_CLR, PLL_AUDIO_CTRL_MFI_MASK);//DIV_SELECT = 28 POST_DIV_SELECT = 0x3out32(MX6X_ANATOP_BASE + CCM_ANALOG_PLL_AUDIO_CTRL_SET, (0x1c & PLL_AUDIO_CTRL_MFI_MASK) | PLL_AUDIO_CTRL_POST_DIV_1);/* Power up and enable Audio PLL (PLL4) */out32(MX6X_ANATOP_BASE + CCM_ANALOG_PLL_AUDIO_CTRL_CLR, PLL_AUDIO_CTRL_BYPASS | PLL_AUDIO_CTRL_POWERDOWN);out32(MX6X_ANATOP_BASE + CCM_ANALOG_PLL_AUDIO_CTRL_SET, PLL_AUDIO_CTRL_ENABLE);/* the clock frequence of ssi2 is 12.288MHz*/init_ssi2_clk();init_audiomux(2, 3);}#else //imx6q:slave, codec:master{init_audiomux(3, 2);}#endif

该代码配置了SSI模块需要的工作时钟,但是配置完此之后,ssi仍然不能正常工作,主要是由于IMX6存在有门时钟

,该门时钟主要是控制芯片内部各个模块的时钟使能标记。主要是为了降低功耗。如下:
我们在上文配置的ssi时钟其实配置的是SSI_CLK_ROOT,该时钟的主要作用是为了产生SSI作为I2S模式下作为
MASTER时所需要用的TXC和TXFS时钟,而SSI模块正常工作的时钟是由ipg_clk_root所提供的,而该时时钟是由AHB时钟2分频得到的。具体应用如下:
所以上图中的World Clock和Serial Bit Clock都是由SSI's sys clock产生的。而SSI's sys clock对应的就是
SSI_CLK_ROOT时钟源。因此我们除配置完ssi模块工作在I2S模式下的协议时钟外,还需要配置SSI模块
正常工作的时钟,即配置CCM模块的CGR5寄存器时钟SSI_CLK_ENABLE。

QNX下音频解码器SGTL5000驱动的调试相关推荐

  1. 基于NXP iMX6ULL 扩展音频解码器 MAX98357A

    By Toradex胡珊逢 Colibri iMX6ULL 是 Toradex 面向低成本设备推出的 Arm 计算机模块.该产品没有音频编解码器,无法直接输出模拟音频信号.本文将介绍如何使用模块的数字 ...

  2. ffmpeg学习笔记之创建音频解码器失败 avcodec_open2() 返回值为-22

    目录 前言 解决过程 总结分析 前言 由于项目需求,需要开发一个私有播放器,所以就无法使用ffmpeg通用的取流接口:avformat_open_input()(埋下祸根)其中遇上了一个坑在创建音频解 ...

  3. VS1053音频解码器介绍

    VS1053音频解码器简介 VS1053b是单片Ogg Vorbis/MP3/AAC/WMA/MIDI音频解码器,及IMA ADPCM 编码器和用户加载的Ogg Vorbis编码器.它包含了一个高性能 ...

  4. Android下音频tinyalsa(tinymix/tinycap/tinyplay/tinypcminfo)--------mark详细

    Android下音频tinyalsa(tinymix/tinycap/tinyplay/tinypcminfo) 2017年05月29日 10:02:03 songze_lee 阅读数:10224更多 ...

  5. 解决Android5.1系统下音频Xrun(underrun或overrun)问题

    基于RK3288解决Android5.1系统下音频Xrun(underrun或overrun)问题 2018年11月23日 16:35:06 21cnhui 阅读数:38 标签: Android  a ...

  6. WIN10 + VS2015 + WDK10 + SDK10 + VM虚拟机驱动开发调试环境搭建

    为什么80%的码农都做不了架构师?>>>    一.准备工作 1 系统环境:Win10系统 2 开发工具:VS2015 3 驱动开发工具:WDK10 4 Windows SDK:SD ...

  7. Linux下的USB总线驱动 3

    版权所有,转载请说明转自 http://my.csdn.net/weiqing1981127 4.U盘驱动分析 USB Mass Storage是一类USB存储设备,这些设备包括USB磁盘.USB硬盘 ...

  8. linux内核关闭触摸屏校准,linux内核usb触摸屏驱动bug调试- selected device is not a touchscreen I understand...

    近期给客户调试一块数控板,今天客户带过来一个屏,并且有一个usb的触摸屏芯片接在屏上.屏很快就弄好正常显示. 触摸屏在内核下找到usb 触摸屏驱动,内核启动后这个usb转的触摸屏也正常找到,注册为ev ...

  9. Win7 32位下DebugView和DriverMinitor不能打印调试信息的问题

    使用DebugView打印内核调试信息是开发驱动的非常重要的手段,但DebugView在VISTA/WINDOWS 7下却无法获取内核的调试日志,修改方法是: HKLM/SYSTEM/CurrentC ...

最新文章

  1. 从闲扯开始我的技术博客吧
  2. Winforn中设置ZedGraph曲线图的属性、坐标轴属性、刻度属性
  3. 201621123085 《Java程序设计》第2周学习总结
  4. spring boot Filter过滤器的简单使用
  5. [shell进阶]——shell多线程
  6. java 类型转换方法_java数据类型转换的常见方法
  7. VS2022+.NET6+C#10,.NET开发起飞
  8. 微软的平板电脑_Microsoft 微软 Surface Go 2 10.5英寸二合一平板电脑(m3-8100Y、8GB、128GB、LTE) 5788元...
  9. ARM LDR与MOV的区别
  10. 蓝桥杯2020年第十一届C++省赛第六题-成绩统计
  11. windows 10 l2tp 连接无响应问题解决
  12. 【UE4 特效】粒子火焰
  13. acer软件保护卡怎么解除_Acer软件保护卡使用说明全解.doc
  14. B站黑马Java基础+就业班+各种项目idea版本(正在更新)4测试 反射 注解
  15. 在8X8的棋盘上分布着n个骑士,他们想约在某一个格中聚会。骑士每天可以像国际象棋中的马那样移动一次,可以从中间像8个方向移动(当然不能走出棋盘),请计算n个骑士的最早聚会地点和要走多少天。要求尽早聚会
  16. linux带page参数报错,Linux配置hugepage
  17. SDJZU DotA
  18. OpenCL Programming Cases and Optimization Methods, Pinned Memory
  19. Kettle报错:Driver class org.gjt.mm.mysql.Driver could not be found
  20. Java代码使用最小二乘法实现线性回归预测

热门文章

  1. 使用Java的PrinterJob实现调用打印机打印
  2. 工作5年,我的互联网工具箱(30个提升办公效率的神器)
  3. Microsoft Office Word 2007 文档结构图突然变小的解决办法
  4. 梦幻单机游戏添加怪物lua
  5. Stata常用命令示例
  6. 燕山大学数据结构二级项目实验报告
  7. iOS警告:ignoring file /Users/apple/Documents/拷贝1/.../CorePlot_1.3/Binar
  8. win10无法装载iso文件_Win10如何使用自带虚拟光驱打开ISO镜像文件?
  9. 按照规定,在高速公路上行使的机动车,达到或超出本车道限速的10%则处200元罚款;若达到或超出50%,就要吊销驾驶证。请编写程序根据车速和限速自动判别对该机动车的处理。
  10. 语言学句法分析树形图怎么画_语言学第四章树形图句法.doc