添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

今天,使用树莓派驱动 mpu6050 时,发现 /dev 目录下没有 i2c-0、i2c-1 类似的文件。查看 BananaPi M1 中是存在的。
咦?树莓派中的 i2c 设备文件去哪了?

硬件:树莓派 3b+
软件:buildroot,make O=RPi3/ raspberrypi3_defconfig

使用 buildroot 编译出来的 sdcard.img 烧录到 SD 卡运行后,在 /dev 目录下没有生成 i2c-0、i2c-1 类似的文件。

由于 buildroot 支持的板子只有 raspberrypi3,没有 3b+ ,所以使用 3b+ 的用户需要自己再适配下。

原因 1:i2c-dev.ko

内核需要开启在 /dev 目录下产生 i2c 设备文件的功能—— I2C device interface,
在这里插入图片描述
我这边是将其编译成了模块(M),不然要替换 Kernel,比较麻烦,不利于调试。
编译好后,会生成 i2c-dev.ko。
兴致冲冲地跑去将 i2c-dev.ko 安装到内核,想着问题就解决了。
没成想,安装完后 /dev 目录下依然没有产生 i2c-* 文件。
🙄🙄🙄 什么情况。。。

查看 /proc/devices

# cat /proc/devices
Character devices:
  1 mem
  4 /dev/vc/0
  4 tty
  4 ttyS
  5 /dev/tty
  5 /dev/console
  5 /dev/ptmx
  5 ttyprintk
  7 vcs
 10 misc
 13 input
 14 sound
 29 fb
 89 i2c
128 ptm
136 pts

已然看到 89 i2c,说明 i2c 驱动已经注册成功了啊,为什么不产生 /dev/i2c-* 呢?
那就手动创建一下

mknod /dev/i2c-1 c 89 1

竟然能够创建成功,那就使用一下

# i2cdetect -y 1
i2cdetect: can't open '/dev/i2c-1': No such device or address

报错了,说明驱动还是有问题。

原因 2:i2c-bcm2835.ko

束手无策,只能查看源码了,打开 i2c-dev.c,

module_init(i2c_dev_init);
	i2c_dev_init()
		i2c_for_each_dev(NULL, i2cdev_attach_adapter);
i2cdev_attach_adapter()
	dev_set_name(&i2c_dev->dev, "i2c-%d", adap->nr);
	cdev_device_add()

看到是在 i2cdev_attach_adapter() 中创建 “i2c-%d” 文件的。
没有执行到这里?
经过加 printk() 调试,发现果真没有执行过 i2cdev_attach_adapter(),
那是哪个条件不满足呢?
那就追踪它的调用者 i2c_for_each_dev()

i2c_for_each_dev()
	bus_for_each_dev()
		while (!error && (dev = next_device(&i))) {
			error = fn(dev, data);

原来是没有找到 device,那它在找什么设备呢?为什么没找到呢?
最后发现,原来它是在找 I2C adaptor 或者叫 I2C controller(我认为它俩是一个东西的不同叫法),
树莓派 3b+ 的 I2C controller 如下
在这里插入图片描述
咦?M?那就去安装它

# insmod /lib/modules/5.10.92-v7/kernel/drivers/i2c/busses/i2c-bcm2835.ko

再次查看 /dev 目录,
还是没有 i2c-*
崩溃!!!

原因 3:设备树

最后发现,原来是安装了 I2C 控制器的驱动,但是设备树里面并没有让 I2C 控制器使能,也就是说系统中只有驱动,没有硬件
在这里插入图片描述
使能 I2C 控制器编译出 bcm2710-rpi-3-b-plus.dtb 后,使用
上一篇文章介绍的方法,更新到 SD 卡中,重启并执行如下命令

# insmod /lib/modules/5.10.92-v7/kernel/drivers/i2c/i2c-dev.ko
# insmod /lib/modules/5.10.92-v7/kernel/drivers/i2c/busses/i2c-bcm2835.ko
# ls /dev/i2c-*
/dev/i2c-1  /dev/i2c-2

哇!终于有了

# i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --
  • I2C 总线在 kernel 中就一个,bus->name = “i2c”
  • 在树莓派 3b+ SOC 中,有两个 I2C 控制器,i2c1、i2c2。它们是同种类型的器件,所以使用相同的驱动:i2c-bcm2835.ko。
  • 在设备树中填写这两个控制器,在安装 i2c-bcm2835.ko 驱动时,就会通过 i2c bus 对 驱动 和 外设 进行匹配,匹配之后,就会在 /dev 目录产生两个设备节点文件 i2c-1、i2c-2,这两个设备节点文件就对应两个 I2C 控制器。
  • 对这两个设备文件读写,就会在对应的引脚发出 I2C 信号。这样就可以在应用层写具体外设(如 mpu6050)的驱动代码了,如《Banana Pi M1 读取 MPU6050(Shell 脚本方式)》
  • 通过上面这点,就能明白,I2C 控制器 及其 驱动I2C 外设 及其 驱动,的区别与联系了。
最近在调试arm与外设iic通讯是,想来个投机取巧,先不写单独的驱动,直接通过iic bus设备是否可以连接到外设,然后发现在板子上找不到“/dev/i2c-n”的设备,标准的系统应该都是有的。 回去看内核驱动 lichee/linux-3.10/drivers/i2c/ # Makefile for the i2c core. obj-$(CO...
前提:insmod i2c-gpio-custom bus0=0,X1,X2安装没有问题;(X1、X2表示可以的GPIO口)检查:下面路径下是否有i2c-dev.ko如果有:root@JoySince:/lib/modules/3.10.49# ls i2c- i2c-dev.ko i2c-gpio-custom.ko root@JoySince:/lib/modules/3.1...
def getPiI2CBusNumber(): # Gets the I2C bus number /dev/i2c# return 1 if Adafruit_I2C.getPiRevision() > 1 else 0 /dev/i2c# 这个小妖精
1. 安装xtion/kinect 驱动1.1. 安装支持库sudo apt-get update sudo apt-get install g++ python libusb-1.0-0-dev freeglut3-dev sudo apt-get install doxygen graphviz mono-complete sudo apt-get install openjdk-7-jdk1.
文章目录配置CSI接口摄像头生成/dev/video0设备节点 配置CSI接口摄像头 树莓派开发板的CSI(Camera Serial Interface)接口位于USB和以太网接口旁边。我们先将CSI接口的黑色挡板拔开,之后将排线蓝色一端正对以太网接口方向插入,之后按下黑色挡板进行固定。 用同样的方法连接摄像头一端,排线的蓝色端与摄像头背面保持相同方向。 注意接线时务必保持电源断开,否则可能会烧掉。 摄像头功能的激活 首先打开树莓派终端,对树莓派进行更新: sudo apt-get update
Raspberry Pi B +连接MPU-6050加速度计与陀螺仪六轴感测器这里介绍如何在Raspberry Pi上面安装MPU-6050加速度计与陀螺仪六轴感测器,并透过I2C读取传感器上的资料。 Raspberry Pi 3B使用MPU-6050三轴加速度计与陀螺仪组合模组 MPU-6050是一个六轴感测器,包含三轴加速度计与三轴陀螺仪,其价格便宜,用途也很广泛,一般的手机,平板电脑几乎都
1 由于树莓派默认不打开I2C,所以要在配置文件中打开 修改/boot/config.txt pi@raspberrypi:~ $ sudo vim /boot/config.txt 加入下面两行,注意顺序 dtparam=i2c1=on dtparam=i2c_arm=on 2: 启动刚打开的IIC sudo modprobe i2c-dev sudo modprobe i2c-bcm...
刚刚接触树莓派,的确很适合用来学习,资料多而且很规范,开发者多,平台统一,很多问题别人都已经解决。 买的是带3.5电阻屏的版本, 使用i2c接传感器,但是总是报错: 1. 执行 sudo raspi-config 开启i2c的时候: There was an erro running option A6 I2C 2.终端中: FATAL: Module i2c-dev not ...
主要是参考http://blog.csdn.net/cjok376240497/article/details/6972305,对I2C子系统讲解的很透彻的一篇文章,值得一读。 1 硬件特性1.1 概述I2C总线是由Philips公司开发的两线式串行总线,这两根线为时钟线(SCL)和双向数据线(SDA)。由于I2C总线仅需要两根线,因此在电路板上占用的空间更少,带来的问题是带宽较窄。I2C在标准...