RK3399使用ICS-43432音频录制Codec芯片

一、ICS-43432 简介

官网 ICS-43432

1.基本特征

  • 24-bit I2S interface
  • Wide Frequency Response from 50 Hz to 20 kHz
  • 用于录制的codec
    • 注意:一个codec一般只支持录制或者回放,例如回放就要用PCM5102 codec芯片

2.引脚说明

I2S总线主要有3个信号:串行时钟BCLK、帧时钟LRCK、串行数据SDATA;有时为了使系统间能够更好地同步,还需要另外传输一个信号MCLK,称为主时钟,也叫系统时钟(Sys Clock)。

  • 串行时钟BCLK:也叫SCLK,即对应数字音频的每一位数据,SCLK都有1个脉冲;SCLK的频率=2×采样频率×采样位数,2倍是因为I2S有左右两个通道。

  • 帧时钟LRCK:用于切换左右声道的数据。LRCK为“1”表示正在传输的是左声道的数据,为“0”则表示正在传输的是右声道的数据;LRCK的频率等于采样频率。

  • 串行数据SDATA:就是用二进制补码表示的音频数据。

对应SSI接口

  • FS:WS/LRCLK
  • CLK:SCK
  • DR:SD

3.时序图

I2S format: left-justified, right-justified, and PCM modes.

逻辑分析仪实测时序图

(LF:默认拉低,所以使用左声道录音,右声道没有数据)

  • 数据时钟频率是帧频率Fs的64倍(硬件配置决定)。
  • Data Word Length:24 bits/channel
    • 一个I2S数据帧可以携带1-2个通道的数据, 一个通道的data word长度一般为16, 24, or 32 bits.
  • Data Word Format:I2S, MSB-first.

二、RK3399 I2S配置

1.RK3399 I2S资源

  • I2S0接口有1路SDI,4路SDO,可以支持2个输入通道和8路输出声道。
  • I2S1接口有1路SDI,1路SDO,可以支持2个输入通道和2路输出声道。

2.RK3399 I2S DTS配置

  • I2S0

    &i2s0 {
      rockchip,i2s-broken-burst-len;
      rockchip,capture-channels = <8>;
      rockchip,playback-channels = <8>;
      #sound-dai-cells = <0>;
      status = "okay";
    };
    
    / {
      i2s0: i2s@ff880000 {
          compatible = "rockchip,rk3399-i2s", "rockchip,rk3066-i2s";
          reg = <0x0 0xff880000 0x0 0x1000>;
          rockchip,grf = <&grf>;
          interrupts = <GIC_SPI 39 IRQ_TYPE_LEVEL_HIGH 0>;
          dmas = <&dmac_bus 0>, <&dmac_bus 1>;
          dma-names = "tx", "rx";
          clock-names = "i2s_clk", "i2s_hclk";
          clocks = <&cru SCLK_I2S0_8CH>, <&cru HCLK_I2S0_8CH>;
          resets = <&cru SRST_I2S0_8CH>, <&cru SRST_H_I2S0_8CH>;
          reset-names = "reset-m", "reset-h";
          pinctrl-names = "default";
          pinctrl-0 = <&i2s0_8ch_bus>;
          power-domains = <&power RK3399_PD_SDIOAUDIO>;
          status = "disabled";
      };
    };
    
    &pinctrl {
      i2s0 {
              i2s0_8ch_bus: i2s0-8ch-bus {
                  rockchip,pins =
                      <3 24 RK_FUNC_1 &pcfg_pull_none>,
                      <3 25 RK_FUNC_1 &pcfg_pull_none>,
                      <3 26 RK_FUNC_1 &pcfg_pull_none>,
                      <3 27 RK_FUNC_1 &pcfg_pull_none>,
                      <3 28 RK_FUNC_1 &pcfg_pull_none>,
                      <3 29 RK_FUNC_1 &pcfg_pull_none>,
                      <3 30 RK_FUNC_1 &pcfg_pull_none>,
                      <3 31 RK_FUNC_1 &pcfg_pull_none>;
              };
    
              i2s_8ch_mclk: i2s-8ch-mclk {
                  rockchip,pins = <4 0 RK_FUNC_1 &pcfg_pull_none>;
              };
          };
    };
    
  • I2S1

    &i2s1 {
      rockchip,i2s-broken-burst-len;
      rockchip,playback-channels = <2>;
      rockchip,capture-channels = <2>;
      assigned-clocks = <&cru SCLK_I2S1_DIV>, <&cru SCLK_I2S_8CH>;
      assigned-clock-parents = <&cru PLL_GPLL>, <&cru SCLK_I2S1_8CH>;
      #sound-dai-cells = <0>;
      status = "okay";
    };
    
    / {
      i2s1: i2s@ff890000 {
          compatible = "rockchip,rk3399-i2s", "rockchip,rk3066-i2s";
          reg = <0x0 0xff890000 0x0 0x1000>;
          interrupts = <GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH 0>;
          dmas = <&dmac_bus 2>, <&dmac_bus 3>;
          dma-names = "tx", "rx";
          clock-names = "i2s_clk", "i2s_hclk";
          clocks = <&cru SCLK_I2S1_8CH>, <&cru HCLK_I2S1_8CH>;
          resets = <&cru SRST_I2S1_8CH>, <&cru SRST_H_I2S1_8CH>;
          reset-names = "reset-m", "reset-h";
          pinctrl-names = "default";
          pinctrl-0 = <&i2s1_2ch_bus>;
          power-domains = <&power RK3399_PD_SDIOAUDIO>;
          status = "disabled";
      };
    };
    
    &pinctrl {
      i2s1 {
              i2s1_2ch_bus: i2s1-2ch-bus {
                  rockchip,pins =
                      <4 3 RK_FUNC_1 &pcfg_pull_none>,
                      <4 4 RK_FUNC_1 &pcfg_pull_none>,
                      <4 5 RK_FUNC_1 &pcfg_pull_none>,
                      <4 6 RK_FUNC_1 &pcfg_pull_none>,
                      <4 7 RK_FUNC_1 &pcfg_pull_none>;
              };
          };
    };
    

三、I2S数据格式

1.I2S格式

image
  • LRCLK=0:左声道;LRCLK=1:右声道;

2.LJ (Left Justified)

image
  • LRCLK=0:右声道;LRCLK=1:左声道;

3.RJ (Left Justified)

image

4.I2S–八声道

image
  • 2个输入通道
  • 8个输出通道

四、设备树配置声卡驱动

  • 使用Simple-audio-card 作为 machine driver,是一个简化音频框架,在alsa上面的一个封装。

  • 使用dummy-codec虚拟声卡驱动,虚拟声卡,就是像这种soc外部没有外接codec的情况下,为了匹配声卡驱动框架,虚拟的一个设备,类似于占位符之类的东西的作用。

    • 使用dummy-codec也支持多声道,例如I2S0支持8个输出声道,2个输入声道,则可以在i2s0_sdo0---3接上4个回放型codec,在i2s0_sdi0接上1个录制型codec。linux系统使用aplay播放就可以选择8个通道,使用arecord录制可以选择2个通道。

    • 对于没有MCLK接口的Codec(如ICS-43432),可以不用配置MCLK;对于有MCLK接口的(如PCM1804),则需要配置

/ {
    dummy_codec: dummy-codec {
        compatible = "rockchip,dummy-codec";
        #sound-dai-cells = <0>;
        clocks = <&cru SCLK_I2S_8CH_OUT>;
        clock-names = "mclk";
        pinctrl-names = "default";
        pinctrl-0 = <&i2s_8ch_mclk>;    //指定MCLK引脚
        // capture-volume = <0>;
        status = "okay";
    };

    dummy-sound {
        status = "okay";
        compatible = "simple-audio-card";
        simple-audio-card,format = "i2s";
        simple-audio-card,name = "rk,dummy-codec";
        simple-audio-card,mclk-fs = <256>;  // 指定MCLK频率为帧频率Fs的256倍
        simple-audio-card,cpu {
            sound-dai = <&i2s1>;
        };
        simple-audio-card,codec {
            sound-dai = <&dummy_codec>;
            #sound-dai-cells = <0>;
        };
    };
};

五、数字音频的质量

1.香农采样定律

  • 采样频率只要大于2*Fs,采集的数据即可无失真的还原原始信号,常见的CD,采样率为44.1KHz;这样当采样频率达到48KHz时即可无失真采样还原所有的声音信号。

2.数字音频的质量影响因素

数字音频的质量取决于采样频率和量化位数这两个参数,为了保真,在时间变化方向上取样点尽量密,取样率要高;在幅度取值上尽量细,量化比特率要高,直接的结果就是存储容量及传输信道容量要求的压力大;

音频信号的传输率= 取样频率 × 样本的量化比特数 × 通道数。

# 对录制声卡进行音频录制,采样率为8KHz,量化比特数为16bits,信号通道数为2
$ arecord -D hw:2,0 -c 2 -f S16_LE -d 5 -v test.wav
Recording WAVE 'test.wav' : Signed 16 bit Little Endian, Rate 8000 Hz, Stereo
Hardware PCM card 2 'rk,dummy-codec' device 0 subdevice 0
Its setup is:
  stream       : CAPTURE
  access       : RW_INTERLEAVED
  format       : S16_LE
  subformat    : STD
  channels     : 2
  rate         : 8000
  exact rate   : 8000 (8000/1)
  msbits       : 16
  buffer_size  : 4000
  period_size  : 1000
  period_time  : 125000
  tstamp_mode  : NONE
  tstamp_type  : MONOTONIC
  period_step  : 1
  avail_min    : 1000
  period_event : 0
  start_threshold  : 1
  stop_threshold   : 4000
  silence_threshold: 0
  silence_size : 0
  boundary     : 9007199254740992000
  appl_ptr     : 0
  hw_ptr       : 0
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342