背景:
通过 DAI、DMA、Codec 文章对 RK 系列开发板音频驱动适配指南曾经论述了,本次次要介绍音频驱动适配中的 HCS 适配。
RK 系列开发板 HCS 适配:
配置 HCS 的次要作用是实现各设施节点、服务的参数与公有数据配置,个别在设施驱动注册与初始化时加载到零碎中,在音频解决场景中的各阶段应用。HDF 框架提供了 2 组配置文件,别离是专用参数配置文件和设施公有数据配置的,私有参数须按 HCS 标准配置,公有数据配置既恪守 HCS 标准,开发者还可自定义配置项,并提供配置解析办法即可。
1.1. 私有参数配置
•配置文件门路:
vendor\xxxx\RK 系列开发板 \hdfconfig\khdf\deviceinfo
•DAI 模块:
device_dai0 :: device {
device0 :: deviceNode {
policy = 1; // dai 模块只对内核提供服务
priority = 50; // dai 模块需在 HDF_AUDIO 模块之前加载
preload = 0; // dai 模块加载形式
permission = 0666; // dai 模块拜访权限
moduleName = "DAI_RK 系列开发板"; // 模块名,与 g_daiDriverEntry 中的模块名统一
serviceName = "dai_service"; // 对外提供的服务名称
deviceMatchAttr = "hdf_dai_driver"; // 公有配置属性名称, 通过此名称匹配对应的公有数据
}
}
•DMA 模块:
device_dma :: device {
device0 :: deviceNode {
policy = 1;
priority = 50;
preload = 0;
permission = 0666;
moduleName = "DMA_RK 系列开发板"; // 模块名,与 g_platformDriverEntry 中的模块名统一
serviceName = "dma_service_0";
deviceMatchAttr = "hdf_dma_driver";
}
}
•Codec 模块:
device_codec_ex :: device {
device0 :: deviceNode {
policy = 1;
priority = 50;
preload = 0;
permission = 0666;
moduleName = "CODEC_ES8316"; // 模块名,与 g_es8388DriverEntry 中的模块名统一
serviceName = "codec_service_1";
deviceMatchAttr = "hdf_codec_driver_ex";
}
}
1.2. 公有参数配置
•配置文件门路:
vendor\xxxx\RK 系列开发板 \hdf_config\khdf\audio
•audio_config.hcs:audio 声卡配置信息,配置抉择运行时的 codec、dai、dma、dsp 具体芯片:
controller_0x120c1000 :: card_controller {
match_attr = "hdf_audio_driver_0"; // 公有配置关键字,通过此与 device_info.hcs 中的各个模块的公有属性进行匹配
serviceName = "hdf_audio_codec_dev0"; // 此声卡对外提供的服务名称
codecName = "codec_service_0"; // 此声卡应用的 codec 服务名称
platformName = "dma_service_0"; // 此声卡应用的 dma 服务名称
cpuDaiName = "dai_service"; // 此声卡应用的 cpu dai 服务名称
codecDaiName = "codec_dai"; // 此声卡应用的 codec dai 服务名称
dspName = "dsp_service_0"; // 此声卡应用的 dsp 服务名称
dspDaiName = "dsp_dai"; // 此声卡应用的 dsp dai 服务名称
}
controller_0x120c1001 :: card_controller {
match_attr = "hdf_audio_driver_1";
serviceName = "hdf_audio_smartpa_dev0";
accessoryName = "codec_service_1";
platformName = "dma_service_0";
cpuDaiName = "dai_service";
accessoryDaiName = "accessory_dai";
dspName = "dsp_service_0";
dspDaiName = "dsp_dai";
}
•dai_config.hcs:dai 的公有配置信息:
controller_0x120c1020 :: dai_controller {
match_attr = "hdf_dai_driver"; //cpu dai 公有配置关键字
serviceName = "dai_service"; // 配置对应的服务名称,要和 device_info.hcs 中的 cpu dai 模块服务名称雷同
idInfo {
chipName = "RK 系列开发板";
chipIdRegister = 0xff880000;
chipIdSize = 0x1000;
}
regConfig {
ctrlParamsSeqConfig = [
0xffffff, 0xffffff, 0, 0, 0x0, 0x2, 0x3, 0, 0, // accessory enable
0xffffff, 0xffffff, 0, 0, 0x0, 0x2, 0x3, 0, 0 // codec enable
];
controlsConfig = [
6, 4, 0,
7, 4, 0
];
daiStartupSeqConfig = [
0x0000, 0x0000, 0, 0, 0, 0xF, 0xF, 0, 0xf, // AIP_I2S_REG_CFG0
0x0004, 0x0004, 0, 0, 0, 0xF, 0xF, 0, 0xf, // AIP_I2S_REG_CFG1
0x0008, 0x0008, 0, 0, 0, 0xFFFFF, 0xFFFFF, 0, 0x00071f1f,
0x0010 0x0010, 16,16,0, 0xFFFFFFFF, 0xFFFFFFFF, 0, 0x1f0100
];
daiParamsSeqConfig = [
0x0008, 0x0008, 16, 16, 0x0, 0xFF, 0xFF, 0, 0x0, // ao i2s_frequency
0x0008, 0x0008, 0, 0, 0x1E, 0xFF, 0xFF, 0, 0x0, // ao i2s_frequency
0x0000, 0x0000, 0, 0, 0x0, 0xF, 0xF, 0, 0x0, // ao i2s_format
0x0000, 0x0000, 15, 15, 0x0, 0x3, 0x3, 0, 0x0, // ao i2s_channel
0x0008, 0x0008, 16, 16, 0x0, 0xFF, 0xFF, 0, 0x0, // ai i2s_frequency
0x0008, 0x0008, 8, 8, 0x1E, 0xFF, 0xFF, 0, 0x0, // ai i2s_frequency
0x0004, 0x0004, 0, 0, 0x0, 0xF, 0xF, 0, 0x0, // ai i2s_format
0x0004, 0x0004, 15, 15, 0x0, 0x3, 0x3, 0, 0x0 // ai i2s_channel
];
}
}
总结:
加上前三篇 RK 系列开发板音频驱动的适配介绍,以及本次介绍 HCS 的适配步骤以及外围代码,音频驱动的适配,根本就实现了。接下来一篇会解说 Audio 模块的驱动编译。