目的:为uboot添加判断gpio电平的操作,修改对内核的跳转
1.查参考手册Register Map
R: read only, W: write only, R/W: both read and write
在uboot跳转之前,可以查看相关状态;
附:U-boot中的nboot命令介绍
-原文链接:https://blog.csdn.net/laotang365/article/details/45181045
U_BOOT_CMD(nboot, 4, 1, do_nandboot,
"boot from NAND device",
"[partition] | [[[loadAddr] dev] offset]"
);
看帮助提示很容易明白,nboot是uboot指令--将nand flash中的内容加载到sdram中,比如"nboot 0x30000000 0 0x60000\;bootm
0x30000000是拷到的sdram的地址,0是nand flash设备号,0x60000是内核在nand flash的地址。再通过bootm从0x30000000启动内核。
但是这里有个疑问,nboot怎么知道你内核的大小,需要拷贝多少内容?
由于uImage的前64个字节是zImage的描述信息,所以do_nandboot能知道需要加载的kernel的size。
当然啦,开启nboot的使用,需要对uboot进行设置,否则,uboot无法跳转;
将nboot写入环境变量并自动开启跳转操作,如下图
二,根据外部GPIO状态,做内核跳转,按照上述对GPIO的设置有如下定义:
#define GPIO_PIN_DATA_BASE (0xB0004800ul)
#define GPIO_PIN_DATA(port, pin) (*((volatile uint32_t *)((GPIO_PIN_DATA_BASE+(0x40*(port))) + ((pin)<<2))))
// #define GPIO_PIN_DATA(port, pin) (*((volatile uint32_t *) ((GPIO_PIN_DATA_BASE+(0x40)))
#define sw1_USBA GPIO_PIN_DATA(0, 10 ) //PA10
#define sw1_USBB GPIO_PIN_DATA(0, 11 ) //PA11
#define sw_D7 GPIO_PIN_DATA(3, 7 ) //PA11
#define key0_A1 GPIO_PIN_DATA(0, 1 ) //PA11
在3秒自动跳转前判断GPIO 状态
3s结束后;在从nandflash具体地址自动加载内核前;做判断
其中,addr和offset大小由环境变量所设定:0xc00000@0xe00000(kernel_backup),