uboot linux dts 内存,uboot中获取dts资源并操作gpio口

设备树(DTS)的引入减少了内核为支持新硬件而需要的改变,提高代码重用,使得单个内核镜像能支持多个系统。

DTS作为U-Boot 和Linux 内核之间的动态接口,能够有效减少重复配置,共享于U-Boot 和Linux之间。本文将简单介绍U-Boot使用DTS控制LED的例子:

1.在kernel/arch/arm/boot/dts/rk3288-box.dts中添加LED配置:

------------------- kernel/arch/arm/boot/dts/rk3288-box.dts -------------------

index e102714..80928ba 100755

@@ -137,6 +136,16 @@

rockchip,remote_wakeup;

rockchip,usb_irq_wakeup;

};

+

+ leds {

+ compatible = "gpio-leds";

+ power {

+ label = "tchip:blue:power";

+ default-state = "on";

+ gpios = ;

+ };

+ };

};

&gmac {

以上是linux标准的GPIO-LED配置,直接配置上内核就可使用LED。

2.修改U-Boot,以支持读取DTS配置并操作LED灯,修改u-boot/board/rockchip/rk32xx/rk32xx.c:

-------------------- u-boot/board/rockchip/rk32xx/rk32xx.c --------------------

index bfdcf0e..29fff0f 100755

@@ -61,12 +61,34 @@ void board_lmb_reserve(struct lmb *lmb) {

//reserve 48M for kernel & 8M for nand api.

lmb_reserve(lmb, gd->bd->bi_dram[0].start, CONFIG_LMB_RESERVE_SIZE);

}

+

+static struct fdt_gpio_state power_led_gpio;

+int power_led_parse_dt(const void *blob)

+{

+ int led_node = 0;

+ int node = 0;

+

+ node = fdt_node_offset_by_compatible(blob,

+ 0, "gpio-leds");

+ if (node < 0) {

+ printf("can't find dts node for led\n");

+ return -ENODEV;

+ }

+ led_node = fdt_subnode_offset(blob, node, "power");

+ fdtdec_decode_gpio(blob, led_node, "gpios", &power_led_gpio);

+ power_led_gpio.gpio = rk_gpio_base_to_bank(power_led_gpio.gpio & RK_GPIO_BANK_MASK) | (power_led_gpio.gpio & RK_GPIO_PIN_MASK);

+ power_led_gpio.flags = !(power_led_gpio.flags & OF_GPIO_ACTIVE_LOW);

+ debug("power_led_gpio: %s,%d-%d\n", power_led_gpio.name, power_led_gpio.gpio, power_led_gpio.flags);

+

+ return 0;

+}

#endif /* CONFIG_OF_LIBFDT */

#ifdef CONFIG_RK_FB

#ifdef CONFIG_OF_LIBFDT

+

static struct fdt_gpio_state lcd_en_gpio, lcd_cs_gpio;

static int lcd_en_delay, lcd_cs_delay;

static int lcd_node = 0;

@@ -114,7 +136,6 @@ void rk_backlight_ctrl(int brightness)

void rk_fb_init(unsigned int onoff)

{

-

#ifdef CONFIG_OF_LIBFDT

if (lcd_node == 0) rk_lcd_parse_dt(gd->fdt_blob);

@@ -178,6 +199,17 @@ void init_panel_info(vidinfo_t *vid)

vid->logo_rgb_mode = RGB565;

}

+void power_led_init(void)

+{

+ printf("Enter power_led_init\n");

+#ifdef CONFIG_OF_LIBFDT

+ power_led_parse_dt(gd->fdt_blob);

+ if (power_led_gpio.name!=NULL)

+ {

+ gpio_direction_output(power_led_gpio.gpio, power_led_gpio.flags);

+ }

+#endif

+}

#ifdef CONFIG_RK616

int rk616_power_on(void)

@@ -259,6 +291,9 @@ int board_late_init(void)

load_disk_partitions();

prepare_fdt();

key_init();

+

+ power_led_init();

+

#ifdef CONFIG_POWER_RK

pmic_init(0);

fg_init(0); /*fuel gauge init*/

3.编译内核,参考Wiki<>中的编译内核映像部分4.编译U-Boot,参考SDK下的“RKDocs/common/uboot/RockChip_Uboot开发文档V1.0.pdf”文档,编译生成RK3288Loader_uboot_V2.15.bin

5.烧写resource.img和RK3288Loader_uboot_V2.15.bin,开机。有没有发现LED灯比原来的快差不多两秒点亮呢

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值