立即注册
查看: 1044|回复: 4

[软件资料] 全志H6 TWI接口使用说明书

已绑定手机
发表于 2022-5-31 18:53:46 | 显示全部楼层 |阅读模式 来自 广东省深圳市
1.编写目的
全志平台TWI硬件通信协议兼容I2C通信协议,因此可以使用Linux内核中的I2C子系统,本文档主要介绍TWI设备协议如何使用Linux内核I2C子系统接口,为TWI通信设备驱动开发提供参考。

2. 模块介绍
2.1 模块功能介绍
Linux 的 I2C 体系结构 2.1 所示, 图中用分割线分成了三个层次
1. 用户空间, 包括所有的 I2C 设备的应用程序
2. 内核, 也就是驱动部分
3. 硬件, 指实际物理设备, 包括 I2C 控制器和I2C外设
1.jpg
其中,Linux 内核中的 I2C 驱动程序从逻辑上又可以分为 3 个部分
1. I2C 核心 (I2CCore): 实现对 I2C 总线驱动以及 I2C 设备驱动的管理
2. I2C 总线驱动 (I2C adapter driver):针对不同类型的 I2C 控制器, 实现对 I2C 总线访问的具体方法
3. I2C 设备驱动 (I2C clientdriver): 针对特定的 I2C 设备, 实现具体的功能, 包括 read,write 以及 ioctl 等对用户层操作的接口
I2C 总线驱动主要实现了用于特定 I2C 控制器的总线读写方法, 并注册到 Linux 内核的I2C 架构, I2C 外设就可以通过 I2C 架构完成设备和总线的适配. 但是总线驱动本身不会进行任何的通讯, 它只是提供通讯的实现, 等待设备驱动来调用其函数
I2C Core 的管理正好屏蔽了 I2C 总线驱动的差异, 使得 I2C 驱动可以忽略各种总线控制器的不同, 不用考虑其如何与硬件设备通讯的细节

2.3 模块配置介绍
2.3.1 sys_config.fex 配置说明
在不同的 Sunxi 硬件平台中,TWI 控制器的数目也不同,但对于每一个 TWI 控制器来说,在 sys_config.fex 中配置参数相似,如下:
[twi0]
twi0_used = 1
twi0_scl = portH14<2><default><default><default>
twi0_sda = portH15<2><default><default><default>
其中,twi0_used 置为 1 表示使能,0 表示不使能;twi0_scl 和 twi0_sda 用于配置相应 的 GPIO。
2.3.2 menuconfig 配置说明
在命令行中进入内核根目录,执行 make ARCH=arm64 menuconfig 进入配置主界面,并按以下步骤操作:首先,选择 Device Drivers 选项进入下一级配置,如下图所示:
2.jpg
然后,选择 I2C support 选项,进入下一级配置,如下图所示:
3.jpg
接着,选择 I2C HardWare Bus support 选项,进入下一级配置,如下图:
4.jpg
选择 SUNXI I2C controller 选项,可选择直接编译进内核,也可编译成模块。如下图:
5.jpg

2.4 源码结构介绍
I2C 总线驱动的源代码位于内核在 drivers/i2c/buesses 目录下:drivers/i2c/
├── busses
│ ├── i2c-sunxi.c // Sunxi 平台的 TWI 控制器驱动代码
│ ├── i2c-sunxi.h // 为 Sunxi 平台的 TWI 控制器驱动定义了一些宏、数据结构

3. 接口描述
3.1 设备注册接口
定义在./include/linux/i2c.h
3.1.1 i2c_add_driver()
【函数原型】:#define i2c_add_driver(driver) i2c_register_driver(THIS_MODULE, driver)
int i2c_register_driver(struct module owner, struct i2c_driver driver)
【功能描述】:注册一个 I2C 设备驱动。从代码可以看带 i2c_add_driver() 是一个宏,由函 数 i2c_register_driver() 实现。
【参数说明】:driver,i2c_driver 类型的指针,其中包含了 I2C 设备的名称、probe、detect等接口信息。
【返回值】:0,成功;其他值,失败。
其中,结构 i2c_driver 的定义如下:
struct i2c_device_id {
char name[I2C_NAME_SIZE];
kernel_ulong_t driver_data /* Data private to the driver */
__attribute__((aligned(sizeof(kernel_ulong_t))));
};
struct i2c_driver {
unsigned int class;
/* Notifies the driver that a new bus has appeared or is about to be
* reMOVed. You should avoid using this, it will be removed in a * near future.
*/
int (*attach_adapter)(struct i2c_adapter *) __deprecated;
int (*detach_adapter)(struct i2c_adapter *) __deprecated;
......

更多详细内容请下载附件查看
游客,如果您要查看本帖隐藏内容请回复
已绑定手机
发表于 2022-6-1 06:05:09 | 显示全部楼层 来自 上海市闵行区
谢谢分享
已绑定手机
发表于 2022-6-3 20:34:19 | 显示全部楼层 来自 上海市
谢谢分享
已绑定手机
发表于 2022-6-3 20:34:38 | 显示全部楼层 来自 上海市
学习学习
已绑定手机
发表于 2023-11-28 21:18:30 | 显示全部楼层 来自 上海市长宁区
谢谢分享
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

合作/建议

TEL: 19168984579

工作时间:
周一到周五 9:00-11:30 13:30-19:30
  • 扫一扫关注公众号
  • 扫一扫打开小程序
Copyright © 2013-2024 一牛网 版权所有 All Rights Reserved. 帮助中心|隐私声明|联系我们|手机版|粤ICP备13053961号|营业执照|EDI证
在本版发帖搜索
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表