資源簡介
手寫簡易的bootloader在Mini2440上親測成功。

代碼片段和文件信息
#include?“setup.h“
extern?void?uart0_init(void);
extern?void?nand_read(unsigned?int?addr?unsigned?char?*buf?unsigned?int?len);
extern?void?puts(char?*str);
extern?void?puthex(unsigned?int?val);
static?struct?tag?*params;
void?setup_start_tag(void)
{
params?=?(struct?tag?*)0x30000100;
params->hdr.tag?=?ATAG_CORE;
params->hdr.size?=?tag_size?(tag_core);
params->u.core.flags?=?0;
params->u.core.pagesize?=?0;
params->u.core.rootdev?=?0;
params?=?tag_next?(params);
}
void?setup_memory_tags(void)
{
params->hdr.tag?=?ATAG_MEM;
params->hdr.size?=?tag_size?(tag_mem32);
params->u.mem.start?=?0x30000000;
params->u.mem.size??=?64*1024*1024;
params?=?tag_next?(params);
}
int?strlen(char?*str)
{
int?i?=?0;
while?(str[i])
{
i++;
}
return?i;
}
void?strcpy(char?*dest?char?*src)
{
while?((*dest++?=?*src++)?!=?‘\0‘);
}
void?setup_commandline_tag(char?*cmdline)
{
int?len?=?strlen(cmdline)?+?1;
params->hdr.tag??=?ATAG_CMDLINE;
params->hdr.size?=?(sizeof?(struct?tag_header)?+?len?+?3)?>>?2;
strcpy?(params->u.cmdline.cmdline?cmdline);
params?=?tag_next?(params);
}
void?setup_end_tag(void)
{
params->hdr.tag?=?ATAG_NONE;
params->hdr.size?=?0;
}
int?main(void)
{
void?(*theKernel)(int?zero?int?arch?unsigned?int?params);
volatile?unsigned?int?*p?=?(volatile?unsigned?int?*)0x30008000;
/*?0.?幫內(nèi)核設置串口:?內(nèi)核啟動的開始部分會從串口打印一些信息但是內(nèi)核一開始沒有初始化串口?*/
uart0_init();
/*?1.?從NAND?FLASH里把內(nèi)核讀入內(nèi)存?*/
puts(“Copy?kernel?from?nand\n\r“);
nand_read(0x60000?(unsigned?char?*)0x30008000?0x500000);
puthex(0x12345678);
puts(“\n\r“);
puthex(*p);
puts(“\n\r“);
/*?2.?設置參數(shù)?*/
puts(“Set?boot?params\n\r“);
setup_start_tag();
setup_memory_tags();
setup_commandline_tag(“noinitrd?root=/dev/mtdblock3?init=/linuxrc?console=ttySAC0“);
setup_end_tag();
/*?3.?跳轉(zhuǎn)執(zhí)行?*/
puts(“Boot?kernel\n\r“);
theKernel?=?(void?(*)(int?int?unsigned?int))0x30008000;
theKernel(0?1999?0x30000100);??
/*?
?*??mov?r0?#0
?*??ldr?r1?=1999
?*??ldr?r2?=0x30000100
?*??mov?pc?#0x30008000?
?*/
puts(“Error!\n\r“);
/*?如果一切正常?不會執(zhí)行到這里?*/
return?-1;
}
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2014-05-23?03:04??my_bootloader\
?????文件?????????500??2014-05-23?01:48??my_bootloader\Makefile
?????文件????????2216??2014-05-23?03:04??my_bootloader\boot.bin
?????文件????????2260??2014-05-23?03:04??my_bootloader\boot.c
?????文件???????25076??2014-05-23?03:04??my_bootloader\boot.dis
?????文件???????36783??2014-05-23?03:04??my_bootloader\boot.elf
?????文件?????????255??2014-05-23?01:48??my_bootloader\boot.lds
?????文件????????2392??2014-05-23?03:04??my_bootloader\boot.o
?????文件????????4713??2014-05-23?01:48??my_bootloader\init.c
?????文件????????2892??2014-05-23?03:04??my_bootloader\init.o
?????文件????????6222??2014-05-23?01:48??my_bootloader\setup.h
?????文件????????1601??2014-05-23?01:48??my_bootloader\start.S
?????文件????????1084??2014-05-23?03:04??my_bootloader\start.o
評論
共有 條評論