I2C需要分两部分进行修改,第一部分是设备树的配置,这部分主要是有关I2C控制器相关的参数、中断等,另一部分是硬件引脚的配置,由于驱动用的是i2c-designware的通用驱动,所以需要读取进行IO初始化,这就出现了额外的操作,希望后面对驱动进行适配,可以从设备树对引脚进行配置,自动完成初始化。
下面就来看看I2C驱动的大概过程吧:
设备树
// linux_5.10/arch/riscv/boot/dts/cvitek/cv180x_base.dtsi
i2c0: i2c@04000000 {
compatible = "snps,designware-i2c";
clocks = < &clk CV180X_CLK_I2C >;
reg = < 0x0 0x04000000 0x0 0x1000 >;
clock-frequency = < 400000 >;
#size-cells = < 0x0 >;
#address-cells = < 0x1 >;
resets = < &rst RST_I2C0 >;
reset-names = "i2c0";
};
// linux_5.10/arch/riscv/boot/dts/cvitek/cv180x_base_riscv.dtsi
i2c0: i2c@04000000 {
interrupts = < 49 IRQ_TYPE_LEVEL_HIGH >;
interrupt-parent = < &plic0 >;
};
驱动源码
使用的是i2c designware的框架。
控制器驱动
// linux_5.10/drivers/i2c/busses/i2c-designware-platdrv.c
dw_i2c_plat_probe(struct platform_device *pdev):
i2c_dw_probe(struct dw_i2c_dev *dev)
i2c_dw_probe_master(struct dw_i2c_dev *dev)
i2c_add_numbered_adapter(struct i2c_adapter *adap)
i2c_add_adapter(struct i2c_adapter *adapter)
i2c_register_adapter(struct i2c_adapter *adap)
device_register(struct device *dev) // 注册设备
设备驱动
// linux_5.10/drivers/i2c/i2c-core-base.c
i2c_register_driver(struct module *owner, struct i2c_driver *driver)
driver_register(&driver->driver); // 注册驱动
通过device_register和driver_register会进行match和probe的操作,从而关联起来I2C适配器和设备驱动。
对于详细得展开需要进一步的学习。
应用编程
i2c的驱动编程就是open/read/write/ioctrl这一套。
uint8_t reg_addr = 0x00;
uint8_t data_buf[2];
// 打开设备
int i2c_fd = open("/dev/i2c-0", O_RDWR);
// 方式一:
// 设置从机地址
ioctl(i2c_fd, I2C_SLAVE, slave_addr);
write(i2c_fd, 0, ®_addr, 1);
read(i2c_fd, 0, data_buf, 2);
// 方式二:
struct i2c_rdwr_ioctl_data rdwr;
struct i2c_msg msgs[2];
msgs[0].addr = I2C_SLAVE;
msgs[0].flags = 0;
msgs[0].len = 1;
msgs[0].buf = ®_addr;
msgs[1].addr = I2C_SLAVE;
msgs[1].flags = I2C_M_RD;
msgs[1].len = 2;
msgs[1].buf = data_buf;
rdwr.msgs = msgs;
rdwr.nmsgs = 2;
ioctl(file, I2C_RDWR, &rdwr);
以上两种方式选择其中一种就行。
接下去就用温湿度传感器测试一下i2c总线的使用,演示过程后面通过视频展示。
审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
控制器
+关注
关注
114文章
17921浏览量
195868 -
I2C
+关注
关注
28文章
1566浏览量
131972 -
温湿度传感器
+关注
关注
6文章
664浏览量
37845 -
开发板
+关注
关注
26文章
6517浏览量
121375
发布评论请先 登录
相关推荐
热点推荐
【Milk-V Duo S 开发板免费体验】人脸检测
;
执行步骤
网络配置,详见:Milk-V Duo S 网络连接、分区扩展、外壳设计.
将摄像头与开发板的 J2 接口连接,注意接口定义。
使用 Type-
发表于 07-27 16:53
【Milk-V Duo S 开发板免费体验】测试舵机
, for GNU/Linux 3.7.0, BuildID[sha1]=11b670c34a8bea79c366ba4d95c35978c5eb25e8, with debug_info, not stripped
三、测试验证
拷贝到Milk-V
发表于 08-09 22:46
【Milk-V Duo 开发板免费体验】Milk-V Duo之开箱初体验
一,第一印象
外观设计方面,Milk-V Duo以简约而精致的风格为主,采用沉金工艺,给人一种高端大气的感觉。开发板的尺寸小巧,便于携带和使用,在我拿到的所有的开发板中,也只有
发表于 07-16 01:15
【Milk-V Duo 开发板免费体验】Milk-V Duo 开发板学习初体验
milkv-duo-20230616-2232.img自制成linux启动盘
3、通过Type-C数据线连接电脑,小板系统顺畅的启动了
登录Milk-V Duo小板的系统耍耍吧
1、正
发表于 07-28 15:58
【Milk-V Duo 开发板免费体验】milkv-duo 申请成功体验
。
引脚图
总结
Milk-V Duo开发板的小巧精致设计和强悍的性能确实为创客和开发者提供了一个优秀的平台。它的紧凑设计使得它适用于各种空间有限的场景,同时强大的性能可以支持复杂
发表于 07-29 14:31
【Milk-V Duo 开发板免费体验】Milk-V Duo 开发板初体验
。
Milk-V Duo开发板(图4)是一款基于CV1800B芯片(RISC-V架构,C906@1Ghz +
发表于 08-18 00:26
【Milk-V Duo 开发板免费体验】4-Linux控制小车动作(原创)首发
【Milk-V Duo 开发板免费体验】2控制螺旋桨电路https://bbs.elecfans.com/jishu_2371054_1_
发表于 08-21 02:11
Milk-V Duo开发板免费体验 I2C分析
评论