嵌入式开发者社区
标题: U-Boot配置GPIO问题 [打印本页]
作者: czs----Tronlong 时间: 2020-1-7 17:08
标题: U-Boot配置GPIO问题
客户问题
现在需要解决在系统启动过程中24个输出口状态不固定的问题,使在系统启动过程中数字输出端口的状态稳定为高电平或是低电平;按现在的硬件设计需要做到开机过程中所有的输出指示灯不亮,即输出要求为高电平。请问应该如何处理呢?
作者: czs----Tronlong 时间: 2020-1-7 17:15
解决办法
一般情况下,客户在设备树配置文件中对GPIO进行配置,是需要在linux 系统起来后,GPIO 驱动加载时才生效,加载时间随机;
如果想要的上电过程就对配置好GPIO,比如从 uboot阶段 就开始就稳定输出状态,可以参考如下方法进行配置:
1. 根据底板原理图确定需要用的GPIO引脚
[attach]6050[/attach]
2. 查询《AM572x Sitara Processor Technical Reference Manual (Rev. J)》手册,确定对应引脚的默认模式,并将其配置为GPIO模式:
[attach]6053[/attach]
3. 配置对应IO的GPIO_OE和GPIO_SETDATAOUT寄存器输出对应电平
[attach]6054[/attach]
[attach]6055[/attach]
在 board/ti/am57xx/board.c 中 的 spl_start_uboot 函数中添加对相应 GPIO 寄存器的配置
+#define AM572X_GPIO7_BASE 0x48051000
+#define AM572X_GPIO_OE_OFF 0x134
+#define AM572X_GPIO_SETDATA_OUT_OFF 0x194
int spl_start_uboot(void)
{
+ u32 reg_val;
+
+ /* SOM-TL5728 led1: gpio7_7 */
+ reg_val = __raw_readl(AM572X_GPIO7_BASE + AM572X_GPIO_OE_OFF);
+ reg_val &= ~(BIT(7));
+ __raw_writel(reg_val, AM572X_GPIO7_BASE + AM572X_GPIO_OE_OFF);
+
+ reg_val = __raw_readl(AM572X_GPIO7_BASE + AM572X_GPIO_SETDATA_OUT_OFF);
+ reg_val|= BIT(7);
+ __raw_writel(reg_val, AM572X_GPIO7_BASE + AM572X_GPIO_SETDATA_OUT_OFF);
小工具:U-Boot下可以用md指令读取寄存器的电平状态
[attach]6049[/attach]
作者: czs----Tronlong 时间: 2020-2-20 17:54
基于创龙TL5728F-EVM-A3开发板,在MLO、u-boot、内核全程点亮LED1
《一》 查看底板原理图,LED1 对应 GPIO 管脚是 GPIO3_19,与 VIN1A_D15 复用
[attach]6079[/attach]
[attach]6080[/attach]
查看 TRM数据手册
[attach]6081[/attach]
[attach]6082[/attach]
[attach]6083[/attach]
《二》 MLO (u-boot 第一阶段)
要完成:
1、配置 GPIO3_19 的 pinmux
2、设置 GPIO3_19 输出高电平
在U-Boot源码 arch/arm/mach-omap2/hwinit-common.c文件中添加如下代码
204 #defineAM572X_CTRL_MODULE_CORE_BASE 0x4A002000
205 #defineAM572X_VIN1A_D15_MUXMODE_OFFSET 0x1530
206 #defineAM572X_VIN1A_D15_MUXMODE_GPIO3_19 0xE
207
208 #defineAM572X_GPIO3_BASE 0x48057000
209 #defineAM572X_GPIO_OE_OFFSET 0x134
210 #define AM572X_GPIO_SETDATA_OUT_OFFSET 0x194
211
212 void Test_tl5728f_evm_a3_led1_on(void) {
213 u32 reg_val;
214
215 /* TL5728F-EVM-A3LED1: set VIN1A_D15 to GPIO3_19 Mode */
216 reg_val =__raw_readl(AM572X_CTRL_MODULE_CORE_BASE + AM572X_VIN1A_D15_MUXMODE_OFFSET);
217 reg_val &=((2^32) - 1) << 4;
218 reg_val |=AM572X_VIN1A_D15_MUXMODE_GPIO3_19;
219 __raw_writel(reg_val,AM572X_CTRL_MODULE_CORE_BASE + AM572X_VIN1A_D15_MUXMODE_OFFSET);
220
221 /* TL5728F-EVM-A3LED1: set gpio3_19 to output enable */
222 reg_val =__raw_readl(AM572X_GPIO3_BASE + AM572X_GPIO_OE_OFFSET);
223 reg_val &=~(BIT(19));
224 __raw_writel(reg_val,AM572X_GPIO3_BASE + AM572X_GPIO_OE_OFFSET);
225
226 /* TL5728F-EVM-A3LED1: set gpio3_19 to high level */
227 reg_val =__raw_readl(AM572X_GPIO3_BASE + AM572X_GPIO_SETDATA_OUT_OFFSET);
228 reg_val|= BIT(19);
229 __raw_writel(reg_val,AM572X_GPIO3_BASE + AM572X_GPIO_SETDATA_OUT_OFFSET);
230 }
232
233 #ifdef CONFIG_SPL_BUILD
234 void board_init_f(ulong dummy)
235 {
236 early_system_init();
237
238 Test_tl5728f_evm_a3_led1_on();
239
240 #ifdef CONFIG_BOARD_EARLY_INIT_F
241 board_early_init_f();
242 #endif
243 /* For regular u-bootsdram_init() is called from dram_init() */
244 sdram_init();
245 gd->ram_size =omap_sdram_size();
246 }
247 #endif
《三》 u-boot(第二阶段)
运行过程中未对 GPIO3_19 做任何操作,固不需改动
《四》 kernel 阶段
在 kernel 启动过程中会对 GPIO 等硬件做 reset 操作,并且在加载 LED 驱动时会对 GPIO 操作。固在设备设备树中做相应配置
修改文件:arch/arm/boot/dts/am57xx-beagle-x15-common.dtsi
LED 驱动加载的时候GPIO3_19 保持高电平
125 led2{
126 label= "user-led0";
127 gpios= <&gpio3 19 GPIO_ACTIVE_HIGH>;
128 default-state= "on";
129 };
内核初始化对硬件 RESET 时,不要对 GPIO3 进行操作
805 &gpio3 {
806 ti,no-reset-on-init;
807 ti,no-idle-on-init;
808 };
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |