0

我正在为嵌入式板上的 lirc 编写自定义红外发射器驱动程序。该板有一个 i2c-to-gpio 扩展器 ( FXL6408 )。

问题是我的驱动程序(因此 LIRC)只需要一个 GPIO 引脚,而其他应用程序需要其他引脚。像这样的东西:

驱动程序连接

我已经阅读了 LWM、LDD3 和大量关于i2c-slavei2c适配器、总线pinctrl、、、堆叠gpio的网站,但不清楚如何做我想做的事情:

my-driver需要控制 GPIO 扩展器上的单个引脚,同时仍允许其他应用程序通过 控制其他 7 个引脚/dev/i2c-0

遵循这个 SO 建议很有希望但i2c_new_dummy失败了,返回 NULL:

i2cAdaptor = i2c_get_adapter(ECP_I2CBUS); // 1 means i2c-1 bus
if (i2cAdaptor == NULL)
{
    printk("ecp_gpio: Could not acquire i2c adaptor\n");
    return -EBUSY;
}

i2cClient  = i2c_new_dummy(i2cAdaptor, ECP_I2CDEV); // 0x43 - slave address on i2c bus
if (i2cClient == NULL)
{
    printk("ecp_gpio: Could not acquire i2c client\n");
    return -EBUSY;
}

if ( (rc = i2c_smbus_write_byte(i2cClient, 0xF0)) < 0)
{
    printk("ecp_gpio: Error writing byte - error %d", rc);
    return -EIO;
}

连接管道以实现我想要的正确方法是什么?

操作系统信息:

# uname -a
Linux ecp 4.4.127-1.el6.elrepo.i686 #1 SMP Sun Apr 8 09:44:43 EDT 2018 i686 i686 i386 GNU/Linux
4

1 回答 1

-1

在尝试了许多不同的事情之后,我找到了一个有效的。我不知道这是否是“正确的方法”,但它确实有效。

无需尝试创建虚拟客户端,只需i2c_xx直接调用函数即可。所以代码看起来像:

i2cAdaptor = i2c_get_adapter(ECP_I2CBUS); // 1 means i2c-1 bus etc
if (i2cAdaptor == NULL)
{
    printk("ecp_gpio: Could not acquire i2c adaptor\n");
    return -EBUSY;
}


union i2c_smbus_data data;

data.byte = 0xF0;

if ((rc = i2c_smbus_xfer(ecpHardware.i2cAdaptor, ECP_I2CDEV, 0, I2C_SMBUS_WRITE, 0x05, I2C_SMBUS_BYTE_DATA, &data)) < 0)
{
    printk("ecp_gpio: i2c_smbus_xfer failed: %d\n", rc);
    return -EIO;
}

data.byte = 0xE0;

if ((rc = i2c_smbus_xfer(ecpHardware.i2cAdaptor, ECP_I2CDEV, 0, I2C_SMBUS_WRITE, 0x05, I2C_SMBUS_BYTE_DATA, &data)) < 0)
{
    printk("ecp_gpio: i2c_smbus_xfer failed: %d\n", rc);
    return -EIO;
}
于 2019-07-14T02:54:52.767 回答