【问题标题】:I2C device driver error [TCA6408 I/O expander]I2C 设备驱动程序错误 [TCA6408 I/O 扩展器]
【发布时间】:2013-12-20 08:02:58
【问题描述】:

我想连接 TCA6408 IO 扩展器并获取嵌入式系统的按键输入。 我正在尝试使用 SABRELite (iMX6Q) Boad,我的开发环境是 LTIB (L3.0.35_4.1.0_130816_source.tar.gz)

我做了以下修改

1.) 在“board-mx6q_sabrelite.c”中添加一个条目

static struct i2c_board_info mxc_i2c2_board_info[] __initdata = {
    {
          I2C_BOARD_INFO("pca953x", 0x21),
          .irq = gpio_to_irq(MX6Q_SABRELITE_CAP_TCH_INT1),
    },
};

2.) 从 menuconfig 启用驱动程序

---  GPIO Support
< * > PCA953x, PCA955x, TCA64xx, and MAX7310 I/O ports
[ * ]         Interrupt controller support for PCA953x

当我启动系统时,驱动程序注册正常。 但是 Probe() 函数中有一个错误(pca953x: probe of 2-0020 failed with error -22)。

#Console 日志

Freescale USB OTG Driver loaded, $Revision: 1.55 $
pca953x: probe of 2-0020 failed with error -22
imx-ipuv3 imx-ipuv3.0: IPU DMFC NORMAL mode: 1(0~1), 5B(4,5), 5F(6,7)
imx-ipuv3 imx-ipuv3.1: IPU DMFC NORMAL mode: 1(0~1), 5B(4,5), 5F(6,7)
mxc_mipi_csi2 mxc_mipi_csi2: i.MX MIPI CSI2 driver probed
mxc_mipi_csi2 mxc_mipi_csi2: i.MX MIPI CSI2 dphy version is 0x3130302a
MIPI CSI2 driver module loaded
Advanced Linux Sound Architecture Driver Version 1.0.24.

由于(pdata == NULL)而发生此错误

linux-3.0.35/drivers/gpio/pca953x.c

static int __devinit pca953x_probe(struct i2c_client *client,
               const struct i2c_device_id *id)
{
struct pca953x_platform_data *pdata;
struct pca953x_chip *chip;
int ret = 0;

chip = kzalloc(sizeof(struct pca953x_chip), GFP_KERNEL);
if (chip == NULL)
    return -ENOMEM;

pdata = client->dev.platform_data;
if (pdata == NULL) {
    pdata = pca953x_get_alt_pdata(client);
    /*
     * Unlike normal platform_data, this is allocated
     * dynamically and must be freed in the driver
     */
    chip->dyn_pdata = pdata;
}

if (pdata == NULL) {
    dev_dbg(&client->dev, "no platform data\n");
    ret = -EINVAL;
    goto out_failed;
}

我无法理解这个问题。 “platform_data”需要做什么样的修改?

任何人都请支持我。

【问题讨论】:

    标签: linux linux-device-driver embedded-linux kernel-module


    【解决方案1】:

    您需要在 i2c_board_info 结构中提供一些平台数据。

    根据您提供的代码,该结构的类型应为 struct pca953x_platform_data 和 在 platform_data 字段中引用。

    即(SABRE 精简版)

    static struct pca953x_platform_data my_pca953x_pdata = {
         .gpio_base = MX6Q_PAD_GPIO_5__I2C3_SCL,
    };
    
    static struct i2c_board_info mxc_i2c2_board_info[] __initdata = {
        {
              I2C_BOARD_INFO("pca953x", 0x21),
              .irq = gpio_to_irq(MX6Q_SABRELITE_CAP_TCH_INT1),
              .platform_data = &my_pca953x_pdata
        },
    };
    

    【讨论】:

    • 再次感谢您的回复。但我是 Linux 设备驱动程序的新手。我无法理解 SABRE Lite 板的相关平台数据是什么。您能否将 SABRE Lite 的平台详细信息发给我?
    • 我已经填写了SABRELite板的相关平台数据。
    【解决方案2】:

    这是 am3517 板和 tca6416 的示例。 platform_data 指定从哪个 GPIO 编号开始计算新的 GPIO。例如OMAP_MAX_GPIO_LINES 128,那么第一个 tca6416 GPIO 将是 128 + 1 = 129。

    static struct pca953x_platform_data sp860_gpio_expander_info_0 = {
            .gpio_base      = OMAP_MAX_GPIO_LINES,
    };
    static struct i2c_board_info __initdata am3517evm_i2c2_boardinfo[] = {
            {
                    I2C_BOARD_INFO("tca6416", 0x20),
                    .platform_data = &sp860_gpio_expander_info_0,
            },
    };
    

    您可以在此platform_data结构中设置以下参数:

    struct pca953x_platform_data {
            /* number of the first GPIO */
            unsigned        gpio_base;
    
            /* initial polarity inversion setting */
            uint16_t        invert;
    
            /* interrupt base */
            int             irq_base;
    
            void            *context;       /* param to setup/teardown */
    
            int             (*setup)(struct i2c_client *client,
                                    unsigned gpio, unsigned ngpio,
                                    void *context);
            int             (*teardown)(struct i2c_client *client,
                                    unsigned gpio, unsigned ngpio,
                                    void *context);
            const char      *const *names;
    };
    

    【讨论】:

      猜你喜欢
      • 2016-05-28
      • 1970-01-01
      • 1970-01-01
      • 2018-07-24
      • 2012-04-02
      • 2021-08-26
      • 2015-07-17
      • 2016-03-27
      • 1970-01-01
      相关资源
      最近更新 更多