Beagle Bone Black LED的物理地址

时间:2019-11-14 21:15:06

标签: beagleboneblack

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

1 个答案:

答案 0 :(得分:1)

是的,您可以查阅BBB原理图以找到连接LED here的引脚。让我帮你。 enter image description here

这是实际的芯片组引脚。

enter image description here

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

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 */
        >;
    };

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

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. Requesting the GPIO pins required in the device tree
  2. Getting and controlling the GPIO pins from kernel driver