[alsa-devel] CS8409 Macbook Pro 2016 2017

David Ulricht david.ulricht434 at gmail.com
Mon Nov 19 18:30:15 CET 2018


 I have found the schematics of the board its model A1708:
http://sualaptop365.edu.vn/threads/apple-macbook-pro-13-a1708-820-00875-051-02265-x502-mlb_catz-schematic-boardview.19646/
page 48 CS8409 audio codec GPIO7 is SDA GPIO6 is SCL.
page 50:  the four SSM3515B amplifiers connected to CS8409's I2C SDA/SCL
have found the datasheet of SSM3515 amplifiers as well:
https://www.analog.com/media/en/technical-documentation/data-sheets/SSM3515.pdf
Documentation says: If the REG_EN pin is tied to the PVDD the power-up
sequence is performed internally.
According to the SSM3515B REG_EN is also called C2.
According to the 1708 schematics(page 50) REG_EN also called C2, is
connected to ground. This means if REG_EN is connected to ground, it uses
an external 1.8V regulator (page 19 of SSM3515 pdf). e.g. the device needs
to be initialized via i2c commands. This means the 4 amplifiers SSM3515B
need to be initialized via i2c, because simply apple decided to disable
them by default for some reason probably save power while booting for
example.
Now I need to figure out how to send the i2c commands i have from windows10.
page 21: describes the I2C control which should be of help

The following windows 10 registry about i2c maybe of help, it has the
slaves addresses, the start/stop the powerup2c commands, everything
needed...:
"I2CSpeedMode"=dword:00000001
"I2CPolledMode"=dword:00000001
"I2CQuickMode"=dword:00000001
"I2CBusClear"=dword:00000006
"I2CSlave90Config"=dword:01002090
"InitI2C"=hex:01,90,3a,00,10,10,b0,00,1d,01,00,02,06,00,11,07,01,00,10,09,02,\

07,03,00,12,01,00,08,13,05,ff,06,00,07,20,02,0d,00,2a,02,02,03,00,04,00,05,\

02,06,00,07,20,08,02,09,00,0a,80,0b,02,0c,00,0d,a0,01,0c,00,29,02,01,03,02,\

04,00,05,00,01,01,00,11,01,0a,02,84,00,23,01,00,03,00,02,3f,00,20,01,03,00,\
  1b,75,b6,73,c2,00,11,29,01,21,f3,03,20,05,00,12,00,13,80,00,1c,03,c0
"n0AStreamStartI2C"=hex:01,90,02,00,11,01,02
"n0AStreamStopI2C"=hex:01,90,02,00,11,01,0a
"I2CSlave28Config"=dword:00004028
"I2CSlave2AConfig"=dword:0000402a
"I2CSlave2CConfig"=dword:0000402c
"I2CSlave2EConfig"=dword:0000402e
"n02PwrUpI2C"=hex:04,28,2a,2c,2e,07,00,81,01,11,02,32,03,48,04,11,05,10,00,80
"n03PwrUpI2C"=hex:01,28,01,05,00,01,2a,01,05,02,01,2c,01,05,01,01,2e,01,05,03
"ExitI2C"=hex:04,28,2a,2c,2e,01,00,83
"EQ1S1R7"=hex:1e,b2,9a,1a,df,15,c6,f4,11,19,91,ae,c6,f4,11,16,3b,23,16,3b,23,\
  d3,89,b9,1f,88,d9,c0,78,b8
"EQ1S2R7"=hex:16,3d,23,16,3d,23,d3,85,bb,1f,8e,8e,c0,73,03,14,62,da,12,94,45,\
  d9,23,c2,1d,b9,a4,c2,61,3d

Now comes the problem that I cannot write my own i2c driver to power up the
4 SSM3515B amps via the I2C on GPIO7/6 on CS8409.
I have no idea how to get a pointer to the i2c interface knowing the
GPIO7/6 are the i2c interface.
If someone helps me to get a C pointer to the i2c bus, I might be able to
read/write to it and test and figure it out.
I have only experimented with real i2c bus on Raspberry Pi with C code, and
it is completely different. I have there an /dev/i2c-l device that I can
write to file handle the bytes.
Please advise.

On Fri, Nov 16, 2018 at 7:31 PM Takashi Iwai <tiwai at suse.de> wrote:

> On Fri, 16 Nov 2018 17:50:24 +0100,
> David Ulricht wrote:
> >
> >     The stuff in sound/i2c/* are mostly for the i2c bus on a PCI sound
> >     cards, an implementation independent from the standard i2c stuff.
> >
> >     And, in your case, it's hard to know how the i2c bus is connected.
> >     If it's controlled over HD-audio GPIO pin (one for clk and one for
> >     data), then some stuff in sound/i2c can be re-used.  Or, if it's on
> >     another i2c bus, the story will be completely different...
> >
> > I have the schematics of the CS8409. the i2c is connected to the GPIO of
> the
> > HDA.
> >
> > MAX98374 has a Reset Low pin which is connected to GPIO 5 on the HDA
> > controller CS8409.  This must
> > be driven high, then wait for 1.5 ms.  Only then will the amps be out of
> > device shutdown.
> > GPIO6 is  8409_I2C_SCL
> > GPIO7 is  8409_I2C_SDA
> >
> > GPIO5 is AUD_SPKRAMP_RESET_L
> >
> > Knowing GPIO6 is the clock and GPIO7 is the data, how can I use them?
> > Can I use hda-verb /dev/snd/hwC0D0 0x01 XXX YYY ? what XXX YYY would be ?
>
> You need to set GPIO mask, direction then data.
>   0x01 SET_GPIO_MASK 0xXX
>   0x01 SET_GPIO_DIR 0xXX
>   0x01 SET_GPIO_DATA 0xXX
>
> The value to be pass is the bits.  GPIO0=0x01, GPIO1=0x02, GPIO3=0x04,
> ...
>
> You can read the data after setting mask and dir by 0x01
> GET_GPIO_DATA.  Pass 0 for the value, and you'll get a byte value as a
> read result.
>
>
> Takashi
>


More information about the Alsa-devel mailing list