1. 在U-Boot中添加XSBASE270目标板的定义
具体方法可参考第一节,本篇给出部分细节和要点,假定$U-BOOT为源码根目录。
-
############################################################
# (1)建立目标板目录
# 其中lowlevel_init.S采用adsvix的文件,以开启turbo mode,并注释掉
# 其中对pxavoltage.S文件中initPXAvolatage函数的调用。
############################################################
cd board/
cp -arv lubbock xsbase270
mv xsbase270/lubbock.c xsbase270/xsbase270.c
cp adsvix/lowlevel_init.S xsbase270/
vim xsbase270/lowlevel_init.S
@setvoltage:
@ mov r10, lr
@ bl initPXAvoltage
@ mov lr, r10
############################################################
# (2)建立目标板配置头文件
############################################################
cd $U-BOOT/include/configs
cp lubbock.h xsbase270.h
############################################################
# (3)修改Makefile
############################################################
#########在$U-BOOT/Makefile中添加:
xsbase270_config: unconfig
@$(MKCONFIG) $(@:_config=) arm pxa xsbase270
#########在$U-BOOT/Makefile中修改CROSS_COMPILE:
CROSS_COMPILE = arm-iwmmxt-linux-gnueabi-
#########在$U-BOOT/board/xsbase270/Makefile中修改:
#COBJS := lubbock.o flash.o
COBJS := xsbase270.o
这里去掉了flash.c文件,因为它是在lubbock板中自定义的FLASH存储器驱动,lubbock不使用U-Boot自带的FLASH驱动;而在本次移植中,我们将使用U-Boot自带的drivers/cfi_flash.c作为XSBASE270开发板的NOR型闪存28F128K18C的驱动程序,具体过程后述。
实际移植过程中还可能要作如下改动:
-
#############################################################
# (1) cpu/pxa/config.mk
#############################################################
#armv5-->armv5te, modified by aaron wong
PLATFORM_CPPFLAGS += -march=armv5te -mtune=xscale
#############################################################
# (2) include/asm-arm/mach-types.h
#############################################################
/* added by aaron */
#define MACH_TYPE_XSBASE270 1141
编译U-Boot:
-
export BUILD_DIR=~/u-boot_xsbase270/build/
make xsbase270_config
make
作其他必要修改,直至能正常编译通过。然后再进行后续的针对目标板的定制步骤。
2. 修改U-Boot Stage 1(汇编级)的平台相关代码
U-Boot第一阶段的代码包括:
(1) cpu/pxa/start.S (平台无关,处理器架构相关)
(2) board/xsbase270/lowlevel_init.S (平台与处理器型号相关)
(3) board/xsbase270/config.mk (平台相关,设置TEXT_BASE)
(4) include/configs/xsbase270.h (平台相关,设置寄存器初值等)
lowlevel_init.S已在第一步作了相应修改。config.mk中设置TEXT_BASE(U-Boot的链接起始地址),暂时不改动(0xa3080000)。
xsbase270.h中定义了系统初始化时的寄存器初值(主要是GPIO配置,时钟与处理器频率设置,片上存储器控制器与存储系统的初始化),这需要根据平台进行配置。下面给出部分代码示例及注释:
-
/*
* High Level Configuration Options (easy to change)
*/
#define CONFIG_PXA27X 1 /*to keep PXA27x specific code*/
#define CONFIG_XSBASE270 1
#define BOARD_LATE_INIT 1
#undef CONFIG_USE_IRQ /* we don't need IRQ/FIQ stuff */
......
/*
* Size of malloc() pool
*/
#define CFG_MALLOC_LEN (CFG_ENV_SIZE + 128*1024)
#define CFG_GBL_DATA_SIZE 128
/*
* Stack sizes
* The stack sizes are set up in start.S using the settings below
*/
#define CONFIG_STACKSIZE (128*1024) /* regular stack */
#ifdef CONFIG_USE_IRQ
#define CONFIG_STACKSIZE_IRQ (4*1024) /* IRQ stack */
#define CONFIG_STACKSIZE_FIQ (4*1024) /* FIQ stack */
#endif
/*
* Miscellaneous configurable options
*/
#define CFG_CPUSPEED 0x207 /* cpu start-up frequency,91MHz */
/*
* GPIO settings
*/
#define CFG_GPSR0_VAL 0x00003000
#define CFG_GPSR1_VAL 0x00000000
#define CFG_GPSR2_VAL 0x00010000
#define CFG_GPSR3_VAL 0x00020000
#define CFG_GPCR0_VAL 0x00000800
......
/*
* Clock settings
*/
#define CFG_CKEN 0x00400200
#define CFG_CCCR 0x08000290 /* 520 MHz */
/*
* Memory settings
*/
#define CFG_MSC0_VAL 0x7FF82BD0
#define CFG_MSC1_VAL 0x7FF87FF8
#define CFG_MSC2_VAL 0x7FF87FF8
#define CFG_MDCNFG_VAL 0x00001AC9
#define CFG_MDREFR_VAL 0x0000001E
#define CFG_MDMRS_VAL 0x00000000
......
/*
* PCMCIA and CF Interfaces
*/
#define CFG_MECR_VAL 0x00000001
#define CFG_MCMEM0_VAL 0x00010504
#define CFG_MCMEM1_VAL 0x00010504
......
3. 修改U-Boot Stage 2(C语言级)的平台相关代码
U-Boot第二阶段的大部分代码是平台无关的。从移植的角度,我们仅需要关注下面一些平台相关的代码:
(1) include/configs/xsbase270.h:通过使用定义或取消定义相关的预编译变量,用于对平台无关的代码进行平台相关的定制,包括定制U-Boot命令、缺省的环境变量、存储器映射、串口控制台配置、驱动程序等。
(2) board/xsbase270/xsbase270.c:板级初始化,只需进行最基本的配置,包括设置mach-type,启动参数列表首地址,设置标准输入输出设备,获取系统RAM配置信息等。
(3) 驱动程序的移植。最基本的是FLASH存储器驱动程序和以太网卡驱动程序。对于U-Boot中已经支持的器件,可以进行简单移植,否则需要自己加入相关的设备驱动程序。
下面对以上三部分分别阐述。
3.1 配置xsbase270.h
可以参考lubbock.h,adsvix.h等相关开发板的设置,另外也可以从U-Boot源码的README文件获取更多信息。
(1) 存储器映射配置:
-
/*
* Physical Memory Map
*/
#define CONFIG_NR_DRAM_BANKS 4 /* we have 2 banks of DRAM*/
#define PHYS_SDRAM_1 0xa0000000 /* SDRAM Bank #1 */
#define PHYS_SDRAM_1_SIZE 0x04000000 /* 64 MB */
#define PHYS_SDRAM_2 0xa4000000 /* SDRAM Bank #2 */
#define PHYS_SDRAM_2_SIZE 0x00000000 /* 0 MB */
#define PHYS_SDRAM_3 0xa8000000 /* SDRAM Bank #3 */
#define PHYS_SDRAM_3_SIZE 0x00000000 /* 0 MB */
#define PHYS_SDRAM_4 0xac000000 /* SDRAM Bank #4 */
#define PHYS_SDRAM_4_SIZE 0x00000000 /* 0 MB */
#define PHYS_FLASH_1 0x00000000 /* Flash Bank #1 */
#define PHYS_FLASH_2 0x04000000 /* Flash Bank #2 */
#define PHYS_FLASH_SIZE 0x02000000 /* 32 MB */
#define PHYS_FLASH_BANK_SIZE 0x02000000 /* 32 MB Banks */
#define PHYS_FLASH_SECT_SIZE 0x00040000 /* 256 KB sectors (x2) */
#define CFG_DRAM_BASE 0xa0000000
#define CFG_DRAM_SIZE 0x04000000
#define CFG_FLASH_BASE PHYS_FLASH_1
//you can also add other IO address map here, such as a FPGA
(2) 定制U-Boot命令:
在include/cmd_confdefs.h头文件中已经预定义了一些常用的U-Boot命令,我们可以在include/configs/xsbase270.h中包含该头文件,对于其中已定义的不需要的命令,可用undef去除;对于要添加的命令,使用define定义相关的符号即可。
-
/*
* Command line configuration.
*/
#include <config_cmd_default.h>
#define CONFIG_CMD_PING
(3) 控制台串口配置:
包括指定控制台所用的PXA27X串口,缺省的串口通信波特率等。
-
/*
* select serial console configuration
*/
#define CONFIG_FFUART 1 /* we use FFUART on XSBASE270 */
#define CONFIG_BAUDRATE 115200
(4) 环境变量设置
包括BOOTP选项设置,缺省环境变量设置,启动参数列表配置等。
-
/*
* BOOTP options
*/
#define CONFIG_BOOTP_BOOTFILESIZE
#define CONFIG_BOOTP_BOOTPATH
#define CONFIG_BOOTP_HOSTNAME
#define CONFIG_BOOTDELAY 3
#define CONFIG_ETHADDR 08:00:3e:26:0a:5b
#define CONFIG_NETMASK 255.255.255.0
#define CONFIG_IPADDR 192.168.0.21
#define CONFIG_SERVERIP 192.168.0.250
#define CONFIG_BOOTCOMMAND "bootm 80000"
#define CONFIG_BOOTARGS "root=/dev/ram0,rw mem=64M console=ttyS0, 115200"
#define CONFIG_CMDLINE_TAG
#define CONFIG_TIMESTAMP
/* allow to overwrite serial and ethaddr */
#define CONFIG_ENV_OVERWRITE
其中,CONFIG_BOOTCOMMAND和CONFIG_BOOTARGS在后续的引导内核实验中还需要进行修正。
(5) 网卡驱动程序配置:
-
/*
* Hardware drivers
*/
#define CONFIG_DRIVER_SMC91111
#define CONFIG_SMC91111_BASE 0x0C000000
#define CONFIG_SMC_USE_32_BIT 1
XSBASE270采用的网卡是LAN91C111,U-Boot自带的驱动程序drivers/smc91111.c可支持这款网卡,因此只要在这里作相应的配置即可。CONFIG_SMC91111_BASE要根据PXA27X对网卡的地址译码来决定(片选信号CSx和高位地址线),CONFIG_SMC_USE_32_BIT指定了网卡工作于32位数据总线模式。可以查看驱动程序源代码得到更多配置选项。
(6) NOR型闪存驱动程序配置:
U-Boot本身支持一系列符合CFI(Common Flash Interface)接口规范的闪存,其缺省支持的闪存芯片信息在include/flash.h中定义,该头文件中还定义了CFI闪存驱动所必需的数据结构和其他物理及结构特性描述符。NAND闪存驱动在drivers/nand目录下,这里不予考虑。CFI是针对NOR型FLASH所提出的一种获取闪存芯片物理和结构参数的操作规程和标准。
XSBASE270采用两片Intel 28F128K18C的兼容CFI标准的NOR型闪存,单片容量为16MB,数据线宽度为16-bit,两片并作一个32MB容量的数据宽度为32-bit的BANK来使用。在头文件include/flash.h中没有定义该芯片的相关信息,可以手动添加;这并不是必须的,如果你并不需要使用这些信息的话(例如将CFI驱动所检测到的Device Id与头文件中定义的Device ID进行比对与验证)。
-
/* file : include/flash.h */
#define INTEL_ID_28F128K18 0x88068806 /* added by aaron */
#define FLASH_28F128K18 0x00BA /*Intel 28F128K18 (128M=8Mx16)*/
要使用U-Boot自带的CFI闪存驱动,必须要作的是在include/configs/xsbase270.h中添加如下定义:
-
#define CFG_FLASH_CFI
#define CFG_FLASH_CFI_DRIVER 1
/* avoid long time detection, added by aaron ,see include/flash.h */
#define CFG_FLASH_CFI_WIDTH FLASH_CFI_32BIT
#define CFG_MAX_FLASH_BANKS 1 /* max number of memory banks */
#define CFG_MAX_FLASH_SECT 128 /*max number of sectors on one chip*/
/* timeout values are in ticks */
#define CFG_FLASH_ERASE_TOUT (25*CFG_HZ) /*Timeout for Flash Erase */
#define CFG_FLASH_WRITE_TOUT (25*CFG_HZ) /*Timeout for Flash Write */
/* write flash less slowly */
#define CFG_FLASH_USE_BUFFER_WRITE 1
另外,如果把环境变量保存在FLASH中,还有如下相关定义:
-
/* NOTE: many default partitioning schemes assume the kernel starts at
* the second sector, not an environment. You have been warned!
*/
#define CFG_MONITOR_BASE 0
#define CFG_MONITOR_LEN PHYS_FLASH_SECT_SIZE
#define CFG_ENV_IS_IN_FLASH 1
#define CFG_ENV_ADDR (PHYS_FLASH_1 + PHYS_FLASH_SECT_SIZE)
#define CFG_ENV_SECT_SIZE PHYS_FLASH_SECT_SIZE
#define CFG_ENV_SIZE (PHYS_FLASH_SECT_SIZE / 16)
/* If defined, hardware flash sectors protection is used instead of
* U-Boot software protection. */
#define CFG_FLASH_PROTECTION
(7) 其他配置:
-
/*
* Miscellaneous configurable options
*/
#define CFG_HUSH_PARSER 1
#define CFG_PROMPT_HUSH_PS2 "> "
#define CFG_LONGHELP /* undef to save memory */
#ifdef CFG_HUSH_PARSER
#define CFG_PROMPT "$ " /* Monitor Command Prompt */
#endif
#define CFG_CBSIZE 256 /* Console I/O Buffer Size*/
/* Print Buffer Size */
#define CFG_PBSIZE (CFG_CBSIZE+sizeof(CFG_PROMPT)+16)
#define CFG_MAXARGS 16 /* max number of command args */
#define CFG_BARGSIZE CFG_CBSIZE /*Boot Argument Buffer Size*/
#define CFG_DEVICE_NULLDEV 1
#define CFG_MEMTEST_START 0xa0400000 /* memtest works on */
#define CFG_MEMTEST_END 0xa0800000 /* 4 ... 8 MB in DRAM */
#undef CFG_CLKS_IN_HZ /* everything, incl board info, in Hz */
/*default load address */
#define CFG_LOAD_ADDR (CFG_DRAM_BASE + 0x8000)
#define CFG_HZ 3686400 /* incrementer freq: 3.6864 MHz */
/* valid baudrates */
#define CFG_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200 }
至此,目标板配置头文件xsbase270.h就完成了。
3.2 板级初始化代码xsbase270.c
只需修改board_init()函数即可,完整代码如下:
-
#include <common.h>
DECLARE_GLOBAL_DATA_PTR;
/* Miscelaneous platform dependent initialisations */
int board_init (void)
{
/* memory and cpu-speed are setup before relocation */
/* so we do _nothing_ here */
/* arch number of XSBASE270-Board */
gd->bd->bi_arch_number = MACH_TYPE_XSBASE270;
/* adress of boot parameters */
gd->bd->bi_boot_params = 0xa0000100;
return 0;
}
int board_late_init(void)
{
setenv("stdout", "serial");
setenv("stderr", "serial");
return 0;
}
int dram_init (void)
{
gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE;
gd->bd->bi_dram[1].start = PHYS_SDRAM_2;
gd->bd->bi_dram[1].size = PHYS_SDRAM_2_SIZE;
gd->bd->bi_dram[2].start = PHYS_SDRAM_3;
gd->bd->bi_dram[2].size = PHYS_SDRAM_3_SIZE;
gd->bd->bi_dram[3].start = PHYS_SDRAM_4;
gd->bd->bi_dram[3].size = PHYS_SDRAM_4_SIZE;
return 0;
}
3.3 驱动程序移植
最主要的是闪存和网卡驱动程序的移植。由于使用U-Boot自带的CFI闪存驱动程序和SMC91111网卡驱动程序,应此只要在头文件中进行相关配置即可完成。具体见3.1节。如果需要自行添加相关的设备驱动,则需要在board/xsbase270/目录下添加驱动源文件,并将其添加到该目录下的Makefile中进行编译与链接。
至此,针对特定目标板的U-Boot软件移植工作基本完成。在下一节中,将简单讨论U-Boot的基本的硬件调试方法与技巧。
[Track]http://blog.chinaunix.net/u/26710/showart_403452.html