beagleboneblack - Beagle Bone Black LED 的物理地址
问题描述
无论如何我们可以找到BBB LED的物理地址吗?我对此并不陌生,但我正在尝试编写一个直接访问硬件的设备驱动程序。谢谢 :)。
解决方案
是的,您可以查阅 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。
请点击以下链接了解更多详情:
推荐阅读
- c++ - fmod() 在我的简单 C++ 银行程序中返回相同的值
- c# - 从控制台应用程序通过 HTTPS 调用 web api(两者都部署在 Windows Docker 中)
- react-native - 自定义字体加载在 Expo React 本机应用程序中不起作用
- python-3.x - 当我尝试在 python 中生成一个随机字母时收到一个错误
- php - 使用 Eloquent 从 3 个三个表中选择数据
- eclipse - eclipse“查找所有引用” - 我如何限制此搜索的文件类型
- reactjs - 为什么在使用 Material-ui 和 NextJS 时需要在 componentDidUpdate 或 useEffect 中去掉 jssStyles?
- python - 在 psycopg2 中没有 postgres 数据库的所有权限
- woocommerce - 将 UTM 参数添加到 Woocommerce 订单信息(元框)
- reactjs - VSS SDK 行为异步