mt7620 uboot


 

我本機裝的是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: 
1: Load system code to SDRAM via TFTP. 
2: Load system code then write to Flash via TFTP. 
3: Boot system code via Flash (default).
4: Entr boot command line interface.
7: Load Boot Loader code then write to Flash via Serial. 
9: 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 1.1.3 (Jul 3 2014 - 11:19:18)

Board: Ralink APSoC DRAM: 128 MB
relocate_code Pointer at: 87fb8000
enable ephy clock...done. rf reg 29 = 5
SSC disabled.
spi_wait_nsec: 29 
spi device id: ef 40 18 0 0 (40180000)
find flash: W25Q128BV
raspi_read: from:30000 len:1000 
raspi_read: from:30000 len:1000 
============================================ 
Ralink UBoot Version: 4.2.1.0
-------------------------------------------- 
ASIC 7620_MP (Port5<->None)
DRAM component: 1024 Mbits DDR, width 16
DRAM bus: 16 bit
Total memory: 128 MBytes
Flash component: SPI Flash
Date:Jul 3 2014 Time:11:19:18
============================================ 
icache: sets:512, ways:4, linesz:32 ,total:65536
dcache: sets:256, ways:4, linesz:32 ,total:32768

##### The CPU freq = 580 MHZ #### 
estimate memory size =128 Mbytes

Please choose the operation: 
1: Load system code to SDRAM via TFTP. 
2: Load system code then write to Flash via TFTP. 
3: Boot system code via Flash (default).
4: Entr boot command line interface.
7: Load Boot Loader code then write to Flash via Serial. 
9: Load Boot Loader code then write to Flash via TFTP. 
2 
You choosed 4

0 
raspi_read: from:40028 len:6


4: System Enter Boot Command Line Interface.

U-Boot 1.1.3 (Jul 3 2014 - 11:19:18)
MT7620 # 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM