代码之家  ›  专栏  ›  技术社区  ›  fadedbee

在Linux引导期间,如何尽早设置I2c PCA9570 GPIO扩展器的值?

  •  0
  • fadedbee  · 技术社区  · 7 年前

    我为PCA9570编写了一个工作驱动程序。它的四个输出通过Linux的gpio子系统进行设置(和读取)。例如

    root@armbox:/sys/class/gpio# echo 508 > export
    root@armbox:/sys/class/gpio# echo 509 > export
    root@armbox:/sys/class/gpio# echo 510 > export
    root@armbox:/sys/class/gpio# echo 511 > export
    

    问题是,芯片从高输出开始。 https://www.nxp.com/docs/en/data-sheet/PCA9570.pdf 第8.1条

    root@armbox:/sys/class/gpio# cat gpio508/value 
    1
    root@armbox:/sys/class/gpio# cat gpio509/value 
    1
    root@armbox:/sys/class/gpio# cat gpio510/value 
    1
    root@armbox:/sys/class/gpio# cat gpio511/value 
    1
    

    启动后,我可以从用户空间手动将它们设置得较低。例如

    root@armbox:/sys/class/gpio# echo 0 > gpio510/value 
    root@armbox:/sys/class/gpio# cat gpio510/value 
    0
    

    如何在引导过程中尽早将芯片的输出设置为低?

    我可以在 pca9570_probe() 但那感觉很糟糕。 PCA9570_探针( 当前从芯片读取值。

    static int pca9570_probe(struct i2c_client *client,
                       const struct i2c_device_id *id)
    {
        ...
    
        ret = pca9570_readb(chip, &chip->reg);
        if (ret)
            goto out_failed;
    
        return 0;
    
    out_failed:
        if (chip->client)
            i2c_unregister_device(chip->client);
    
        return -1;
    }
    

    在Linux中,在引导期间指定gpio值的方法是否正确,而不是黑客攻击驱动程序?

    P.S.DTS条款为:

                pca9570: pca9570@48 {
                                compatible = "pca9570";
                                reg = <0x24>;
                                gpio-controller;
                                #gpio-cells = <4>;
                };
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Tomas Novotny    7 年前

    DeviceTree gpio binding documentation

    gpio_expander: tca6424a@22 {
            compatible = "ti,tca6424";
            reg = <0x22>;
            [...] /* some other gpio expander configuration */
    
            lcd-rst {
                    gpio-hog;
                    gpios = <7 GPIO_ACTIVE_LOW>;
                    output-low;
            };
    };