我想使用Linux GPIO驱动程序来处理mpc8308处理器的一个GPIO引脚作为输出。因此,我启用了GPIO驱动程序,它正在调试:Device Drivers ---> GPIO Support ---> /sys/class/gpio/... (sysfs interface)
但当使用echo
命令导出GPIO21时,它给出无效参数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>;
};
现在它在/sys/class/gpio
中显示gpiochip224
,并且这个gpiochip有32个GPIO。但是我不知道21和224 - 255之间的Map是什么?谁能告诉我数据手册中的PIN编号和MPC8308 PowerPC系列处理器内核中的GPIO编号之间的关系?我尝试了所有编号224 - 255,但它们都不起作用。
1条答案
按热度按时间tp5buhyn1#
您需要使用GPIO控制器底座+GPIO。
如果您有gpiochip451并且需要gpio 21:
然后,您需要:回显472〉导出