强制内核模块的 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);
我正在为 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);