Bootstrap

Linux系统I2C设备驱动框架


Linux I2C 设备的基本结构
请添加图片描述

请添加图片描述
在Linux系统中,可以使用i2c-tools软件包提供的工具来操作I2C总线设备
查看i2c总线使用情况

i2cdetect -l 

请添加图片描述

1、设备树
(1)I2C控制器的设备树

进入SOC芯片的顶层设备树目录 tegra210-soc-base.dtsi。I2C控制器的描述,自己的设备需要挂载到这个设备树。
请添加图片描述

(2)对应驱动设备mpu6050的设备树

请添加图片描述

2、I2C总线驱动
(1)英伟达平台的I2C总线驱动类定义

在这里插入图片描述

(2)struct i2c_adapter结构体

在这里插入图片描述

(3)struct i2c_algorithm结构体

请添加图片描述

(4)匹配probe()

注册、分配空间、初始化
请添加图片描述请添加图片描述

3、陀螺仪MPU6050
(1)硬件部分

请添加图片描述
在tegra210-p3448-0000-p3449-0000-b00.dts设备树i2c1总线节点下添加mpu6050节点
请添加图片描述
管脚复用默认已配置好
请添加图片描述请添加图片描述

(2)struct i2c_client 结构体

在这里插入图片描述

(3)struct i2c_driver结构体

在这里插入图片描述

(4)驱动实现整体架构

请添加图片描述

4、编译 插入模块报错

请添加图片描述
分析:搜索"pio timed out addr"字符串,按照字意理解,初步判断是通讯超时
定位到drivers/i2c/busses/i2c-tegra.c文件的tegra_i2c_xfer_msg函数
请添加图片描述
问题排查思路:

(1)查看I2C设备情况
ls /sys/bus/i2c/devices

请添加图片描述
解释:i2c-0 ~ i2c-8 对应SOC里 9个 I2C控制器
0-0068:标识i2c-0 adapter上的从机地址为0x68的i2c设备 即为:mpu6050设备

(2)设备树虚拟文件系统
/sys/firmware/devicetree/base

base是一个虚拟文件系统目录,用于在 Linux 中表示设备树(Device Tree)。设备树是一种描述硬件平台信息和设备连接关系的数据结构,它在 Linux 中被广泛用于描述嵌入式系统的硬件架构和设备信息。
查看i2c节点信息,找到mpu6050对应生成的节点
请添加图片描述

(3)查看管脚复用情况

请添加图片描述

(4)最后发现是驱动程序中的读写函数有问题

请添加图片描述
定位到i2c_transfer中,最后一个参数传参出现问题,因为发送消息数量为1,但是ARRAY_SIZE(msg)为2,就可能导致发送消息为空,通讯超时。
将传入的参数修改为1,完美解决!
请添加图片描述
按照模块,编译运行应用程序,成功获取传感器数据
请添加图片描述

(5)i2c_transfer函数的上层到底层

请添加图片描述

5、OLED屏控制

oled型号为ssd1306,从机地址0111100 -> 0x3c,挂载在4-003c处。

6、小车马达控制
(1)硬件设备介绍

PCA9685 接收来自 Jetson 设备 I2C 总线的指令,然后驱动 TB6612 芯片按照 PWM 控制信号对两个 TT 电机,透过改变电流大小去调整电机转速与方向,来执行 Jetbot 小车的移动。
PCA9685:是NXP推出,一款基于IIC总线通信的12位精度16通道PWM波输出的芯片,一边与主控通过 I2C 总线通信,另一边连接 TB6612 马达驱动芯片。
TB6612:用pwm控制的电机驱动芯片,可控制2个电机(停止 正传 反转)

 //STBY: 使能端口,高电平有效
 //PWM 电机提供pwm脉冲。
 //IN1 IN2  00:停止 01:正转 10:反转      
 //O1 O2 输出接电机

TT电机:直流减速电机TT马达。改变 O1、O2 极性可正传 反转, pwm调节输出电压值,可控制转速。马达速度差来实现转弯, 故没有方向盘的舵机

(2)设备树

请添加图片描述

(3)驱动
drivers/pwm/pwm-pca9685.c 
;