u-boot移植笔记cym

u-boot移植笔记cym
u-boot移植笔记cym

u-boot移植笔记

基于u-boot-1.1.4-ebd9261,移植到rk2800sdk 1.uboot移植准备

软件环境搭建

1.1Ubuntu操作系统:

1.1.1安装ARM-LINUX-GCC编译器:

1.1.2配制AT91学习板U-Boot

1.1.3配制AT91学习板U-Boot实现在AXD下的C语言源码调试

1.2Windows 操作系统:

1.2.1 AXD下JTAG调试环境搭建

1.2.1.1安装J-link驱动

1.2.1.2用ADS,实现u-boot的C语言源代码级调试

2.U-Boot移植过程

2.1根据at91sam9261ek建立rk2800sdk测试编译选项

2.1.1 修改Makefile文件

2.1.2 建立rk2800sdk的开发板文件

2.1.3 建立rk2800sdk的配置文件

2.1.4 修改交叉编译工具的路径

2.1.5 测试编译rk2800sdk uboot

2.2 将调试好的RK28driver加进uboot工程

2.2.1 添加RK28driver工程到RK28 uboot

2.2.2 添加在rk_drivers下的建立Makefile编译连接

2.2.3 在uboot的根目录Makefile中将rkdriver.a添加进去

2.3 uboot启动流程第一阶段cpu\\start.s

2.4 uboot启动流程第二阶段lib_arm\board.c

2.4.1 添加RK2800driver工程头文件到lib_arm\board.c

2.4.2 修改函数指针数组init_sequence 中定义的函数

2.4.3 修改串口相关函数

2.4.4修改board.c中的其他相关函数

2.5 编译获得的uboot.bin可以通过串口打印信息到uboot命令行

3.uboot网卡enc28j60功能ping、tftp

3.1 注释CONFIG_DRIVER_DM9000,并重写enc28j60.c中四个函数

3.2 在rk2800sdk.h中添加PING命令

4.uboot引导linux内核过程

4.1制作uImage

4.2 tftp下载linux kernel

4.3 bootm引导linux kernel启动

4.4 linux 内核启动串口打印的启动信息

5. merge tool采用uboot.bin制作Rock28Boot(L).bin

5.1 修改uboot编译执行地址

5.2 采用merge tool将uboot.bin加进Rock28Boot(L).bin

5.3 Flash器件对二级Loader(uboot.bin)的限制

Uboot采用AT91学习板附带的u-boot-1.1.4-ebd9261为移植蓝本,移植到ANDROID_RK2800SDK(v1.1 20090707J)。RK2800驱动采用调试好的RK28driver。

1.uboot移植准备

先利用AT91学习板附带的uboot源代码以及交叉编译器,编译出uboot.bin,并在AXD下利用JTAG实现uboot的C语言源码级调试,为后续的uboot移植做准备。

软件环境搭建

1.1Ubuntu操作系统:

Uboot源码:AT91学习板附带的u-boot-1.1.4-ebd9261.tar.gz

交叉编译工具:AT91学习板附带的armv5-linux-gcc.tar.gz

1.1.1安装ARM-LINUX-GCC编译器:

把交叉编译工具armv5-linux-gcc.tar.gz 拷贝到LINUX 系统的根分区下面/opt 文件下面,用tar –zxvf armv5-linux-gcc.tar.gz 命令把arm-linux-gcc安装到/opt/timesys/toolchains/armv5l-linux下面

修改系统环境变量,#sudo gedit /root/.bashrc #sudo gedit /home/cym/.bashrc 在最后一行添加export PA TH=$PATH:/opt/timesys/toolchains/armv5l-linux/bin。可以.使用#armv5l-linux-gcc –v 查看是否安装成功

1.1.2配制AT91学习板U-Boot

U-BOOT 源代码u-boot-1.1.4-ebd9261.tar.gz 拷贝到linux 系统的home/susu/susu_dir/sam9261【1】,用命令tar-jxvf u-boot-1.1.4-ebd9261.tar.gz解压。

进入到U-BOOT的源代码目录下,运行make clean

运行make at91sam9261ek_config进行配制为9261

配制完后运行make dep建立关系

最后运行make进行编译【2】

编译获得AT91板的uboot.bin

1.1.3配制AT91学习板U-Boot实现在AXD下的C语言源码调试

为实现在AXD下的C语言源代码调试,在编译前需修改uboot目录下的config.mk #sudo gedit config.mk

找到OPTFLAGS= -Os #-fomit-frame-pointer

修改为OPTFLAGS= -O0#-Os #-fomit-frame-pointer(注:前一个是大写字母O,后一个是数字零)

******** config.mk修改部分************

AS = $(CROSS_COMPILE)as --gdwarf-2 --gstabs --gen-debug -g

LD = $(CROSS_COMPILE)ld

CC = $(CROSS_COMPILE)gcc #-Q -fprofile-arcs#-pg

CPP = $(CC) -E

AR = $(CROSS_COMPILE)ar

NM = $(CROSS_COMPILE)nm

STRIP= $(CROSS_COMPILE)strip

OBJCOPY = $(CROSS_COMPILE)objcopy

OBJDUMP = $(CROSS_COMPILE)objdump

RANLIB = $(CROSS_COMPILE)RANLIB

RELFLAGS= $(PLATFORM_RELFLAGS)

DBGFLAGS= -gdwarf-2 #-feliminate-dwarf2-dups#-DDEBUG

OPTFLAGS= -O0#-Os #-fomit-frame-pointer

****************************

返回UBOOT目录下输入:

sudo make at91sam9261ek_config

sudo make ARTH=arm

然后生成的两个文件:u-boot.bin u-boot就是AXD要加载的两个文件了loadbinary D:\u-boot-1.1.4\u-boot.bin 0x23F00000

loadsymbols D:\u-boot-1.1.4\u-boot

setpc 0x23F00000

加载u-boot.bin地址为0x23F00000。单步进入程序时,要掉用相应函数时,就会跳出对话筐要求给定文件

1.2Windows 操作系统:

ADS编译工具:ADS1.2

仿真器:JTAG

1.2.1 AXD下JTAG调试环境搭建

1)、安装J-link驱动,JLinkARM_V372a,无需安装,连入J-link硬件时,指定JLinkARM_V372a\USBDriver\x86

运行AXD,在菜单Options->Config Target中添加jlink的dll(jlinkrdi.dll,在jlink软件的安装目录下)

2.)用ADS(AXD Debugger),实现u-boot的源代码级调试(c语言级)

打开AXD,按下Alt + L ;或者点System Views下Command Line Interface,就可以打开一个命令行:

输入help查看帮助文件。

比较有用的命令如:

LoadBinary = 将一个文件导入RAM

LoadSymbols = 导入符号表

SetPC = 设置PC寄存器

Run = 开始运行

OB + 文件名= 按照批处理文件运行

所有的命令在GUI里面也是有的,可以利用批处理文件(OB命令)来免去敲

命令和点菜单的麻烦,

以调试u-boot为例,写一个批处理文件放在D盘,文件名为u-boot.txt,内容如下:

loadbinary D:\u-boot-1.1.4\u-boot.bin 0x23F00000

loadsymbols D:\u-boot-1.1.4\u-boot

setpc 0x23F00000

run

打开AXD,按下ALT+L,键盘输入:ob d:\u-boot.txt

那么AXD会自动运行批处理文件内的命令,自动载入u-boot的二进制代码,自动载入符号表,设置指针为0x23F00000,并开始运行。

在调试时,最后自己一步步输入命令做

Loadbinary简写lb,只能将二进制文件加载到ram中,不能将地址指定到flash 中,在loadsymbols之后,等待进度条显示加载完成,将setpc (pc)指到u-boot.bin 的加载位置,即可单步调试。

这时ads会提示寻找u-boot的入口文件start.s地址,此时需要手动指定start.s 的位置,通常这时可以在linux下,在进入c语言代码中后,ads还可能出现提示指定board.c、string.c等其他文件的地址,这都需要手动做。

2.U-Boot移植过程

2.1根据at91sam9261ek建立rk2800sdk测试编译选项

2.1.1 修改Makefile文件

at91sam9261ek_config : unconfig

@./mkconfig $(@:_config=) arm arm926ejs at91sam9261ek NULL at91sam9261

arm,就表示现在用的是 CPU 的架构是 arm 体系结构。

arm926ejs,指明这是 cpu 的内核类型,它对应于cpu/arm926ejs目录。

at91sam9261ek,这是开发板的型号,它的目录在 board/at91sam9261ek目录下。

NULL,表示开发者或者经销商是谁(vender)

at91sam9261,表示开发板上的 cpu 是啥。

建立rk2800dk的编译项

rk2800sdk_config : unconfig

@./mkconfig $(@:_config=) arm arm926ejs rk2800sdk NULL at91sam9261

2.1.2 建立rk2800sdk的开发板文件

在 board 目录下建立rk2800sdk的文件:

1、复制 board/at91sam9261ek,并更名为 board/rk2800sdk。

2、复制board/at91sam9261ek/at91sam9261ek.c,并更名为board/rk2800sdk/rk2800sdk.c

3、修改 board/rk2800sdk下的Makefile OBJS := rk2800sdk.o

at45.o

4、修改 board/rk2800sdk下的config.mk TEXT_BASE = 0x63f00000

2.1.3 建立rk2800sdk的配置文件

include/configs/at91sam9261ek.h。复制并更名为include/configs/rk2800sdk.h ,

2.1.4 修改交叉编译工具的路径

CROSS_COMPILE=/opt/timesys/toolchains/armv5l-linux/bin/armv5l-linux-

2.1.5 测试编译rk2800sdk uboot

sudo make clean

sudo make rk2800sdk_config

sudo make ARCH=arm

将编译产生的uboot.bin在AXD下利用JTAG下载到SDRAM上,可以运行完start.s并进入start_armboot。

2.2将调试好的RK28driver加进uboot工程

2.2.1添加RK28driver工程到RK28 uboot

将RK28driver工程的源码文件夹Drivers添加到uboot文件夹下,命名为rk_drivers

2.2.2添加在rk_drivers下的建立Makefile编译连接

在rk_driverss文件夹中建立Makefile文件,将rk_driverss下模块函数编译成rkdriver.a

include $(TOPDIR)/config.mk

LIB = rkdriver.a

OBJS := common/drivers_delay.o BuiltIn/SCU/armpll.o BuiltIn/GRF/grf.o BuiltIn/SCU/scu.o \

Loadable/UART/uart.o Loadable/UART/api_uart.o BuiltIn/Interrupt/intc.o \

Loadable/SPI/spi.o Loadable/GPIO/gpio.o Loadable/MAC/enc28j60.o

$(LIB): $(OBJS)

$(AR) crv $@ $(OBJS)

clean:

rm -f $(SOBJS) $(OBJS)

distclean: clean

rm -f $(LIB) core *.bak .depend

##########################################################

.depend: Makefile $(SOBJS:.o=.S) $(OBJS:.o=.c)

$(CC) -M $(CPPFLAGS) $(SOBJS:.o=.S) $(OBJS:.o=.c) > $@ -include .depend

######################################################

2.2.3在uboot的根目录Makefile中将rkdriver.a添加进去

LIBS += rk_drivers/rkdriver.a

2.3uboot启动流程第一阶段cpu\\start.s

第一阶段启动代码在cpu\\start.s 中,完成的工作主要有:

1).CPU 自身初始化:包括MMU,Cache,时钟系统,SDRAM 控制器等的初始化

2).重定位:把自己从非易失性存储器搬移到 RAM 中

3).分配堆栈空间,设置堆栈指针

4).清零 BSS 数据段

5).跳转到第二阶段入口函数 start_armboot()

由于RK2800与AT91sam9261ek采用的ARM核都是arm926ejs,所以两者可以使用相同的start.s,

Rk28000sdk板的uboot直接下载到SDRAM,在start.s阶段运行的代码有以下几段。

;复位入口

reset:

; CPU 设为SVC32 模式

mrs r0,cpsr

bic r0,r0,#0x1f

orr r0,r0,#0xd3

msr cpsr,r0

;为irq,fiq,abt 模式分配堆栈

stack_setup:

ldr r0, _TEXT_BASE ;指向U-boot 起始点

sub r0, r0, #CFG_MALLOC_LEN ;留出malloc 内存空间

sub r0, r0, #CFG_GBL_DATA_SIZE ;留出u-boot 私有数据的空间

;分配abt 模式堆栈空间(12 bytes), 设置svc 模式SP

sub sp, r0, #12 /* leave 3 words for abort-stack */

;清零BSS 数据段

clear_bss:

ldr r0, _bss_start /* find start of bss segment */

ldr r1, _bss_end /* stop here */

mov r2, #0x00000000 /* clear */

clbss_l:str r2, [r0] /* clear loop... */

add r0, r0, #4

cmp r0, r1

ble clbss_l

;跳转到第二阶段入口start

ldr pc, _start_armboot

2.4 uboot启动流程第二阶段lib_arm\board.c

第二阶段是u-boot 的主体,入口点是lib_arm\board.c 中的start_armboot()函数,完成的主要工作包括:

1).为 U-boot 内部私有数据分配存储空间,并清零

2).依次调用函数指针数组 init_sequence 中定义的函数进行一系列的初始化

3).如果系统支持 NOR Flash,调用flash_init ()和display_flash_config ()初始化并显示检测到的器件信息

4).如果系统支持 LCD 或VFD,调用lcd_setmem()或vfd_setmem()计算帧缓冲(Framebuffer)大小,然后在BSS 数据段之后为Framebuffer 分配空间,初始化gd->fb_base 为Framebuffer 的起始地址

5).调用 mem_malloc_init()进行存储分配系统(类似于C 语言中的堆)的初始化和空间分配

6).如果系统支持 NAND Flash,调用nand_init ()进行初始化

7).如果系统支持DataFlash,调用AT91F_DataflashInit()和dataflash_print_info()进行初始化并显示检测到的器件信息

8).调用 env_relocate ()进行环境变量的重定位,即从Flash 中搬移到RAM 中

9).如果系统支持 VFD,调用drv_vfd_init()进行VFD 设备初始化

10).从环境变量中读取 IP 地址和MAC 地址,初始化gd->bd-> bi_ip_addr 和gd->bd->bi_enetaddr

11).调用 jumptable_init ()进行跳转表初始化,跳转表在global_data 中,

12).调用 console_init_r()进行控制台初始化

13).如果需要,调用 misc_init_r ()进行杂项初始化

14).调用 enable_interrupts ()打开中断

15).如果需要,调用board_late_init()进行单板后期初始化,对于AT91SAM9260EK,主要是以太网初始化

16).进入主循环:根据用户的选择启动 linux,或者进入命令循环执行用户输入的命令

该部分代码与板级相关,需要在AT91板的基础上根据RK2800SDK的特点进行修改。

2.4.1添加RK2800driver工程头文件到lib_arm\board.c

#define IN_MAIN

#include "../rk_drivers/drivers.h"

2.4.2修改函数指针数组init_sequence 中定义的函数

将init_sequence中定义的函数注释掉,注释掉循环调用函数指针数组

init_sequence 中定义的for循环

//init_fnc_t *init_sequence[] = {

//cpu_init, /* basic cpu dependent setup */

//board_init, /* basic board dependent setup */

//interrupt_init, /* set up exceptions */

//env_init, /* initialize environment */

//init_baudrate, /* initialze baudrate settings */

//serial_init, /* serial communications setup */

//console_init_f, /* stage 1 init of console */

//display_banner, /* say that we are here */

//dram_init, /* configure available RAM banks */

//display_dram_config,

//#if defined(CONFIG_VCMA9) || defined (CONFIG_CMC_PU2) //checkboard,

//#endif

// NULL,

//};

//for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) { // if ((*init_fnc_ptr)() != 0) {

// hang ();

// }

//}

添加函数指针数组init_sequence 中定义的相关函数

SCUInit();

board_init();

interrupt_init();

env_init();

init_baudrate();

UARTInit(UART_CH0,115200);

SPIMInit(10000,1,0x01,0);

console_init_f(); /* stage 1 init of console */

display_banner();

dram_init();

display_dram_config();

注释掉include/config/rk2800sdk.h中的CFG_CMD_NAND宏开关

注释掉include/config/rk2800sdk.h中的BOARD_LATE_INIT宏开关

2.4.2.1 SCUInit();

SCUInit();为RK28驱动工程函数,已经调试过无需修改

对rk2800sdk的系统控制单元进行初始化

2.4.2.2 board_init();\board\rk2800sdk\rk2800sdk.c

设置机器类型和启动参数块地址到global_data 中相关数据成分中

1)注释掉

//Enable clocks for SMC and PIOC

// AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_SYS;

// AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_PIOC;

//bright all led su.2006.05.29

//AT91F_PIO_ClearOutput(AT91C_BASE_PIOA,AT91C_PIO_PA15|AT91C_PIO_PA16 |AT91C_PIO_PA30|AT91C_PIO_PA31);

// AT91F_PIO_SetOutput(AT91C_BASE_PIOA,AT91C_PIO_PA23);

/* memory and cpu-speed are setup before relocation */

/* so we do _nothing_ here */

2)注释掉include/config/rk2800sdk.h中CONFIG_LCD宏开关

3)修改linux内核机器码类型

gd->bd->bi_arch_number = MACH_TYPE_AT91SAM9261EK;改为

gd->bd->bi_arch_number = MACH_TYPE_RK2800SDK;

并需在include/asm_arm/ mach-types.h中添加RK2800linux内核机器码

#define MACH_TYPE_RK2800SDK 1616

4)修改include/config/rk2800sdk.h中的SDRAM地址和大小

#define PHYS_SDRAM 0x60000000

#define PHYS_SDRAM_SIZE 0x8000000 /* 64 megs */

gd->bd->bi_boot_params = PHYS_SDRAM + 0x100

2.4.2.3 interrupt_init();cpu\arm926ejs\at91sam9261\interrupts.c

注释掉interrupt_init()中原有函数修改为

if( INTCInit() == 0 )

return 0;

2.4.2.4 env_init();\common\env_dataflash.c

环境变量初始化,AT91板从dataflash读取环境变量,rk2800sdk采用默认环境变量

注释掉AT91板中与dataflash相关的函数修改为

int env_init(void)

{

DECLARE_GLOBAL_DATA_PTR;

ulong crc, len, new;

unsigned off;

uchar buf[64];

int DataflashExists;

if (gd->env_valid == 0){

// if((DataflashExists = AT91F_DataflashInit())){ /* prepare for DATAFLASH read/write */

//printf("Dataflash is not plugged or not supported\n");

//return 1;

//}

/* read old CRC */

// read_dataflash (CFG_ENV_ADDR+offsetof(env_t,crc),sizeof(ulong),&crc); // new = 0;

// len = ENV_SIZE;

// off = offsetof(env_t,data);

// while (len > 0) {

// int n = (len > sizeof(buf)) ? sizeof(buf) : len;

// read_dataflash (CFG_ENV_ADDR+off,n , buf);

// new = crc32 (new, buf, n);

// len -= n;

// off += n;

// }

// if (crc == new) {

// gd->env_addr = offsetof(env_t,data);

// gd->env_valid = 1;

// } else {

// gd->env_addr = (ulong)&default_environment[0];

// gd->env_valid = 0;

// }

// }

gd->env_addr = (ulong)&default_environment[0];

gd->env_valid = 0;

}

return 0;

}

2.4.2.5 init_baudrate();\lib_arm\board.c

无需更改

从环境变量中读取波特率,初始化gd->bd->bi_baudrate

2.4.2.6 UARTInit(UART_CH0,115200);

RK2800驱动工程函数,初始化串口

2.4.2.7 SPIMInit(10000,1,0x01,0);

RK2800驱动工程函数,spi初始化

2.4.2.8 console_init_f();\common\console.c

无需更改,控制台初始化

2.4.2.9 display_banner();\lib_arm\board.c

无需更改,输出版本信息和代码/数据段/堆栈信息到控制台

2.4.2.10 dram_init();rk2800sdk\rk2800sdk.c

无需更改,初始化SDRAM区间信息:gd->bd->bi_dram

2.4.2.11 display_dram_config();\lib_arm\board.c

无需更改,输出SDRAM 区间信息信息到控制台

2.4.3 修改串口相关函数

At91sam9261串口相关函数定义在\cpu\arm926ejs\at91sam9261\ serial.c,AT91板的串口驱动并不适用于RK2800SDK,需要注释掉serial.c定义的相关函数,并在rk_driver里的UART下api_uart.c中进行重写。

2.4.

3.1void serial_setbrg (void)

void serial_setbrg(void)

{

UARTSetBaudRate(UART_CH0,115200);

}

2.4.

3.2int serial_init (void)

int serial_init(void)

{

return(UARTInit(UART_CH0,115200));

}

2.4.

3.3 void serial_putc (const char c)

void serial_putc(const char c)

{

if (c == '\n')

UARTWriteByte(UART_CH0,'\r');

UARTWriteByte(UART_CH0, c);

}

2.4.

3.4 void serial_puts (const char *s)

void serial_puts(const char *s)

{

while (*s)

{

serial_putc(*s++);

}

}

2.4.

3.5 int serial_getc (void)

char serial_getc(void)

{

char a;

a=UARTReadByte(UART_CH0);

if(0==a)

a='\0';

return(a);

}

2.4.

3.6 int serial_tstc (void)

char serial_tstc(void)

{

pUART_REG puartRegStart=(pUART_REG)UART0_BASE_ADDR;

if((puartRegStart->UART_USR & UART_RECEIVE_FIFO_NOT_EMPTY) != UART_RECEIVE_FIFO_NOT_EMPTY)

return (-1);

else

return (0);

}

2.4.4修改board.c中的其他相关函数

2.4.4.1注释掉\lib_arm\board.c中DATAFLASH相关函数

//#ifdef CONFIG_HAS_DATAFLASH

// AT91F_DataflashInit();

// dataflash_print_info();

//#endif

2.4.4.2env_relocate ();common/env_common.c 环境变量重定位

无需修改

2.4.4.3 \lib_arm\board.c

从环境变量"ipaddr"中读取IP 地址,初始化

gd->bd->bi_ip_addr

/* IP Address */

gd->bd->bi_ip_addr = getenv_IPaddr ("ipaddr");

从环境变量"ethaddr"中读取MAC 地址,初始化gd->bd->bi_enetaddr

/* MAC Address */

{

int i;

ulong reg;

char *s, *e;

uchar tmp[64];

i = getenv_r ("ethaddr", tmp, sizeof (tmp));

s = (i > 0) ? tmp : NULL;

for (reg = 0; reg < 6; ++reg) {

gd->bd->bi_enetaddr[reg] = s ? simple_strtoul (s, &e, 16) : 0;

if (s)

s = (*e) ? e + 1 : e;

}

}

2.4.4.4 devices_init ();\common\devices.c 初始化设备

device_t 的主体是一系列操作设备的函数指针,另外还包含了设备名称,标记和私有数据等等。

函数drv_system_init ()总是要执行的,这个函数创建并注册了一个串行口设备和一个空设备(空设备是可选的),在common/devices.c 中定义:

没找到devices_init (void)中相关宏开关在哪里设置,注释掉其中AT91板相关代码

int devices_init (void)

{

#ifndef CONFIG_ARM /* already relocated for current ARM implementation */ DECLARE_GLOBAL_DATA_PTR;

ulong relocation_offset = gd->reloc_off;

int i;

/* relocate device name pointers */

for (i = 0; i < (sizeof (stdio_names) / sizeof (char *)); ++i) {

stdio_names[i] = (char *) (((ulong) stdio_names[i]) +

relocation_offset);

}

#endif

/* Initialize the list */

devlist = ListCreate (sizeof (device_t));

if (devlist == NULL) {

eputs ("Cannot initialize the list of devices!\n");

return -1;

}

//#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C)

// i2c_init (CFG_I2C_SPEED, CFG_I2C_SLA VE);

//#endif

//#ifdef CONFIG_LCD

// drv_lcd_init ();

//#endif

//#if defined(CONFIG_VIDEO) || defined(CONFIG_CFB_CONSOLE)

// drv_video_init ();

//#endif

//#ifdef CONFIG_KEYBOARD

// drv_keyboard_init ();

//#endif

//#ifdef CONFIG_LOGBUFFER

// drv_logbuff_init ();

//#endif

drv_system_init ();

//#ifdef CONFIG_SERIAL_MULTI

// serial_devices_init ();

//#endif

//#ifdef CONFIG_USB_TTY

// drv_usbtty_init ();

//#endif

//#ifdef CONFIG_NETCONSOLE

// drv_nc_init ();

//#endif

return (0);

}

2.4.4.5 jumptable_init (); \common\exports.c /* 初始化跳转表*/

无需修改

2.4.4.6 console_init_r (); \common\console.c /* 初始化控制台*/

无需修改

控制台初始化分两个阶段:console_init_f()和console_init_r()。console_init_f()完成的功能很简单,只是根据环境变量设置了global_data 中的一些数据成分(hasconsole ,flag);console_init_r()在common/console.c 中定义,完成主要的控制台初始化工作:在设备链表中搜索stdin,stdout,stderr 设备;将搜索结果分别设为置控制台的in, out 和err 设备。

通过console_init_r ();包含的console_setfile()函数可以看出,控制台有一个包含3 个evice_t 元素的数组stdio_devices,分别对应stdin,stdout,stderr。通过stdio_devices[file] = dev 就可以将dev 设成设置控制台的某个设备。这样就实现了控制台任意选择设备的功能。这和linux 的设计思想

有点类似。

2.4.4.7 enable_interrupts ();\cpu\arm926ejs\ interrupts.c /* 开中断*/

无需修改

2.4.4.8 \lib_arm\board.c

/* 读取环境变量"loadaddr"到loadaddr 变量*/

/* Initialize from environment */

if ((s = getenv ("loadaddr")) != NULL) {

load_addr = simple_strtoul (s, NULL, 16);

}

/* 读取环境变量"bootfile"到BootFile 变量*/

#if (CONFIG_COMMANDS & CFG_CMD_NET)

if ((s = getenv ("bootfile")) != NULL) {

copy_filename (BootFile, s, sizeof (BootFile));

}

#endif /* CFG_CMD_NET */

无需修改

2.4.4.9 eth_initialize(gd->bd); \lib_arm\board.c以太网初始化

无需修改

2.4.4.10 \lib_arm\board.c进入main_loop ();主循环

在uboot的stage2的最后阶段,进入main_loop()函数。在这个函数中首先检查是否有启动延时,然后决定是自动加载内核映像来启动内核还是通过命令行来启动内核

/* 主循环*/

/* main_loop() can return to retry autoboot, if so just run it again. */

for (;;) {

main_loop ();

}

/* NOTREACHED - no way out of command loop except booting */

}

2.5 编译获得的uboot.bin可以通过串口打印信息到uboot命令行

U-Boot 1.1.4 (Apr 3 2010 - 16:47:08)

U-Boot code: 63F00000 -> 63F3F4C4 BSS: -> 63F8201C

RAM Configuration:

Bank #0: 60000000 128 MB

*** Warning - bad CRC, using default environment

In: serial

Out: serial

Err: serial

Hit any key to stop autoboot: 0

U-Boot>

U-Boot>

3.uboot网卡enc28j60功能ping、tftp

3.1 注释CONFIG_DRIVER_DM9000,并重写enc28j60.c中四个函数

At91学习板采用的网卡芯片为DM9000,而rk2800SDK使用的网卡芯片为enc280j60,enc28j60驱动函数是从网络上下载的linux下的驱动经修改加进RK2800驱动工程进行调试,调试完加进uboot工程,

需要在\ rk_drivers\Loadable\MAC\ enc28j60.c中重写/drivers/dm9000x.c中的四个函数

并在/include/config/rk2800sdk.h中注释掉

//#define CONFIG_DRIVER_DM9000 1

int eth_init(bd_t * bd);

int eth_send(volatile void *, int);

int eth_rx(void);

void eth_halt(void);

3.1.1 int

eth_init(bd_t * bd)

{

unsigned char* macaddr = bd->bi_enetaddr;

uint32 time=0;

SPIMInit(5000,0,0,0);

ENC28J60_CSH(); //CS脚拉高

for (time = 50000; time > 0; time--);

enc28j60WriteOp(ENC28J60_SOFT_RESET, 0, 0xff);

for (time = 50000; time > 0; time--);

NextPacketPtr = RXSTART_INIT;

enc28j60Write(ERXSTL, (RXSTART_INIT & 0xFF));

enc28j60Write(ERXSTH, (RXSTART_INIT >> 8));

enc28j60Write(ERXRDPTL, (RXSTART_INIT & 0xFF));

enc28j60Write(ERXRDPTH, (RXSTART_INIT >> 8));

enc28j60Write(ERXWRPTL, (RXSTART_INIT & 0xFF));

enc28j60Write(ERXWRPTH, (RXSTART_INIT >> 8));

enc28j60Write(ERXNDL, (RXSTOP_INIT & 0xFF));

enc28j60Write(ERXNDH, (RXSTOP_INIT >> 8));

enc28j60Write(ETXSTL, (TXSTART_INIT & 0xFF));

enc28j60Write(ETXSTH, (TXSTART_INIT >> 8));

enc28j60Write(ETXNDL, (TXSTOP_INIT & 0xFF));

enc28j60Write(ETXNDH, (TXSTOP_INIT >> 8));

enc28j60Write(ERXFCON,

ERXFCON_UCEN|ERXFCON_CRCEN| ERXFCON_PMEN);

enc28j60Write(EPMM0, 0x3f);

enc28j60Write(EPMM1, 0x30);

enc28j60Write(EPMCSL, 0xf9);

enc28j60Write(EPMCSH, 0xf7);

enc28j60Write(MACON1,

MACON1_MARXEN|MACON1_TXPAUS| MACON1_RXPAUS);

enc28j60Write(MACON2, 0x00);

enc28j60WriteOp(ENC28J60_BIT_FIELD_SET,

MACON3,MACON3_PADCFG0|MACON3_TXCRCEN|MACON3_FRMLNEN);

enc28j60Write(MAIPGL, 0x12);

enc28j60Write(MAIPGH, 0x0C);

enc28j60Write(MABBIPG, 0x12);

enc28j60Write(MAMXFLL, (MAX_FRAMELEN & 0xFF));

enc28j60Write(MAMXFLH, (MAX_FRAMELEN >> 8));

enc28j60Write(MAADR5, macaddr[0]);

enc28j60Write(MAADR4, macaddr[1]);

enc28j60Write(MAADR3, macaddr[2]);

enc28j60Write(MAADR2, macaddr[3]);

enc28j60Write(MAADR1, macaddr[4]);

enc28j60Write(MAADR0, macaddr[5]);

enc28j60PhyWrite(PHCON2, PHCON2_HDLDIS);

enc28j60PhyWrite(PHLCON, 0x476);

enc28j60SetBank(ECON1);

enc28j60WriteOp(ENC28J60_BIT_FIELD_SET,

EIE, EIE_INTIE | EIE_PKTIE);

enc28j60WriteOp(ENC28J60_BIT_FIELD_SET,

ECON1, ECON1_RXEN); DRVDelayCyc(1000);

return 0;

}

3.1.2 int eth_send(volatile void *packet, int length)

{

enc28j60PacketSend(length,packet);

return 0;

}

3.1.3 int eth_rx(void)

{

uint8 *rdptr = (u8 *) NetRxPackets[0];

uint16 RxLen = 0;

if(enc28j60Read(EPKTCNT) ==0)

{

return 0;

}

RxLen=enc28j60PacketReceive(1536,NetRxPackets[0]);

NetReceive(NetRxPackets[0], RxLen);

return RxLen;

}

3.1.4 void eth_halt(void)

{

SPIMDeinit();

}

3.2 在rk2800sdk.h中添加PING命令

/include/config/rk2800sdk.h

#define CONFIG_COMMANDS \

((CONFIG_CMD_DFL | \

CFG_CMD_NET | \

CFG_CMD_PING | \

U-Boot 1.1.4 (Apr 3 2010 - 19:20:31)

U-Boot code: 63F00000 -> 63F35628 BSS: -> 63F69C20

RAM Configuration:

Bank #0: 60000000 128 MB

*** Warning - bad CRC, using default environment

In: serial

Out: serial

Err: serial

Hit any key to stop autoboot: 0

U-Boot> ping 192.168.0.125

host 192.168.0.125 is alive

U-Boot> tftp 60400000 uImage2800

TFTP from server 192.168.0.125; our IP address is 192.168.0.11

Filename 'uImage2800'.

Load address: 0x60400000

Loading:###########################################################

#################################################################

#################################################################

#################################################################

############################################################

done

Bytes transferred = 1637954 (18fe42 hex)

U-Boot>

4.uboot引导linux内核过程

uboot的支持

在include/config/rk2800sdk.h中加入:

#define CONFIG_CMDLINE_TAG 1 /* enable passing of ATAGs */ #define CONFIG_SETUP_MEMORY_TAGS 1

向内核传递参数(以Tag标记的形式),依赖于宏定义,所以如果要想u-boot给内

核传递特定的标记,则必须定义相应的宏。

#ifdef CONFIG_CMDLINE_TAG

char *commandline = getenv ("bootargs");

#endif

如果在include/configs/.h定义了CONFIG_CMDLINE_TAG则将bootargs环境变量传递给内核。

4.1制作uImage

采用release_1.4 linux kernel工程,uImage的制作工具tools和mkimage脚本加进工程

Mkimage脚本内容为:

-----------------------------------------------------------------------------------------------

make Image

../toolchain/arm-eabi-4.2.1/bin/arm-eabi-objcopy -O binary -S vmlinux linux.bin

gzip -v9 linux.bin

./tools -A arm -O linux -C gzip -T kernel -a 0x60008000 -e 0x60008000 -n linux-2.6 -d linux.bin.gz uImage2800

---------------------------------------------------------------------------------------------------

-A ==> set architecture to 'arch'

-O ==> set operating system to 'os'

-T ==> set image type to 'type'

-C ==> set compression type 'comp'

-a ==> set load address to 'addr' (hex)

-e ==> set entry point to 'ep' (hex)

-n ==> set image name to 'name'

-d ==> use image data from 'datafile'

-x ==> set XIP (execute in place)

参数说明:

-A 指定CPU的体系结构:

取值表示的体系结构

alpha Alpha、arm A RM、x86 Intel x86、ia64 IA64、mips MIPS、mips64 MIPS 64 Bit、ppc PowerPC、s390 IBM S390、sh SuperH、sparc SPARC、sparc64 SPARC 64 Bit、m68k MC68000

-O 指定操作系统类型,可以取以下值:

openbsd、netbsd、freebsd、4_4bsd、linux、svr4、esix、solaris、irix、sco、dell、ncr、lynxos、vxworks、psos、qnx、u-boot、rtems、artos

-T 指定映象类型,可以取以下值:

standalone、kernel、ramdisk、multi、firmware、script、filesystem

-C 指定映象压缩方式,可以取以下值:

none 不压缩

gzip 用gzip的压缩方式

bzip2 用bzip2的压缩方式

-a 指定映象在内存中的加载地址,映象下载到内存中时,要按照用mkimage制

作映象时,这个参数所指定的地址值来下载

-e 指定映象运行的入口点地址,这个地址就是-a参数指定的值加上0x40(因为前面有个mkimage添加的0x40个字节的头)

-n 指定映象名

-d 指定制作映象的源文件

4.2 tftp下载linux kernel

U-Boot> tftp 60400000 uImage2800

4.3 bootm引导linux kernel启动

U-Boot> bootm 60400000

在bootm执行过程,会调用do_bootm_linux()

内核接受Uboot传递来的三个参数,第一个为R0=0x00000000,第二个为系统的机器码R1=0x00000650(机器码为1616),第三个是传入内核的参数偏移量R2=0x60000100

在do_bootm_linux()的最后,会跳到内核去执行:

theKernel (0, bd->bi_arch_number, bd->bi_boot_params);

/* arch number of AT91SAM9261EK-Board */

gd->bd->bi_arch_number = MACH_TYPE_RK2800SDK;

/* adress of boot parameters */

gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;

(有的时候为了省去make menuconfig的时间,并且内核命令也是固定的,就可以写死内核arch/arm/setup.c文件default_command_line,这个变量本来是初始化为CONFIG_CMDLINE的)

4.4 linux 内核启动串口打印启动信息

下载了uImage和ramdisk后,由uboot引导启动(bootm),kernel能加载到ramdisk,然而无法执行ramdisk中的init进程,还不知道是什么原因造成。

Uboot引导内核启动,由于uImage2800生成时采用-C gzip压缩,并将加载地址,启动地址设置为0x60008000,所以uboot将uImage2800解压缩到0x60008000位置,并引导内核启动。

由于只下载了kernel,并未下载ramdisk所以linux启动到加载根文件系统处出现错误

不带文件系统的内核启动过程打印信息如下:

Starting kernel ...

Linux version 2.6.25 (root@cym-desktop) (gcc version 4.2.1) #939 Wed Mar 3 14:08 :45 CST 2010

CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=00053177

Machine: RK28board

Ignoring unrecognised tag 0x54410008

Tiny6410_Uboot移植步骤详解

Uboot_for_Tiny6410_移植步骤详解 一、设计要求 1.目的 1)掌握U-boot剪裁编写 2)掌握交叉编译环境的配置 3)掌握U-boot的移植 2.实现的功能 1)U-boot编译成功 2)移植U-boot,使系统支持从NAND FLASH启动 二、设计方案 1.硬件资源 1)ARM处理器:ARM11芯片(Samsung S3C6410A),基于ARM1176JZF-S核设 计,运行频率533Mhz,最高可达 667Mhz 2)存储器:128M DDR RAM,可升级至 256M;MLC NAND Flash(2GB) 3)其他资源:具有三LCD接口、4线电阻 触摸屏接口、100M标准网络接口、标准DB9 五线串口、Mini USB2.0接口、USB Host 1.1、3.5mm音频输入输出口、标准TV-OUT

接口、SD卡座、红外接收等常用接口;另外 还引出4路TTL串口,另1路TV-OUT、 SDIO2接口(可接SD WiFi)接口等;在板的 还有蜂鸣器、I2C-EEPROM、备份电池、A D 可调电阻、8个中断式按键等。 2.软件资源 1)arm-linux-gcc-4.5.1(交叉编译) 2)u-boot-2010.09.tar.gz arm-linux-gcc-4.5.1-v6-vfp-20101103.t gz 三、移植过程 1.环境搭建 1)建立交叉编译环境 2)去这2个网站随便下载都可以下载得到最 新或者你想要的u-boot。( https://www.360docs.net/doc/a07315955.html,/batch.viewl ink.php?itemid=1694 ftp://ftp.denx.de/pub/u-boot/ )

UBoot移植详解

u-boot 移植步骤详解 1 U-Boot简介 U-Boot,全称Universal Boot Loader,是遵循GPL条款的开放源码项目。从FADSROM、8xxROM、PPCBOOT逐步发展演化而来。其源码目录、编译形式与Linux内核很相似,事实上,不少U-Boot源码就是相应的Linux内核源程序的简化,尤其是一些设备的驱动程序,这从U-Boot源码的注释中能体现这一点。但是U-Boot不仅仅支持嵌入式Linux 系统的引导,当前,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS嵌入式操作系统。其目前要支持的目标操作系统是OpenBSD, NetBSD, FreeBSD,4.4BSD, Linux, SVR4, Esix, Solaris, Irix, SCO, Dell, NCR, VxWorks, LynxOS, pSOS, QNX, RTEMS, ARTOS。这是U-Boot中Universal的一层含义,另外一层含义则是U-Boot除了支持PowerPC系列的处理器外,还能支持MIPS、x86、ARM、NIOS、XScale等诸多常用系列的处理器。这两个特点正是U-Boot项目的开发目标,即支持尽可能多的嵌入式处理器和嵌入式操作系统。就目前来看,U-Boot对PowerPC系列处理器支持最为丰富,对Linux的支持最完善。其它系列的处理器和操作系统基本是在2002年11 月PPCBOOT 改名为U-Boot后逐步扩充的。从PPCBOOT向U-Boot的顺利过渡,很大程度上归功于U-Boot的维护人德国DENX软件工程中心Wolfgang Denk[以下简称W.D]本人精湛专业水平和持着不懈的努力。当前,U-Boot项目正在他的领军之下,众多有志于开放源码BOOT LOADER移植工作的嵌入式开发人员正如火如荼地将各个不同系列嵌入式处理器的移植工作不断展开和深入,以支持更多的嵌入式操作系统的装载与引导。 选择U-Boot的理由: ①开放源码; ②支持多种嵌入式操作系统内核,如Linux、NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS; ③支持多个处理器系列,如PowerPC、ARM、x86、MIPS、XScale; ④较高的可靠性和稳定性; ④较高的可靠性和稳定性; ⑤高度灵活的功能设置,适合U-Boot调试、操作系统不同引导要求、产品发布等; ⑥丰富的设备驱动源码,如串口、以太网、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、键盘等; ⑦较为丰富的开发调试文档与强大的网络技术支持; 2 U-Boot主要目录结构 - board 目标板相关文件,主要包含SDRAM、FLASH驱动; - common 独立于处理器体系结构的通用代码,如内存大小探测与故障检测;

i.MX6UL -- Linux系统移植过程详解(最新的长期支持版本)

i.MX6UL -- Linux系统移植过程详解(最新的长期支持版本) ?开发平台:i.MX 6UL ?最新系统: u-boot2015.04 + Linux4.1.15_1.2.0 ?交叉编译工具:dchip-linaro-toolchain.tar.bz2 源码下载地址: U-Boot: (选择rel_imx_4.1.15_1.2.0_ga.tar.bz2) https://www.360docs.net/doc/a07315955.html,/git/cgit.cgi/imx/uboot-imx.git/ Kernel: (选择rel_imx_4.1.15_1.2.0_ga.tar.bz2) https://www.360docs.net/doc/a07315955.html,/git/cgit.cgi/imx/linux-2.6-imx.git/ 源码移植过程: 1、将linux内核及uBoot源码拷贝到Ubuntu12.04系统中的dchip_imx6ul目录下; 2、使用tar命令分别将uboot和kernel解压到dchip_imx6ul目录下; 3、解压后进入uboot目录下,新建文件make_dchip_imx6ul_uboot201504.sh,且文件内容如下: ################################################################### # Build U-Boot.2015.04 For D518--i.MX6UL By FRESXC # ################################################################### #!/bin/bash export ARCH=arm export CROSS_COMPILE=/dchip-linaro-toolchain/bin/arm-none-linux-gnueabi - make mrproper # means CLEAN make mx6ul_14x14_evk_defconfig make2>&1|tee built_dchip_imx6ul_uboot201504.out 4进入kernel目录下,新建文件make_dchip_imx6ul_linux4115120.sh,且文件内容如下: ###################################################################

uboot移植步骤介绍

uboot移植过程 1.修改Makefile 首先给要建立的S3C2410开发板取名为TE2410, 移植uboot时以smdk2410为模板, 修改Makefile #tar xvjf u-boot-1.1.3.tar.bz2 #cd u-boot-1.1.3 #vi Makefile scb9328_config : unconfig @./mkconfig $(@:_config=) arm arm920t scb9328 NULL imx smdk2400_config : unconfig @./mkconfig $(@:_config=) arm arm920t smdk2400 NULL s3c24x0 smdk2410_config : unconfig @./mkconfig $(@:_config=) arm arm920t smdk2410 NULL s3c24x0 SX1_config : unconfig @./mkconfig $(@:_config=) arm arm925t sx1 te2410_config : unconfig @./mkconfig $(@:_config=) arm arm920t te2410 NULL s3c24x0 蓝色字体是添加的内容。其中,te2410_config : unconfig意思是为TE2410建立一个编译项,@./mkconfig $(@:_config=) arm arm920t te2410 NULL s3c24x0中的arm表示CPU的架构是基于ARM体系结构的;arm920t表示CPU类型是arm920t;te2410是开发板的型号;NULL表示开发商或经销商的名称为空;s3c24x0表示是基于s3c24x0的片上系统。 2.在uboot的board目录下建立te2410开发板子目录 #cp –fr board/smdk2410 /board/te2410 #cd board/te2410 #mv smdk2410.c te2410.c 还要修改board/te2410/Makefile文件, OBJS := smdk2410.o flash.o -------- OBJS := te2410.o flash.o 3.在include/configs目录下建立te2410.h头文件 #cd include/configs #cp –fr smdk2410.h te2410.h 4.指定交叉编译器的路径 选择支持softfloatpoint的交叉编译器,在etc/bashrc文件中添加一行 export PATH=/home/newdisk/toolchain/gcc-3.4.5-glibc-2.3.6/arm-softfloat-linu x-gnu/bin:$PATH 其中, /home/newdisk/toolchain/gcc-3.4.5-glibc-2.3.6/arm-softfloat-linux-gnu /bin是交叉编译器路径

uboot移植实验

一、移植环境 ?主机:UBUNTU ?开发板:飞凌2440 ?编译器:arm-linux-gcc-4.3.2.tgz ?u-boot:u-boot-2009.03.tar.bz2

3)修改u-boot根目录下的Makefile文件。查找到smdk2410_config的地方,在他下面按照smdk2410_config的格式建立mini2440_config的编译选项,另外还要指定交叉编译器 4)测试编译新建的mini2440开发板项目

到此为止,u-boot对自己的mini2440开发板还没有任何用处,以上的移植只是搭建了一个mini2440开发板u-boot的框架,要使其功能实现,还要根据mini2440开发板的具体资源情况来对u-boot源码进行修改。 3. 根据u-boot启动流程图的步骤来分析或者修改添加u-boot源码,使之适合mini2440开发板(注:修改或添加的地方都用红色表示)。 1)mini2440开发板u-boot的stage1入口点分析。 一般在嵌入式系统软件开发中,在所有源码文件编译完成之后,链接器要读取一个链接分配文件,在该文件中定义了程序的入口点,代码段、数据段等分配情况等。那么我们的my2440开发板u-boot的这个链接文件就是cpu/arm920t/u-boot.lds,打开该文件部分代码如下:

知道了程序的入口点是_start,那么我们就打开mini2440开发板u-boot第一个要运行的程序cpu/arm920t/start.S(即u-boot的stage1部分),查找到_start的位置如下: 从这个汇编代码可以看到程序又跳转到start_code处开始执行,那么再查找到start_code 处的代码如下:

嵌入式Linux之我行 史上最牛最详细的uboot移植,不看别后悔

嵌入式Linux之我行——u-boot-2009.08在2440上的移植详解(一) 嵌入式Linux之我行,主要讲述和总结了本人在学习嵌入式linux中的每个步骤。一为总结经验,二希望能给想入门嵌入式Linux 的朋友提供方便。如有错误之处,谢请指正。 ?共享资源,欢迎转载:https://www.360docs.net/doc/a07315955.html, 一、移植环境 ?主机:VMWare--Fedora 9 ?开发板:Mini2440--64MB Nand,Kernel:2.6.30.4 ?编译器:arm-linux-gcc-4.3.2.tgz ?u-boot:u-boot-2009.08.tar.bz2 二、移植步骤 本次移植的功能特点包括: ?支持Nand Flash读写 ?支持从Nor/Nand Flash启动 ?支持CS8900或者DM9000网卡 ?支持Yaffs文件系统 ?支持USB下载(还未实现) 1.了解u-boot主要的目录结构和启动流程,如下图。

u-boot的stage1代码通常放在cpu/xxxx/start.S文件中,他用汇编语言写成;u-boot的stage2代码通常放在lib_xxxx/board.c文件中,他用C语言写成。各个部分的流程图如下:

2. 建立自己的开发板项目并测试编译。 目前u-boot对很多CPU直接支持,可以查看board目录的一些子目录,如:board/samsung/目录下就是对三星一些ARM 处理器的支持,有smdk2400、smdk2410和smdk6400,但没有2440,所以我们就在这里建立自己的开发板项目。 1)因2440和2410的资源差不多,主频和外设有点差别,所以我们就在board/samsung/下建立自己开发板的项目,取名叫my2440 2)因2440和2410的资源差不多,所以就以2410项目的代码作为模板,以后再修改

u_boot移植(五)之分析uboot源码中nand flash操作

u_boot移植(五)之分析uboot源码中nand flash操作 一、OneNand 和Nand Flash 我们已经能从Nand Flash启动了,启动之后,大家会看到如下效果: 可以看出,我们的uboot默认使用的是OneNand。需要注意的是我们的FSC100上面是没有OneNand的,有的是K9F2G08U0B 型号的NAND FLASH。 前面我们了解过Nor Flash 和Nand Flash,那OneNand Flash又是什么呢?

二、uboot 源码中Nand Flash部分代码分析 我们从Nand Flash初始化看起,打开lib_arm/board.c文件,为了紧抓主 线,以下代码只列举出了主线代码。

可以看出,我们可以通过CONFIG_CMD_NAND和 CONFIG_CMD_ONENAND两个宏来选择NAND FLASH初始化还是 ONENAND FLASH初始化。 uboot 中默认定义了宏CONFIG_CMD_ONENAND,所以选择的是ONENAND FLASH初始化。我们的FSC100上面使用的是 NAND FLASH,所以我们要定义CONFIG_CMD_NAND宏,取消CONFIG_CMD_ONENAND宏的定义。 嗯!先做个记录: 修改include/configs/fsc100.h,定义宏CONFIG_CMD_NAND,取消宏CONFIG_CMD_ONENAND。 好了,接下我们看看nand_init()函数时如何实现的。

看以看出,这段代码调用根据CONFIG_SYS_MAX_NAND_DEVICE宏[默认没有定义]的值来决定系统中Nand Flash设备的个数。接着调 用nand_init_chip()函数完成Nand Flash初始化,然后计算出每块Nand Flash的大小。最终会输出Nand Flash总的容量。 嗯!做个记录: 修改include/configs/fsc100.h,定义 宏CONFIG_SYS_MAX_NAND_DEVICE,值为1 没有看明白的地方是给nand_init_chip()函数传递的参数,接下来我们来看看他们是如何定义的。 哈哈,终于到了让人头疼的地方了。先来看看struct nand_chip和struct mtd_info两个结构体,这两个结构体的成员有很多很多,很多初学者一看到就晕头转向了,为了让大家不被吓到,我对这两个结构体的成员做了精简,只保留我们关心的成员,其它的都去掉了。 (1)struct nand_chip

uboot移植笔记

u-boot-2015-01移植笔记 一、修改编译器路径 修改顶层Makefile文件,查找CROSS_COMPILE =,注释掉if判断,增加一行CROSS_CMPILE = arm-linux- (根据编译器不同这个自行添加,在这里感谢胡茂晓同学)。 二、复制平台相近board 1、进入board子目录下的samsung子目录,复制trats2文件夹为自己平台名字的文件夹(这里笔者使用iTop4412)。 2、进入iTop4412子目录,修改为。 3、修改Makefile,将trats2改为iTop4412。 三、修改板子相应配置 1、从源码根目录下进入include/configs目录,复制为。 2、从源码根目录下进入configs目录,复制trats2_defconfig为iTop4412_defconfig。 3、修改iTop4412_defconfig,将CONFIG_DEFAULT_DEVICE_TREE="exynos4412-trats2"改为CONFIG_DEFAULT_DEVICE_TREE="exynos4412-iTop4412"。

四、增加自己的Device Tree Source 1、从源码根目录下进入arch/arm/Dts目录,复制 exynos4412- 。 2、修改当前目录下的Makefile文件,将 dtb-$(CONFIG_EXYNOS4) += \ \ \ \ \ 修改成 dtb-$(CONFIG_EXYNOS4) += \ \ \ \ \ \

五、制作顶层.config文件 1、在源码根目录下使用命令make menuconfig(貌似刚支持图形界面配置)。 2、先配置基本的,Architecture select 选项选择ARM architecture,architecture选项的子选项Target select选择Samsun EXYNOS;EXYNOS board select选项选择Exynos4412 Trat2 board。 3、在Device Tree Control选项下,y(yes)Run-time configuration via Device Tree,选择Provider of DTB for control 为Embedded DTB for DT control,在Default Device Tree for DT control选项下输入exynos4412-iTop4412,退出。 4、保存退出,在源码根目录下会生成.config文件,需要用命令ls –a 查看。 5、在源码根目录下使用命令vim .config,修改.config文件。将CONFIG_SYS_BOARD="trats2" 修改成CONFIG_SYS_BOARD="iTop4412";将CONFIG_SYS_CONFIG_NAME="trats2"修改成CONFIG_SYS_CONFIG_NAME="iTop4412";将CONFIG_DEFAULT_DEVICE_TREE=""修改成CONFIG_DEFAULT_DEVICE_TREE="exynos4412-iTop4412"。(注意:每次使用make menuconfig后都要修改本条)

Uboot_for_mini6410_移植步骤详解

这是u-boot-2010.09 针对友善之臂MINI6410移植的最基础版本,只包含了就基本的系统引导,NAND读写,DM9000网卡等等。但是这个足够开发的方便使用。今后会陆续添加原先我为mini2440添加的所有功能。 但是此次移植并非我的功劳,首先基本的移植是由Alex Ling 完成的,你可以在这里看到他提交的补丁,但是编译后无法使用,可能是因为host系统不同,对脚本的解析不同,使得spl部分的生成出现问题,只需修改一下nand_spl目录下目标板目录的中config.mk中的 PAD_TO := $(shell expr $$[$(TEXT_BASE) + 4096]) 即可。 DM9000的驱动没有太大的问题(修改了一点可能出现问题的地方,感谢肖工指教),但是原本的u-boot并没有调整所有SROM控制器的配置(其中包括连接DM9000所使用的bank1的总线),我使用了友善带的u-boot的参数配置了一下就好了。 一:https://www.360docs.net/doc/a07315955.html,/batch.viewlink.php?itemid=1694 ftp://ftp.denx.de/pub/u-boot/ 去这2个网站随便下载都可以下载得到最新或者你想要的u-boot。现在我将下载u-boot-2010-09,这个也就是最新的版本啦。 下载后把它解压,然后得到u-boot-2010-09的文件夹,然后进去,并且做下面几件事情:1:进入arch这个文件夹,把出arm外的前部文件夹删掉 2:进入board这个文件夹,把除samsung外前部文件夹删掉 3:进入include/configs,把除smdk6400.h外的所有文件删除。 4: 把顶层目录下有一个叫onenand_ipl的文件夹删除掉,因为没有用到。 5:进入nand_spl/board,把除samsung外全部文件删除掉。 6:再进入arch/arm/cpu文件夹,把除arm1176外其他文件夹删除掉。 7:再进入arch/arm/include/asm文件夹,把除arch-s3c64xx文件外带arch-XX的文件夹删除8:再进入board/samsung文价夹下,把除smdk6400外其他文价夹删除掉。 至此已经把没用到或者不想见到它的文件夹跟文件删除掉了。爽吧。 二: 1:在顶层的目录下找到Makefile文件,并且打开,因为vi或者vim没用习惯而是改用gedit。lwf@lwf-desktop:/home/u-boot-2010.12$ sudo gedit Makefile 在这个Makefile你会找到: ######################################################################### ## ARM1176 Systems ######################################################################### smdk6400_noUSB_config \ smdk6400_config : unconfig @mkdir -p $(obj)include $(obj)board/samsung/smdk6400 @mkdir -p $(obj)nand_spl/board/samsung/smdk6400

韦东山u-boot移植笔记

一:准备移植 1、从下面的官网下载最新的U-boot。用google英文版搜索最新的u-boot源码 ftp://ftp.denx.de/pub/u-boot/ 2、建立sourceinsight工程 a、解压并在E:\colin weidongshan\transplant_u-boot-2012.04.01\u-boot-2012.04.01建立SI b、添加文件到SI工程 1、点击"Add All",选中“Include top level sub-directories”和“Recursively add lower sub-directories”点击“OK” 2、选中“Board”目录,点击“Remove Tree”,去掉总个目录 进入“Board\Samsung\Smdk2410\”,点击"Add All" 3、选中“Arch”目录,点击“Remove Tree”,去掉总个目录 进入“Arch\Arm\Cpu\Arm920t\”,双击选中“Cpu.c”“Interrupts.c”“start.S”。 进入“Arch\Arm\Cpu\Arm920t\S3c24x0\”,点击"Add All" 进入“Arch\Arm\”,选中"Dts"目录,点击"Add Tree" 进入“Arch\Arm\Include\Asm\Arch_s3c24x0”,点击"Add All" 进入“Arch\Arm\Include\Asm\”,点击"Add All",去掉“Include top level sub-directories”和“Recursively add lower sub-directories”前面的勾,表示只加顶层目录的文件 进入“Arch\Arm\Include\Asm\”,单击选中"Proc-armv",点击"Add Tree" 进入“Arch\Arm\Lib\”,点击"Add All" 4、选中“Include”目录,点击“Remove Tree”,去掉总个目录 进入“Include\”,点击"Add All",去掉“Include top level sub-directories”和“Recursively add lower sub-directories”前面的勾,表示只加顶层目录的文件 进入“Include\”,单击选中"Andestech",点击"Add Tree" 进入“Include\”,单击选中"Asm-generic",点击"Add Tree" 进入“Include\”,同上选中除"Configs"目录外的所有目录,点击"Add Tree"。"Configs"目录先不加,下面再议 进入“Include\Configs\”,双击选中“Smdk2410.h” 5、同步文件,完成 3、编译 尝试编译 解压:book@book-desktop:/work/system$ tar xjf u-boot-2012.04.01.tar.bz2 book@book-desktop:/work/system$ cd u-boot-2012.04.01/ 配置:book@book-desktop:/work/system/u-boot-2012.04.01$ make smdk2410_config 编译:book@book-desktop:/work/system/u-boot-2012.04.01$ make

UBOOT分析移植

ARM 平台下的U-boot 移植 u-boot 移植 嵌入式BootLoader 的引导过程 图 1-1给出了嵌入式系统中的一般的引导过程,一般来说,引导程序都是保存在非易失的存储介质(如Flash 等)中,因为引导程序运行的时候需要对数据进行读写操作,所以引导程序的RW 段必须放到RAM 中,所以一般的引导程序初始化的第一件事情就是要在初始化完内存控制器后将其RW 段拷贝到RAM 中,同时开辟一段内存用于其ZI 段。如果引导过程是放置在不可原位执行的存储介质,如NAND Flash 上的时候,引导程序还必须将其自身也拷贝到RAM 中。 一般来说大概的步骤可以分为两个步骤: Stage1 ? 硬件设备初始化(内存控制器的设置); ? 为加载BootLoader 的stage2部分的代码准备RAM 空间; ? 拷贝BootLoader 的stage2部分的代码到RAM 空间中,并跳转执行; ? 设置好堆栈,Heap 等; ? 跳转到 stage2 的 C 入口点; Stage2 ? 初始化本阶段要使用到的硬件设备(net ,flash 等); ? 将OS 映像从 flash 上读到 RAM 空间中; ? 为OS 设置启动参数; ? 跳转到OS 内核image 的入口点。 图1-1 嵌入式系统引导

u-boot简介 U-Boot是由开源项目PPCBoot发展起来的,ARMboot并入了PPCBoot,和其他一些arch 的Loader合称U-Boot。2002年12月17日第一个版本U-Boot-0.2.0发布,同时PPCBoot 和ARMboot停止维护。 U-Boot支持的处理器构架包括PowerPC(MPC5xx, MPC8xx, MPC82xx, MPC7xx,MPC74xx, 4xx), ARM(ARM7,ARM9,StrongARM,Xscale),MIPS (4Kc,5Kc),x86等等,U-Boot (Universal Bootloader)是在GPL下资源代码最完整的一个通用Boot Loader。 U-Boot提供两种操作模式:启动加载(Boot loading)模式和下载(Downloading)模式,并具有大型Boot Loader的全部功能。主要特性为: ●SCC/FEC以太网支持 ●BOOTP/TFTP引导 ●IP,MAC预置功能 ●在线读写FLASH,DOC, IDE,IIC,EEROM,RTC ●支持串行口kermit,S-record下载代码 ●识别二进制、ELF32、pImage格式的Image,对Linux引导有特别的支持 ●监控(minitor)命令集:读写I/O,内存,寄存器、内存、外设测试功能等 ●脚本语言支持(类似BASH脚本) ●支持WatchDog,LCD logo,状态指示功能等 U-Boot的功能是如此之强大,涵盖了绝大部分处理器构架,提供大量外设驱动,支持多个文件系统,附带调试、脚本、引导等工具,特别支持Linux,为板级移植做了大量的工作。U-Boot的完整功能性和后续不断的支持,使系统的升级维护变得十分方便。 u-boot的目录树结构 1.1.1 Borad目录 包括大量的Board dependent files的代码文件,每一个开发板都以一个子目录出现在当前目录中,每个board目录下至少包括这样几个文件 1.config.mk:其中至少包括TEXT_BASE这个一个Makefile的变量,这个变量指出了被编译的可执行uboot image应该放在RAM中的位置,也就是该image的执行位置;2.flash.c:这里主要还是对NorFlash的操作,flash的基本操作; 3.lowlevel_init.S:提供lowlevel_init函数供u-boot在第一阶段调用,一般是针对SDRAM 控制器的初始化,如设置SDRAM的刷新率,等待时钟等,一般来说,如果需要将第二阶段代码和数据拷贝到SDRAM中,这个操作是必须的; 4.Makefile:编译board目录下的代码所使用的makefile; 5.board.c:和板级相关的初始化函数,如设置GPIO,设置时钟,设置总线时序等;6.u-boot.lds:针对开发板的情况编写的连接脚本,通过连接脚本,一般应该将u-boot的stage1的代码放在image的开始的地方; 1.1.2Common目录 该目录下实现uboot支持的命令和公用函数,每一条命令都对应一个文件。例如bootm 命令对应就是cmd_bootm.c。

最新Uboot移植步骤 5:NorFlash

最新Uboot移植步骤5:NorFlash 显示Flash:***failed***,说明norflash未识别,我们搜索“Flash:” 进入第一个查看 找到这个判断条件,如果flash_size>0则输出flash大小,否则输出 *** failed *** ### ERROR ### Please RESET the board ###

其中hang函数导致程序无法继续向下执行,我们只实现了nand启动肯定在这会卡住,所以我们不用这个hang 函数,直接输出flash未识别的信息就好了,改动如下: 现在来找norflash未识别的原因,进入flash_init函数 看见这样一段代码 可知,有2个函数可以检测flash的大小如果flash_detect_legacy函数不行再使用flash_get_size函数,先进入flash_detect_legacy函数看下,其结构如下: 该函数有2个,使用哪一个由宏CONFIG_FLASH_CFI_LEGACY决定,搜索该宏:

很明显,前面我们都是使用该函数进行大小检测的,而该函数无法识别flash,那我们使用新方法进行检测,进入新方法查看: 发现有很多可用调试信息,我们看看如何起用这些调试信息: 发现只要定义了_DEBUG即可启用调试信息,我们定义该宏: 在文件开始发现注释: 我们直接定义DEBUG即可,

配置,编译,下载到板子norflash: 重新上电从norflash启动,输出如下: 我们查看JEDEC PROBE:从哪来

查看norflash手册,看读取的设备ID是否正确 可以看到输出的厂家设备ID是正确的, 说明下面这个函数读取正确 那就是 函数出现错误,我们进入该函数查看:

jz2440-uboot移植

第一部分,移植uboot2015支持JZ2440串口 前言 本人入手JZ2440半个月,以前未接触过linux,但在校接触过许多不跑linux系统的CPU,具有LPC1114,LPC1343,STM32,blackfin等处理器的编程经验,对微处理器的原理以及运行方式具有一定的了解。靠着这点小经验,以及新学习的知识,自己动手移植了最新的uboot,绝对原创,得益于韦老师的书籍以及开发板,能让我们这个小白可以踏进linux的世界,但本人毕竟在linux方面只是个类似小白的学生,许多不对之处,希望大家不吝指教! 说明:阅读本文需要一点的ARM以及S3C2440的基础知识,建议先阅读《嵌入式Linux 应用开发完全手册》,此书对对ARM以及JZ2440有很好的介绍和说明,在阅读中有不懂的也可以再去翻看此书,查漏补缺。 JZ2440移植最新u-boot-2015.04-rc4.tar 1,配置uboot 去官网下载最新uboot源代码u-boot-2015.04-rc4.tar,开发环境采用JZ2440光盘上的vmware虚拟机ubuntu9.10。 本次采用smdk2410的默认配置来配置uboot,然后启动类似linux一样的menuconfig菜单进行配置,然后make,并烧写进JZ2440看效果,然后根据现象一步步修改。 我们移植uboot的基本原则是:因为我们刚上手,可能什么都不知道,更加不知需要更改什么,这个时候我们就先尽量什么都不改,直接烧写进去看现象,然后根据现象或者提示信息一步步更改,从而移植完成。 配置命令如下: book@book-desktop:~/uboot/u-boot-2015.04-rc4$ tar jxvf u-boot-2015.04-rc4.tar.bz2 book@book-desktop:~/uboot/u-boot-2015.04-rc4$ cd u-boot-2015.04-rc4/ book@book-desktop:~/uboot/u-boot-2015.04-rc4$ make smdk2410_defconfig book@book-desktop:~/uboot/u-boot-2015.04-rc4$ make menuconfig 3,在uboot根目录执行 book@book-desktop:~/uboot/u-boot-2015.04-rc4$ make 报错: cc1: error: bad value (armv4) for -march= switch cc1: error: bad value (armv4) for -mtune= switch make[2]: *** [include/autoconf.mk] Error 1 make[1]: *** [silentoldconfig] Error 1 make: *** No rule to make target `include/config/auto.conf', needed by `include/config/ubo ot.release'. Stop. 错误并不可怕,学会看错误提示,根据提示进行下一步工作。错误提示意思好像是说机器平台不对,那么我们就来指定,打开顶层Makefile,指定交叉编译器和架构平台: book@book-desktop:~/uboot/u-boot-2015.04-rc4$ vim Makefile

黄刚--uboot在mini2440上的移植

u-boot-2009.08在2440上的移植详解(黄刚) u-boot-2009.08在2440上的移植详解(一) 嵌入式Linux之我行,主要讲述和总结了本人在学习嵌入式linux中的每个步骤。一为总结经验,二希望能给想入门嵌入式Linux的朋友提供方便。如有错误之处,谢请指正。 共享资源,欢迎转载: 一、移植环境 主机:VMWare--Fedora 9 开发板:Mini2440--64MB Nand, 编译器: u-boot: 二、移植步骤 本次移植的功能特点包括: 支持Nand Flash读写 支持从Nor/Nand Flash启动 支持CS8900或者DM9000网卡 支持Yaffs文件系统 支持USB下载(还未实现) 1. 了解u-boot主要的目录结构和启动流程,如下图。

u-boot的stage1代码通常放在cpu/xxxx/start.S文件中,他用汇编语言写成; u-boot的stage2代码通常放在lib_xxxx/board.c文件中,他用C语言写成。 各个部分的流程图如下:

2. 建立自己的开发板项目并测试编译。 目前u-boot对很多CPU直接支持,可以查看board目录的一些子目录,如:board/samsung/目录下就是对三星一些ARM处理器的支持,有smdk2400、smdk2410和smdk6400,但没有2440,所以我们就在这里建立自己的开发板项目。 1)因2440和2410的资源差不多,主频和外设有点差别,所以我们就在board/samsung/下建立自己开发板的项目,取名叫my2440 #tar -jxvf u-boot-2009.08.tar.bz2 //解压源码

S3C2440移植uboot过程全解+移植记录

一、Uboot移植前的准备 1、修改makefile、配置文件 在配置文件之前,需要修改makeflie相关内容:修改如下: (1)修改编译器,这里我们的makefile已经设置为arm-linux-无需再修改,如下所示: ifeq ($(ARCH),arm) CROSS_COMPILE = arm-linux- Endif (2)添加fl2440的配置项,如下所示: fl2440_config:unconfig @$(MKCONFIG) $(@:_config=) arm arm920t fl2440 step s3c24x0 注意:在添加的fl2440_config的第二行,必须以Table开头,不能有任何多余的符号,否则极易导致编译错误。 Uboot支持多种处理器和平台,在编译uboot之前需要对其进行配置,使其支持我们自己的开发平台。在执行编译make之前,需要进行配置即make fl2440_config。通过查看顶层目录的makeflie文件,通过以下语句:MKCONFIG := $(SRCTREE)/mkconfig得出实际执行的命令为: ./mkconfig fl2440 arm arm920t fl2440 step s3c24x0 执行完这句后,产生如下结果: (1)开发板名称为fl2440; (2)将include中的头文件连接到同平台相关的头文件中,这里的连接为: asm->asm-arm arch->arch-s3c24x0 proc->proc-armv (3)创建顶层Makefile包含的文件inclued/config.mk,该文件内容如下 ARCH = arm CPU = arm920t BOARD = fl2440 VENDOR = step

uboot-1.1.4DM9000移植过程(成功)

作者:lgj 时间:2010年5月9日 实验内容:把移植到mini2440的uboot-1.1.4的网卡驱动由CS8900改为DM9000 Uboot原来就有DM9000的驱动代码,只要把头文件定义为选择DM9000,修改初始化函数就行了。 步骤: 1.DM9000的片选是nCS4,所以它接到SDRAM的Blank4。之前看了网上一些资料,说要修改board/utu2440/lowlevel_init.S文件,其实不用修改保持原来那样就行了。 #define B1_BWSCON (DW32) #define B2_BWSCON (DW16) #define B3_BWSCON (DW16 + WAIT + UBLB) #define B4_BWSCON (DW16) #define B5_BWSCON (DW16) #define B6_BWSCON (DW32) #define B7_BWSCON (DW32) #define REFCNT 1113 2.修改/include/configs/xx2440.h文件,这里定义了使用哪个网卡 /* * Hardware drivers屏蔽CS8900 */ #if 0 #define CONFIG_DRIVER_CS8900 1 /* we have a CS8900 on-board */ #define CS8900_BASE 0x19000300 #define CS8900_BUS16 1 /* the Linux driver does accesses as shorts */ #endif 定义DM9000 #define CONFIG_DRIVER_DM9000 1 #define CONFIG_DM9000_BASE 0x20000000 #define DM9000_IO CONFIG_DM9000_BASE #define DM9000_DATA (CONFIG_DM9000_BASE+4) #define CONFIG_DM9000_USE_16BIT 网上很多资料说要改成0x20000300但是我的板是0x20000000 3.修改dm9000x.c

uboot移植整理

1.Make 编译uboot出错: …… …… board.c:138: error: inline function 'coloured_LED_init' cannot be declared weak board.c:140: error: inline function 'red_LED_on' cannot be declared weak board.c:142: error: inline function 'red_LED_off' cannot be declared weak board.c:144: error: inline function 'green_LED_on' cannot be declared weak board.c:146: error: inline function 'green_LED_off' cannot be declared weak board.c:148: error: inline function 'yellow_LED_on' cannot be declared weak board.c:150: error: inline function 'yellow_LED_off' cannot be declared weak make[1]: *** [board.o] 错误1 make[1]:正在离开目录`/opt/u-boot-1.3.4/lib_arm' make: *** [lib_arm/libarm.a] 错误2 开始编译的时候会出现上面的错误,继续移植操作这个错误将消失。或者注释掉出错行。 ****挂载文件系统时候的错误:************ …… …… TCP cubic registered NET: Registered protocol family 17 drivers/rtc/hctosys.c: unable to open rtc device (rtc0) VFS: Unable to mount root fs via NFS, trying floppy. VFS: Cannot open root device "nfs" or unknown-block(2,0) Please append a correct "root=" boot option; here are the available partitions: 1f00 16 mtdblock0 (driver?) 1f01 2048 mtdblock1 (driver?) 1f02 4096 mtdblock2 (driver?) 1f03 2048 mtdblock3 (driver?) 1f04 4096 mtdblock4 (driver?) 1f05 10240 mtdblock5 (driver?) 1f06 24576 mtdblock6 (driver?) 1f07 16384 mtdblock7 (driver?) Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(2,0) [] (unwind_backtrace+0x0/0xf0) from [] (panic+0x54/0x17c) 解决方法:保证传入的命令行参数正确无误,保证NFS配置成功,rootfs正确,可以重启机器试试。 错误:error: common/libcommon.a(main.o) uses FPA instructions, whereas u-boot does not /opt/opt/FriendlyARM/toolschain/4.4.3/bin/.arm-none-linux-gnueabi-ld: failed to merge target specific data of file common/libcommon.a(main.o)

相关文档
最新文档