海思hi3531d音频外接codec (tlv320aic32x4)(二)

在学了在学了! 2020-08-24 21:28:44 3292

与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

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包 点赞 收藏 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
在学了在学了!
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区