Грешка в драйвера на I2C устройство [TCA6408 I/O разширител]

Искам да свържа TCA6408 IO Expander и да получа ключов вход към моята вградена система. Опитвам се със 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

Когато стартирам системата, регистрацията на драйвери е наред. Но има грешка (pca953x: сондата на 2-0020 е неуспешна с грешка -22) във функцията Probe().

#Дневник на конзолата

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"?

някой моля да ме подкрепи.


person deeman    schedule 20.12.2013    source източник


Отговори (2)


Трябва да предоставите някои данни за платформата в структурата i2c_board_info.

От кода, който предоставихте, структурата трябва да бъде от тип struct pca953x_platform_data и посочена в полето platform_data.

т.е. (SABRE Lite Board)

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
    },
};
person Maduranga Jayasinghe    schedule 21.12.2013
comment
Благодаря ви отново за отговора. Но аз съм нов за драйвера на устройство за Linux. Не мога да разбера какви са съответните данни за платформата за платката SABRE Lite. Бихте ли ми изпратили подробности за платформата за SABRE Lite? - person deeman; 25.12.2013
comment
Попълних съответните данни за платформата за платката SABRELite. - person Maduranga Jayasinghe; 18.01.2014

Ето пример за платка 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;
};
person yegorich    schedule 20.12.2013