rk3288 dts i2c4


原文链接: rk3288 dts i2c4

[RK3288]I2C地址的确定
重要 如何确定I2C设备地址
MPU6050 0x68
const mpu6050Address = 0x68

指南针芯片和加速度、角加速度芯片用到了I2C通信。其中I2C的从器件地址(我只用到了7位的)的组成如下:

1byte = 7bit地址 + 1bit读写标志

注:1bit读写标志中,0-发送数据(写),1-请求数据(读)。

但有的芯片手册上给的地址是包括了1bit读写标志,有的数据手册上给的地址不包括1bit读写标志。举例如下:

(1) 3轴数字指南针芯片HMC5881L(3-Axis Digital Compass)
The default (factory) HMC5883L 7-bit slave address is 0x3C for write operations, or 0x3D for read operations.

可以看到,这个给的地址已经包含了读写标志位,其中:

a) 0x3C = 00111100b :这个是写操作时发送的地址字节。
b) 0x3D = 00111101b :这个是读操作时发送的地址字节。

(2)3轴数字输出陀螺仪芯片L3G4200D(three-axis digital output gyroscope)
The slave address (SAD) associated with the L3G4200D is 110100xb. The SDO pin can be used to modify the least significant bit (LSb) of the device address. If the SDO pin is connected to the voltage supply, LSb is ‘1’ (address 1101001b). Otherwise, if the SDO pin is connected to ground, the LSb value is ‘0’ (address 1101000b).
可以看到,7位地址跟SDO的电平高低有关:
a) 当SDO引脚拉高时,从地址是0x69 = 1101001b。写操作应该发送的字节是 (0x69<<1)|0x00,读操作应该发送的字节是 (0x69<<1)|0x01。
b) 当SDO引脚拉低时,从地址是0x68 = 1101000b。写操作应该发送的字节是 (0x68<<1)|0x00,读操作应该发送的字节是 (0x68<<1)|0x01。

I2C总线设备地址:
设备地址标识外设在总线上的唯一性,每一个外设都有唯一的设备地址,设备地址由原理图和芯片手册共同定义!CPU通过设备地址来访问到I2C总线上的某个外设!类似"学生的学号"

I 2 C 实时时钟 / 日历芯片 HYM8563

I 2 C总线从地址:读,0A3H;写,0A2H
地址: i2cdetect -y 0 0x51

AT24C02

例如:
以AT24C02存储器为例:通过查阅芯片手册发现 它是直接给出的设备地址 0x50
设备地址=0101 0A2A1A0(去掉R/W位,高位补0),硬件将A2A1A0都接地=》设备地址=01010000=0x50
再次得到:
如果CPU读设备,那么读设备地址=设备地址(0x50<<1 | 1) => 0xa1
1010A2A1A01=>10100001=>0xa1
如果CPU写设备,那么写设备地址=设备地址(0x50<<1 | 0) => 0xa0

而有些芯片是没有直接给出I2C设备地址的,只有读写设备地址

例如MT9P031 芯片手册

Slave Address
The 8-bit address of a two-wire serial interface device consists of 7 bits of address and 1
bit of direction. A “0” in the LSB (least significant bit) of the address indicates write mode
(0xBA), and a “1” indicates read mode (0xBB).

如此就可以按照上面的方法,倒着推出I2C设备地址。

MT9P031 图像传感器
读0xBB=10111011
写0xBA=10111010
0101 1101 = 0x5d
设备地址为 0x5d

之前学习的过程中大概整理了下pwm和spi的驱动,现在继续整理下i2c的驱动,只是一个简单的收发程序配了个proc的接口。感觉相对来说i2c的驱动还是比较简便的。在对应的i2c上加上dts的配置:

  • vol@34 {
  • compatible = "nxp,volume";
  • reg = <0x34>;
  • };
    复制代码

配置好Makefile
--- a/kernel/drivers/Makefile
+++ b/kernel/drivers/Makefile
@@ -157,3 +157,4 @@ obj-$(CONFIG_NTB) += ntb/
obj-$(CONFIG_GATOR) += gator/
obj-y += headset_observe/
+obj-y += volume_control.o
复制代码
因为懒~所以只配了Makefile,没配Kconfig~{:3_55:}

下面是驱动的代码。有需要的初学者可以看看
ps:
经论坛的朋友提醒
大家要用这个驱动的话
去掉MODULE_DEVICE_TABLE(of, volume_of_match);这句

请问:I2C4的GPIO要用做普通GPIO的话,删除设备树中的配置就可以了吗?

dts里disabled掉,然后按普通io那样申请使用就可以了
要去dts里面disabled,你这个是dtsi里面的,dts使能了的话会覆盖dtsi

        i2c4: i2c@ff160000 {
                compatible = "rockchip,rk30-i2c";
                reg = <0xff160000 0x1000>;
                interrupts = <GIC_SPI 64 IRQ_TYPE_LEVEL_HIGH>;
                #address-cells = <1>;
                #size-cells = <0>;
                pinctrl-names = "default", "gpio";
                pinctrl-0 = <&i2c4_sda &i2c4_scl>;
                pinctrl-1 = <&i2c4_gpio>;
                gpios = <&gpio7 GPIO_C1 GPIO_ACTIVE_LOW>, <&gpio7 GPIO_C2 GPIO_ACTIVE_LOW>;
                clocks = <&clk_gates6 15>;
                rockchip,check-idle = <1>;
                status = "disabled";
        };

i2c4在dts中的status = "disabled"的,但是为什么dev/下还有i2c4设备(crw-rw-rw- root root 89, 4 2011-01-01 12:00 i2c-4)?
我在自己的驱动中申请gpio是失败的啊!

`