由于产品需要在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口在uboot中正常初始化实现应用功能。
版权属于:咖啡走糖
本文链接:https://www.qwc-lmhhj.cn/archives/137.html
若无注明,本文皆咖啡走糖原创,转载时必须注明出处及本声明!