当前位置:  技术问答>linux和unix

关于LINUX I2C驱动的Probe方法

    来源: 互联网  发布时间:2016-11-11

    本文导语:  我在编写LINUX I2C驱动时,使用了Probe方式。因为是为Input设备编写的,所以参照了在driversinputkeyboard下的很多驱动,例如adp588-key.c,他们都是使用Probe方式。文档上说(linux-2.6.32.2Documentationi2cinstantiating-devices),利用pro...

我在编写LINUX I2C驱动时,使用了Probe方式。因为是为Input设备编写的,所以参照了在driversinputkeyboard下的很多驱动,例如adp588-key.c,他们都是使用Probe方式。文档上说(linux-2.6.32.2Documentationi2cinstantiating-devices),利用probe方法会自动生成i2c_client.会自动调用i2c_driver的.probe。可我编写的驱动没有自动调用i2c_driver的.probe,在此请教高手。声明:我是新手。

文档上描述的方法:
Method 1: Declare the I2C devices by bus number
-----------------------------------------------

This method is appropriate when the I2C bus is a system bus as is the case
for many embedded systems. On such systems, each I2C bus has a number
which is known in advance. It is thus possible to pre-declare the I2C
devices which live on this bus. This is done with an array of struct
i2c_board_info which is registered by calling i2c_register_board_info().

Example (from omap2 h4):

static struct i2c_board_info __initdata h4_i2c_board_info[] = {
{
I2C_BOARD_INFO("isp1301_omap", 0x2d),
.irq = OMAP_GPIO_IRQ(125),
},
{ /* EEPROM on mainboard */
I2C_BOARD_INFO("24c01", 0x52),
.platform_data = &m24c01,
},
{ /* EEPROM on cpu card */
I2C_BOARD_INFO("24c01", 0x57),
.platform_data = &m24c01,
},
};

static void __init omap_h4_init(void)
{
(...)
i2c_register_board_info(1, h4_i2c_board_info,
ARRAY_SIZE(h4_i2c_board_info));
(...)
}

The above code declares 3 devices on I2C bus 1, including their respective
addresses and custom data needed by their drivers. When the I2C bus in
question is registered, the I2C devices will be instantiated automatically
by i2c-core.

The devices will be automatically unbound and destroyed when the I2C bus
they sit on goes away (if ever.)
---------------------------------------------------------------------------------
对应我的驱动:
static struct i2c_board_info __initdata xxx_i2c_board_info[] = {
{
I2C_BOARD_INFO("xxx", 0x58),
.irq = IRQ_EINT18,
.platform_data = (void *)&xxx_kpad_data,
},
}
static const struct i2c_device_id xxx_id[] = {
{"xxx", 0 },
{ }
};
MODULE_DEVICE_TABLE(i2c, xxx_id);

static struct i2c_driver xxx_driver = {
.driver = {
.name = "xxx",
},
.probe    = xxx_probe,
.remove   = __devexit_p(xxx_remove),
.id_table = xxx_id,
};

static int __init xxx_init(void)
{
//register board info xxx
i2c_register_board_info(0, xxx_i2c_board_info, ARRAY_SIZE(xxx_i2c_board_info));
return i2c_add_driver(&xxx_driver);
}
我满心希望xxx_probe会自动调用,但是并没有。希望大侠指点。再者,能否说明一下这总自动生成、调用的来龙去脉!
如果编译有什么关键点,也请指出。我的平台:s3c2440  linux内核:2.6.32

|
个人猜测是这样的,注册的i2c_board_info数组中的信息没有生成i2c_client.

i2c_register_board_info的传统用法是在内核初始化时,在i2c_adapter注册之前。这点注释中已经说明了。查看i2c_adapter的注册代码可以发现,i2c_adapter注册的时候会扫描已经注册的board_info的链表,为每一个注册的信息调用i2c_new_device函数生成i2c_client,这样在i2c_driver注册的时候,设备和驱动就能匹配并调用probe.

如果楼主在adapter注册之后调用i2c_register_board_info,注册的信息没有机会生成i2c_client,从而无法与i2c_driver匹配,当然不会调用probe。

我是从代码中得到的结论。
我的博客讲了一种i2c的用法,楼主可以参考:http://blog.csdn.net/yuanlulu/archive/2011/01/24/6161698.aspx

|
probe 被调用的前提是 driver 和device 配对成功
检查一下 总线的 driver 和 device 是否配对成功 深入到 i2c_add_driver 函数面了解一下   

|
检查一下i2c_register_board_info的返回值。

这个函数的第一个参数是总线编号,你试试其它编号,比如1、2

|
moduler_init(init_func);
这里init_func函数会被调用到,然后在里面调用probe

|
/**
 * i2c_register_board_info - statically declare I2C devices
 * @busnum: identifies the bus to which these devices belong
 * @info: vector of i2c device descriptors
 * @len: how many descriptors in the vector; may be zero to reserve
 * the specified bus number.
 *
 * Systems using the Linux I2C driver stack can declare tables of board info
 * while they initialize.  This should be done in board-specific init code
 * near arch_initcall() time, or equivalent, before any I2C adapter driver is
 * registered.  For example, mainboard init code could define several devices,
 * as could the init code for each daughtercard in a board stack.
 *
 * The I2C devices will be created later, after the adapter for the relevant
 * bus has been registered.  After that moment, standard driver model tools
 * are used to bind "new style" I2C drivers to the devices.  The bus number
 * for any device declared using this routine is not available for dynamic
 * allocation.
 *
 * The board info passed can safely be __initdata, but be careful of embedded
 * pointers (for platform_data, functions, etc) since that won't be copied.
 */

    
 
 

您可能感兴趣的文章:

  • UIO(linux Userspace I/O子系统)用户空间设备驱动I/O技术介绍
  • Linux环境下,“PC机的驱动”与“嵌入式驱动”有什么区别?
  • linux驱动 单片机驱动
  • linux:怎么在驱动中调用IIC驱动?
  • linux下一个驱动怎么调用另一个驱动
  • redhat linux 9 与WNI xp共存一硬盘,显卡为 ATI RADEON 9600 可linux给出的驱动却是Vesa 的,我从驱动列表里选择了ATI RADEON 9600可是
  • Linux环境下,如何一个驱动中调用另外一个驱动
  • 我的网卡在redhat7.3下不能自动驱动,但我有for linux的驱动程序,请问如何才能驱动我的网卡,我是菜菜,请详细说明,谢谢!
  • Linux 9.0+865G,只能上到640×480,Intel官方站点的最新驱动安装失败,那位有驱动?
  • Linux设备驱动(第三版)- 字符设备驱动 - 例子
  • Linux源代码中ata驱动为什么要调用pci驱动的代码
  • 请教有关linux驱动开发,按关机键关机时,驱动应作哪些结束工作?
  • 小弟之前学过wince驱动,想入们linux驱动
  • 请问, linux 驱动中, IO 口变化了,驱动如何通知应用程序?
  • 官方都只发布Windows驱动,无原理图,如何自已为它写Linux驱动?提供点手段思路
  • 关于Linux 2.6平台下,自定义的USB HID设备是系统提供驱动程序还是需要自己完成驱动程序?
  • 关于LINUX下1024*768显示问题,是不是因为没有驱动显卡才不能设置,如果是的话应该怎么驱动
  • linux的驱动 和 android的驱动 有区别吗?
  • 我的笔机本装的是redhat7.2,从网上下了个显卡驱动(xxx.o的文件),请问怎样安装这个驱动?(我以拷到linux盘下)?
  • linux 2.6.15 中被编译为模块的驱动test.ko,应该放在什么路径下才能使得在需要该驱动时,由内核自动加载?谢谢
  • 请问做好的驱动,发布给用户的时候,用户必须要在各自的Linux中重新编译驱动源码才能使用吗?
  • secureCRT下Linux终端汉字乱码解决方法
  • 请问大家:我先装windows然后用虚拟机的方法装linux,可是装后,启动linux界面,其下面
  • Linux/CentOS下的CST和UTC时间的区别以及不一致的解决方法
  • linux下安装oracle后使用命令行启动的方法 linux启动oracle
  • Linux_centos_redhat下tar命令解压tgz文件方法
  • 在线等:我想备份我的LINUX系统,有何方法啊!GHOST行吗?还原后LINUX还能启动吗?
  • mount命令(linux操作系统)挂载卸载文件系统(cifs,光驱,nfs等)方法介绍
  • 在linux中一般软件的安装方法??
  • Linux下时钟同步问题:Clock skew detected原因分析及解决方法
  • 我用的是红帽5 我想知道我LINUX下的KDbg的使用方法
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux驱动中probe函数中参数传递问题?
  • linux c/c++ IP字符串转换成可比较大小的数字
  • 在win分区上安装linux和独立分区安装linux有什么区别?可以同时安装吗?(两个linux系统)
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 在虚拟机上安装的linux上,能像真的linux系统一样开发linux程序么?
  • Linux c字符串中不可打印字符转换成16进制
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在有linux的盘)
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • 安装vmware软件,不用再安装linux系统,就可以模拟linux系统了,然后可以在其上学习一下LINUX下的基本操作 了?
  • linux命令大全详细分类介绍及常用linux命令文档手册下载
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux
  • Linux Kernel 'sctp_v6_xmit()'函数信息泄露漏洞
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在没有linux的盘,只有DOS启动盘)
  • linux c下利用srand和rand函数生成随机字符串
  • 如何让win2000和linux共存。我装好WIN2000,再装LINUX7.0,但LILO只能找到LINUX,不能引导WIN2000
  • Linux c++虚函数(virtual function)简单用法示例代码
  • 在windows中的VMware装了个linux,主板有两个串口,能做windows和linux的串口通信测试么,怎么测试这两个串口在linux是有效
  • Docker官方镜像将会使用Alpine Linux替换Ubuntu
  • 我们网站的服务器从windows2000迁往linux,ASP程序继续使用,可是我连LINUX的皮毛都不了解,大家告诉我LINUX下怎么建网站??
  • Linux下chmod命令详细介绍及用法举例
  • 中文Linux与西文Linus分别哪一个版是权威?I认为是:中科软的白旗Linux与西文的绿帽子Linux!大家的看法呢?
  • Linux下c基于openssl生成MD5的函数
  • 我重装了winme,却进不了Linux了,而我现在又没有Linux光盘,也没有Linux启动盘,还有没有办法?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3