MTK7620 11N 板子 UBOOT软件架构分析
整体组成
- TOOLS工具组成,主要是mkimage,主要处理CRC, mkimage本地主机工具是这个模块产物。用于打镜像。
- cpu/ralink_soc 这里是Startup Code for MIPS32 CPU-core。 是整个CPU启动的入口。cpu/ralink_soc/start.S。libralink_soc.a是这个模块产物。
- 基础库lib_generic,比如压缩,CRC,等工具库。
- /board/rt2880 。 主要是FLASH的擦写,内存写入FLASH等驱动能力,以及串口驱动。这类BSP级别的功能实现。
- lib_mips , 启动LINUX KERNEL的核心代码,do_bootm_linux。计算KERNEL在MIPS CPU的位置。打印: printf (“\nStarting kernel …\n\n”);
- net 网络协议栈,不是驱动,是ARP,DHCP, TFTP等收发协议实现,还包括 一个TFTP命令行,PING命令行。
- drivers,包括 网卡驱动,SPI FLASH 驱动,I2C驱动。其他还有USB驱动。
- common通用实现,包括 bootm,菜单选择处理
由UBOOT代码查看FLASH 布局
common/cmd_bootm.c
#define CFG_LOAD_ADDR 0x80100000 /* default load address */
上述地址在不指定参数时使用。实际上并不使用。真正的地址=81001000通过打印,
确认:
Transferring control to Linux (at address 81001000) …
debug ("## Transferring control to Linux (at address %08lx) ...\n",
(ulong)kernel);
/*
* Linux Kernel Parameters:
* r3: ptr to board info data
* r4: initrd_start or 0 if no initrd
* r5: initrd_end - unused if r4 is 0
* r6: Start of command line string
* r7: End of command line string
*/
(*kernel) (kbd, initrd_start, initrd_end, cmd_start, cmd_end);
启动KERNEL,先计算出KERNEL地址,打印出来是0X81001000内存地址。
然后,把内存地址0X81001000转成一个函数指针,调用该指针,实现代码的JUMP指令并执行效果。
而之前,就把相关的内核代码拷贝到了0X81001000这里!
if(BootType == '3') {
char *argv[2];
sprintf(addr_str, "0x%X", CFG_KERN_ADDR);
argv[1] = &addr_str[0];
printf(" \n3: System Boot system code via Flash.\n");
do_bootm(cmdtp, 0, 2, argv);
}
#define PHYS_FLASH_1 0xBCC00000 /* Image1 Bank #1 */
#define CFG_FLASH_BASE PHYS_FLASH_1
#define CFG_BOOTLOADER_SIZE 0x30000
#define CFG_CONFIG_SIZE 0x10000
#define CFG_FACTORY_SIZE 0x10000
#define CFG_ENV_ADDR (CFG_FLASH_BASE + CFG_BOOTLOADER_SIZE)
#define CFG_FACTORY_ADDR (CFG_FLASH_BASE + CFG_BOOTLOADER_SIZE + CFG_CONFIG_SIZE)
#define CFG_KERN_ADDR (CFG_FLASH_BASE + (CFG_BOOTLOADER_SIZE + CFG_CONFIG_SIZE + CFG_FACTORY_SIZE))
BCC00000+30000+10000+10000 = BCC50000
打印“Booting image at bc050000 …”
printf (“## Booting image at %08lx …\n”, addr);
FLASH
[ 2.148000] flash manufacture id: ef, device id 40 18
[ 2.156000] W25Q128BV(ef 40180000) (16384 Kbytes)
[ 2.168000] mtd .name = raspi, .size = 0x01000000 (16M) .erasesize = 0x00010000 (64K) .numeraseregions = 0
[ 2.184000] Creating 5 MTD partitions on “raspi”:
[ 2.196000] 0x000000000000-0x000001000000 : “ALL” - 16M
[ 2.204000] 0x000000000000-0x000000030000 : “Bootloader” - 192K
[ 2.216000] 0x000000030000-0x000000040000 : “Config” -64K
[ 2.228000] 0x000000040000-0x000000050000 : “Factory” -64K
[ 2.240000] 0x000000050000-0x000001000000 : “firmware” -16064K
[ 2.252000] 0x00000030a3fb-0x000001000000 : “rootfs” - 13271KBYTE
[ 2.260000] mtd: partition “rootfs” must either start or end on erase block boundary or be smaller than an erase block – forcing read-only
[ 2.288000] mtd: partition “rootfs_data” created automatically, ofs=0x7f0000, len=0x810000
[ 2.304000] 0x0000007f0000-0x000001000000 : “rootfs_data”
BF000000-BF030000 UBOOT
BF030000-BF040000 CONFIG
BF040000-BF050000 FACTORY
BF050000-BF100000 FIRMWARE
BF30A3FB
BF7F0000 -
root@OpenWrt:/proc# cat mtd
dev: size erasesize name
mtd0: 01000000 00010000 “ALL”
mtd1: 00030000 00010000 “Bootloader”
mtd2: 00010000 00010000 “Config”
mtd3: 00010000 00010000 “Factory”
mtd4: 00fb0000 00010000 “firmware”
mtd5: 00cf5c05 00010000 “rootfs”
mtd6: 00810000 00010000 “rootfs_data”
root@OpenWrt:/proc# mount
rootfs on / type rootfs (rw)
/dev/root on /rom type squashfs (ro,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,noatime)
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,noatime)
tmpfs on /tmp type tmpfs (rw,nosuid,nodev,noatime)
/dev/mtdblock6 on /overlay type jffs2 (rw,noatime)
overlayfs:/overlay on / type overlayfs (rw,noatime,lowerdir=/,upperdir=/overlay)
tmpfs on /dev type tmpfs (rw,nosuid,relatime,size=512k,mode=755)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,mode=600)