首页 > 解决方案 > Beagle Bone Black LED 的物理地址

问题描述

无论如何我们可以找到BBB LED的物理地址吗?我对此并不陌生,但我正在尝试编写一个直接访问硬件的设备驱动程序。谢谢 :)。

标签: beagleboneblack

解决方案


是的,您可以查阅 BBB 原理图以在此处找到连接 LED 的引脚。让我来帮你。 在此处输入图像描述

这是实际的芯片组引脚。

在此处输入图像描述

因此,您需要访问和控制引脚 GPIO1_21、GPIO1_22、GPIO1_23 和 GPIO1_24。为此,您需要确保没有其他驱动程序正在配置/使用这些引脚。这些引脚很可能已经由现有的“gpio-leds”驱动程序控制。请参阅下面的 gpio-led 驱动程序的设备树节点(来源

leds {
        pinctrl-names = "default";
        pinctrl-0 = <&user_leds_s0>;

        compatible = "gpio-leds";

        led@2 {
            label = "beaglebone:green:heartbeat";
            gpios = <&gpio1 21 GPIO_ACTIVE_HIGH>;
            linux,default-trigger = "heartbeat";
            default-state = "off";
        };

        led@3 {
            label = "beaglebone:green:mmc0";
            gpios = <&gpio1 22 GPIO_ACTIVE_HIGH>;
            linux,default-trigger = "mmc0";
            default-state = "off";
        };

        led@4 {
            label = "beaglebone:green:usr2";
            gpios = <&gpio1 23 GPIO_ACTIVE_HIGH>;
            linux,default-trigger = "cpu0";
            default-state = "off";
        };

        led@5 {
            label = "beaglebone:green:usr3";
            gpios = <&gpio1 24 GPIO_ACTIVE_HIGH>;
            linux,default-trigger = "mmc1";
            default-state = "off";
        };
    };

您需要禁用或覆盖上述节点才能使用您自己的驱动程序。还要确保为您的驱动程序选择正确的 pinmux 设置,以便这些引脚处于 gpio 模式。您可以重复使用如下所示的默认“user_leds_s0”引脚组。

&am33xx_pinmux {
    pinctrl-names = "default";
    pinctrl-0 = <&clkout2_pin>;

    user_leds_s0: user_leds_s0 {
        pinctrl-single,pins = <
            0x54 (PIN_OUTPUT_PULLDOWN | MUX_MODE7)  /* gpmc_a5.gpio1_21 */
            0x58 (PIN_OUTPUT_PULLUP | MUX_MODE7)    /* gpmc_a6.gpio1_22 */
            0x5c (PIN_OUTPUT_PULLDOWN | MUX_MODE7)  /* gpmc_a7.gpio1_23 */
            0x60 (PIN_OUTPUT_PULLUP | MUX_MODE7)    /* gpmc_a8.gpio1_24 */
        >;
    };

最后,不要直接使用 GPIO 引脚的物理地址,而应该使用 Linux 的 GPIO 接口,因为它已经控制了 GPIO 寄存器。您的自定义驱动程序的最终设备树节点可能如下所示:

leds {
        pinctrl-names = "default";
        pinctrl-0 = <&user_leds_s0>;

        compatible = "my-gpio-led-driver";

        userled-gpios = <&gpio1 21 GPIO_ACTIVE_HIGH>, /* USR0 */
                <&gpio1 22 GPIO_ACTIVE_HIGH>, /* USR1 */
                <&gpio1 23 GPIO_ACTIVE_HIGH>; /* USR2 */
                <&gpio1 24 GPIO_ACTIVE_HIGH>; /* USR3 */


}

在驱动程序代码中,您可以参考这些 GPIO 引脚,如下所示

    struct gpio_desc *usr_led0, *usr_led1, *usr_led2, *usr_led3;

    usr_led0 = gpiod_get_index(dev, "userled", 0, GPIOD_OUT_HIGH);
    usr_led1 = gpiod_get_index(dev, "userled", 1, GPIOD_OUT_HIGH);
    usr_led2 = gpiod_get_index(dev, "userled", 2, GPIOD_OUT_HIGH);
    usr_led3 = gpiod_get_index(dev, "userled", 3, GPIOD_OUT_HIGH);

然后您可以使用 linux gpio 消费者接口 (gpiod_* API) 来控制 LED。

请点击以下链接了解更多详情:

  1. 请求设备树中所需的 GPIO 引脚
  2. 从内核驱动程序获取和控制 GPIO 引脚

推荐阅读