码迷,mamicode.com
首页 > 其他好文 > 详细

[国嵌攻略][069][Bootm命令移植]

时间:2015-12-07 12:05:41      阅读:196      评论:0      收藏:0      [点我收藏+]

标签:

Bootloader作用

1.初始化软硬件

2.启动操作系统

 

内核分类

1.zImage 不加信息头的内核

2.uImage 加信息头后的内核,用bootm命令来启动

 

bootm作用

1.检测信息头:压缩、操作系统、幻数

2.根据OS信息调用相应的处理函数:获取内核地址、知道CPU型号、设置启动参数

 

代码编写

1.获取启动地址

 

2.设置启动参数

2.1设置核心启动参数

2.2设置内存参数

2.3设置命令行参数

2.4设置参数结束行标志

 

3.启动操作系统

 

/********************************************************************
*名称:bootm.c
*作者:D
*时间:2015.11.23
*功能:启动Linux系统
*********************************************************************/

/********************************************************************
*头文件
*********************************************************************/
#include "net.h"

/********************************************************************
*宏定义
*********************************************************************/
#define KERNEL_ZERO 0
#define KERNEL_MACH 168                 //开发板ID,要与内核ID匹配
#define KERNEL_ADDR TFTP_DONWLOAD       //内核地址
#define ATAG_ADDR (KERNEL_ADDR-0x100)   //标签地址

#define ATAG_CORE      0x54410001   //核心标签
#define ATAG_MEM       0x54410002   //内存标签
#define ATAG_CMDLINE   0x54410009   //命令标签
#define ATAG_NONE      0x00000000   //结束标签

#define MEM_ADDR 0x30000000   //内存地址
#define MEM_SIZE 0x04000000   //内存大小

#define tag_size(type) ( (sizeof(struct tag_header)+sizeof(struct type))>>2 )        //计算标签大小,除以4表示标签大小以4字节计算,用于移动标签指针
#define tag_next(type) ( (struct tag *)((unsigned int *)(type)+(type)->hdr.size) )   //移动标签指针

/********************************************************************
*类型定义
*********************************************************************/
struct tag_header {
	unsigned int tag;
	unsigned int size;
};

struct tag_core {
	unsigned int flags;
	unsigned int pagesize;
	unsigned int rootdev;
};
struct tag_mem32 {
	unsigned int start;
	unsigned int size;
};

struct tag_cmdline {
	char cmdline[1];
};

struct tag{
	struct tag_header hdr;
	union{
		struct tag_core core;
		struct tag_mem32 mem;
		struct tag_cmdline cmdline;
	}u;
};
struct tag *params;

/********************************************************************
*全局变量声明
*********************************************************************/
const char *cmdline = "console=ttySAC0,115200 init=/init";

/********************************************************************
*函数原型声明
*********************************************************************/
void do_bootm_linux();
void setup_core_tag();
void setup_memory_tag();
void setup_cmdline_tag();
void setup_end_tag();

/********************************************************************
*名称:do_bootm_linux
*参数:
*	none
*返回:
*	none
*功能:启动Linux系统
*********************************************************************/
void do_bootm_linux(){
	 void  (*theKernel)(int zero, int arch, unsigned int params);   //内核函数指针

	//设置启动地址
	theKernel = (void (*)(int, int, unsigned int))KERNEL_ADDR;   //将地址转换为函数指针
	
	//设置启动参数
	setup_core_tag();      //设置核心参数
	setup_memory_tag();    //设置内存参数
	setup_cmdline_tag();   //设置命令参数
	setup_end_tag();       //设置结束标志
	
	//启动操作系统
	theKernel(KERNEL_ZERO, KERNEL_MACH, ATAG_ADDR);   //不再返回
}

/********************************************************************
*名称:setup_core_tag
*参数:
*	none
*返回:
*	none
*功能:设置核心参数
*********************************************************************/
void setup_core_tag(){
	//设置标签地址
	params = (struct tag *)ATAG_ADDR;
	
	//设置核心参数
	params->hdr.tag = ATAG_CORE;
	params->hdr.size = tag_size(tag_core);
	
	params->u.core.flags = 0;
	params->u.core.pagesize = 4096;
	params->u.core.rootdev = 0;
	
	//移动标签地址
	params = tag_next(params);
}

/********************************************************************
*名称:setup_memory_tag
*参数:
*	none
*返回:
*	none
*功能:设置内存参数
*********************************************************************/
void setup_memory_tag(){
	//设置内存参数
	params->hdr.tag = ATAG_MEM;
	params->hdr.size = tag_size(tag_mem32);
	
	params->u.mem.start = MEM_ADDR;
	params->u.mem.size = MEM_SIZE;
	
	//移动标签地址
	params = tag_next(params);
}

/********************************************************************
*名称:setup_cmdline_tag
*参数:
*	none
*返回:
*	none
*功能:设置命令参数
*********************************************************************/
void setup_cmdline_tag(){
	//设置命令参数
	params->hdr.tag = ATAG_CMDLINE;
	params->hdr.size = (sizeof(struct tag_header)+strlen(cmdline)+1+4)>>2;   //‘+1‘表示字符结束标志‘\0‘, ‘+4‘表示除以4转换成整型时向上取整

	strcpy(params->u.cmdline.cmdline, cmdline);

	//移动标签地址
	params = tag_next(params);
}

/********************************************************************
*名称:setup_cmdline_tag
*参数:
*	none
*返回:
*	none
*功能:设置结束标志
*********************************************************************/
void setup_end_tag(){
	params->hdr.tag = ATAG_NONE;
	params->hdr.size = 0;
}

 

[国嵌攻略][069][Bootm命令移植]

标签:

原文地址:http://www.cnblogs.com/d442130165/p/5025467.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!