• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >嵌入式开发 > 自己写的驱动,感觉probe函数应该要有打印信息的,没有打印是个什么鬼?

自己写的驱动,感觉probe函数应该要有打印信息的,没有打印是个什么鬼?

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-05

佚名通过本文主要向大家介绍了自己写的驱动,感觉probe函数应该要有打印信息的,没有打印是个什么鬼?等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题:自己写的驱动,感觉probe函数应该要有打印信息的,没有打印是个什么鬼?
描述:

本帖最后由 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:

引用 5 楼 ouchao0727 的回复:
Quote: 引用 3 楼 yilonglucky 的回复:

如果你确认qn8027_init(void)中的printk("==========%s==========\n", __FUNCTION__);  已经打印出来,那就说明你的probe函数确实没有被调用。没有被调用的原因是系统没有识别到你的i2c设备硬件。
请检查下你的i2c设备挂接的是哪条i2c总线,设备地址是多少,device结构体添加到内核中了吗?
我还是不是很明白,我的想法是通过detect函数来检测一个硬件设备的存在然后把设备添加进i2c总线 然而detect函数也没有被调用

不是,你先别急,函数被调用是因为系统检测到硬件,然后对应的device结构体添加到了系统中,才会调用。
请先确认以下问题:
1,对应的device结构体代码你添加了没?地址线设置的对不对?可以贴上来
2,在sys文件系统中,drivers下虽然没有,但是i2c总线下的device中是否你想加的设备,也请列出来

解决方案2:

这种遇到过,通常是板级文件没处理好造成的,init有,probe没有,说明在驱动加载过程中没有匹配好。缺乏一些重要的信息。


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 自己写的驱动,感觉probe函数应该要有打印信息的,没有打印是个什么鬼?

相关文章

  • 2017-06-05 非root用户修改给自己用的DNS
  • 2017-06-05 关于vxworks69的问题?
  • 2017-06-05 tilcon能做多窗口的应用程序吗?
  • 2017-06-05 user_modebuffer&kernel_modebufferproblen
  • 2017-06-05 自己写了温湿度SHT11的协议但测量出的值错误,不知道哪里错了。
  • 2017-06-05 我已经成功做了一个中间层的驱动,如PPPoE拨号驱动,但我想在Win98下安装后也不用重启也可以正常使用,如何才能实现?
  • 2017-06-05 请问io和pciio是不是同样的?
  • 2017-06-05 我手里有一块飞凌嵌入式的iMX6开发板,开机默认语言怎么更改为英文
  • 2017-06-05 Vxwork下USBHost与USBHun数据包错误
  • 2017-06-05 wince70拨号上网打开COM口失败

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 以太网芯片选型求教
    • 菜鸟学习写驱动
    • 新手,请各位指教
    • 求指点,VLC直播流时AAC无声音!
    • 求教内存映射问题
    • 嵌入式系统开发环境和调试方式
    • 关于Unix驱动的问题
    • 给初学wdm驱动的忠告
    • 关于移植数学函数的问题!
    • 一些虚拟摄像头的原理是什么,如何编写的啊?

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有