Firefly开源社区

12
发表新贴

U-Boot使用DTS共享配置应用实例

2548

积分

56

威望

46

贡献

社区版主

Rank: 7Rank: 7Rank: 7

积分
2548

优秀版主论坛元老

发表于 2014-10-15 15:12:38     
本帖最后由 zhansb 于 2014-10-15 15:25 编辑

    设备树(DTS)的引入减少了内核为支持新硬件而需要的改变,提高代码重用,使得单个内核镜像能支持多个系统。
    DTS作为U-Boot 和Linux 内核之间的动态接口,能够有效减少重复配置,共享于U-Boot 和Linux之间本文将简单介绍U-Boot使用DTS控制LED的例子:   
    1.在kernel/arch/arm/boot/dts/rk3288-box.dts中添加LED配置:
  1. ------------------- kernel/arch/arm/boot/dts/rk3288-box.dts -------------------
  2. index e102714..80928ba 100755
  3. @@ -137,6 +136,16 @@
  4.                  rockchip,remote_wakeup;
  5.                  rockchip,usb_irq_wakeup;
  6.          };
  7. +
  8. +        leds {
  9. +                compatible = "gpio-leds";
  10. +                power {
  11. +                        label = "tchip:blue:power";
  12. +                        default-state = "on";
  13. +                        gpios = <&gpio8 GPIO_A3 GPIO_ACTIVE_LOW>;
  14. +                };
  15. +        };
  16. };

  17. &gmac {
复制代码
    以上是linux标准的GPIO-LED配置,直接配置上内核就可使用LED。

    2.修改U-Boot,以支持读取DTS配置并操作LED灯,修改u-boot/board/rockchip/rk32xx/rk32xx.c:
  1. -------------------- u-boot/board/rockchip/rk32xx/rk32xx.c --------------------
  2. index bfdcf0e..29fff0f 100755
  3. @@ -61,12 +61,34 @@ void board_lmb_reserve(struct lmb *lmb) {
  4.          //reserve 48M for kernel & 8M for nand api.
  5.          lmb_reserve(lmb, gd->bd->bi_dram[0].start, CONFIG_LMB_RESERVE_SIZE);
  6. }
  7. +
  8. +static struct fdt_gpio_state power_led_gpio;
  9. +int power_led_parse_dt(const void *blob)
  10. +{
  11. +        int led_node = 0;
  12. +        int node = 0;
  13. +
  14. +        node = fdt_node_offset_by_compatible(blob,
  15. +                                        0, "gpio-leds");
  16. +        if (node < 0) {
  17. +                printf("can't find dts node for led\n");
  18. +                return -ENODEV;
  19. +        }
  20. +        led_node = fdt_subnode_offset(blob, node, "power");
  21. +        fdtdec_decode_gpio(blob, led_node, "gpios", &power_led_gpio);
  22. +        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);
  23. +        power_led_gpio.flags = !(power_led_gpio.flags  & OF_GPIO_ACTIVE_LOW);
  24. +        debug("power_led_gpio: %s,%d-%d\n", power_led_gpio.name, power_led_gpio.gpio, power_led_gpio.flags);
  25. +
  26. +        return 0;
  27. +}
  28. #endif /* CONFIG_OF_LIBFDT */


  29. #ifdef CONFIG_RK_FB

  30. #ifdef CONFIG_OF_LIBFDT
  31. +
  32. static struct fdt_gpio_state lcd_en_gpio, lcd_cs_gpio;
  33. static int lcd_en_delay, lcd_cs_delay;
  34. static int lcd_node = 0;
  35. @@ -114,7 +136,6 @@ void rk_backlight_ctrl(int brightness)

  36. void rk_fb_init(unsigned int onoff)
  37. {
  38. -
  39. #ifdef CONFIG_OF_LIBFDT
  40.          if (lcd_node == 0) rk_lcd_parse_dt(gd->fdt_blob);

  41. @@ -178,6 +199,17 @@ void init_panel_info(vidinfo_t *vid)
  42.          vid->logo_rgb_mode = RGB565;
  43. }

  44. +void power_led_init(void)
  45. +{
  46. +        printf("Enter power_led_init\n");
  47. +#ifdef CONFIG_OF_LIBFDT
  48. +        power_led_parse_dt(gd->fdt_blob);
  49. +        if (power_led_gpio.name!=NULL)
  50. +        {
  51. +                gpio_direction_output(power_led_gpio.gpio, power_led_gpio.flags);
  52. +        }
  53. +#endif
  54. +}

  55. #ifdef CONFIG_RK616
  56. int rk616_power_on(void)
  57. @@ -259,6 +291,9 @@ int board_late_init(void)
  58.          load_disk_partitions();
  59.          prepare_fdt();
  60.          key_init();
  61. +
  62. +        power_led_init();
  63. +
  64. #ifdef CONFIG_POWER_RK
  65.          pmic_init(0);
  66.          fg_init(0); /*fuel gauge init*/
复制代码

    3.编译内核,参考Wiki<http://wiki.t-firefly.com/index.php/Firefly-RK3288/Build_kernel>中的编译内核映像部分

    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灯比原来的快差不多两秒点亮呢{:3_48:}





回复

使用道具 举报

37

积分

0

威望

0

贡献

游客

积分
37
发表于 2014-10-30 13:38:55     
查了一下kernel/arch/arm/boot/dts/Makefile文件,发现:
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3188-tb.dtb
也就是选择ROCKCHIP平台,编译的是 rk3188-tb.dtb,并没有编译rk3288-box.dts文件啊
回复

使用道具 举报

4

积分

0

威望

0

贡献

游客

积分
4
发表于 2014-11-24 20:10:21     
请问UBOOT代码在那个目录下面,没有找到。
回复

使用道具 举报

2548

积分

56

威望

46

贡献

社区版主

Rank: 7Rank: 7Rank: 7

积分
2548

优秀版主论坛元老

发表于 2014-11-25 10:46:32     
bg4ajb 发表于 2014-11-24 20:10
请问UBOOT代码在那个目录下面,没有找到。

在SDK下的u-boot/目录下
回复

使用道具 举报

19

积分

0

威望

0

贡献

技术小白

积分
19
发表于 2015-1-12 09:07:02     
没有这个目录.
回复

使用道具 举报

2548

积分

56

威望

46

贡献

社区版主

Rank: 7Rank: 7Rank: 7

积分
2548

优秀版主论坛元老

发表于 2015-1-12 10:36:44     
回复

使用道具 举报

39

积分

0

威望

0

贡献

游客

积分
39
发表于 2015-5-13 11:54:06     
U-BOOT用的DTS文件和kernel用的是一样的吗?路径是kernel/arch/arm/boot/dts/rk3288-box.dts。为什么找不到UBOOT的DTS
回复

使用道具 举报

2548

积分

56

威望

46

贡献

社区版主

Rank: 7Rank: 7Rank: 7

积分
2548

优秀版主论坛元老

发表于 2015-5-13 16:27:58     
是一样的
回复

使用道具 举报

133

积分

0

威望

0

贡献

技术小白

积分
133
发表于 2016-6-27 18:19:51     
支持一个
回复

使用道具 举报

90

积分

0

威望

0

贡献

游客

积分
90
发表于 2016-8-10 14:17:44     
rk_gpio_base_to_bank函数运行出错,提示的是rk_gpio_base_to_id error ...?
这个该怎么解决啊?版主可否教一下。
回复

使用道具 举报

返回列表
12
*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

友情链接 : 爱板网 电子发烧友论坛 云汉电子社区 粤ICP备14022046号-2
快速回复 返回顶部 返回列表