资源简介
手写简易的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
相关资源
- 方格网土方简易计算表.xls
- swift,苹果开发简易聊天室
- Appinventor的2048安卓小游戏,足够简易
- 基于qt的简易计算器
- 28335在线升级bootloader
- 简易数字电压表
- ios简易计算器
- 简易贪吃蛇
- 简易DHCP工具
- iOS CoreData实现简易的成绩管理系统
- IOS简易的成绩管理系统
- 电子竞赛——简易信号测量仪(全部
- mini2440的按键,led灯裸机程序,不使用
- 全国电子设计大赛----简易数控稳压电
- Qt简易浏览器(类似微信)无边框阴影
- 密码学课程设计 一个简易的数字签名
- 单片机c51设计简易计算器数码管显示
- 简易的矩阵键盘,带仿真,可直接用
- 单片机和LCD1602实现的简易计算器
- 简易直流电子负载程序
- 基于单片机的简易数字电压表的设计
- xcode 简易计算器
- 基于comet4j的简易聊天
- 简易电子琴设计,VHDL,占空比50%
- 简易版 TYPE-C 封装
- 设计一个简易键盘 数字电路课程设计
- 简易电压表设计微机原理
- 五子棋(简易AI)
- 即时聊天工具(简易版)
- 2440自编简易操作系统——实现任务调
评论
共有 条评论