linux gpio 驱动无法导出 GPIO

问题描述 投票:0回答:1

我想使用linux GPIO驱动程序来处理mpc8308处理器的GPIO引脚之一作为输出。所以我启用了 GPIO 驱动程序并在以下位置进行调试:

Device Drivers  ---> GPIO Support  ---> /sys/class/gpio/... (sysfs interface)

但是当使用

echo
命令导出GPIO21时,它给出Invalid argument errno:

gpio_request: gpio-21 (sysfs) status -22
export_store: status -22

我使用

cat /sys/kernel/debug/gpio
查看哪些GPIO引脚被其他驱动程序保留,但它什么也没显示。所以这个引脚是免费的。

我破解了内核以查找错误位置,发现在 gpiolib.c 中的

gpio_request
函数的开头,它在下面的最后一行崩溃了:

int gpio_request(unsigned gpio, const char *label)
{
    struct gpio_desc    *desc;
    struct gpio_chip    *chip;
    int         status = -EINVAL;
    unsigned long       flags;

    spin_lock_irqsave(&gpio_lock, flags);

    if (!gpio_is_valid(gpio))
        goto done;
    desc = &gpio_desc[gpio];
    chip = desc->chip;
    if (chip == NULL)
        goto done

gpio_desc[gpio]
是驱动程序 (
static struct gpio_desc gpio_desc[ARCH_NR_GPIOS];
) 中的数组条目,必须由驱动程序中的
gpiochip_add
函数初始化。并且必须按照驱动程序所说尽早调用此函数:

/**
 * gpiochip_add() - register a gpio_chip
 * @chip: the chip to register, with chip->base initialized
 * Context: potentially before irqs or kmalloc will work
 *
 * Returns a negative errno if the chip can't be registered, such as
 * because the chip->base is invalid or already associated with a
 * different chip.  Otherwise it returns zero as a success code.
 *
 * When gpiochip_add() is called very early during boot, so that GPIOs
 * can be freely used, the chip->dev device must be registered before
 * the gpio framework's arch_initcall().  Otherwise sysfs initialization
 * for GPIOs will fail rudely.
 *
 * If chip->base is negative, this requests dynamic assignment of
 * a range of valid GPIOs.
 */

但是

gpiochip_add
函数在启动期间永远不会被调用。

这是 .dts 文件:

gpio@c00 {
            device_type = "gpio";
            compatible = "fsl,mpc8315-gpio";
            reg = <0xc00 0x100>; //reg = <0xc00 0x18>;
            interrupt-parent = < &ipic >;
        };

谁能帮我解决这个问题吗?

编辑:

我将 dts 文件更改为:

gpio1: gpio-controller@c00 {
            #gpio-cells = <2>;
            compatible = "fsl,mpc8308-gpio", "fsl,mpc8349-gpio";
            reg = <0xc00 0x100>;
            interrupt-parent = <&ipic>;
            interrupts = <74 0x8>;
            gpio-controller;
            interrupt-controller;
            #interrupt-cells = <2>;
        };

现在它在

gpiochip224
中显示
/sys/class/gpio
并且该 gpiochip 有 32 个 GPIO。但我不知道21和224-255之间的映射是什么? 谁能告诉我MPC8308 PowerPC系列处理器数据表中的PIN号和内核中的GPIO号之间的关系是什么?我尝试了所有数字224-255,但没有一个起作用。

c linux gpio
1个回答
0
投票

需要使用GPIO控制器底座+GPIO。

如果您有 gpiochip451 并且想要 gpio 21:

$ ls /sys/class/gpio
export  gpiochip451@  unexport

那么你需要:echo 472 > 导出

© www.soinside.com 2019 - 2024. All rights reserved.