当前位置: 代码迷 >> 驱动开发 >> Linux 下I2C驱动的有关问题,求高手帮忙
  详细解决方案

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

热度:113   发布时间:2016-04-28 11:03:03.0
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;