资源简介

手写简易的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. 帮内核设置串口: 内核启动的开始部分会从串口打印一些信息但是内核一开始没有初始化串口 */
uart0_init();

/* 1. 从NAND FLASH里把内核读入内存 */
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. 设置参数 */
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. 跳转执行 */
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“);
/* 如果一切正常 不会执行到这里 */

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

评论

共有 条评论