20 设备树里声明i2c设备

本文档介绍了如何通过设备树来配置I2C设备,包括定义子节点、设置compatible属性值及reg属性等关键步骤,并以具体实例展示了如何添加一个DHT12温湿度传感器。

参考内核源码目录里的Documentation/i2c/instantiating-devices
文档里主要的内容:

Method 1b: Declare the I2C devices via devicetree
-------------------------------------------------

This method has the same implications as method 1a. The declaration of I2C
devices is here done via devicetree as subnodes of the master controller.

Example:

    i2c1: i2c@400a0000 {
        /* ... master properties skipped ... */
        clock-frequency = <100000>;   

        flash@50 {
            compatible = "atmel,24c256";
            reg = <0x50>;
        };

        pca9532: gpio@60 {
            compatible = "nxp,pca9532";
            gpio-controller;
            #gpio-cells = <2>;
            reg = <0x60>;
        };
    };

通过文档里的内容, 可以得知: i2c设备节点需要作为i2c控制器节点的子节点.
i2c设备节点的compatible属性值除了用于与设备驱动匹配以外,还作为设备名.
reg属性值为设备地址.也可以在设备节点里加入额外的属性.


如dht12接在第0个i2c控制器上,则修改内核源码目录arch/arm64/boot/dts/allwinner/sunxi-h3-h5.dts:

        i2c0: i2c@01c2ac00 {  /* 控制器的设备节点 */
            compatible = "allwinner,sun6i-a31-i2c";
            reg = <0x01c2ac00 0x400>;
            interrupts = <GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>;
            clocks = <&ccu CLK_BUS_I2C0>;
            resets = <&ccu RST_BUS_I2C0>;
            pinctrl-names = "default";
            pinctrl-0 = <&i2c0_pins>;
            status = "disabled";
            #address-cells = <1>;
            #size-cells = <0>;

            mydht12 {   /* 增加的设备子节点  */
                compatible = "mydht12";
                reg = <0x5c>; /* 设备地址 */

        /*  额外增加的属性,供i2c设备驱动使用  */
                led-gpios = <&pio 0 17 GPIO_ACTIVE_HIGH>; 
            };

        };

重编设备树并更新,重启系统后:

^_^ / # ls /sys/bus/i2c/devices/
0-005c/  0-0068/  i2c-0/   i2c-1/   i2c-2/
^_^ / # cat /sys/bus/i2c/devices/0-005c/name 
mydht12
<think>好的,用户需要了解RK3588芯片的I2C设备树配置方法,特别是示例和教程。首先,我需要参考提供的引用资料,找到相关的配置步骤和代码示例。 引用[1]提到了i2c-rk3x.c驱动和文档路径,说明设备树配置需要按照kernel/Documentation/devicetree/bindings/i2c/i2c-rk3x.txt的指导。用户可能需要知道如何编写设备树节点,包括I2C控制器的基本配置。 引用[2]中的代码示例展示了如何在驱动中注册I2C设备和客户端,这可能涉及到设备树中的I2C地址和设备名称的匹配。用户可能需要了解如何将设备树配置与驱动代码结合。 引用[3]详细描述了ft5x06触摸设备设备树配置,包括pinctrl设置、中断配置和兼容性属性。这提示设备树需要正确配置引脚控制、中断类型以及确保compatible属性与驱动匹配。 引用[4]提到用户态访问I2C的方法,但用户主要关注设备树配置,这部分可能暂时不需要,但可以作为补充信息。 引用[5]讨论了es8388的dts配置和编译步骤,说明配置完成后需要编译设备树文件并更新引导加载器,用户需要了解整个流程,包括编译和加载步骤。 综合这些信息,我应该分步骤解释设备树配置,包括控制节点设备节点、引脚控制、中断配置,并提供示例代码。同时需要强调兼容性属性、引脚编号和中断类型的正确设置,以及编译和加载的注意事项。还要检查是否有遗漏的步骤,比如时钟配置或电源管理,但根据引用资料,可能不需要这些。最后,生成相关问题,帮助用户深入理解可能出现的问题。</think>以下是为您整理的RK3588芯片I2C设备树配置方法详解: ### 一、RK3588 I2C设备树配置步骤 1. **I2C控制器节点配置** 需在设备树声明I2C控制器节点,示例如下: ```dts &i2c1 { status = "okay"; pinctrl-names = "default"; pinctrl-0 = <&i2c1m0_xfer>; clock-frequency = <100000>; // 标准模式100kHz }; ``` 注意时钟频率可设置为$400000$(快速模式)或$1000000$(高速模式)[^1][^4] 2. **外设子节点配置** 在控制器节点下添加设备节点: ```dts &i2c1 { es8388: es8388@10 { compatible = "everest,es8388"; reg = <0x10>; // 7位地址需左移一位 interrupt-parent = <&gpio0>; interrupts = <RK_PA0 IRQ_TYPE_EDGE_FALLING>; }; }; ``` 地址计算需满足$reg = (7bit\_addr << 1)$[^5] 3. **引脚复用配置** 在pinctrl节点定义GPIO复用: ```dts &pinctrl { i2c1 { i2c1m0_xfer: i2c1m0-xfer { rockchip,pins = <0 RK_PB0 1 &pcfg_pull_none>, <0 RK_PB1 1 &pcfg_pull_none>; }; }; }; ``` 其中`RK_PB0`表示GPIO Bank0的B0引脚[^3] ### 二、关键配置项说明 1. **compatible属性** 必须与驱动代码中的匹配表一致,如: ```c static const struct of_device_id ft5x06_of_match[] = { { .compatible = "focaltech,ft5x06" }, {} }; ``` 否则驱动无法正确加载[^3] 2. **中断配置** 推荐使用边缘触发方式: ```dts interrupts = <RK_PA5 IRQ_TYPE_EDGE_RISING>; // 上升沿触发 ``` 支持的类型包括: - $IRQ\_TYPE\_LEVEL\_HIGH/LOW$(电平触发) - $IRQ\_TYPE\_EDGE\_RISING/FALLING$(边沿触发)[^3] ### 三、配置验证流程 1. 编译设备树 ```bash make ARCH=arm64 dtbs ``` 2. 查看系统日志 ```bash dmesg | grep i2c ``` 正常应显示类似: ``` i2c i2c-1: Added multiplexed i2c bus 2 ``` ### 四、常见问题解决 1. **设备无法识别** 检查地址是否满足:$reg\_addr = (7bit\_addr << 1)$ 2. **中断不触发** 验证GPIO配置是否正确映射,可用命令: ```bash cat /proc/interrupts ```
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值