i2c_add_driver函数用法

I2C的设备驱动是通过i2c_add_driver(&my_driver)向i2c-core注册的,my_driver中的核心是detach和attach函数,在attach中通过probe探测到总线上的设备并把设备和
驱动建立连接以完成设备的初始化。如何探测总线上的设备、Linux中i2c设备地址如何标识并引用?

I2C中, 典型的attach如下所示:
static int my_attach(struct i2c_adapter *adapter)
{
    returni2c_probe(adapter, &addr_data, my_probe);
}
static int my_probe(struct i2c_adapter *adapter, int address, intkind)
{
    ..........
}
addr_data是在 include/linux/i2c.h中定义的或自己在自己驱动程序中定义的一个i2c_client_address_data结构:
static struct i2c_client_address_data addr_data ={            \
    .normal_i2c    =normal_i2c,                    \
    .probe        =probe,                    \
    .ignore        =ignore,                    \
    .forces        =forces,                    \
}
若自己不定义,则用i2c.h中的默认定义。
struct i2c_client_address_data {
    unsignedshort *normal_i2c;
    unsignedshort *probe;
    unsignedshort *ignore;
    unsignedshort **forces;
};
根据作者自行定义设备地址与否,有两种情形:
a.采用默认定义,一般是不会work,毕竟大多数i2c-core中是不可能提前知道所接设备地址的,这样通过i2c_probe()探测肯定不可能找到,也不可能建立两者之间的联系;
况且,i2c_probe()属于i2c-core中的函数,i2c-core中管理着所有注册过的设备和驱动列表,i2c_probe()中也不能随意传入地址,否则容易导致系统混乱或有潜在的风险,
所以i2c-core也不允许这么做!
b. 作者自行定义地址结构
典型例子如下:
若自行定义,则参考如下:
static unsigned short normal_i2c[] ={I2C_KS0127_ADDON>>1,
                       I2C_KS0127_ONBOARD>>1,I2C_CLIENT_END};/// 实际设备的地址List
static unsigned short probe[2]=    {I2C_CLIENT_END,I2C_CLIENT_END};
static unsigned short ignore[2]=     {I2C_CLIENT_END,I2C_CLIENT_END};
static struct i2c_client_address_data addr_data = {
    normal_i2c,
    probe,
    ignore,
};
或者根本就不定义完整的i2c_client_address_data结构,只根据需要定义normal_i2c[],probe[],ignore[],forces[][],然后调用
i2c_probe(adapter,&addr_data, &my_probe) 即可。
在my_probe()中把实际的地址赋于i2c_client,调用i2c_set_clientdata()设置i2c_client->dev->drv_data,并调用i2c_attach_client(client)向系统注册设备。
最后,i2c_probe()中探测时的地址优先级:
forces[][], probe[], normal_i2c[](其中忽略ignore[]中的项)。
I2c设备在实际使用中比较广泛,sensor,rtc,audio, codec,etc.因设备复杂性不同,Linux中有些驱动中对地址的定义不在同一文件,这时多数情况都在arch中对设备作为
platform_device进行初始化并注册的代码中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/434727.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基因组印记

基因组印记是指来自父方和母方的等位基因在通过精子和卵子传递给子代时发生了修饰,使带有亲代印记的等位基因具有不同的表达特性,这种修饰常为DNA甲基化修饰,也包括组蛋白乙酰化、甲基化等修饰。在生殖细胞形成早期,来自父方和母方…

判断字段长度大于某长度_判断数据库性能只能通过count(*)?No,这些优化方案了解一下!...

大多数用户在体验数据库时,接触到的最早的sql语句就是count(*),因此用户判断数据库性能时通常也会通过count(*)进行比较。但在执行时通常会出现一个问题:对某个表做count(*)时需对全表数据进行扫描,当表中包含数据量较大的字段时&…

linux下i2c接口的电容触摸屏驱动开发

原文地址: http://hi.baidu.com/god_sperm/blog/item/2aaac228e8a1ece8e7cd400a.html 电容触摸屏 2011-01-14 15:36 1.Kconfig文件    增加宏定义 2.Makefile文件 增加编译处理 3.添加程序源码 Touch screen remote control design document 2010…

10 款基于 jQuery 的切换效果插件推荐

本文整理了 10 款非常好用的jQuery切换效果插件,包括平滑切换和重叠动画等,这些插件可以实现不同元素之间的动态切换。 1. InnerFade 这是一个基于jQuery的小插件,可以实现页面内的元素淡入淡出效果。 源码/演示 2. HighlightFade 该插件可以…

r语言ggplot2一夜多图_ggplot2绘图:多张图合并为一张

以下内容来自教程 R语言中多张图画到同一个页面上常用的函数为par()和layout() par()函数详解 layout()函数的简单使用 但是这两个函数不适用于ggplot2;ggplot2作图如果希望把多张图放到同一个页面上基本的解决办法是使用(The basic solution is to use the gridExtra R packa…

电容屏原理

电容屏 电容技术的触摸屏是一块四层复合玻璃屏,如下图所示。玻璃屏的内表面和夹层各涂有一层ITO导电层,最外层是只有0.0015毫米厚的矽土玻璃保护层。内层ITO作为屏蔽层,以保证良好的工作环境,夹层ITO涂层作为检测定位的工作层&am…

js矢量图类库:Raphaël—JavaScript Library

官方网址:http://raphaeljs.com/ Raphal is a small JavaScript library that should simplify your work with vector graphics on the web. If you want to create your own specific chart or image crop and rotate widget, for example, you can achieve it si…

sklearn 绘制roc曲线_如何用Tensorflow和scikit-learn绘制ROC曲线?

我试图从tensorflow提供的CIFAR-10示例的修改版本绘制ROC曲线。它现在为2类,而不是10如何用Tensorflow和scikit-learn绘制ROC曲线?的网络的输出被称为logits并采取以下形式:[[-2.57313061 2.57966399] [0.04221377 -0.04033273] [-1.42880082…

Linux的I2C 设备驱动 -- mini2440 上i2c接口触摸屏驱动

本篇记录在友善之臂 mini2440 平台上挂载I2C接口触摸屏的驱动开发过程。内核版本linux-2.6.32.2, 平台是ARM9 S3C2440I2C接口的触摸屏如上篇 Linux的I2C驱动体系结构讲述http://www.lupaworld.com/273398/viewspace-204237.html要挂载新的I2C设备,需要实现3部分&…

十六进制字符串转整形

System.Convert.ToInt32( "字符串 ",16); 转载于:https://www.cnblogs.com/dashi/archive/2011/12/22/4034737.html

gridview databind 会导致页面刷新马_Innodb批量页面刷盘情况下的quot;两次写quot;

//Innodb批量页面刷盘情况下的"两次写"//之前的文章中,我们介绍过innodb的两次写特性,这里给出链接:InnoDB的两次写特性今天我们完善一下这部分的内容。我们知道innodb数据页的默认大小是16kb,磁盘和内存通过数据页进行…

linux内核I2C子系统学习(一)

这部分准备分几个部分进行分析总结 因为I2C的通信肯定至少要有2个芯片完成,所以它的驱动是由2大部分组成:主芯片的i2c的驱动从芯片的i2c的驱动 注:万一选的都不支持咋办???(惨了,只能…

【转】excel表格导出集锦repeater实用,和普通用法

【http://www.cnblogs.com/s-y-l/archive/2011/12/23/2299008.html】下面导出excel主要解决repeater产生乱码的问题publicvoid CreateExcel(DataSet ds,string typeid,string FileName) { HttpResponse resp; resp Page.Response; …

什么是流量攻击? 流量攻击怎么处理?

由于DDoS攻击往往采取合法的数据请求技术,再加上傀儡机器,造成DDoS攻击成为最难防御的网络攻击之一。据美国最新的安全损失调查报告,DDoS攻击所造成的经济损失已经跃居第一。 传统的网络设备和周边安全技术,例如防火墙和IDSs(Intr…

django批量修改table_django-formset实现数据表的批量操作

什么是formset我们知道forms组件是用来做表单验证,更准确一点说,forms组件是用来做数据库表中一行记录的验证。有forms组件不同,formset是同科同时验证表中的多行记录,即formset是做表单批量验证的组件。批量添加首先要实例化form…

linux内核I2C子系统学习(二)

下面具体分析如何写第一部分:主控芯片的i2c驱动分为2个步骤:写总线驱动:选了个主控芯片,比如:S3C8900(自己瞎编的芯片)在driver/i2c/busses/i2c-s3c2410.c中没有找到这个芯片的I2C支持(总线驱动…

20111228_给窗体设置默认输入法

//给窗体设置默认输入法 //新建一个窗体类ImeForm,设置Form1:ImeForm public class ImeForm:System.Windows.Forms.Form { [DllImport("imm32.dll")] public static extern IntPtr ImmGetContext(IntPtr hWnd); [DllImport("imm32.dll")] publ…

efishell无法开机shell_开机出现efi shell卡住不动了解决方法全集

[文章导读] 最近有很多网友问我,为什么我的电脑开机后出现efi shell提示进不了系统,开机出现efi shell提示时,一般是由于第一启动项设置的是efi shell启动的,有的网友告诉我,我第一启动项明明设置的是硬盘启动&#xf…

linux内核I2C子系统学习(三)

写设备驱动:四部曲:构建i2c_driver注册i2c_driver构建i2c_client ( 第一种方法:注册字符设备驱动、第二种方法:通过板文件的i2c_board_info填充,然后注册) 注销i2c_driver 具体如下:…

Delphi环境中编写调用DLL的方法和技巧

Delphi环境中编写调用DLL的方法和技巧第一章 为什么要使用动态链接库(DLL) top 提起DLL您一定不会陌生,在Windows中有着大量的以DLL为后缀的文件,它们是保证Windows正常运行和维护升级的重要保证。(举个例子&#xff0…