前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >uboot中初始化IO口

uboot中初始化IO口

作者头像
咖啡走糖
发布2022-11-05 16:25:42
7770
发布2022-11-05 16:25:42
举报
文章被收录于专栏:咖啡走糖

由于产品需要在uboot启动时要实现某些应用功能,所以在uboot中对一些IO口进行初始化,这里参考了dm-gpio的使用方法。

1.dts中增加GPIO的定义。(arch/arm/dts/armada-3720-espressobin.dts)

代码语言:javascript
复制
first {
        compatible = "marvell,first";  //first随便取的一个名字
        reset-gpio = <&gpionb 14 GPIO_ACTIVE_LOW>;  //MPP1_14(北桥第14个gpio,从0开始)蜂鸣器
        wdi-gpio = <&gpiosb 1 GPIO_ACTIVE_LOW>;     //MPP2_1   看门狗
        enable-gpio = <&gpionb 9 GPIO_ACTIVE_LOW>;  //MPP1_9   WDI enable    
};

2.驱动从节点中获取一个GPIO,在board_init()中增加。(board/Marvell/mvebu_armada-37xx/board.c)

代码语言:javascript
复制
 int board_init(void)
 {
+        struct gpio_desc gpio = {};
+        struct gpio_desc wdi_gpio = {};
+        struct gpio_desc enable_gpio = {};
+        int node;
         /* adress of boot parameters */
         gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;

         /* enable serdes lane 2 mux for sata phy */
         board_comphy_usb3_sata_mux(COMPHY_LANE2_MUX_SATA);

- node = fdt_node_offset_by_compatible(gd-fdt_blob, 0,"marvell,first");
- if (node  0)
- {                          
- printf("===========================Don't find marvell,first node\n");
- return -1; 
- }
+
- gpio_request_by_name_nodev(offset_to_ofnode(node), "reset-gpio",0, gpio,       
- GPIOD_IS_OUT); /* 在驱动中调用gpio_request_by_name_nodev接口或者其他接口从dtsi节点 
- 中获取对应GPIO属性的gpio_desc描述符 */
- gpio_request_by_name_nodev(offset_to_ofnode(node), "wdi-gpio",0, wdi_gpio, 
- GPIOD_IS_OUT);
- gpio_request_by_name_nodev(offset_to_ofnode(node), "enable-gpio",0, 
- enable_gpio, GPIOD_IS_OUT);
- if (dm_gpio_is_valid(gpio)) /调用dm_gpio_is_valid判断该gpio_desc是否可用/
- {
- dm_gpio_set_value(gpio, 1);  /* MPP1_14置0,启动uboot时关闭蜂鸣器  */
- }
+
- if (dm_gpio_is_valid(wdi_gpio))
- {
- dm_gpio_set_value(wdi_gpio, 1);  /* gpio设置1是低电平,0是高电平 */
- }
+
- if (dm_gpio_is_valid(enable_gpio))
- {  
- dm_gpio_set_value(enable_gpio, 1);/*  默认输出低0,开门狗功能使能, 
- 开启开门狗功能后,此IO需置高1方可使能 */
- }
  return 0;
 }

* 这里要注意在menuconfig中要支持CONFIG_DM和CONFIG_DM_GPIO这两个选项。

编译完之后烧写uboot等设备启动,发现添加的GPIO口初始化不起作用,检查发现board_init()没有运行到,在common/board_r.c中加入board_init。

代码语言:javascript
复制
    #ifdef CONFIG_PS2KBD
            initr_kbd,
    #endif
+           board_init,
            run_main_loop,

重新编译烧写uboot,GPIO口在uboot中正常初始化实现应用功能。

版权属于:咖啡走糖

本文链接:https://cloud.tencent.com/developer/article/2152381

若无注明,本文皆咖啡走糖原创,转载时必须注明出处及本声明!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020 年 03 月,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档