TDA7415内部的寄存器比较少,共32个,实际只会使用0~23和31这25个。其中0~23是功能寄存器,31寄存器是用于测试的。调试这个片子,建议先从测试寄存器入手,在其内部写入0x3E,这样就可以在相应的引脚上测得一个200KHz的信号。如果顺利到这一步,基本可以放心了,IIC通讯没有问题,写寄存器没有问题。千万记住,不要想当然的通过读取寄存器的方法来确定IIC通讯是否有问题。接下来就是按照它的文档配置那24个寄存器。
/*
* INIT part
*/
static const struct i2c_device_id tda7415_id[] = {
{"tda7415-i2c", 0},
{},
};
MODULE_DEVICE_TABLE(i2c, tda7415_id);
static struct i2c_driver tda7415_i2c_driver = {
.driver = {
.name = "tda7415-i2c",
.owner = THIS_MODULE,
},
.probe = tda7415_i2c_probe,
.remove = __devexit_p(tda7415_i2c_remove),
.id_table = tda7415_id,
};
static int __init alsa_tda7415t_init(void)
{
return i2c_add_driver(&tda7415_i2c_driver);
}
static void __exit alsa_tda7415t_exit(void)
{
i2c_del_driver(&tda7415_i2c_driver);
}
module_init(alsa_tda7415t_init);
module_exit(alsa_tda7415t_exit);
static __devinit int tda7415_i2c_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
struct tda7415_drvdata *drv_data;
struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
printk("Debug at func %s(),line %d by tongjiang/n",__FUNCTION__,__LINE__);
drv_data = kmalloc(sizeof(struct tda7415_drvdata), GFP_KERNEL);
if (drv_data == NULL)
{
printk(&client->dev, "DEV %s,lack of kernel memory!/n");
return -ENOMEM;
}
if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
{
printk(&adapter->dev,
"DEV %s,I2C-Adapter doesn't support I2C_FUNC_SMBUS_WORD/n");
return -EIO;
}
drv_data->client = client;
i2c_set_clientdata(client, drv_data);
mutex_init(&drv_data->lock);
tda7415_init_client(client);
return 0;
}
static struct i2c_board_info mxc_i2c0_board_info[] __initdata = {
{
.type = "ov3640",
.addr = 0x3C,
.platform_data = (void *)&camera_data,
},
{
.type = "tda7415-i2c",
.addr = 0x46,
}
};
static int tda7415_init_client(struct i2c_client *client)
{
int i;
struct tda7415_drvdata *tda7415_data = i2c_get_clientdata(client);
u8 reg;
u8 data;
int ret = 0;
if (NULL == tda7415_data)
{
return -ENOMEM;
}
printk("Debug at func %s(),line %d by tongjiang/n",__FUNCTION__,__LINE__);
tda7415_data->audio7415_regbuf[0] = 0xff;
tda7415_data->audio7415_regbuf[1] = 0xd0;
tda7415_data->audio7415_regbuf[2] = 0xfe; //bass:40hz
tda7415_data->audio7415_regbuf[3] = 0xff;
tda7415_data->audio7415_regbuf[4] = 0xff;
tda7415_data->audio7415_regbuf[5] = 0xfe;
tda7415_data->audio7415_regbuf[6] = 0xff; //full mute
tda7415_data->audio7415_regbuf[7] = 0xff; //full mute
tda7415_data->audio7415_regbuf[8] = 0xff; //full mute
tda7415_data->audio7415_regbuf[9] = 0x30; //fast charge: must be setting release
tda7415_data->audio7415_regbuf[10] = 0x7c;
tda7415_data->audio7415_regbuf[11] = 0xec; //center, subwoof of the mix channel from AC3; Jowen.xiao091112
tda7415_data->audio7415_regbuf[12] = 0x76; //left & right channel high filter bypass
tda7415_data->audio7415_regbuf[13] = 0x70;
tda7415_data->audio7415_regbuf[14] = 0x70;
tda7415_data->audio7415_regbuf[15] = 0x70;
tda7415_data->audio7415_regbuf[16] = 0x70;
tda7415_data->audio7415_regbuf[17] = 0xf6; //stereo bypass
tda7415_data->audio7415_regbuf[18] = 0x70;
tda7415_data->audio7415_regbuf[19] = 0x70;
tda7415_data->audio7415_regbuf[20] = 0xfe;
tda7415_data->audio7415_regbuf[21] = 0xc8;
tda7415_data->audio7415_regbuf[22] = 0xf6;//y11110110;//sotf-mute time 5ms, soft-step 2.56ms
tda7415_data->audio7415_regbuf[23] = 0xf1;
memset(&tda7415_data->audio7415.curr_ch, 0, sizeof(Audio7415Struct));
tda7415_data->audio7415.bas = 0;
tda7415_data->audio7415.tre = 0;
tda7415_data->audio7415.mid = 0;
tda7415_data->audio7415.balance = 0;
tda7415_data->audio7415.fader = 0;
tda7415_data->audio7415.subwoof = 0;
tda7415_data->audio7415.center = 0;
reg = 0x5f;
data = 0x3E;
ret = tda7415_reg_write(client,reg,data);
printk("Initial write of tda7415 write over ret = %d/n",ret);
/*
for (i = 0; i < ARRAY_SIZE(tda7415_data->audio7415_regcache); i++)
{
int v = i2c_smbus_read_byte_data(client, i);
if (v < 0)
{
return -ENODEV;
}
tda7415_data->audio7415_regcache[i] = v;
}
for (i = 0; i < ARRAY_SIZE(tda7415_data->audio7415_regcache); i++)
{
printk("Debug read byte 0 is %d",tda7415_data->audio7415_regcache[i]);
}
*/
return 0;
}