海思hi3531d音频外接codec (tlv320aic32x4)(二)
与set_divs和get_divs函数有关,c文件中定义了结构体变量aic32x4_divs[]
typedef union
{
struct audio_interface_t interface;
struct other_config_t other;
struct adc_dac_config_t adc;
struct adc_dac_config_t dac;
struct agc_config1_t agc_conf1;
struct agc_config2_t agc_conf2;
struct agc_config3_t agc_conf3;
struct agc_config4_t agc_conf4;
struct audio_power_up_t powerup;
struct hp_route_t hp;
struct lo_route_t lo;
struct output_volume_t output_volume;
struct output_mute_t output_mute;
struct micpga_left_t micpga_left;
struct micpga_right_t micpga_right;
struct micpga_volum_t micpga_volume;
struct float_input_t float_input;
}Audio_Ctrl;
由于有众多的选项需要配置,为了方便应用层调用ioctl,同时也方便ioctl 的cmd定义,做了这样一个联合体,需要配置哪个部分,就对哪个部分进行赋值
在c文件中,可以看到ioctl中有这么一段,其实就是接收应用层的cmd参数
Audio_Ctrl temp;
Audio_Ctrl* audio_ctrl;
if (argp != NULL)
{
if (copy_from_user(&temp, argp, sizeof(Audio_Ctrl)))
{
return -EFAULT;
}
}
audio_ctrl = (Audio_Ctrl*)(&temp);
结构体说明
接下来详细解释一下各个结构体,为了理解这些结构体的含义,需要看3254的手册,那个路由的图,以及各个寄存器说明
struct audio_interface_t
{
unsigned int sample_rate;
unsigned char transfer_mode;
unsigned char master_slave_mode;
unsigned char chn_num;
unsigned char bit_width;
unsigned char data_offset;
};
sample_rate是音频的采样率,目前常用的是48k,44.1k和8k
transfer_mode传输模式,只做了i2s的调试,pcm理论上是可以,但是没有调过
master_slave_mode规定了3254的主从模式,注意是3254,不是海思的
chn_num通道数,可以分时复用传输多个声道的数据,但是一般是两个声道的立体声
bit_width位深,也叫采样精度,目前固定为16bit
data_offset数据在bclk时钟的偏移,这个参数给0就行,实际上从波形看,海思和codec都是偏移了一个blck周期
这个结构体针对dac和adc,联合体Audio_Ctrl中,既定义了adc,也定义了dac
struct adc_dac_config_t
{
unsigned char power_up;
unsigned char left_power_up;
unsigned char right_power_up;
unsigned char mute;
unsigned char left_mute;
unsigned char right_mute;
unsigned char volume;
unsigned char left_volume;
unsigned char right_volume;
};
power_up左右都使能
left_power_up左边使能
right_power_up右边使能
3254这款codec的配置做的很细,为了减少代码量,可以直接用power_up,实现left_power_up加right_power_up的功能,如果想要分开设置,也可以单独进行left_power_up或者right_power_up,ioctl提供了三个命令(ADC_POWER_UP 、ADC_LEFT_POWER_UP 、ADC_RIGHT_POWER_UP)来实现这种功能。在其它的结构体中也可以看到大量这种形式的处理,下文不再单独描述
mute静音设置
volume音量调节
struct other_config_t
{
unsigned char loop_data_in_to_data_out;
unsigned char loop_adc_to_dac;
unsigned char micbias_power_up;
unsigned char micbias_output_voltage;
unsigned char micbias_voltage_source;
unsigned char adc_signal_block;
unsigned char dac_signal_block;
};
loop_data_in_to_data_out 数据从data in进入后,直接环出到data out,不经过任何通道、adc、dac之类的,这个一般是不用的,测试可以看有没用声音
loop_adc_to_dac 数据从adc进入,然后环出到dac,中间不经过其它处理,同上,一般不用,仅做测试
micbias_xxx 针对数字麦克风的,用不上的话就不用管,需要使用就参考3254的文档说明
adc_signal_block和dac_signal_block,是内置的处理算法,一般用默认的就行
struct agc_config1_t
struct agc_config2_t
struct agc_config3_t
struct agc_config4_t
agc这些参数我也不怎么懂,按照手册做了一下
struct audio_power_up_t {
unsigned char hp_power_up;
unsigned char hpl_power_up;
unsigned char hpr_power_up;
unsigned char lo_power_up;
unsigned char lol_power_up;
unsigned char lor_power_up;
unsigned char ma_power_up;
unsigned char mal_power_up;
unsigned char mar_power_up;
};
headphone,Mixer Amplifier、line out的使能
struct hp_route_t {
unsigned char ldac_hpl;
unsigned char in1l_hpl;
unsigned char mal_hpl;
unsigned char mar_hpl;
unsigned char ldac_hpr;
unsigned char rdac_hpr;
unsigned char in1r_hpr;
unsigned char mar_hpr;
unsigned char hpl_hpr;
};
headphone左右通道数据的来源,可以来自dac,in1,或者ma
struct lo_route_t {
unsigned char ldac_lol;
unsigned char rdac_lol;
unsigned char mal_lol;
unsigned char lor_lol;
unsigned char rdac_lor;
unsigned char mar_lor;
};
line out的左右通道数据来源
struct output_volume_t {
unsigned char hp_volume;
unsigned char hpl_volume;
unsigned char hpr_volume;
unsigned char lo_volume;
unsigned char lol_volume;
unsigned char lor_volume;
unsigned char in1l_hpl_volume;
unsigned char in1r_hpr_volume;
unsigned char ma_volume;
unsigned char mal_volume;
unsigned char mar_volume;
};
输出音频,主要是hp、lo、ma的音量,另外in1可以不经过其它处理,直接路由到hp,这个音量也是可以调节的
struct output_mute_t {
unsigned char hp_mute;
unsigned char hpl_mute;
unsigned char hpr_mute;
unsigned char lo_mute;
unsigned char lol_mute;
unsigned char lor_mute;
};
输出静音,没什么好说的
struct micpga_left_t {
unsigned char in1l_micpga;
unsigned char in2l_micpga;
unsigned char in3l_micpga;
unsigned char in1r_micpga;
unsigned char cm_micpga_via_cm1l;
unsigned char in2r_micpga;
unsigned char in3r_micpga;
unsigned char cm_micpga_via_cm2l;
};
struct micpga_right_t {
unsigned char in1r_micpga;
unsigned char in2r_micpga;
unsigned char in3r_micpga;
unsigned char in1l_micpga;
unsigned char cm_micpga_via_cm1r;
unsigned char in2l_micpga;
unsigned char in3l_micpga;
unsigned char cm_micpga_via_cm2r;
};
struct micpga_volum_t {
unsigned char power_up;
unsigned char left_power_up;
unsigned char right_power_up;
unsigned char volume;
unsigned char left_volume;
unsigned char right_volume;
};
https://blog.csdn.net/whitefish520/article/details/108129844
- 分享
- 举报
-
浏览量:6468次2020-08-24 21:24:41
-
浏览量:4141次2022-04-01 17:01:16
-
浏览量:3041次2020-08-03 11:02:46
-
浏览量:4279次2018-12-25 20:34:34
-
浏览量:3099次2017-11-22 19:41:21
-
浏览量:1225次2023-07-13 14:05:43
-
浏览量:3505次2018-02-06 10:43:46
-
浏览量:4293次2020-08-10 09:16:13
-
浏览量:3660次2022-01-04 09:00:18
-
浏览量:2985次2020-07-27 15:26:51
-
浏览量:3352次2020-03-26 15:59:03
-
浏览量:2386次2022-01-10 09:00:16
-
浏览量:3855次2020-09-24 11:58:24
-
浏览量:3751次2021-12-10 16:59:31
-
浏览量:3714次2020-08-25 18:10:00
-
浏览量:4844次2020-08-11 10:32:41
-
浏览量:1000次2024-01-24 18:13:58
-
浏览量:6470次2022-08-11 09:31:37
-
浏览量:913次2023-12-22 11:12:20
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
在学了在学了!
感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明