Jump to content

SPH0645 I2S microphone on NanoPi Neo Core


felipeduque

Recommended Posts

I was struggling to make SPH0645 I2S microphone to work with H3 mainline kernel (4.14.87), on NanoPi Neo Core. After weeks of distress, I finally made it work! Maybe some will find it useful. Here's what I did:

 

1- In file sound/soc/sunxi/sun4i-i2s.c, change the following line

 

{ SUN8I_I2S_RX_CHAN_SEL_REG, 0x00000000 }

to

{ SUN8I_I2S_RX_CHAN_SEL_REG, 0x00001000 }

You may have to download the linux-source package for your kernel version, or you can build your own kernel. It's weird that in legacy kernel, this register was assigned 0x00001000 by default (and the mic worked easily on that kernel). Not sure why it's changed.

 

I'm not sure if this register can be accessed through an overlay. I tried my best but could not find a way to do it. Please, someone let me know if it's possible to do that, so we can avoid the driver compiling stuff.

 

2- Compile, generate and load the new sun4i-i2s.ko module.

 

3- Create a .dts file, sph0645-overlay.dts, with the following contents:

 

 

Spoiler

/dts-v1/;
/plugin/;

/ {
    compatible = "allwinner,sun8i-h3";


    fragment@0 {
        target-path = "/";
        __overlay__ {
            adau7002_codec: adau7002_codec {
                #sound-dai-cells = <0>;
                compatible = "adi,adau7002";
                status = "okay";
            };
        };
    };

 

    fragment@1 {
        target = <&i2s0>;
        __overlay__ {
            status = "okay";
            pinctrl-0 = <&i2s0_pins>;
            sound-dai = <&adau7002_codec>;
            pinctrl-names = "default";
        };
    };

    fragment@2 {
        target-path = "/";
        __overlay__ {
            sound_i2s {
            compatible = "simple-audio-card";
            simple-audio-card,format = "i2s";
            simple-audio-card,name = "adau7002";
            simple-audio-card,bitclock-slave = <&dailink0_slave>; 
            simple-audio-card,frame-slave = <&dailink0_slave>; 
        simple-audio-card,mclk-fs = <512>;

            simple-audio-card,widgets = 
                    "Microphone", "Microphone Jack"; 
            simple-audio-card,routing = 
                    "PDM_DAT", "Microphone Jack"; 


            status = "okay";
            simple-audio-card,cpu {
                sound-dai = <&i2s0>;
            };
            dailink0_slave: simple-audio-card,codec {
                sound-dai = <&adau7002_codec>;

            };
            };
        };
    };
};

 

It's almost the same as the one @Valery Rezvyakov devised in this thread. The only difference is the line with

 

simple-audio-card,mclk-fs = <512>;

which specifies MCLK's oversample rate regarding the sampling frequency (i.e., if sampling frequency = 48KHz, mclk = 512 * 48k = 24,576MHz). As far as I understand, this is the base clock which generates other clock signals (bit clock, frame sync).  

 

4- Compile and add the .dts file.

 

5- Reboot and test with 

arecord -f S16_LE -c 2 -r 48000 -D hw:0,0 -v >test.wav

Please let me know if it works for you. Maybe I have forgotten something. 

Link to comment
Share on other sites

Thank you for your explanation. Unfortunately, I was not able to follow it completely... How exactly did you "compile, generate and load" the new .ko file? I downloaded the original sun4i-i2s.c.c file and made your recommended change. Then I want to build it using a Makefile, but I get the exception: /lib/modules/4.14.111/build No such file or directory. Am I missing some kernels? I am using the NanoPi Neo2 with kernel version 4.14.111.

 

Furthermore, if I try to build the dtb file based on your third step, I get: "Error: sph0645-overlay.dts:2.2-8 syntax error". This would indicate that the /plugin/ part is not working, or that the compiler does not understand this part... Do you have any tips on how to proceed?

 

Thanks in advance!

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
×
×
  • Create New...

Important Information

Terms of Use - Privacy Policy - Guidelines