原文:
BootLoader实验--转载
链接:http://blog.chinaunix.net/uid-23711997-id-131364.html
@ fixgpio.S
define_gpio:
……
ldr r1, =GPIO_BASE /* 0x40E00000*/
ldr r0, =_GPSR0 /*0x00003000*/
str r0, [r1, #GPSR0] /*GPIO<13,12> is set as output */
ldr r0, =_GPCR0 /* 0x00000800*/
str r0, [r1, #GPCR0] /*GPIO<11> is clear to level zero*/
ldr r0, =_GAFR0L /* 0x80000000*/
str r0, [r1, #GAFR0L] /* GPIO(15) is set as alternate functions 2->nCS<1>*/
ldr r0, =_GAFR0U /* 0x00000010 | (2<<0 )*/
str r0, [r1, #GAFR0U] /*GPIO<18,16> set as alternate functions 2
……
|
clock_enable :/* start.S*/
#if defined(CONFIG_PXA25x)
ldr r0, =0x0001FFFF
#elif defined(CONFIG_PXA27x)
ldr r0, =0x01FFFFFF
#endif
ldr r1, =CKEN
str r0, [r1]
mov pc, lr
|
setup_memory : /* memsetup.S*/
@ change cpu speed function
ldr r1, =CCCR
ldr r0, =_CCCR
str r0, [r1] @ set CCCR
……
|
/* copy
bootloader to dynamic memory area*/
ldr r0, =0x00
ldr r1, =__boot_start /* @boot.ld.in file */
ldr r2, =__boot_end /* @boot.ld.in file */
1: ldmia r0!, {r3-r10}
stmia r1!, {r3-r10}
cmp r1, r2
blt 1b
|
@ set stack point
ldr sp, =stack_point-4 /*stack_point = __boot_start + 0x00100000;*/
|
ldr pc, =main /* @ start.S file*/
|
@ jump to c code
ldr pc, =main
|
……
(*(volatile unsigned short *)(0x0a000000)) |= (1<<9)|(1<<8)|(1<<6)|(1<<15);
uart_init(); //初始化串口
time_init(); //初始化定时器
config_init(); //内存映射配置初始化
//信息提示
printf("\033[H\033[J\n"); // clear screen.
printf(" %s :
bootloader for Xscale 270 board\n", PACKAGE);
printf(" Copyright (C) 2002-2004 Emdoor Co,. ltd.\n");
printf(" support : http://www.emdoor.com\n");
iflash_init(); //flash存储器初始化
PWMPCR0 = 0xff;
PWMDCR0 = (0x4ff>>2);
//let eth CS is ok
(*(volatile unsigned long *)(0x4800000c)) = _MSC1_ED;
eth_init(); //网络初始化
……
|
struct map __bsetup parts[] = {
{
.name = "loader",
.sramb = LOADER_SRAM_BASE, //0x00000000
.srams = LOADER_MAX_SIZE, //0x00040000->256K
.dramb = LOADER_DRAM_BASE, //0xA1E00000
.drams = 0,
.maxs = LOADER_MAX_SIZE,
}, {
.name = "kernel",
.sramb = KERNEL_SRAM_BASE, //0x00040000
.srams = KERNEL_MAX_SIZE, //0x00140000->1.25M
.dramb = KERNEL_DRAM_BASE, //0xA0008000
.drams = 0,
.maxs = KERNEL_MAX_SIZE,
}, {
.name = "ramdisk",
.sramb = RAMDISK_SRAM_BASE, //0x00180000
.srams = RAMDISK_MAX_SIZE, //0x00300000->3M
.dramb = RAMDISK_DRAM_BASE, //0xA1000000
.drams = 0,
.maxs = RAMDISK_MAX_SIZE,
}, {
.name = "root",
.sramb = ROOTFS_SRAM_BASE, //0x00180000
.srams = ROOTFS_MAX_SIZE, //0x01e80000->30.5M
.dramb = ROOTFS_DRAM_BASE, //0xA0000000
.drams = 0,
.maxs = ROOTFS_MAX_SIZE,
}
};
|
……
#define ATAG_NONE 0x00000000
struct tag_header {
uint32 size;
uint32 tag;
};
……
struct tag {
struct tag_header hdr;
union {
struct tag_core core;
struct tag_mem32 mem;
struct tag_videotext videotext;
struct tag_ramdisk ramdisk;
struct tag_initrd initrd;
struct tag_serialnr serialnr;
struct tag_revision revision;
struct tag_videolfb videolfb;
struct tag_cmdline cmdline;
struct tag_acorn acorn;
/*
* DC21285 specific
*/
struct tag_memclk memclk;
} u;
};
|
void create_tags(void){
tags = (struct tag *)BOOT_PARAMS;
setup_tag_core(0, 0);
setup_tag_initrd2(0xA1000000, 0x00420000);
setup_end_tag();
return;
}
static void setup_tag_core(uint32 rootdev, uint32 flags){
tags->hdr.tag = ATAG_CORE;
tags->hdr.size = tag_size(tag_core);
tags->u.core.flags = flags; // not use.
tags->u.core.pagesize = 0; // set read/write.
tags->u.core.rootdev = 0;
tags = tag_next(tags);
return;
}
|
static void setup_tag_initrd2(uint32 start, uint32 size){
tags->hdr.tag = ATAG_INITRD2;
tags->hdr.size = tag_size(tag_initrd);
tags->u.initrd.start = start;
tags->u.initrd.size = size;
tags = tag_next(tags);
return;
}
|
static void setup_end_tag(void){
tags->hdr.tag = ATAG_NONE;
tags->hdr.size = 0;
return;
}
|
static bool do_boot(int argc, char **argv){
void (*kernel)(int zero, int arch);
if (argc == 1) {
struct map *mp;
mp = find_map("kernel");
if (!mp){ printf(" can't found map for kernel.\n"); goto invalid; }
kernel = (void *)mp->dramb;
} else if (argc == 2){
bool res;
ulong tmp;
res = strtoul(argv[1], &tmp, 16);
if (!res) goto invalid;
kernel = (void *)tmp;
} else goto invalid;
if (!get_kernel_size(kernel)){ printf(" error: kernel is not exists.\n"); return false; }
create_tags();
printf("starting kernel ...\n");
kernel(0, 200);
return true;
invalid :
boot_usage();
return false;
}
|
用法
|
帮助
|
描述
|
简短显示各命令的介绍
|
参数
|
无
|
举例
|
Bboot> Help
|
用法
|
load [kernel/ramdisk]
|
描述
|
把存放在FLASH中的映像文件拷贝到SDRAM中。在Autoboot
过程中会自动运行,把内核映像从FLASH加载到SDRAM中。
|
参数
|
Kernel - 把内核映像从FLASH拷贝到SDRAM中
Ramdisk- 从FLASH中拷贝RAMDISK到SDRAM
|
举例
|
Bboot> load kernel
|
用法
|
Bootp
|
描述
|
运行bootp命令用来获取HOST主机发送的BOOTP的数据包,解析
BOOTP的数据包,获取本机的IP地址
|
参数
|
无
|
举例
|
Bboot> bootp
|
用法
|
Tftp 文件名 {address/loader/kernel/root/ramdisk}
|
描述
|
通过以太网下载主机的数据或文件到目标平台的SDRAM
|
参数
|
文件名 - 主机平台需要传输的文件名
loader - 把传输到目标平台的文件放置在SDRAM的loader区域
kernel - 把传输到目标平台的文件放置在SDRAM的kernel区域
root - 把传输到目标平台的文件放置在SDRAM的root区域
ramdisk - 把传输到目标平台的文件放置在SDRAM的ramdisk区域
address - 把传输到目标平台的文件放置在SDRAM的指定地址
|
举例
|
Bboot> tftp zImage kernel
|
用法
|
Flash {loader/kernel/root/ramdisk}
|
描述
|
把SDRAM中的数据烧录到FLASH中特定的地址
|
参数
|
loader - 把SDRAM中的数据烧录到FLASH中的loader区域
kernel – 把SDRAM中的数据烧录到FALSH中的kernel区域
root – 把SDRAM中的数据烧录到FLASH中的root区域
ramdisk – 把SDRAM中的数据烧录到FLASH中的ramdisk的区域
|
举例
|
Bboot> flash kernel
|
用法
|
erase {loader/kernel/ramdisk/root}
|
描述
|
擦除FALSH中的相应区域
|
参数
|
loader – 擦除FALSH中loder区域
kernel – 擦除FLASH中的kernel区域
root – 擦除FLASH中的root区域
ramdisk – 擦除FLASH中的ramdisk区域
|
举例
|
bboot> erase kernel
|
用法
|
Boot
boot [addr]
|
描述
|
在SDRAM中运行kernel
通过参数中指定的地址运行kernel
|
参数
|
addr – kernel image address
|
举例
|
bboot> boot
|
用法
|
set [name] [value]
|
描述
|
设置IP地址,MAC地址以及autoboot参数
|
参数
|
Name [myipaddr] [destipaddr] [myhaddr] [autoboot]
Value [ip] [ip] [mac address] [load kernel; boot]
|
举例
|
bboot> set //输出设置信息
bboot> set myipaddr 192.168.100.X //改变目标平台的IP地址
bboot> set destipaddr 192.168.100.XX //改变主机平台的IP地址
bboot> set myhaddr 00:0E:6F:CE:59:21 //设置目标平台的MAC地址
bboot> set autoboot load kernel; boot //装载kernel后自动启动
|
用法
|
Ping
|
描述
|
检查目标平台和主机平台的网络连接
|
参数
|
Ping主机平台的ip地址
|
举例
|
Ping 192.168.100.xx
|
用法
|
Reboot
|
描述
|
软件复位
|
参数
|
None
|
举例
|
Reboot
|