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 网络协议栈不是驱动是ARPDHCP, 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))BCC00000300001000010000 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, ofs0x7f0000, len0x810000[ 2.304000] 0x0000007f0000-0x000001000000 : “rootfs_data”BF000000-BF030000 UBOOTBF030000-BF040000 CONFIGBF040000-BF050000 FACTORYBF050000-BF100000 FIRMWAREBF30A3FBBF7F0000 -rootOpenWrt:/proc# cat mtddev: size erasesize namemtd0: 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”rootOpenWrt:/proc# mountrootfs 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,size512k,mode755)devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,mode600)