一、X210 开发板的软启动电路详解
《x210bv3.pdf》
(1) 210 供电需要的电压比较稳定,而外部适配器的输出电压不一定那么稳定,因此板载了一个文稳压器件 MP1482. 这个稳压芯片的作用就是外部适配器电压在一定范围内变化时稳压芯片的输出电压都是 5V。
(2) MP1482芯片有一个EN(Enable)引脚,这个引脚可以让稳压芯片输出或关闭输出。EN 为高电平时有输出电压,EN 引脚为低电平时稳压芯片无输出。
(3) 两个因素可以影响 EN 引脚的电平:第一个是 POWER 按键(SW1),POWER 按键按下时 EN 为高电平,POWER 按键弹起时 EN 为低电平;第二个是 POWER_LOCK(EINT0)引脚,这个引脚为 POWER_LOCK 模式下高电平,则 EN 为高;若这个引脚为 EINT0 模式或者为POWER_LOCK 模式但输出为低电平,则 EN 为低。
(4) 图中还有 EINT1 引脚,这个引脚的作用是用来做中断,提供给 CPU 用来唤醒的。
二、为什么要软启动
(1) 一般的电路设计都是用拨码开关来做电源开关的(打到一侧则接通,打到另一侧则关闭)。这种方式的优点是设计简单,缺点是电路太简单,整个主板要么有电要么没电无法做休眠模式、低功耗模式等。
(2) 软启动电路是比较接近于实际产品的,其他开发板的硬开关其实是简化版的,和实际产品还有差异。
《x210v3s开发板裸机教程.pdf》
市面上绝大多数开发板都是给整个系统直接上电,通过拨码开关实现硬件开关机,这种设计开发板将无法休眠唤醒。x210 开发板独特的软件开关机功能,可实现轻触开关实现软件开关机,休眠唤醒等,让开发板更接近产品。
上述电路图中,EINT0 用于置锁整个开发板的 5V 电源,EINT0 为高时,5V 电源被使能,为低时 5V 电源关闭。在实现休眠唤醒时,配合 EINT1 中断,通过 POWER 键实现中断响应,继而实现休眠唤醒。
EINT0 管脚和 PS_HOLD 管脚复用,当 PS_HOLD_CONTROL 寄存器的第 0 位设置为高时,使 能 PS_HOLD 管 脚 , 这 时 , EINT0 的 相 关 寄 存 器 设 置 将 无 效 , 该 管 脚 将 完 全 由PS_HOLD_CONTROL 寄存器控制。
我们将 PS_HOLD_CONTROL 的第 8,9 位设置为 1 时,该 IO 口为高,设置为 0 时,为低。
在 tester_powerlock 函数中,经 5 秒延时后,执行如下指令:
writel(S5PV210_PS_HOLD_CONTROL, (readl(S5PV210_PS_HOLD_CONTROL) & ~( 0x00000301 )) | ((0x1<<0) | (0x0<<8) | (0x0<<9)));
即将 PS_HOLD_CONTROL 的第 8,9 位清零,这时,EINT0 管脚被拉低,整个开发板的 5V
电源被关闭,开关板断电关机。
在整个 main 函数中,我们并没有对该寄存器做过任何设置,而上面的寄存器表格显示,在
芯片的初始化状态,PS_HOLD_CONTROL 的第 0 位是 0,即默认为普通 GPIO 口,复位时电平
为 0,那么开发板为什么还能运行起来呢?
在 start.s 中,有如下程序段:
ldr r0, =0xe010e81c
ldr r1, [r0]
orr r1, r1, #0x300
orr r1, r1, #0x1
str r1, [r0]
上面程序将 PS_HOLD_CONTROL 的第 0,8,9 位置高,即将该 IO 设置为 PS_HOLD 的模
式的同时,将 IO 口拉高,实现 5V 电源置锁。如果在 start.s 中去掉上面语句,那么开发板只
能长按住 POWER 键不放,才能维持电平。
三 、开发板供电置锁原理和分析
(1) 软开关在设计时有一个置锁电路,用 EINT0(也就是GPH0_2)引脚来控制的。
(2) EINT0 这个引脚是有复用设计(两个完全不相干的功能挤在同一个引脚上,同时我们只能让这个引脚用于其中一种功能,这就叫复用)的,一个是 GPIO(也就是GPH0_2引脚)、一个是PS_HOLD_CONTROL。(注意:EINT0 功能算是 GPIO 下的一个子功能)。
(3) PS_HOLD 在Section2.4 Power Management章节下的 4.10.5.8 节下。
(4) PS_HOLD_CONTROL 寄存器(0xE010E81C),共有 3 个位有用。
bit0, 0 表示这个引脚为 GPIO 功能,1表示这个引脚为 PS_HOLD 功能;
bit9,0 表示这个引脚方向为输入,1 表示这个引脚方向为输出。
bit8,0 表示这个引脚输出为低电平,1 表示输出为高电平。
分析:我们要使用软启动置锁,则需要将 bit0、8、9 都置为 1 即可。
四、写代码+实验验证
(1) 要想让开发板和普通的开发板一样,一按下按键程序运行后即可松手不会断电,则只要在程序的开头部分添加代码去置锁开关板即可。
文件名: BL1/start.S
cat BL1/start.S
/*
* 文件名: start.s
* 描述: 演示重定位(在SRAM内部重定位)
*/
#define WTCON 0xE2700000
#define SVC_STACK 0xd0037d80
.global _start // 把_start链接属性改为外部,这样其他文件就可以看见_start了
_start:
//第0步:开发板置锁
ldr r0, =0xe010e81c
ldr r1, [r0]
orr r1, r1, #0x300
orr r1, r1, #0x1
str r1, [r0]
// 第1步:关看门狗(向WTCON的bit5写入0即可)
ldr r0, =WTCON
ldr r1, =0x0
str r1, [r0]
// 第2步:设置SVC栈
ldr sp, =SVC_STACK
// 第3步:开/关icache
mrc p15,0,r0,c1,c0,0; // 读出cp15的c1到r0中
//bic r0, r0, #(1<<12) // bit12 置0 关icache
orr r0, r0, #(1<<12) // bit12 置1 开icache
mcr p15,0,r0,c1,c0,0;
// 第4步:初始化ddr
bl sdram_asm_init
// 第5步:重定位,从SD卡第45扇区开始,复制32个扇区内容到DDR的 0x23E0,0000
bl copy_bl2_2_ddr
// 汇编最后的这个死循环不能丢
b .
(2) 置锁代码的方法是:给 PS_HOLD_CONTROL 寄存器的 bit0、8、9 均写入 1 即可。
(3) 注意:此时开发板已经置锁,POWER 按键已经失效,关机时需要按下复位按键。
源自朱有鹏老师.