mirror of
https://github.com/54shady/kernel_drivers_examples.git
synced 2025-08-11 23:32:00 +00:00
Uboot : parse info from dts to control gpio
This commit is contained in:
@ -20,6 +20,10 @@
|
||||
|
||||
[Regmap 驱动实例](./debug/regmap/README.md)
|
||||
|
||||
## Uboot中驱动开发
|
||||
|
||||
[GPIO驱动](./uboot/README.md)
|
||||
|
||||
## 烧写
|
||||
|
||||
### 分区和对应文件
|
||||
|
82
uboot/README.md
Normal file
82
uboot/README.md
Normal file
@ -0,0 +1,82 @@
|
||||
# Uboot
|
||||
|
||||
## 在uboot中控制gpio操作led实例
|
||||
|
||||

|
||||
|
||||
对于上图的Q23三极管,只要拉高WORK_LED管脚,三级管导通,led被点亮
|
||||
|
||||
在设备树中leds描述如下
|
||||
|
||||
```c
|
||||
leds {
|
||||
compatible = "gpio-leds";
|
||||
power {
|
||||
label = "firefly:blue:power";
|
||||
linux,default-trigger = "ir-power-click";
|
||||
default-state = "on";
|
||||
gpios = <&gpio2 D3 GPIO_ACTIVE_HIGH>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&led_power>;
|
||||
};
|
||||
user {
|
||||
label = "firefly:yellow:user";
|
||||
linux,default-trigger = "ir-user-click";
|
||||
default-state = "off";
|
||||
gpios = <&gpio0 B5 GPIO_ACTIVE_HIGH>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&led_user>;
|
||||
};
|
||||
};
|
||||
```
|
||||
|
||||
其中注意两个宏设置,和名字意思相反
|
||||
|
||||
#define GPIO_ACTIVE_HIGH 0
|
||||
#define GPIO_ACTIVE_LOW 1
|
||||
|
||||
在uboot的板级驱动文件rk33xx.c中添加如下代码,
|
||||
后在board_late_init函数中调用power_led_init即可
|
||||
|
||||
```c
|
||||
static struct fdt_gpio_state power_led_gpio;
|
||||
static struct fdt_gpio_state user_led_gpio;
|
||||
int power_led_parse_dt(const void *blob)
|
||||
{
|
||||
int power_node = 0;
|
||||
int user_node = 0;
|
||||
int node = 0;
|
||||
|
||||
/* 通过compatible获取leds的node */
|
||||
node = fdt_node_offset_by_compatible(blob, 0, "gpio-leds");
|
||||
if (node < 0) {
|
||||
printf("can't find dts node for led\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
/* 获取leds下power和user的node */
|
||||
power_node = fdt_subnode_offset(blob, node, "power");
|
||||
user_node = fdt_subnode_offset(blob, node, "user");
|
||||
|
||||
/* 获取power和user里管脚配置 */
|
||||
fdtdec_decode_gpio(blob, power_node, "gpios", &power_led_gpio);
|
||||
fdtdec_decode_gpio(blob, user_node, "gpios", &user_led_gpio);
|
||||
|
||||
/* 打印出相关信息 */
|
||||
printf("power_led_gpio: %s,%d-%d\n", power_led_gpio.name, power_led_gpio.gpio, power_led_gpio.flags);
|
||||
printf("user_led_gpio: %s,%d-%d\n", user_led_gpio.name, user_led_gpio.gpio, user_led_gpio.flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void power_led_init(void)
|
||||
{
|
||||
power_led_parse_dt(gd->fdt_blob);
|
||||
if (power_led_gpio.name != NULL)
|
||||
{
|
||||
/* 由于GPIO_ACTIVE_HIGH宏定义反了,所以这里需要取反flags */
|
||||
gpio_direction_output(power_led_gpio.gpio, !power_led_gpio.flags);
|
||||
gpio_direction_output(user_led_gpio.gpio, !user_led_gpio.flags);
|
||||
}
|
||||
}
|
||||
```
|
BIN
uboot/leds.png
Normal file
BIN
uboot/leds.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 49 KiB |
Reference in New Issue
Block a user