uboot中初始化IO口

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

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

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)

 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。

    #ifdef CONFIG_PS2KBD
            initr_kbd,
    #endif
+           board_init,
            run_main_loop,

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

上一篇:22、统计各个部门的工资记录数


下一篇:基于阿里云Centos搭建个人博客