- 论坛徽章:
- 0
|
2.6.36.2内核里的i2c_client怎么使用
最近在弄ok6410开发板,把以前在mini2440板子上能跑起来的fm驱动植入ok6410,但是出了问题,特来求救。。。
先说明一下,mini2440使用的内核是2.6.32.2,而ok6410的内核是2.6.36.2,
我把驱动的关键部分贴出来,给大家看看,出问题的地方就在i2c_fm_write函数里面的这句话上面:adap = fm->client->adapter;
我知道32和36内核关于i2c_adapter的定义是有区别的,但是关于这些没经验啊,不知道如何修改才能是驱动在36内核里跑起来,希望有过经验或是懂的能给点指导,非常感激了!
关键代码如下:
static struct fm_tea5767hn {
struct i2c_client *client;
} *fm;
static int fm_probe(struct i2c_client *client,const struct i2c_device_id *id)
{
printk("FM probe\n");
struct device *dev = &client->dev;
fm = kzalloc(sizeof(struct fm_tea5767hn), GFP_KERNEL);
if (fm == NULL) {
dev_err(dev, "failed to create our fm/n");
return -ENOMEM;
}
fm->client = client;
i2c_set_clientdata(client, fm);
dev_info(dev, "my fm client created/n");
return 0;
}
static int __devexit fm_remove(struct i2c_client *client)
{
printk(KERN_ALERT "FM removes\n");
fm = i2c_get_clientdata(client);
kfree(fm);
return 0;
}
static struct i2c_device_id fm_idtable[] = {
{ "fm", 0 },
{ }
};
static struct i2c_driver i2c_fm_driver = {
.driver = {
.name = "fm_driver",
.owner = THIS_MODULE,
},
.id_table = fm_idtable,
.probe = fm_probe,
.remove = fm_remove,
};
static void i2c_fm_init (void)
{
printk("I2C addr driver ready!\n");
if ((i2c_add_driver( &i2c_fm_driver )))
{
printk("I2C addr driver failed\n");
return;
}
}
static int i2c_fm_read(u8 *data)
{
struct i2c_msg msg;
struct i2c_adapter *adap;
char buf[5];
int i, ret;
for (i=0; i<5; i++)
buf[i]=0;
//initialize the message structure
msg.addr = I2C_ADDR_TEA5767HN; //i2c_fm_client.addr;
msg.flags = I2C_M_RD;
msg.len = 5;
msg.buf = buf;
adap = fm->client->adapter;
ret = i2c_transfer(adap, &msg, 1);
for (i=0; i<5; i++){
*data++ = buf[i]; //*p++ = buf[i];
}
//printk("read ret = %d \n",ret);
return ret;
}
static int i2c_fm_write (u8 *data)
{
struct i2c_msg msg;
struct i2c_adapter *adap;
char buf[5];
int i, ret;
for(i=0;i<5;i++){
buf[i] = *data++;
}
//initialize the message structure
msg.addr = I2C_ADDR_TEA5767HN;
msg.flags = 0;
msg.len = 5;
msg.buf = buf;
printk("msg is right! \n");
adap = fm->client->adapter;
printk("adapter is right! \n");
ret = i2c_transfer(adap, &msg, 1);
printk("write ret = %d \n",ret);
return ret;
} |
|