如何将 raspberry pi 上的 gpio 引脚与设备驱动程序中的设备树一起使用?
How to use the gpio pins on the raspberry pi with the device tree in a device driver?
我尝试开发一个驱动程序来通过 raspberry pi 上的 gpio 引脚控制自定义硬件。
我很乐意将新的 gpio_desc 与设备树结合使用。
但是我无法让它工作。
如果我尝试通过
red = gpio_to_desc( 17 );
一切正常,但是
green = gpiod_get(dev, "carr", GPIOD_OUT_LOW);
似乎跳过了设备树。
在 dmesg 中:
[ 4326.023976] carrera_driver carrera.0: GPIO lookup for consumer carr
[ 4326.023986] carrera_driver carrera.0: using lookup tables for GPIO lookup
[ 4326.023999] carrera_driver carrera.0: No GPIO consumer carr found
[ 4326.024010] carrera_driver carrera.0: Failed to get carr GPIO: -2
[ 4326.024034] carrera_driver: probe of carrera.0 failed with error -2
设备树:
/dts-v1/;
/plugin/;
/{
compatible = "brcm,bcm2835";
fragment@0 {
target = <&gpio>;
__overlay__ {
carrera_pins: carrera_pins {
compatible = "kru,carrera";
brcm,pins = <18>;
brcm,function = <1>; // out
brcm,pull = <0>;
};
};
};
fragment@1 {
target = <&gpio>;
__overlay__ {
carrera: carrera {
compatible = "kru,carrera";
#gpio-cells = <2>;
pinctrl-names = "default";
pinctrl-0 = <&carrera_pins>;
carr-gpios = <&gpio 18 0>;
};
};
};
};
我认为这是设备树与驱动程序映射发生的部分
struct platform_device linuxmag = {
.name = "carrera", /* driver identification */
.id = 0,
.dev = {
.release = linuxmag_release,
}
};
static struct of_device_id linmag_match[] = {
{.compatible = "kru,carrera"},
{}
};
static struct platform_driver mydriver = {
.probe = linuxmag_probe_device,
.remove = linuxmag_remove_device,
.driver = {
.name = "carrera_driver",
.of_match_table = linmag_match,
}
};
别把名字搞混了。我使用了这篇文章中的模板。
https://www.linux-magazin.de/ausgaben/2017/08/kern-technik/3/
我想我遗漏了一些非常重要的东西。
有人举了一个例子说明如何通过设备树在 gpiod 子模块上至少获得一个 led 吗?
我在 Internet 上找到的所有内容都有不完整的设备树或没有代码。
这是一个对我有用的简短答案。
/dts-v1/;
/plugin/;
/ {
fragment@0 {
target = <&gpio>;
__overlay__ {
hsnrcarr {
compatible = "kru,carrera";
carr-gpios = <&gpio 17 0 >;
};
};
};
};
我切换到 GPIO 17。
我希望我能抽出时间 post 一个更详细的答案。
我尝试开发一个驱动程序来通过 raspberry pi 上的 gpio 引脚控制自定义硬件。
我很乐意将新的 gpio_desc 与设备树结合使用。 但是我无法让它工作。
如果我尝试通过
red = gpio_to_desc( 17 );
一切正常,但是
green = gpiod_get(dev, "carr", GPIOD_OUT_LOW);
似乎跳过了设备树。
在 dmesg 中:
[ 4326.023976] carrera_driver carrera.0: GPIO lookup for consumer carr
[ 4326.023986] carrera_driver carrera.0: using lookup tables for GPIO lookup
[ 4326.023999] carrera_driver carrera.0: No GPIO consumer carr found
[ 4326.024010] carrera_driver carrera.0: Failed to get carr GPIO: -2
[ 4326.024034] carrera_driver: probe of carrera.0 failed with error -2
设备树:
/dts-v1/;
/plugin/;
/{
compatible = "brcm,bcm2835";
fragment@0 {
target = <&gpio>;
__overlay__ {
carrera_pins: carrera_pins {
compatible = "kru,carrera";
brcm,pins = <18>;
brcm,function = <1>; // out
brcm,pull = <0>;
};
};
};
fragment@1 {
target = <&gpio>;
__overlay__ {
carrera: carrera {
compatible = "kru,carrera";
#gpio-cells = <2>;
pinctrl-names = "default";
pinctrl-0 = <&carrera_pins>;
carr-gpios = <&gpio 18 0>;
};
};
};
};
我认为这是设备树与驱动程序映射发生的部分
struct platform_device linuxmag = {
.name = "carrera", /* driver identification */
.id = 0,
.dev = {
.release = linuxmag_release,
}
};
static struct of_device_id linmag_match[] = {
{.compatible = "kru,carrera"},
{}
};
static struct platform_driver mydriver = {
.probe = linuxmag_probe_device,
.remove = linuxmag_remove_device,
.driver = {
.name = "carrera_driver",
.of_match_table = linmag_match,
}
};
别把名字搞混了。我使用了这篇文章中的模板。 https://www.linux-magazin.de/ausgaben/2017/08/kern-technik/3/
我想我遗漏了一些非常重要的东西。
有人举了一个例子说明如何通过设备树在 gpiod 子模块上至少获得一个 led 吗? 我在 Internet 上找到的所有内容都有不完整的设备树或没有代码。
这是一个对我有用的简短答案。
/dts-v1/;
/plugin/;
/ {
fragment@0 {
target = <&gpio>;
__overlay__ {
hsnrcarr {
compatible = "kru,carrera";
carr-gpios = <&gpio 17 0 >;
};
};
};
};
我切换到 GPIO 17。
我希望我能抽出时间 post 一个更详细的答案。