无论如何,我们可以找到BBB LED的物理地址吗? 我对此并不陌生,但是我试图编写一个直接访问硬件的设备驱动程序。 谢谢:)。
答案 0 :(得分:1)
是的,您可以查阅BBB原理图以找到连接LED 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。
点击这些链接以获取更多详细信息: