Hello all,
I need some help about audio on a custom am335x board. I have done some changes on kernel but I couldn't hear anything.
We used I2C0 and there is no problem on communication with codec. In spite of communication, codec doesn't run properly. There is no bit clock and frame sync. clock on codec.
I can see below debugs while linux booting;
[ 0.098876] omap_mux_init: Add partition: #1: core, flags: 0
[ 0.100189] omap_i2c.1: alias fck already exists
[ 0.100708] omap2_mcspi.1: alias fck already exists
[ 0.100799] omap2_mcspi.2: alias fck already exists
[ 0.100952] edma.0: alias fck already exists
[ 0.100982] edma.0: alias fck already exists
[ 0.100982] edma.0: alias fck already exists
[ 0.111541] musb-ti81xx musb-ti81xx: musb0, board_mode=0x13, plat_mode=0x3
[ 0.111724] musb-ti81xx musb-ti81xx: musb1, board_mode=0x13, plat_mode=0x1
[ 0.112152] omap_i2c omap_i2c.1: bus 1 rev2.4.0 at 100 kHz
[ 0.133361] Advanced Linux Sound Architecture Driver Version 1.0.24. [ 1.490631] asoc: tlv320aic3x-hifi <-> davinci-mcasp.0 mapping ok
[ 1.497863] ALSA device list:
[ 1.500946] #0: AM335X EVM
And We used MCASP0 and i2c0 like below
board-am335xevm.c
static void i2c0_init(int evm_id, int profile)
{
setup_pin_mux(i2c0_pin_mux);
omap_register_i2c_bus(2, 100, am335x_i2c_boardinfo0, ARRAY_SIZE(am335x_i2c_boardinfo0));
return;
}
static struct pinmux_config i2c0_pin_mux[] = {
{"i2c0_sda.i2c0_sda", OMAP_MUX_MODE0 | AM33XX_SLEWCTRL_SLOW |
AM33XX_PULL_ENBL | AM33XX_INPUT_EN},
{"i2c0_scl.i2c0_scl", OMAP_MUX_MODE0 | AM33XX_SLEWCTRL_SLOW |
AM33XX_PULL_ENBL | AM33XX_INPUT_EN},
{NULL, 0},
};
static struct i2c_board_info am335x_i2c_boardinfo0[] = {
{
I2C_BOARD_INFO("tlv320aic3x", 0x1b),
},
};
/* Setup McASP 0 */
static void mcasp0_init(int evm_id, int profile)
{
/* Configure McASP */
setup_pin_mux(mcasp0_pin_mux);
am335x_register_mcasp(&am335x_evm_snd_data0, 0);
return;
}
/* Module pin mux for mcasp0*/
static struct pinmux_config mcasp0_pin_mux[] = {
{"mcasp0_aclkx.mcasp0_aclkx", OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLDOWN},
{"mcasp0_fsx.mcasp0_fsx", OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLDOWN},
{"mcasp0_axr0.mcasp0_axr0", OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLDOWN},
{"mcasp0_axr1.mcasp0_axr1", OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLDOWN},
{NULL, 0},
};
static struct snd_platform_data am335x_evm_snd_data0 = {
.tx_dma_offset = 0x46000000, /* McASP0 */
.rx_dma_offset = 0x46000000,
.op_mode = DAVINCI_MCASP_IIS_MODE,
.num_serializer = ARRAY_SIZE(am335x_iis_serializer_direction0),
.tdm_slots = 2,
.serial_dir = am335x_iis_serializer_direction0,
.asp_chan_q = EVENTQ_2,
.version = MCASP_VERSION_3,
.txnumevt = 1,
.rxnumevt = 1,
};
static u8 am335x_iis_serializer_direction0[] = {
TX_MODE, INACTIVE_MODE, RX_MODE, INACTIVE_MODE,
INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE,
INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE,
INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE,
};
static struct evm_dev_cfg gen_purp_evm_dev_cfg[] = {
{enable_ecap0, DEV_ON_BASEBOARD, (PROFILE_0 | PROFILE_1 |
PROFILE_2 | PROFILE_7) },
{lcdc_init, DEV_ON_BASEBOARD, (PROFILE_0 | PROFILE_1 |
PROFILE_2 | PROFILE_7) },
{tsc_init, DEV_ON_BASEBOARD, (PROFILE_0 | PROFILE_1 |
PROFILE_2 | PROFILE_7) },
{mii1_init, DEV_ON_BASEBOARD, PROFILE_ALL},// add by colin 20130709
{usb0_init, DEV_ON_BASEBOARD, PROFILE_ALL},
{usb1_init, DEV_ON_BASEBOARD, PROFILE_ALL},
{evm_nand_init, DEV_ON_BASEBOARD, (PROFILE_ALL & ~PROFILE_2 & ~PROFILE_3)},
{i2c0_init, DEV_ON_BASEBOARD, (PROFILE_ALL & ~PROFILE_2)},
{mcasp0_init, DEV_ON_BASEBOARD, (PROFILE_NONE)},
{mmc0_init, DEV_ON_BASEBOARD, (PROFILE_ALL & ~PROFILE_5)},
{mmc0_no_cd_init, DEV_ON_BASEBOARD, PROFILE_5},
{spi0_init, DEV_ON_BASEBOARD, PROFILE_2},
{uart4_init, DEV_ON_BASEBOARD, PROFILE_ALL},
{NULL, 0, 0},
};
davinci-evm.c
static struct snd_soc_dai_link am335x_evm_dai = {
.name = "TLV320AIC3X",
.stream_name = "AIC3X",
.cpu_dai_name = "davinci-mcasp.0",//1->0 revised colin 20130716
.codec_dai_name = "tlv320aic3x-hifi",
.codec_name = "tlv320aic3x-codec.2-001b",
.platform_name = "davinci-pcm-audio",
.init = evm_aic3x_init,
.ops = &evm_ops,
};