首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 驱动开发 >

Linux 下I2C驱动的有关问题,求高手帮忙

2012-04-08 
Linux 下I2C驱动的问题,求高手帮忙。下面是我的程序,这个程序:tatic const struct i2c_device_id Colorado_

Linux 下I2C驱动的问题,求高手帮忙。
下面是我的程序,这个程序:
tatic const struct i2c_device_id Colorado_register_id[] = {
  { "Colorado_i2c", 0 },
  { }
};

MODULE_DEVICE_TABLE(i2c, Colorado_register_id);


//static struct i2c_driver Colorado_i2c_driver;
//static struct i2c_client *Colorado_i2c_client;

/*
static struct i2c_client *get_Colorado_i2c_client(void)
{
return Colorado_i2c_client;
}*/



static int Colorado_i2c_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
//int rc;


struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
struct colorado_data *data;
int err = 0;

if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE))
return -EIO;

data = kzalloc(sizeof(struct colorado_data), GFP_KERNEL);
if (!data)
return -ENOMEM;

data->client = client;
i2c_set_clientdata(client, data);
mutex_init(&data->lock);



/*
err = Colorado_System_Init();
if (err)
goto exit_kfree;

exit_kfree:
kfree(data);
return err;*/

/*
memcpy(&g_client, &client, sizeof(client));
if (!i2c_check_functionality(client->adapter,
I2C_FUNC_SMBUS_I2C_BLOCK)) {
dev_err(&client->dev, "i2c bus does not support the Colorado\n");
rc = -ENODEV;
goto exit;
}


return 0;

 exit:
return rc;*/
}

static int Colorado_i2c_remove(struct i2c_client *client)
{
return 0;
}


/*
static int Colorado_suspend(struct i2c_client *client)
{
return 0;
}
static int Colorado_resume(struct i2c_client *client)
{
return 0;
}*/

static struct i2c_driver Colorado_driver = {
  .driver = {
.name = "Colorado_i2c",
.owner = THIS_MODULE,
  },
  .probe = Colorado_i2c_probe,
  .remove = Colorado_i2c_remove,
  // .suspend = Colorado_suspend,
  // .resume = Colorado_resume,
  .id_table = Colorado_register_id,
};




void Colorado_work_func(struct work_struct * work)
{
// set_freezable();
//unsigned long interval = jiffies_to_msecs((unsigned long)((long) jiffies - last_jiffies));
//D("Colorado: Colorado_work_func() is called, intervel: %lu msec.\n", interval);
last_jiffies = (long) jiffies;

//D("Colorado_timer_handler\n");
if(timer_en_cnt > 0){
if(CoolHDModeGet() == 1)//if DP mode
{
DP_CTRL_Main_Procss();
}

bModeMonitor = CoolHDModeMonitor();

if((CoolHDModeGet())!= bModeMonitor)
{
D("switch to mode %.2x\n",(WORD)bModeMonitor);

CoolHDModeSet(bModeMonitor);

//DP_USB_Mode_Control(bModeMonitor);
}
timer_en_cnt--;
}

if(Colorado_enablef == ENABLE){
timer_en_cnt = 1;
}

queue_delayed_work(Colorado_workqueue, &Colorado_work, msecs_to_jiffies(500));
}

int Colorado_System_Init (void)
{
  int ret;
ret = DP_CTRL_Chip_Detect();
if(ret<0)
{
D("Chip detect error\n");
return -1;
}
//else

//D("chip not found");



//Chip initialization
DP_CTRL_Chip_Initial();

bCoolHdMode = CoolHDModeGet();

return 0;

//DP_USB_Mode_Control(bCoolHdMode);

}

static int __init Colorado_init(void)
{
int ret;

/* step 0 init Colorado_dev */
//Colorado_dev.misc_dev.minor = MISC_DYNAMIC_MINOR;
  //Colorado_dev.misc_dev.name = DEVICE_NAME;


  // Colorado_dev.misc_dev.fops = &Colorado_fops;
   
//Colorado_dev.open_cnt = 0;
//Colorado_dev.rate = 1000;
//Colorado_dev.Colorado_init_status = UNINITIALIZED;
//Colorado_enablef = DISABLE;
//Colorado_dev.Colorado_resolution = HDMI_1280x720;
//Colorado_dev.connect_status = UnPlug;
//Colorado_dev.rk28_output_status = LCD;
//timer_en_cnt = 0;
//Colorado_dev.timer = NULL;
//Colorado_dev.async_queue = NULL;

D("Colorado_init!!\n");

/* step 1 i2c_add_driver */
ret = i2c_add_driver(&Colorado_driver);
if (ret < 0){
E("i2c_add_driver err!\n");
goto err1;
}
  #if 0
/* step 2 add misc device */
ret = misc_register(&Colorado_dev.misc_dev);
if (ret < 0){
E("misc_register err!\n");
goto err2;
}
#endif
#if 0

/* step 3 init timer */
Colorado_workqueue = create_singlethread_workqueue("ANX7150_WORKQUEUE");

if (Colorado_workqueue == NULL)
{
printk("Colorado: Failed to creat work queue.\n");
goto err3;
}

last_jiffies = (long) jiffies;
INIT_DELAYED_WORK(&Colorado_work, Colorado_work_func);
queue_delayed_work(Colorado_workqueue, &Colorado_work, 0);
#endif


/*
ret = Colorado_timer_init(&Colorado_dev, Colorado_timer_handler);
if (ret < 0){
E("Colorado_timer_init err!\n");
goto err3;
}
*/


ret=Colorado_System_Init();
//Colorado_enable(&Colorado_dev);
  if (ret < 0){
E("Colorado_System_init err!\n");
goto err2;
}
return 0;

//err2:
//misc_deregister(&Colorado_dev.misc_dev);
err1:
i2c_del_driver(&Colorado_driver);
err2:
return ret;
}

static void __exit Colorado_exit(void)
{
D("Colorado_exit!!\n");

//Colorado_timer_uninit(&Colorado_dev);
//misc_deregister(&Colorado_dev.misc_dev);
i2c_del_driver(&Colorado_driver);
}


unsigned char DP_TX_Write_Reg(unsigned char dev,unsigned char offset, unsigned char d)
{
  int rc;
  g_client-> addr=dev >> 1;
  rc=i2c_smbus_write_byte_data(g_client, offset, d);
  //printk("Colorado: Failed to creat work queue.\n");
// msleep(10);
  return 0;

}

unsigned char DP_TX_Read_Reg(unsigned char dev,unsigned char offset, unsigned char *d)
{
  int rc;
  g_client-> addr=dev >> 1;
  rc=i2c_smbus_read_byte_data(g_client, offset);
  *d=rc;
// msleep(10);
  return 0;
   
}


下面是出错信息:
CPU: 0 Not tainted (2.6.32.9 #18)  
PC is at DP_TX_Read_Reg+0x24/0x40  
LR is at DP_TX_Chip_Located+0x28/0x90  
pc : [<c01ddd50>] lr : [<c01e1744>] psr: 60000013  
sp : ea833f30 ip : c01ddd40 fp : ea833f44  
r10: 00000000 r9 : 00000000 r8 : 00000000  
r7 : 00000000 r6 : 00000000 r5 : 00000000 r4 : ea833f4f  
r3 : c0591c3c r2 : 00000000 r1 : 00000002 r0 : 00000039  
Flags: nZCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment kernel  
Control: 10c5387d Table: 20004019 DAC: 00000017  
   
PC: 0xc01ddcd0:  
dcd0 ebf94515 e59f3048 e1a04000 e5830000 e5903018 e1a00003 e593300c e1a0e00f  
dcf0 e593f008 e2000303 e3500303 0280033d 089da818 e2840020 eb00cc94 e5942028  
dd10 e1a01000 e59f000c eb06217e e3e00012 e89da818 c0591c3c c0471524 e1a0c00d  
dd30 e92dd818 e24cb004 e92d4000 ebf944fa e59f3020 e1a04002 e1a000a0 e5932000  
dd50 e1c200b2 e5930000 eb023b4d e5c40000 e3a00000 e89da818 c0591c3c e1a0c00d  


dd70 e92dd800 e24cb004 e92d4000 ebf944ea e59f3018 e1a000a0 e593c000 e1cc00b2  
dd90 e5930000 eb023b29 e3a00000 e89da800 c0591c3c e1a0c00d e92dd800 e24cb004  
ddb0 e92d4000 ebf944dc eb0005d3 eb0005c0 eb0000d2 e59f3008 e5c30004 e3a00000  
3fe0: c0030140 00000000 00000000 ea833ff8 c0030140 c00083e0 ffffffff ffffffff  
[<c01ddd50>] (DP_TX_Read_Reg+0x24/0x40) from [<c01e1744>] (DP_TX_Chip_Located+0)
[<c01e1744>] (DP_TX_Chip_Located+0x28/0x90) from [<c01df524>] (DP_CTRL_Chip_Det)
[<c01df524>] (DP_CTRL_Chip_Detect+0x18/0x1c) from [<c01dddbc>] (SlimPort_System)
[<c01dddbc>] (SlimPort_System_Init+0x18/0x34) from [<c0019c8c>] (Colorado_init+)
[<c0019c8c>] (Colorado_init+0xd8/0x10c) from [<c002e3e4>] (do_one_initcall+0x6c)
[<c002e3e4>] (do_one_initcall+0x6c/0x1bc) from [<c0008470>] (kernel_init+0x9c/0)
[<c0008470>] (kernel_init+0x9c/0x118) from [<c0030140>] (kernel_thread_exit+0x0)
Code: e59f3020 e1a04002 e1a000a0 e5932000 (e1c200b2)  
---[ end trace da227214a82491b7 ]---  
Kernel panic - not syncing: Attempted to kill init!  



[解决办法]
反正你是在DP_TX_Read_Reg函数里死掉了
你打印log看看g_client值,在死掉前是个啥值。

热点排行