I2C子系统

核心 i2c_driver 结构体

分配、设置、注册一个i2c_driver结构体

static struct i2c_driver i2c_example_driver = {

.driver = {

.name = "example",

.of_match_table = of_match_ids_example,

},

.probe = i2c_example_driver_probe,

.remove = i2c_example_driver_remove,

.id_table = example_ids,

};

出入口函数

/*入口函数 注册一个i2c_drvier */

static int __init i2c_driver_init(void)

{

return i2c_add_driver(&i2c_example_driver);

}

module_init(i2c_driver_init);

/**出口函数 del一个i2c_drvier */

static void __exit i2c_driver_exit(void)

{

i2c_del_driver(&i2c_example_driver);

}

i2c_driver表明能支持哪些设备

i2c_driver表明能支持哪些设备:

使用of_match_table来判断

设备树中,某个I2C控制器节点下可以创建I2C设备的节点

如果I2C设备节点的compatible属性跟of_match_table的某项兼容,则匹配成功

i2c_client.name跟某个of_match_table[i].compatible值相同,则匹配成功 static const struct of_device_id of_match_ids_example[] = {

{ .compatible = "com_name,chip_name", .data = NULL},

{ /* END OF LIST */ } /*最后空一项为必须,空闲为end 判断条件*/

};

// of_ 开头一般与设备树关联

使用id_table来判断

i2c_client.name跟某个id_table[i].name值相同,则匹配成功 static const struct i2c_device_id example_ids[] = {

{ "chip_name", (kernel_ulong_t)NULL },

{ /* END OF LIST */ }

};

i2c_driver跟i2c_client匹配成功后,就调用i2c_driver.probe函数。

i2c_client

参考资料 Linux内核文档: 5.0版本内核

Documentation\i2c\instantiating-devices.rst

Documentation\i2c\writing-clients.rst

i2c_client表示一个I2C设备,创建i2c_client的方法有4种:

方法1

通过I2C bus number来创建 int i2c_register_board_info(int busnum, struct i2c_board_info const *info, unsigned len);

通过设备树结点 /* 在某个I2C控制器的节点下,添加如下代码: */

ap3216c@1e {

compatible = "lite-on,ap3216c";

reg = <0x1e>;

};

方法2

有时候无法知道该设备挂载哪个I2C bus下,无法知道它对应的I2C bus number。 但是可以通过其他方法知道对应的i2c_adapter结构体。 可以使用下面两个函数来创建i2c_client:

i2c_new_device static struct i2c_client *ap3216c_client;

static int __init i2c_client_ap3216c_init(void)

{

struct i2c_adapter *adapter;

struct i2c_board_info board_info = {

I2C_BOARD_INFO("ap3216c", 0x1e),

};

printk("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);

/* register I2C device */

adapter = i2c_get_adapter(0);

ap3216c_client = i2c_new_device(adapter, &board_info);

i2c_put_adapter(adapter);

return 0;

}

i2c_new_probed_device static struct i2c_client *ap3216c_client;

/* 罗列出所有可能的地址,这里只有一个*/

static const unsigned short normal_i2c[] = { 0x1e, I2C_CLIENT_END };

static int __init i2c_client_ap3216c_init(void)

{

struct i2c_adapter *adapter;

struct i2c_board_info i2c_info;

/* 将名字信息写入i2c_info,先清0 */

memset(&i2c_info, 0, sizeof(struct i2c_board_info));

strscpy(i2c_info.type, "ap3216c", sizeof(i2c_info.type));

adapter = i2c_get_adapter(0); /* 第0根i2c总线 */

ap3216c_client = i2c_new_probed_device(adapter, &i2c_info,

normal_i2c, NULL);

i2c_put_adapter(adapter);

return 0;

}

差别

i2c_new_device:

会创建i2c_client,即使该设备并不存在

i2c_new_probed_device:

它成功的话,会创建i2c_client,并且表示这个设备肯定存在

I2C设备的地址可能发生变化,比如AT24C02的引脚A2A1A0电平不一样时,设备地址就不一样

可以罗列出可能的地址

i2c_new_probed_device使用这些地址判断设备是否存在

方法3 (不推荐):由i2c_driver.detect函数来判断是否有对应的I2C设备并生成i2c_client

方法4 : 通过用户空间(user-space)生成

调试时、或者不方便通过代码明确地生成i2c_client时,可以通过用户空间来生成。 // 创建一个i2c_client, .name = "eeprom", .addr=0x50, .adapter是i2c-3

# echo eeprom 0x50 > /sys/bus/i2c/devices/i2c-3/new_device

// 删除一个i2c_client

# echo 0x50 > /sys/bus/i2c/devices/i2c-3/delete_device

linux i2c子系统入口,I2C子系统1 - ARM_Linuxx的个人空间 - OSCHINA - 中文开源技术交流社区...相关推荐

  1. linux修改组群名字,Linux用户和组 - 回忆斑斑驳驳的个人空间 - OSCHINA - 中文开源技术交流社区...

    用户相关操作: 1)         su 用户:切换用户但不切目录 2)         su – 用户:切换用户并切换目录 3)         sudo:允许系统管理员让普通用户执行一些或者全部 ...

  2. linux 命令 dsm,群晖常用指令 - osc_sa9nsts3的个人空间 - OSCHINA - 中文开源技术交流社区...

    输入uname –a 回车,用 uname 命令能够看到 NAS 的 CPU 架构.指令集等内容如下: Linux DSM 3.10.105 #23739 SMP Fri Jun 8 12:51:05 ...

  3. linux ssh Unused,ssh免密码登录 - leopardlinux的个人空间 - OSCHINA - 中文开源技术交流社区...

    两台服务器之间的密钥登录 生成密钥 先看 $HOME/.ssh/ 下面有没有已经生成的密钥文件对, 如下: id_dsa id_dsa.pub id_rsa id_rsa.pub 如果已经存在上述任一 ...

  4. linux ospf 命令,OSPF单区域配置 - linuxprobe2020的个人空间 - OSCHINA - 中文开源技术交流社区...

    为了弥补距离矢量路由协议的不足,IEFI组织开发了一种基于链路状态的内部网关协议OSPF 实验环境:红,绿,蓝三个颜色区域代表三个不同网络的办公场所,要求使用OSPF协议实现网络互通. pc1:172 ...

  5. linux恢复安卓数据,安卓数据恢复2 - ranfs的个人空间 - OSCHINA - 中文开源技术交流社区...

    安卓数据恢复2 之前提供一种没有使用adb的方式,进行镜像的方法,存在两个问题,Quicksshd在有些手机上出现兼容性问题,在电脑上安装软件和操作还是有些麻烦. 本文用华为P7-L05手机为例,使用 ...

  6. linux清除定时器,定时器以及清除定时器 - adustdu2015的个人空间 - OSCHINA - 中文开源技术交流社区...

    html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml ...

  7. Linux黑洞路由命令,配置黑洞路由 - osc_ywuazj5t的个人空间 - OSCHINA - 中文开源技术交流社区...

    拓扑图 在R1上配置一条静态路由:ip route-static  192.168.0.0   16     10.1.1.2:在R2上配置一条默认静态路由:ip route-static 0.0.0 ...

  8. linux内核等价多路径路由,高级路由 - 我是*李世民*的个人空间 - OSCHINA - 中文开源技术交流社区...

    策略路由背后的概念 Linux内核在默认情况下使用两张路由表:一张表用于本地路由,另一张可以由管理员来配置.如果内核编译支持策略路由,那么可以有多大255张不同的.相互独立的路由表.策略路由背后的主要 ...

  9. 麒麟linux改中文,麒麟助手改版小结 - 优麒麟操作系统的个人空间 - OSCHINA - 中文开源技术交流社区...

    "恰到好处的解决方案才能让人满足"--Susan Weinschenk <设计师要懂的心理学> "同质化的竞争环境下,决定竞争差距的关键因素就是执行力和创新的 ...

最新文章

  1. iBatis整理——iBatis批处理实现(Spring环境)
  2. 终于有人把「同侪效应」讲明白了
  3. 用 canal 监控 binlog 并实现mysql定制同步数据的功能
  4. 天正坐标标注显示不全_广联达导入CAD图纸不显示怎么办?
  5. Android初始化语言 (init.*.rc、init.conf文件格式)
  6. 绝佳的ASR学习方案:这是一套开源的中文语音识别系统
  7. Java简单从文件读取和输出
  8. 【SDPVRP】基于matlab遗传算法求解同时取送货的车辆路径问题【含Matlab源码 1487期】
  9. dw向右滚动字幕HTML,DW滚动文字代码肿么添加?
  10. 数据库开发综合案例——仓库管理系统设计
  11. 对webkit-font-smoothing和-moz-osx-font-smoothing的理解
  12. 通过python刷android步数,使用 Python 修改微信/QQ/支付宝运动步数
  13. 猎聘网推出移动互联求职新方式
  14. 西安交通大学计算机学院保研面试,西安交通大学电子与信息工程学院(专业学位)计算机技术保研细则...
  15. linux搭建raid5命令,命令行操作RAID5
  16. python有趣的案例_爬虫 (十九) 有趣的例子认识 while 循环 (十)|python爬虫|python入门|python教程...
  17. 【Echarts】渐变色桑基图
  18. Unity使用Newtonsoft.Json插件实现XML与JSON数据的互转
  19. 关于在使用迅雷下载的时候,C盘一下爆满的问题
  20. 星型模型和olap多维数据库

热门文章

  1. OpenCV图像处理使用笔记(五)——图像边界拓展
  2. 调用face++平台api进行人脸识别
  3. spark保存到mysql_Spark写入数据到MySQL
  4. python中判断列表数据类型_浅谈Python数据类型判断及列表脚本操作
  5. 用html做一个发送邮件验证,邮件发送还有问题吗?送大家一个写好的类吧,支持stmp认证、HTML格式邮件-PHP教程,PHP应用...
  6. ios 1 cocoa
  7. 在不知道根节点的情况下生成树形结构 (采用JSONObject)
  8. Dubbo源码分析(三)Dubbo中的SPI和自适应扩展机制
  9. 在Ubuntu中安装PHP,MySQL,Nginx和phpMyAdmin
  10. c语言打印一个整数的二进制形式