snd_soc_codec_driver裡面有:
- write : i2c_write
- read : i2c_read
所以如果想要 debug snd_soc_code driver,知道該 driver 對 i2c 的動作。
可以自己寫 i2c_read, i2c_write 放進去。
static unsigned int my_i2c_read(struct snd_soc_codec *codec, unsigned int reg)
{
struct my_priv *mypriv = snd_soc_codec_get_drvdata(codec);
int ret = -1;
unsigned char tx[1], rx[1];
struct i2c_msg xfer[2];
struct i2c_client *client = mypriv->i2c;
tx[0] = reg;
rx[0] = 0;
/* Write register */
xfer[0].addr = client->addr;
xfer[0].flags = 0;
xfer[0].len = 1;
xfer[0].buf = tx;
/* Read data */
xfer[1].addr = client->addr;
xfer[1].flags = I2C_M_RD;
xfer[1].len = 1;
xfer[1].buf = rx;
ret = i2c_transfer(client->adapter, xfer, 2);
if (ret != 2)
printk("\t%s error ret = %d\n", __func__, ret);
return (unsigned int)rx[0];
}
static int my_i2c_write(struct snd_soc_codec *codec, unsigned int reg,
unsigned int value)
{
struct my_priv *mypriv = snd_soc_codec_get_drvdata(codec);
int ret = -1;
unsigned char tx[2];
size_t len = 2;
if(reg==1)
value |= 0x02; // don't power off spk
tx[0] = reg;
tx[1] = value;
printk("\t %s: (addr,data)=(%x, %x)\n", __func__, reg, value);
ret = i2c_master_send(mypriv->i2c, tx, len);
if (ret != len)
return -EIO;
return 0;
}
但是要struct my_priv 要把 probe 時,register 的 i2c client 田進變數
struct my_priv {
struct i2c_client *i2c;
...
然後 module probe function...
static int my_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *id)
{
struct my_priv *mypriv;
mypriv = devm_kzalloc(&i2c->dev. sizeof(struct my_priv), GFP_KERNEL);
i2c_set_client_data(i2c, mypriv);
mypriv->i2c = i2c;
...
這樣,這個 driver call snd_soc_read/write 時,就會 call 到 自己的 i2c_read/write function.然後舊可以加 debug message...
但是這樣舊沒用到 regmap,所以 sys/kernel/debug/regmap/XXXX/registers 的內容不會顯示。
沒有留言:
張貼留言