全志 T527 适配 I2S

一、背景概念

        在 T5 系列芯片中,内置了一个 AudioHub 模块,使用的 是I2S 接口,都跟 AudioHub 关联在一起,此时外挂的声卡若想正常工作,还需要配置 AudioHub 的路由信息。(AudioHub 是全志 T527 特有的模块,若在全志其他没有 AudioHub 模块的平台上,则不需要考虑配置 AudioHub 的路由信息)。

二、适配步骤

1、确认声卡挂在哪个 I2S 口,哪个 I2C 口

这部分信息可以从原理图看出来,如下图所示,AC107 被挂在 I2C3(TWI3)。

如上图所示,我们可以确认公板的 AC107 挂在 I2S0、I2C3(TWI3),如下步骤将按照公板外挂 AC107 为例进行描述。

2、使能 I2C、I2S 节点,并绑定驱动代码

(1)使能 I2C、I2S 节点

vi longan/device/config/chips/t507/configs/demo2.0/board.dts
twi3: twi@0x05002c00{
	status = "okay";
};

ahub_daudio0:ahub_daudio0@0x05097000{
    status = "okay";
}

snddaudio0:sound@0{
	status = "okay";
};

(2)绑定驱动代码

vi longan/device/config/chips/t507/configs/demo2.0/board.dts
twi3: twi@0x05002c00{
	ac107@36 {
        
	    compatible = "allwinner,ac107_0";   # 该值请咨询声卡原厂,或者自行去确认声卡驱动代码的 of_match_table 字段
        reg = <0x36>;   # I2C 地址
	};
};

snddaudio0:sound@0{
	sunxi,snddaudio-codec = "ac107.3-0036";     # codec name(ac107),3(I2C 口),0036(I2C 地址)
	sunxi,snddaudio-codec-dai = "ac107-pcm0";   # 该值请咨询声卡原厂,或者直接去确认声卡驱动代码的 snd_soc_dai_driver 字段
};

3、配置 SDA、SCK、MCLK、LRCK、BCLK、DIN、DOUT 等 GPIO 引脚

(1)配置 SDA、SCK
确认 I2C3 使用哪个 GPIO 口,如下图所示,I2C3 使用 PA10、PA11 口。

vi longan/device/config/chips/t507/configs/demo2.0/board.dts
twi3: twi@0x05002c00{
    # 确认 pinctrl 字段
	pinctrl-0 = <&twi3_pins_a>;
	pinctrl-1 = <&twi3_pins_b>;
};
vi longan/kernel/linux-4.9/arch/arm64/boot/dts/sunxi/sun50iw9p1-pinctrl.dtsi
twi3_pins_a: twi3@0 {
	allwinner,pins = "PA10", "PA11";
};

twi3_pins_b: twi3@1 {
	allwinner,pins = "PA10", "PA11";
};

(2)配置 MCLK、LRCK、BCLK、DIN、DOUT
确认 I2S0 使用哪个 GPIO 口,如上图所示,I2S0 使用 PA5、PA6、PA7、PA8、PA9口。

# 由于 AC107 只是录音设备,因此不配置 DOUT 
ahub_daudio0_pins_a: ahub_daudio0@0 {
	allwinner,pins = "PA6", "PA7", "PA8", "PA9";
};

ahub_daudio0_pins_b: ahub_daudio0_sleep@0 {
	allwinner,pins = "PA6", "PA7", "PA8", "PA9";
};

4、匹配 I2S 协议参数

由于使用 I2S 通信时需要匹配主从机之间协议,一般是由 T5 端去适配声卡,因此需要向声卡原厂确认如下数据:

  • 主从关系
  • I2S 格式(若是 PCM 格式,需要说明长短帧)
  • LRCK 和 BCLK 的极性
  • 是否需要 MCLK 时钟,需要的频率是多少
  • 通道数、采样率、位深

按照 AC107,则:

  • T5 做主
  • I2S 格式,飞利浦格式(标准格式)
  • 正常极性
  • 需要 MCLK,频率为 3.072M 或者 2.8224M
  • 2 通道,位深 16
vi longan/device/config/chips/t507/configs/demo2.0/board.dts
ahub_daudio0:ahub_daudio0@0x05097000{
	frametype 		= <0x00>;           # 由于是 I2S 模式,此时不起作用
	pcm_lrck_period		= <0x20>;       # 由于是 I2S 模式,并且只配置 2 通道,一帧数据为 32 * 2 = 64,取其一半为 32
                                        # 假设配置为 4 通道,则一帧数据为 32 * 4 = 128, 取其一半为 64,即 0x40
    slot_width_select	= <0x20>;       # 最大位深为 32 位,即用户使用时,采样位深不得高于 32
	tdm_config		= <0x01>;           # I2S 模式
	mclk_div 		= <0x08>;           # MCLK 同步,mclk=pll_audio/8,pll_audio 一般为 24.576M 或者 22.5792M
};

snddaudio0:sound@0{
	daudio_master		= <0x04>;       # T5 做主机
	audio_format  		= <0x01>;       # 标准 I2S 格式
	signal_inversion 	= <0x01>;       # 信号不翻转
};
配置项含义取值
frametype长短帧(仅对 PCM 模式有效,即依赖 tdm_config)0:短帧
1:长帧
pcm_lrck_period依赖 tdm_configI2S 模式:一帧数据位数的一半
PCM 模式:一帧数据的位数
一帧数据 = 位深 * 通道
slot_width_select最大采样位深根据实际情况,往小了配以省电
tdm_configI2S 模式还是 PCM 模式0:PCM 模式
1:I2S 模式
mclk_divmclk 分频系数,mclk=pll_audio/mclk_div0:不输出 mclk
1/2/4…176/192:输出 mclk
daudio_masterT5 做主机还是做从机1:从机
4:主机
audio_formatI2S 协议对齐格式(1/2/3)1:标准 I2S
PCM 协议对齐格式(4/5)2:I2S 右对齐
即依赖 tdm_config3:I2S 左对齐
4:短帧,标准对齐(DSP MODE A)
5:长帧,左对齐(DSP MODE B)
signal_inversion信号的反转1:bclk 正常,lrck 正常
2:bclk 正常,lrck 翻转
3:bclk 翻转,lrck 正常
4:bclk 翻转,lrck 翻转

5、配置 AudioHub 路由参数(在其他非 T5 等平台,如果没有 AudioHub,则可以忽略该步骤)

在 linux 版本下,请直接参考 android/device/softwinner/mercury-common/configs/auto_ahub_paths.xml 配置即可。
比如 I2S2 挂了个录音设备,那么可以使用如下命令配置通路

tinymix -D 1 "I2S2IN Switch" "1"
tinymix -D 1 "APBIF2 Src Select" "I2S2_TXDIF"

比如 I2S3 挂了个播放设备,那么可以使用如下命令配置通路

tinymix -D 1 "I2S3OUT Switch" "1"
tinymix -D 1 "I2S3 Src Select" "APBIF_TXDIF1"

AudioHub 路由:

<mixer>
  <!-- These are the initial mixer settings -->

  <!-- These are commonly used control sequences -->
  <path name="ahub-daudio0-input">
    <ctl name="I2S0IN Switch" value="1" />
    <ctl name="APBIF0 Src Select" value="I2S0_TXDIF" />
  </path>

  <path name="ahub-daudio1-output">
    <ctl name="I2S1OUT Switch" value="1" />
    <ctl name="I2S1 Src Select" value="APBIF_TXDIF0" />
  </path>

  <path name="ahub-daudio2-input">
    <ctl name="I2S2IN Switch" value="1" />
    <ctl name="APBIF2 Src Select" value="I2S2_TXDIF" />
  </path>

  <path name="ahub-daudio2-output">
    <ctl name="I2S2OUT Switch" value="1" />
    <ctl name="I2S2 Src Select" value="APBIF_TXDIF2" />
  </path>

  <path name="ahub-daudio3-input">
    <ctl name="I2S3IN Switch" value="1" />
    <ctl name="APBIF1 Src Select" value="I2S3_TXDIF" />
  </path>

  <path name="ahub-daudio3-output">
    <ctl name="I2S3OUT Switch" value="1" />
    <ctl name="I2S3 Src Select" value="APBIF_TXDIF1" />
  </path>

  <path name="ahub-daudio0-input-close">
    <ctl name="I2S0IN Switch" value="0" />
    <ctl name="APBIF0 Src Select" value="NONE" />
  </path>

  <path name="ahub-daudio1-output-close">
    <ctl name="I2S1OUT Switch" value="0" />
    <ctl name="I2S1 Src Select" value="NONE" />
  </path>

  <path name="ahub-daudio2-input-close">
    <ctl name="I2S2IN Switch" value="0" />
    <ctl name="APBIF2 Src Select" value="NONE" />
  </path>

  <path name="ahub-daudio2-output-close">
    <ctl name="I2S2OUT Switch" value="0" />
    <ctl name="I2S2 Src Select" value="NONE" />
  </path>

  <path name="ahub-daudio3-input-close">
    <ctl name="I2S3IN Switch" value="0" />
    <ctl name="APBIF1 Src Select" value="NONE" />
  </path>

  <path name="ahub-daudio3-output-close">
    <ctl name="I2S3OUT Switch" value="0" />
    <ctl name="I2S3 Src Select" value="NONE" />
  </path>

  <path name="null">
  </path>
</mixer>

6、测试

使用 tinyplay/tinyplay_ahub/tinycap/tinycap_ahub/aplay/arecord 进行测试

7、开机适配

若步骤6测试正常,那么接下来需要开机进行自动配置:

  • linux:修改 longan/platform/framework/auto/rootfs/etc/init.d/rcS
  • android:修改 android/hardware/aw/audio/auto/t507/audio_hw.c

三、常见问题

1. 通过 tinyplay/tinyplay_ahub 等工具进行播放,录音/播放异常。

(1)请先按照本文步骤进行外挂适配
(2)请确认播放/录音命令是否正确
(3)确认驱动层是否正在播放,若节点没有播放信息,则得分析日志,看驱动代码或者应用层代码那部分出了问题。

# cat /proc/asound/card3/pcm0p/sub0/hw_params
access: RW_INTERLEAVED
format: S16_LE
subformat: STD
channels: 2
rate: 48000 (48000/1)
period_size: 1024
buffer_size: 8192

(4)测试内部芯片内部回录

# 声卡挂在哪个 I2S 就把哪个 lookback 开关打开,比如 I2S0
tinymix -D 1 "I2S0 SD0 to SDI0 Loopback Debug" "1"
# 把目标声卡的输入路由以及输出路由都进行配置,比如 I2S0
tinymix -D 1 "I2S0IN Switch" "1"
tinymix -D 1 "APBIF0 Src Select" "I2S0_TXDIF"
tinymix -D 1 "I2S0OUT Switch" "1"
tinymix -D 1 "I2S0 Src Select" "APBIF_TXDIF0"
# 把其他关于 xxx Src Select 的项配置为 0  

# 使用 I2S0 播放音乐,后台运行
tinyplay_ahub /etc/test.wav -aD 1 -ad 0 -D card -d device & # card、device 根据实际情况填写
# 使用 I2S0 录制音乐
tinycap_ahub /etc/record.wav -aD 1 -ad 0 -D card -d device -r rate -b byte -c channel # card、device、rate、byte、channel 根据实际情况填写

        此时 record.wav 是 test.wav 的一部分片段,此时说明驱动代码是没有问题的,如果 record.wav 不符合预期,说明驱动代码有问题,建议咨询原厂。

(5)测量 MCLK、LRCK、BCLK、DIN、DOUT 信号

  • 如果所有信号都正常:
    • 再次确认原理图中 DIN、DOUT 所占用的 GPIO 口,其复用的功能是否是 DIN0、DOUT0,如果不是的话,请提单到全志 AService,由 FAE 协助适配。
    • 再次确认 MCLK、LRCK、BCLK 是否复合预期。
    • 考虑是否是喇叭元器件出现了问题。
  • 部分信号不正常:再次确认 GPIO 口配置是否正确。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/399329.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Java程序员面试专栏 数据结构】三 高频面试算法题:栈和队列

一轮的算法训练完成后,对相关的题目有了一个初步理解了,接下来进行专题训练,以下这些题目就是汇总的高频题目,因为栈和队列这两哥们结构特性比较向对应,所以放到一篇Blog中集中练习 题目题干直接给出对应博客链接,这里只给出简单思路、代码实现、复杂度分析 题目关键字…

高考杂志高考杂志社高考编辑部2023年第32期目录

高考论坛 高中数学课堂教学中创设有效情境的策略探究 黄进生; 3-5 核心素养为导向的高中物理教学探究 王丽萍; 6-8 高中化学“教、学、评”一体化教学模式的有效应用 陈燕; 9-11《高考》投稿&#xff1a;cn7kantougao163.com 新高考背景下高中英语阅读理解教学…

xshell安装社区(免费)版本

xshell安装社区(免费)版本 官方网址&#xff0c;点击直接跳转&#xff1a;https://www.xshell.com/zh/free-for-home-school/ 1.打开链接之后&#xff0c;先选择 家庭/学校免费 &#xff0c;然后输入名字和邮箱&#xff0c;勾选需要下载的资源&#xff1a; 2.然后邮箱就会收到…

Dockerfile文件中只指定挂载点会发生什么?

当你在VOLUME指令中只指定容器内的路径&#xff08;挂载点&#xff09;而不指定宿主机的目录时&#xff0c;Docker会为该挂载点自动生成一个匿名卷。这个匿名卷存储在宿主机的某个位置&#xff0c;但这个具体位置是由Docker自动管理的&#xff0c;用户通常不需要关心这个存储位…

JavaScript 设计模式之组合模式

组合模式 在我们日常中肯呢个会将一个表单用这种模式来创建 const Car function () { } Car.prototype.getName function () { throw new Error("需要重写该方法") } Car.prototype.getPrice function () {throw new Error("需要重写该方法") } const…

K8S临时小结

k8s是什么&#xff1f;能解决什么问题&#xff1f; k8s是容器管理平台&#xff0c;一套复杂的开源系统 如何更好的维护pod&#xff0c;k8s第二大要素&#xff08;pod控制器&#xff09; k8s的很多对容器&#xff08;pod&#xff09;管理的高级特性&#xff0c;都是基于控制器…

HarmonyOS—@Observed装饰器和@ObjectLink嵌套类对象属性变化

Observed装饰器和ObjectLink装饰器&#xff1a;嵌套类对象属性变化 概述 ObjectLink和Observed类装饰器用于在涉及嵌套对象或数组的场景中进行双向数据同步&#xff1a; 被Observed装饰的类&#xff0c;可以被观察到属性的变化&#xff1b;子组件中ObjectLink装饰器装饰的状…

HCIA-HarmonyOS设备开发认证V2.0-IOT硬件子系统-GPIO

目录 一、GPIO 概述二、GPIO模块相关API三、实例四、GPIO HDF驱动开发4.1、LED驱动程序(待续...)4.2、LED驱动配置(待续...) 坚持就有收获 轻量系统设备通常需要进行外设控制&#xff0c;例如温湿度数据的采集、灯开关的控制&#xff0c;因此在完成内核开发后&#xff0c;需要进…

Rancher实用篇-使用rancher,部署微服务应用

说到rancher&#xff0c;我们必须先了解一下k8s 一、k8s简介 Kubernetes&#xff08;通常简写为 K8s&#xff09;是一个开源的容器管理系统&#xff0c;由Google于2014年发起&#xff0c;并在2015年贡献给Cloud Native Computing Foundation (CNCF)进行维护。它基于Borg项目的…

app逆向-平头哥框架ratel使用

文章目录 一、前言二、实现逻辑1、安装ratel手机端app2、使⽤电脑端进⾏感染目标app3、开发⼀个平头哥插件 一、前言 平头哥&#xff08;ratel&#xff09;是⼀个Android逆向分析⼯具套件&#xff0c;他提供⼀系列渐进式app逆向分析⼯具。同时平头哥也是⼀个app⼆次开发的沙箱…

从0到1的私域流量体系搭建,私域操盘手的底层认知升级

一、教程描述 本套私域操盘手教程&#xff0c;大小4.31G&#xff0c;共有12个文件。 二、教程目录 01第一课、私域能力必修&#xff1a;私域大神熟记于心的高阶私域体系.mp4 02第二课、私域IP打造&#xff1a;那些忍不住靠近的私域IP如何打造的.mp4 03第三课、朋友圈经济&…

秦岭天台山隧道群荣获交通运输部科技示范工程,恒星科通群载波应急广播与无线调度系统产品应用其中

2023年9月12日&#xff0c;全国交通运输科技示范工程现场推进会在河南省平顶山市召开&#xff0c;会上为全国已通过验收的10项科技示范工程进行了授牌&#xff0c;其中由陕西交控集团负责实施的“秦岭天台山超长隧道群安全绿色科技示范工程”名列其中。 该科技示范工程为陕西省…

共享WiFi贴是什么,究竟安不安全?

在现代社会中&#xff0c;移动设备和互联网已经成为我们日常生活中不可或缺的一部分。为了方便我们的网络使用&#xff0c;越来越多的人选择使用公共WiFi&#xff0c;但是安全性成了很大的问题。而随着共享WiFi贴的出现&#xff0c;我们是否可以更加安全便捷地使用WiFi呢&#…

不会这个小技巧,你敢说你会零售营销?

新零售模式是随着科技的不断发展而崭露头角的商业模式之一&#xff0c;其核心理念在于将线上线下融合&#xff0c;通过智能技术提升购物体验和效率。 自动售货机作为新零售模式中的一种典型体现&#xff0c;通过数字化、自动化的手段&#xff0c;为消费者提供更为便捷、个性化的…

【C++】C++11下线程库

C11下线程库 1. thread类的简单介绍2.线程函数参数3.原子性操作库(atomic)4.mutex的种类5. RAII风格加锁解锁5.1Lock_guard5.2unique_lock 6.condition_variable 1. thread类的简单介绍 在C11之前&#xff0c;涉及到多线程问题&#xff0c;都是和平台相关的&#xff0c;比如wi…

代码随想录算法训练营29期|day56 任务以及具体安排

第九章 动态规划part13 300.最长递增子序列 class Solution {public int lengthOfLIS(int[] nums) {int[] dp new int[nums.length];int res 0;Arrays.fill(dp, 1);for (int i 1; i < dp.length; i) {for (int j 0; j < i; j) {if (nums[i] > nums[j]) {dp[i] Ma…

【C语言】面试常考----- 内存函数memcpy和memmove的功能区别与模拟实现

1.memcpy 功能&#xff1a;把source指向的前num个字节内容拷贝到destination指向的位置去&#xff0c;可以拷贝任意类型的数据。 注&#xff1a;1.memcpy并不关心\0&#xff0c;毕竟传的也不一定是字符串&#xff0c;因此拷贝过程中遇到\0也不会停下来。 2.num的单位是字节&a…

正大国际期货:银行再掀“压岁钱”争夺战 儿童金融服务还有哪些发力空间

随着春节假期渐入尾声&#xff0c;如何打理过年期间累积的“小金库”成为家长和孩子共同关注的话题&#xff0c;不少银行瞄准这一需求针对压岁钱展开营销。2月20日&#xff0c;北京商报记者调查发现&#xff0c;多家银行通过推出专属存款产品或定制银行卡等方式吸引储户目光。 …

C# CAD交互界面-模态窗体与非模态窗体调用方式

运行环境Visual Studio 2022 c# cad2016 一、模态窗体调用方式&#xff1a; 当一个模态窗体打开时&#xff0c;它会阻塞主窗体的所有输入&#xff0c;直到关闭该模态窗体为止。例如&#xff0c;弹出一个对话框让用户必须完成某些操作后才能继续使用主程序。 [CommandMethod(&q…

击败.helper勒索病毒:恢复被加密的数据文件的方法

导言: 近年来&#xff0c;勒索病毒成为网络安全领域的一大威胁&#xff0c;其中.helper勒索病毒更是备受关注。该类型的勒索软件以其高效的加密算法&#xff0c;能够将用户的文件加密&#xff0c;迫使用户支付赎金才能解密数据。本文将介绍.helper勒索病毒的特点、恢复被加密数…