强制内核模块的 GPIO 始终为输出

Forcing a kernel module's GPIOs to always be outputs

我正在为 pca9570 i2c GPO 扩展器编写驱动程序。 (它有四个输出位,其值通过对其 i2c 地址进行简单的一个字节写入来设置。)

我目前正在按如下方式设置 GPIO:

struct gpio_chip *gc = &chip->gpio_chip;

gc->set = pca9570_gpio_set_value;
gc->get = pca9570_gpio_get_value;
gc->direction_output = pca9570_gpio_direction_output;
gc->direction_input = pca9570_gpio_direction_input;

gc->can_sleep = true;

gc->base = gpio_start;
gc->ngpio = PCA9570_GPIO_COUNT;
gc->label = chip->client->name;
gc->owner = THIS_MODULE;

gc->dev = &chip->client->dev;

这个模块如何告诉内核它只能输出数据?即我希望 user-space root@arm:/sys/class/gpio/gpio508# cat direction 的结果是 out,而不是当前的 in

我有一半认为这个驱动程序需要添加一些客户端 gpio 调用以将方向设置为初始化时的输出,以及每当用户尝试将它们设置为输入时。这是正确的做法吗?

是否有我可以复制的现有 "output only" gpio 驱动程序?

根据数据表 http://www.nxp.com/documents/data_sheet/PCA9570.pdf PCA9570 是一种 CMOS 器件,可在低电压处理器和手持电池供电的移动应用中提供 4 位通用并行输出 (GPO) 扩展。

为了满足此要求,Linux 内核中的驱动程序不得实现 ->get_direction()->direction_input() 回调,如代码中所述:

            if (chip->get_direction) {
             ...
            } else if (!chip->direction_input) {
                    /*
                     * If the chip lacks the .direction_input callback
                     * we logically assume all lines are outputs.
                     */
                    set_bit(FLAG_IS_OUT, &desc->flags);