我本机装的是64位Ubuntu, SDK 里提供的 buildroot-gcc342 是32位的,无法直接运行,需要先安装 gcc-multilib.

sudo apt-get install gcc-multilib

之前一直做 ARM 开发, 对这里 MIPS 首先要了解一点它的 MMU 内存映射关系 。 在 MIPS 中, 0x8000,0000 ~ 0x9fff,ffff 和 0xa000,0000 ~ 0xbfff,ffff 这两段逻辑地址都直接映射 0x0000,0000 ~ 0x1fff,ffff 这段物理地址。 区别是 0x8000,0000 ~ 0x9fff,ffff 的访问是 Uncached, 而 0xa000,0000 ~ 0xbfff,ffff 的访问则经过了cached。 所以在查看 mt7620 代码里操作寄存器时, 会看到 0xb000,0000 以上的地直空间, 其对应的就是 0x1000,0000 。

u-boot 配置

make menuconfig

配置后于 uboot 根目录成生 .config 。 下面记录我阅读代码时关心的几个地方:

1. CFG_ENV_IS_IN_SPI

`make menuconfig` 时 Flash Type 选择了 SPI, 则在 .config 中有: `ON_BOARD_SPI_FLASH_COMPONENT=y`

.config 被 config.mk 包含进来。  config.mk 中有:

ifeq ($(ON_BOARD_SPI_FLASH_COMPONENT),y)
CFG_ENV_IS := IN_SPI
else
CFG_ENV_IS := IN_FLASH
endif
endif
CPPFLAGS += -DCFG_ENV_IS_$(CFG_ENV_IS)

CPPFLAGS 使得代码在预编译时 CFG_ENV_IS_IN_SPI 被宏定义。

2. uboot.bin 生成过程

make -n 看看生成 uboot.bin 的过程, 关键地方可以简化为:

mipsel-linux-ld -Bstatic -T board/rt2880/u-boot.lds -Ttext 0xBC000000 \
cpu/ralink_soc/start.o \
--start-group \
lib_generic/libgeneric.a \
board/rt2880/librt2880.a \
cpu/ralink_soc/libralink_soc.a \
lib_mips/libmips.a \
net/libnet.a \
drivers/libdrivers.a \
common/libcommon.a \
--end-group \
-Map u-boot.map -o u-boot mipsel-linux-objcopy --gap-fill=0xff -O binary u-boot uboot.bin

注意这里的 -Ttext 0xBC000000 , 它将 uboot 整体运行时地址提到了 0xBC000000

3. RALINK_SPI_UPGRADE_CHECK

RALINK_SPI_UPGRADE_CHECK 默认在 config.mk 里打开, 用于在 spi_flash.c 中的写操作完成时, 再读出来比较, 以保证写入完全正确。

4. RALINK_UPGRADE_BY_SERIAL

串口下载, 烧写。

5. 网口初始化 LANWANPartition()

make menuconfig 时选择了 LLLLW, 则在编译时打开了 RALINK_EV_BOARD_PVLAN 宏。

先把五个口都设置成 security mode, 然后设置 PVID (Port-base VLAN ID), LAN口的PVID=1, WAN口的PVID=2.

Port VLAN 是实现 VLAN 的技术手段之一, 将 switch 的商品进行VLAN 划分,前四个 LAN 都划分为VLAN1, WAN口划分到VLAN2。 同一个VLAN ID内的端口主机可以互相访问, 而VLAN1和VLAN2之间的互相访问必须经过路由器转发。

注意寄存器 VAWD1(0xB0110094) [23:16] 位, 这几个位表示 VLAN Memory Control, 由 0xef 变为 0xd0, 即 1110,1111 -> 1101, 0000

VLAN 的介绍可以看这里: http://www.alliedtelesis.com/media/fount/how_to_note_alliedware_plus/overview_vlans.pdf

6. DUAL_IMAGE_SUPPORT

内核编译后生成 vmlinuz,与 rootfs 一起打包生成 firmware。 用 mkimage 为 firmware 打一个 image_header_t 的标签,最终生成 xxx_sysupgrade.bin。

check_image_validation() 将两个 firmware 的 image_header_t 读出来作一番校验 , 如果成功了, 再对整个 firmware 作 checksum 校验。 如果1坏了, 则把2复制到1的位置上; 如果2坏了, 则把1复制到2上。

这样就保证了有两个IMAGE在SPI flash里面。

7. 选择启动方式, 此时终端里会跳出如下字符:

Please choose the operation:
: Load system code to SDRAM via TFTP.
: Load system code then write to Flash via TFTP.
: Boot system code via Flash (default).
: Entr boot command line interface.
: Load Boot Loader code then write to Flash via Serial.
: Load Boot Loader code then write to Flash via TFTP.

有 tftp 命令的都要经过设置 ipaddr, serverip, filename 等几步。 以上各启动项执行的动作分别是:

1. tftpboot 0x80A00000 filename, 可以用来启动 Linux 内核, 然后从该地址启动

2. tftpboot 0x80100000 filename, 然后把下载的数据烧写的IMAGE1的位置上, 设置环境变量Image1Stable为1, 然后 bootm 0xBC050000 启动刚刚烧写的 firmware

3,  bootm 0xBC050000

4. 进入 uboot 命令行

7. 从串口下载文件, 并将下载的文件数据烧写到 SPI Flash 的 0 地址上。 这个动作是用来烧写 uboot.bin 的。 烧写完之后 reset。

8. 第8个选项被隐藏起来了, 在代码里看它应该是有效的。  其动作与1差不多, 只是加载地址不同。  tftpboot 0x80100000 filename, 然后从该地址启动

9. tftpboot 0x80100000 filename, 然后烧写到0地址。

对于 tftpboot 命令, 设置 autostart 命令为 "yes" / "no" 可以配置是否tftp完成后直接启动。

8. SPI Flash Layout

以下是Uboot启动信息:

U-Boot .. (Jul   - ::)

Board: Ralink APSoC DRAM:  MB
relocate_code Pointer at: 87fb8000
enable ephy clock...done. rf reg =
SSC disabled.
spi_wait_nsec:
spi device id: ef ()
find flash: W25Q128BV
raspi_read: from: len:
raspi_read: from: len:
============================================
Ralink UBoot Version: ...
--------------------------------------------
ASIC 7620_MP (Port5<->None)
DRAM component: Mbits DDR, width
DRAM bus: bit
Total memory: MBytes
Flash component: SPI Flash
Date:Jul Time:::
============================================
icache: sets:, ways:, linesz: ,total:
dcache: sets:, ways:, linesz: ,total: ##### The CPU freq = MHZ ####
estimate memory size = Mbytes Please choose the operation:
: Load system code to SDRAM via TFTP.
: Load system code then write to Flash via TFTP.
: Boot system code via Flash (default).
: Entr boot command line interface.
: Load Boot Loader code then write to Flash via Serial.
: Load Boot Loader code then write to Flash via TFTP. You choosed raspi_read: from: len: : System Enter Boot Command Line Interface. U-Boot .. (Jul - ::)
MT7620 #

mt7620 uboot的更多相关文章

  1. 极路由U-boot解锁刷root固件教程,root后可刷华硕、如意云等多种固件,附赠全套刷软

    9008正式版固件将会封堵此漏洞,想root的同学尽快了.安装新工具箱里的root保留,可升级官方最新固件并保留root. 此方法并非本人原创,只是将root的过程和经验做个总结,比较适合菜鸟做参考, ...

  2. Linux主机上使用交叉编译移植u-boot到树莓派

    0环境 Linux主机OS:Ubuntu14.04 64位,运行在wmware workstation 10虚拟机 树莓派版本:raspberry pi 2 B型. 树莓派OS: Debian Jes ...

  3. uboot环境配置

    uboot环境配置 通过配置uboot让它在启动过程中从tftp获取内核和设备树,并从在加载内核之后把通过启动参数将"从nfs挂载根文件系统"传入内核.这个配置主要是通过uboot ...

  4. u-boot-2015.04 在tq2440上的移植(使用spl引导u-boot)

    本次移植跟以往的不同之处是采用了spl来引导u-boot,参考了博客http://blog.csdn.net/fulinus/article/details/42738641 下载链接:http:// ...

  5. u-boot源码分析之C语言段

    题外话: 最近一直在学习u-boot的源代码,从代码量到代码风格,都让我认识到什么才是真正的程序.以往我所学到的C语言知识和u-boot的源代码相比,实在不值一提.说到底,机器都是0和1控制的.感觉这 ...

  6. u-boot源码汇编段简要分析

    Hi,大家好!我是CrazyCatJack,你们可以叫我CCJ或者疯猫.今天我给大家带来的是u-boot的源代码汇编段分析,以后还会给大家讲解后续的C代码,请持续关注哦^_^ 先简单说一下u-boot ...

  7. u-boot的配置、编译及链接

    第一次写技术博客,还有些兴奋呢.我是CrazyCatJack,大家可以叫我CCJ或者疯猫.我即将成为一名嵌入式Linux的驱动工程师,现在还是一枚大四狗,呼呼~大学期间做了一些项目和比赛,都是基于32 ...

  8. uboot的配置流程分析

    简单介绍一下uboot的基本配置流程.和绝大多数源码编译安装一样,uboot在执行make之前需要执行make XXXconfig来配置相关信息,而且uboot本身是针对多种平台的bootloader ...

  9. uboot 第三天学习

    make jCPU_NUM 以CPU_NUM数量同时进行编译CPU_NUM = 当前PC的处理器数量*处理器的核心数 从上电开始1.系统上电,执行固化在IROM中的代码,目的初始化基本的系统功能,已经 ...

随机推荐

  1. 文艺平衡树(splay模板)

    题干:splay模板,要求维护区间反转. splay是一种码量小于treap,但支持排名,前驱后继等treap可求的东西,也支持区间反转的平衡树. 但是有两个坏处: 1.splay常数远远大于trea ...

  2. (3) openssl genrsa(生成rsa私钥)

    genrsa用于生成RSA私钥,不会生成公钥,因为公钥提取自私钥,如果需要查看公钥或生成公钥,可以使用openssl  rsa命令. 使用man genrsa查询其用法. openssl genrsa ...

  3. 条款21:必须返回对象时,别妄想返回其reference(Don't try to return a reference when you must return an object)

    NOTE: 1.绝不要返回pointer或reference 指向一个local stack 对象,或返回reference 指向一个heap-allocated对象,或返回pointer 或refe ...

  4. 对于easyui $.messager.alert和 $.messager.confirm 不同浏览器中位置控制

    $.messager.confirm({ title: '种子购买', msg: '确定购买这个'+seedName+'的种子嘛?', top:, fn: function (r) { if (r){ ...

  5. 利用nginx设置浏览器协商缓存

    强缓存与协商缓存的区别 强缓存:浏览器不与服务端协商直接取浏览器缓存 协商缓存:浏览器会先向服务器确认资源的有效性后才决定是从缓存中取资源还是重新获取资源 协商缓存运作原理 现在有一个这样的业务情景: ...

  6. 一个可以获取知乎timeline的爬虫

    # -*- coding: utf-8 -*- import requests import lxml import os,time from bs4 import BeautifulSoup as ...

  7. 71.mybatis 如何获取插入的id【从零开始学Spring Boot】

    [从零开始学习Spirng Boot-常见异常汇总] 在之前的文章已经讲过spring boot集成mybatis了,但是忘记说一个很重要的知识点了,那就是获取获取主键id,这篇文章补充下,sprin ...

  8. COJ 1211 大整数开平方

    手写求大整数开根号所得到的值,具体计算过程参考别人的资料,最后利用java的大整数得到答案 别人博客链接:http://www.cnblogs.com/Rinyo/archive/2012/12/16 ...

  9. [luoguP2513] [HAOI2009]逆序对数列(DP)

    传送门 f[i][j]表示前i个数,逆序对数为j的答案 则DP方程为: f[1][0] = 1; for(i = 2; i <= n; i++) for(j = 0; j <= m; j+ ...

  10. UltraEdit-14.10.0.1024版本语法着色配置

    用了UltraEdit有段时间了,一直没做语法着色,当做普通文本编辑器使用,这也太委屈这个“神器”了. 今天就让它物尽其用吧.体验一把UltraEdit的语法高亮功能. 参考:http://www.1 ...