佚名通过本文主要向大家介绍了自己写的驱动,感觉probe函数应该要有打印信息的,没有打印是个什么鬼?等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题:自己写的驱动,感觉probe函数应该要有打印信息的,没有打印是个什么鬼?
描述:
将驱动加载进去只有__init 中的两个打印信息打印出来了,卸载驱动也只有__exit中的打印信息出来,
把pr_info换成printk也是这样,在这里省略去一些声明,编译是没错误没警告的,求大神解答
解决方案1:
不是,你先别急,函数被调用是因为系统检测到硬件,然后对应的device结构体添加到了系统中,才会调用。
请先确认以下问题:
1,对应的device结构体代码你添加了没?地址线设置的对不对?可以贴上来
2,在sys文件系统中,drivers下虽然没有,但是i2c总线下的device中是否你想加的设备,也请列出来 解决方案2:
描述:
本帖最后由 woshi_ziyu 于 2016-02-19 16:43:12 编辑
Linux驱动c语言probe
probe函数和detect函数应该都没有被执行啊,这probe函数不应该是在注册过程中就要被执行的么将驱动加载进去只有__init 中的两个打印信息打印出来了,卸载驱动也只有__exit中的打印信息出来,
把pr_info换成printk也是这样,在这里省略去一些声明,编译是没错误没警告的,求大神解答
static const unsigned short normal_i2c[2] = {QN8027ADDRESS, I2C_CLIENT_END};
static const __u32 twi_id = 2;
static int i2c_write_bytes(struct i2c_client *client, uint8_t *data, uint16_t len)
{
struct i2c_msg msg;
int ret=-1;
msg.flags = !I2C_M_RD;
msg.addr = client->addr;
msg.len = len;
msg.buf = data;
ret=i2c_transfer(client->adapter, &msg,1);
return ret;
}
static bool qn8027_i2c_test(struct i2c_client * client)
{
int ret, retry;
uint8_t test_data[1] = { 0 }; //only write a data address.
for(retry=0; retry < 2; retry++)
{
ret =i2c_write_bytes(client, test_data, 1); //Test i2c.
if (ret == 1)
break;
msleep(5);
}
return ret==1 ? true : false;
}
static int qn8027_probe(struct i2c_client * client, const struct i2c_device_id *id)
{
pr_info("[QN8027] %s enter \n", __FUNCTION__);
return 0;
}
static int qn8027_remove(struct i2c_client *client)
{
pr_info("[QN8027] %s enter \n", __FUNCTION__);
return 0;
}
static const struct i2c_device_id qn8027_id[] = {
{ QN8027_DRV_NAME, 2 },
{ }
};
MODULE_DEVICE_TABLE(i2c, qn8027_id);
static int qn8027_detect(struct i2c_client *client, struct i2c_board_info *info)
{
struct i2c_adapter *adapter = client->adapter;
int ret;
pr_info("[QN8027] %s enter \n", __FUNCTION__);
if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
return -ENODEV;
if(twi_id == adapter->nr)
{
pr_info("%s: addr= %x\n",__func__,client->addr);
ret = qn8027_i2c_test(client);
if(!ret)
{
pr_info("%s:I2C connection might be something wrong or maybe the other fm device equipment! \n",__FUNCTION__);
return -ENODEV;
}
else
{
pr_info("I2C connection sucess!\n");
strlcpy(info->type, QN8027_NAME, I2C_NAME_SIZE);
return 0;
}
}
else
{
return -ENODEV;
}
}
static struct i2c_driver qn8027_driver = {
.driver = {
.name = QN8027_DRV_NAME,
.owner = THIS_MODULE,
},
.probe = qn8027_probe,
.remove = qn8027_remove,
.id_table = qn8027_id,
.detect = qn8027_detect,
.address_list = normal_i2c,
};
static ssize_t set_qn8027(struct device_driver *driver,const char *buf,size_t count)
{
printk("[QN8027]:%s\n",__FUNCTION__);
return 0;
}
static ssize_t get_qn8027(struct device_driver *driver,char *buf)
{
printk("[QN8027]:%s\n",__FUNCTION__);
return 0;
}
static DRIVER_ATTR(qn8027, 0777, get_qn8027, set_qn8027);
static int __init qn8027_init(void)
{
int ret = -1;
printk("==========%s==========\n", __FUNCTION__);
ret = i2c_add_driver(&qn8027_driver);
if (ret < 0)
{
printk(KERN_INFO "add qn8027 i2c driver failed\n");
return -ENODEV;
}
ret = driver_create_file(&qn8027_driver.driver, &driver_attr_qn8027);
printk(KERN_INFO "add qn8027 i2c driver.\n");
return ret;
}
static void __exit qn8027_exit(void)
{
printk("++++++++++++%s+++++++++++\n", __FUNCTION__);
driver_remove_file(&qn8027_driver.driver, &driver_attr_qn8027);
i2c_del_driver(&qn8027_driver);
printk(KERN_INFO "remove qn8027 i2c driver.\n");
}
解决方案1:
不是,你先别急,函数被调用是因为系统检测到硬件,然后对应的device结构体添加到了系统中,才会调用。
请先确认以下问题:
1,对应的device结构体代码你添加了没?地址线设置的对不对?可以贴上来
2,在sys文件系统中,drivers下虽然没有,但是i2c总线下的device中是否你想加的设备,也请列出来 解决方案2:
这种遇到过,通常是板级文件没处理好造成的,init有,probe没有,说明在驱动加载过程中没有匹配好。缺乏一些重要的信息。