/*****************************************************************************************************************
Document Author : ELvins Fu
Digtal technology park, A3 -06 , shenzhen, China
*************************************************************************************************************
Module : Unversion Gateway Application
Software Version : 6.1.1
Date : 2015-2016
Description: the document include the uboot programm modifiled by special needs.
********************************************************************************************************************/
论述
下列给出了从uboot根据硬件的需求,更改软件的具体过程:
驱动环境uboot说明
Version :0.1
篇 一
篇一介绍的内容为Uboot的分析,有这些基础对uboot的启动过程,有着一定的参考意义,这文档中的内容分析的只是一部分内容,具体的uboot代码不算很多,但是分析起来比较麻烦,故而选取重要的部分进行介绍。
一:uboot的环境介绍
UGW 6.1.1编译之后的uboot的目录如下:
u-boot-2010.06及以后版本常用目录分析
\
├── api 存放uboot提供的接口函数
├── arch 与体系结构相关的代码,uboot的重头戏
├── board 根据不同开发板定制的代码,代码也不少
├── common 通用的代码,涵盖各个方面,已命令行处理为主
├── disk 磁盘分区相关代码
├── doc 文档,一堆README开头的文件
├── drivers 驱动,很丰富,每种类型的设备驱动占用一个子目录
├── examples 示例程序
├── fs 文件系统,支持嵌入式开发板常见的文件系统
├── include 头文件,已通用的头文件为主
├── lib 通用库文件
├── nand_spl NAND存储器相关代码
├── net 网络相关代码,小型的协议栈
├── onenand_ipl
├── post 加电自检程序
└── tools 辅助程序,用于编译和检查uboot目标文件
移植工作涉及的目录情况
从uboot代码根目录,可以看出其已经非常庞大,功能也很丰富。
移植工作最主要的是看对应的处理器和开发板代码,2010.06版本以后处理器相关的代码集中在arch、board目录。(以前版本主要在cpu和board目录)
先看一下arch目录:
arch
arch目录内容比以前的版本干净,每个子目录代表一个处理器类型,子目录名称就是处理器的类型名称。
我们移植的是mips的处理器,所以参考一下arch/mips目录:
arch/mips
├── cpu
├── include
└── lib
arch/mips目录下有三个目录,其他的处理器目录下也是这个结构:
cpu子目录对应一种处理器的不同产品型号或者系列;
include子目录是处理器用到的头文件;
lib目录对应用到处理器公用的代码;
下面看看cpu下的内容,arch/mips/cpu目录下的内容:
arch/mips/cpu/vr9
目前最新版本(2011.6版本开始)中cpu目录中建立mips32目录,把u-boot.lds是ld程序也就是连接器的脚本文件,这个文件描述了如何连接目标文件,ld程序会根据这个文件的指示按照需求把不同的目标文件连接在一起生成供烧写到开发板的程序。该文件放在board对应的目录中。
注意:如果公司需要升级U-Boot,则源代码下载地址
免费下载地址在 http://linux.linuxidc.com/
用户名与密码都是www.linuxidc.com
具体下载目录在 /pub/u-boot/
或 http://linux.linuxidc.com/pub/u-boot/
用户名与密码都是www.linuxidc.com
所有版本的u-boot源代码压缩包都可以在ftp://ftp.denx.de/pub/u-boot/下载。
关于u-boot源代码的信息,看http://www.denx.de/wiki/U-Boot/SourceCode码下载
二:uboot参考修改
大麦盒子用的uboot用的是vr9的标准板,其实不用更改,如果想要自己参考vr9的信息,我们可以做出一款自己的标准板,如(dm1),
$ cd board/vr9/
$ cp ../vr9 ../dm1 –a
$cd dm1
$ mv vr9.c dm1.c
$ vim Makefile
****************************
24 include $(TOPDIR)/config.mk
25
26 LIB = $(obj)lib$(BOARD).a
28 COBJS = $(BOARD).o
29 SOBJS = lowlevel_init.o
************************************
查看config.mk
********************************
24 -include $(TOPDIR)/.config
25
26 TEXT_BASE = $(CONFIG_RAM_TEXT_BASE)
***********************************
查看Kconfig
*********************************
把VR9的字符全都换成md1
********************************
修改u-boot顶层目录下的Makefile,按照vr9的内容添加md1的内容
*****************************
3423 vr9_config: unconfig
3424 @$(MKCONFIG) $(@:_config=) mips mips vr9
3425 @ln -s -f vr9_cfg.h include/configs/lq_cfg.h
3426 @ln -s -f vr9_cfg.h include/configs/ifx_cfg.h
****************************
在这后面添加同样的信息,把vr9改为md1
修改编译器 u-boot顶层目录下的Makefile
*************************************
191
192 # set default to nothing for native builds
193 ifeq ($(HOSTARCH),$(ARCH))
194 CROSS_COMPILE ?= (添加你所用到的编译器)
****************************
编译u-boot-2010.06 u-boot顶层目录
***************************
$ make distclean
$ make md1_config
$ make
***************************
这个时候我们就可以得到一个u-boot.bin也就是我们的目标文件,但是这个文件通常情况下是不能够正常工作的,我们还需要对u-boot源代码进行进一步的修改。
注意:下面的修改我只提供具体的修改办法,因为这个我没有继续修改下去,不过这个方法是验证过的。
1、u-boot源码中的中断屏蔽位的修改
问题:在md1中的子中断屏蔽位是否和vr9相同?
如果不同,则将arch/mips/cpu/vr9/start.S修改
- 修改配置文件include/configs/vr9.h
- 命令行提示符的修改:
**********************
112 #define CONFIG_SYS_LONGHELP /* undef to save memory */
113 #define CONFIG_SYS_PROMPT "VR9 # " /* Monitor Command Prompt */
114 #define CONFIG_SYS_CBSIZE 1024 /* Console I/O Buffer Size */
115 #define CONFIG_SYS_PBSIZE (CONFIG_SYS_CBSIZE+sizeof(CONFIG_SYS_PROMPT)+16) /* Print Buffer Size *
*********************
vr9# 改为md1#
- 网络参数设置
Ip地址、启动参数、延迟等
- 内核加载地址的修改
这个就很简单了 load_addr 在哪,改你想要的
- Nand功能添加
对照include/config_cmd_default.h和include/config_cmd_all.h添加我们需要的相应功能。
- 同时支持nand、nor和spi启动
/include/configs/vr9.h
265 #ifdef CONFIG_BOOT_FROM_NOR
266 #define IFX_CFG_FLASH_DDR_CFG_START_ADDR 0xB000FFE0
267 #define IFX_CFG_FLASH_DDR_CFG_SIZE 32
268 #define IFX_CFG_FLASH_DDR_CFG_END_ADDR 0xb000ffff
269 #elif defined(CONFIG_BOOT_FROM_SPI)
270 #define IFX_CFG_FLASH_DDR_CFG_START_ADDR 0x0000FFE0
271 #define IFX_CFG_FLASH_DDR_CFG_SIZE 32 //32字节的启动
这个十分关键,如果第二次启动失败,则是这里的问题。
272 #define IFX_CFG_FLASH_DDR_CFG_END_ADDR 0x0000ffff
- 环境变量保存位置
ENV变量是否正确
- USB功能的添加
这个我没做,有必要可以做。
********************
#define CONFIG_CMD_FAT ???????????????/* FAT support*/
#define CONFIG_CMD_USB ????????????????/* USB support*/
#if defined(CONFIG_CMD_USB)
#define CONFIG_DOS_PARTITION
#define CONFIG_USB_OHCI
#define CONFIG_USB_STORAGE
#define CONFIG_SUPPORT_VFAT
#define LITTLEENDIAN
#endif
Ping命令的添加
#define CONFIG_CMD_PING ????????????????/* ping support*/
***************************
再给出一些参考的信息,这是我调试的一部分,具体验证根据各平台的不同验证。
/*********************设计 MIPS GRX390****************/
/****************************/
3、添加Nand启动功能 start.S
u-boot默认情况下是nand启动,这里我们添加nand启动的内容:
iq_xrx200_vrx288_gw_he_vdsl_lte/u-boot-2010.06/arch/mips/cpu/ar10$ ls
cache.c interrupts.c start_nand_spl.S
clock.c Makefile start.S
cpu.c start_bootstrap.S start_uncomp.S
1)添加头文件
26 #include <config.h>
27 #include <version.h>
28 #include <asm/regdef.h>
29 #include <asm/mipsregs.h>
30 #include <asm/cacheops.h>
31 #include <asm/addrspace.h>
32 #include <asm/yamon.h>
2)添加nand启动标志位
3)添加BWSCON寄存器的定义(加粗字体为添加内容)
4)添加启动模式判断Nor启动还是nand启动(加粗字体为添加内容)
5)添加NAND启动自搬移代码(在上一步代码下添加)
4、添加nand_read.c为nand启动做支持
5、修改board/ar10/?支持 nor flash芯片
x200_vrx288_gw_he_vdsl_lte/u-boot-2010.06/board/ar10$ ls
ar10.c ddr2_16bit.conf Kconfig sfddr_board.c
bootstrap.lds ddr2_8bit.cmm lowlevel_init.S start_sfddr.S
config.mk ddr2_8bit.conf Makefile stools.c
ddr1 ddr.h Makefile.lq u-boot.lds
ddr2 gphy_firmware.img nand_spl_board.c
6、修改common/env_flash.c,为nor flash保存环境变量做准备
7、修改common/env_nand.c添加n