基于全志A33开发板linux系统移植学习记录
第一章 Boot0基于ARMGCC编译和修改
文章目录
- 基于全志A33开发板linux系统移植学习记录
- 前言
- 一、全志A33简介及上电引导流程
- 二、Boot编译器修改的一般流程
-
- 1.Boot0大体流程
- 2.这部分需要做的工作
- 3.修改流程
- 三、Boot0调试
- 总结
前言
进入行业近两年,希望通过学习系统移植巩固相关知识,使用基于全志的目标板A33 的astar-parrot开发板开始想用。Boot0来加载uboot,但后期发现,为了统一和方便代码,最终选择了代码SPL但是Boot0流程比较清晰,所以贴出来容易理解。
一、全志A33简介及上电引导流程
-
硬件方面:A三三三芯片以四核为基础Cortex- A支持高清1080的7架构处理器P视频处理,支持各种主流视频标准,如H.264、VP8、MPEG1/2/4、JPEG/MJPEG,支持RGB/LVDS和LCD接口。256KB一级缓存和512KB二级缓存… 软件:适应全志原厂openWrt构建的Tina系统:采用uboot2011,Linux3.4版,可支持Android4.3,
上电流程:
-
芯片支持五种指导方法,即NAND Flash,eMMC NAND,SPI Nor Flash,SD卡(SDC 0/2)和USB。但如果要直接从USB启动系统,内部上拉50k电阻的UBOOT_SEL引脚需要降低。具体引导流程如下图所示:
-
Soc内部SROM区固化一段代码,上电首先执行这段代码,其主要是判断启动介质并将介质中的部分代码搬运至内部SRAM中(SRAM A1区域,最大32KB,相关控制器已经初始化)并mv PC跳转,判断的顺序就是上图所示。由于目标板使用mmc存储方式,并向外提供了SD卡插槽,为了保证不烧砖(由于移植过程中去掉了fel mode,相对不是很安全),首先利用工具将厂商提供的镜像烧录至mmc(SDC2)中,然后后面利用TF卡,将编译好的bin档dd到sd卡偏移16sector的位置,(SDC0)启动移植代码(SDC0优先级高,所以不会有影响),
二、Boot0编译器修改大致流程
1.Boot0大体流程
根据上述A33的启动方式描述,由于主体u-boot占用内存远远大于其SRAM容量,所以Boot0的主要作用就是运行在SRAM中,初始化启动介质,初始化外部DDR,并搬运uboot到DDR最后跳转。源码github:https://github.com/wangzl-coder/sunxi-basicLoader.git
2.此部分需做的工作
Boot0是比较简单但非常底层的裸机程序,SOC厂商发布的Boot0源码是基于cygwin+armcc进行编译,为了后续的方便,我们需要修改并重新编译,而由于armcc的非开源性,所以第一步是将其转换标准,使用ARM GCC编译方式编译。
3.修改流程
(1)编译环境的搭建部分省略,选用arm通用编译器arm-linux-gnueabi-,首先新建armgcc配置文件,添加如下:
#/* #********************************************************************************************************* #* MELIS #* the Easy Portable/Player Develop Kits #* Compiler Module #* #* (c) Copyright 2006-2010, kevin.z China #* All Rights Reserved #* #* File : crosstool.cfg #* By : kevin.z #* Version : v1.0 #* Date : 2010-9-7 10:38 #* Descript: configuration script for RVDS compiler #* Update : date auther ver notes #* #********************************************************************************************************* #*/
#
#工具链配置
CROSSTOOL = ARMGCC
LICHEEPATH = $(SDKROOT)/../../tools/pack/chips/$(ARCH)
WORKSPACEPATH = $(SDKROOT)/../pack/chips/$(ARCH)
WORKTOOLS = $(SDKROOT)/pctools
ifeq ($(CROSSTOOL), ARMRVDS)
#===============================================================
#RVDS编译器参数配置
#===============================================================
else
ifeq ($(CROSSTOOL), ARMGCC)
#===============================================================
#GNU编译器参数配置
#===============================================================
CROSS_COMPILE ?= arm-linux-gnueabi-
#编译器
CC = $(CROSS_COMPILE)gcc
#编译器参数
CFLAGS =
#打包库
AS = $(CROSS_COMPILE)as
#打包库参数
ASFLAGS =
#链接器
LD = $(CROSS_COMPILE)ld
#链接器参数
LKFLAGS =
#objcopy
OBJCOPY = $(CROSS_COMPILE)objcopy
#加载器参数
OBJCOPY_FLAGS = -O binary -S
else
error:
$(error CROSSTOOL configuration is invalid!!!)
endif
endif
(2) 修改相关文件格式:根据gnuc标准,首先将所有汇编文件后缀修改为.S(大写),将目录标识符"“修改linux格式”/"。 (3)boot0/make.cfg 添加编译,链接参数
ifeq ($(CROSSTOOL), ARMGCC)
#===============================================================================
#使用GNU-GCC编译器
#===============================================================================
CFLAGS += -O2 -Wno-nonnull-compare -fno-strict-aliasing -fno-stack-protector -Werror -Wall $(INCLUDES)
LDFLAGS += -T./config/sun8iw5p1.lds -static
(4)添加链接脚本,_start段作为起始段,将头校验段链接在起始位置,此处首先需要对head自定义段,boot0/Boot0_head.c:
#include "boot0_i.h"
#define DDR3_USED
const boot0_file_head_t BT0_head __attribute__((__section__(".bt0_head")))= {
{
/* jump_instruction */ ( 0xEA000000 | ( ( ( sizeof( boot0_file_head_t ) + sizeof( int ) - 1 ) / sizeof( int ) - 2 ) & 0x00FFFFFF ) ), // one intruction jumping to real code
BOOT0_MAGIC, // ="eGON.BT0" or "eGON.BT1", not C-style string.
STAMP_VALUE, // generated by PC
#ifdef ALIGN_SIZE_8K
0x2000,
#else
0x8000, // generated by PC
#endif
sizeof( boot_file_head_t ), // the size of boot_file_head_t
BOOT_PUB_HEAD_VERSION, // the version of boot_file_head_t
0, // the return value
0, // run addr
EGON_VERSION, // eGON version
{
0, 0, '3','.','1','.','0',0 // platform information
},
},
#ifdef DDR3_USED
{
sizeof( boot0_private_head_t ), // the size of prvt_head
BOOT0_PRVT_HEAD_VERSION, // the version of boot0_private_head_t
/******DRAM patameters for initialising dram. Original values is arbitrary******/
{
/***normal configuration******/
552, //dram_clk
3, //dram_type
0x3bbb, //dram_zq
1, //dram_odt_en
0x10F20200, //dram_para1
0x00, //dram_para2
/****timing configuration*****/
0x1840, //dram_mr0
0x40, //dram_mr1
0x8, //dram_mr2
0, //dram_mr3
0x0048A192, //dram_tpr0
0x01B1B18d, //dram_tpr1
0x00076052, //dram_tpr2
0x0, //dram_tpr3
0x0, //dram_tpr4
0x0, //dram_tpr5
0x0, //dram_tpr6
0x0, //dram_tpr7
0x0, //dram_tpr8
0x0, //dram_tpr9
0x0, //dram_tpr10
0x0, //dram_tpr11
168, //dram_tpr12
0x10900, //dram_tpr13
},
3, // UART控制器编号
{
{
8, 6, 3, 1, 0xff, 0xff, {
0, 0} }, // UART控制器(调试打印口)数据信息 tx
{
8, 7, 3, 1, 0xff, 0xff, {
0, 0} } // UART控制器(调试打印口)数据信息 rx
},
0, // jtag 1 : enable, 0 : disable
{
{
0, 0, 0, 0, 0, 0, {
0, 0} },
{
0, 0, 0, 0, 0, 0, {
0, 0} },
{
0, 0, 0, 0, 0, 0, {
0, 0} },
{
0, 0, 0, 0, 0, 0, {
0, 0} },
{
0, 0, 0, 0, 0, 0, {
0, 0} },
}, // 保存JTAG的全部GPIO信息
{
{
6, 0, 2, 1, 2, 0, {
0, 0} },
{
6, 1, 2, 1, 2, 0, {
0, 0} },
{
6, 2, 2, 1, 2, 0, {
0, 0} },
{
6, 3, 2, 1, 2, 0, {
0, 0} },
{
6, 4, 2, 1, 2, 0, {
0, 0} },
{
6, 5, 2, 1, 2, 0, {
0, 0} }, // 存储设备 GPIO信息
},
/****用户保留数据信息****/
{
0,
}
}
#else
{
sizeof( boot0_private_head_t ),
BOOT0_PRVT_HEAD_VERSION,
{
0x40000000,
1024,
180,
1,
1,
0,
(__dram_type_e)1,
16,
10,
14,
4,
3,
0,
16,
1024
},
0,
{