佚名通过本文主要向大家介绍了自己写的驱动,感觉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没有,说明在驱动加载过程中没有匹配好。缺乏一些重要的信息。

