我正在为嵌入式板上的lirc编写一个自定义的IR发送器驱动程序。该开发板具有一个i2c至gpio扩展器(FXL6408)。
问题是我的驱动器(因此需要LIRC)只需要一个GPIO引脚,而其他应用程序则需要其他引脚。像这样:
我已经阅读了LWM,LDD3以及有关i2c-slave
,i2c 适配器,公共汽车,pinctrl
,gpio
,堆叠的大量站点等,但不清楚该怎么做:
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
答案 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;
}