linux驱动程序如何将函数委派给另一个驱动程序(共享硬件)

时间:2019-07-12 02:05:17

标签: driver linux-device-driver lirc

我正在为嵌入式板上的lirc编写一个自定义的IR发送器驱动程序。该开发板具有一个i2c至gpio扩展器(FXL6408)。

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

Driver Connections

我已经阅读了LWM,LDD3以及有关i2c-slave,i2c 适配器,公共汽车pinctrlgpio堆叠的大量站点等,但不清楚该怎么做:

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

遵循this SO suggestion是有希望的,但是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

1 个答案:

答案 0 :(得分:-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;
}