OK6410 uboot移植之sd启动

1  uboot移植

1.1移植准备工作

1.1.1安装交叉编译工具链

版本:arm-linux-gcc 4.4.1

环境:ubuntu14.04.01LTS

1.1.2建立OK6410配置项

从官网下载u-boot-2012.10.tar.bz2,由于uboot支持的smdk6400单板与我们的板子OK6410最相似,所以修改是基于smdk6400进行的,初步修改uboot建立OK6410配置项。

详细修改过程如下:

进入u-boot-2012.10顶层目录,在board/Samsung目录下,新建一个ok6410文件夹,把smdk6400下的所有文件拷贝到ok6410下面。将smdk6400.c改为ok6410.c,将smdk6400_nand_spl.c改为ok6410_nand_spl.c。修改ok6410文件夹下的Makefile:将COBJS-y := smdk6400.o改为COBJS-y := ok6410.o。

在nand_spl/board/samsung下,新建一个ok6410文件夹,把smdk6400下的所有文件拷贝到ok6410下面。修改ok6410文件夹下的Makefile:COBJS   = nand_boot.o nand_ecc.o s3c64xx.osmdk6400_nand_spl.o nand_base.o改为COBJS  = nand_boot.o nand_ecc.o s3c64xx.o ok6410_nand_spl.o nand_base.o;@ln -s$(TOPDIR)/board/samsung/smdk6400/lowlevel_init.S
[email protected]改为@ln -s $(TOPDIR)/board/samsung/ok6410/[email protected];$(obj)smdk6400_nand_spl.c:

@rm -f [email protected]

@ln -s$(TOPDIR)/board/samsung/smdk6400/smdk6400_nand_spl.c [email protected]改为$(obj)ok6410_nand_spl.c:

@rm -f [email protected]

@ln -s$(TOPDIR)/board/samsung/ok6410/ok6410_nand_spl.c [email protected]

在include/configs文件夹下,修改板子配置文件。将smdk6400.h拷贝一份为ok6410.h。修改ok6410.h将CONFIG_S3C6400改为CONFIG_S3C6410,CONFIG_SMDK6400改为CONFIG_OK6400。

在arch/arm/include/asm/arch-s3c64xx文件夹下,将s3c6400.h拷贝一份为s3c6410.h并修改#ifndef __S3C6400_H__为#ifndef __S3C6410_H__;修改

#define __S3C6400_H__为#define __S3C6410_H__。

进入arch/arm/cpu/arm1176/s3c64xx,打开Makefile,将CONFIG_S3C6400修改为CONFIG_S3C6410。

进入board/samsung/ok6410,打开ok6410.c和lowlevel_init.S;

进入arch/arm/cpu/arm1176/s3c64xx,打开cpu_init.S、reset.S、speed.c和timer.c;

进入/drivers/mtd/nand,打开s3c64xx.c;

进入/drivers/serial,打开s3c64xx.c;

进入/drivers/usb/host,打开s3c64xx-hcd;

将上面文件中的#include <asm/arch/s3c6400.h>改为#include <asm/arch/s3c6410.h>

修改uboot顶层的Makefile,修改编译工具:将CROSS_COMPILE ?改为CROSS_COMPILE ?= arm-linux-

在下面代码处添加#########################################################################

## ARM1176 Systems

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

smdk6400_noUSB_config   \

smdk6400_config :       unconfig

@mkdir -p $(obj)include$(obj)board/samsung/smdk6400

@mkdir -p$(obj)nand_spl/board/samsung/smdk6400

@echo "#defineCONFIG_NAND_U_BOOT" > $(obj)include/config.h

@echo"CONFIG_NAND_U_BOOT = y" >> $(obj)include/config.mk

@if [ -z"$(findstring smdk6400_noUSB_config,[email protected])" ]; then                       \

echo"RAM_TEXT = 0x57e00000" >>$(obj)board/samsung/smdk6400/config.tmp;\

else                                                                            \

echo"RAM_TEXT = 0xc7e00000" >>$(obj)board/samsung/smdk6400/config.tmp;\

fi

@$(MKCONFIG) smdk6400 armarm1176 smdk6400 samsung s3c64xx

@echo"CONFIG_NAND_U_BOOT = y" >> $(obj)include/config.mk

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

ok6410配置项:

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

## ARM1176 Systems

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

ok6410_noUSB_config     \

ok6410_config   :       unconfig

@mkdir -p $(obj)include$(obj)board/samsung/ok6410

@mkdir -p$(obj)nand_spl/board/samsung/ok6410

@echo "#defineCONFIG_NAND_U_BOOT" > $(obj)include/config.h

@echo"CONFIG_NAND_U_BOOT = y" >> $(obj)include/config.mk

@if [ -z"$(findstring ok6410_noUSB_config,[email protected])" ]; then                 \

echo"RAM_TEXT = 0x57e00000" >>$(obj)board/samsung/ok6410/config.tmp;\

else                                                                            \

echo"RAM_TEXT = 0xc7e00000" >>$(obj)board/samsung/ok6410/config.tmp;\

fi

@$(MKCONFIG) ok6410 armarm1176 ok6410 samsung s3c64xx

@echo "CONFIG_NAND_U_BOOT= y" >> $(obj)include/config.mk

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

此时,如果没操作错误的话,执行make ok6410_config就可以建立ok6410的配置了。执行成功信息如下:

warning: Please migrate to boards.cfg. Failure to do so will

mean removal of yourboard in the next release.

Configuring for ok6410 board...

执行make也编译成功。

1.2硬件初始化

从start.S文件开始一路跟踪,修改代码。

1.2.1 led配置和时钟修改

ok6410led接到GPM端口,修改board/samsung/ok6410/lowlevel.S

/* LED on only #8 */

ldr     r0, =ELFIN_GPIO_BASE

ldr     r1, =0x55540000

str     r1, [r0, #GPNCON_OFFSET]

ldr     r1, =0x55555555

str     r1, [r0, #GPNPUD_OFFSET]

ldr     r1, =0xf000

str     r1, [r0, #GPNDAT_OFFSET]

修改为:

/* LED on only #8 */

ldr    r0, =ELFIN_GPIO_BASE

ldr     r1, =0x1111

str     r1, [r0, #GPMCON_OFFSET]

ldr     r1, =0x555

str     r1, [r0, #GPMPUD_OFFSET]

ldr     r1, =0x3

str     r1, [r0, #GPMDAT_OFFSET]

时钟初始化部分smdk6400和ok6410还是有区别的:

/* FOUT of EPLL is 96MHz*/

ldr     r1, =0x200203

str     r1, [r0, #EPLL_CON0_OFFSET]

ldr     r1, =0x0

str     r1, [r0, #EPLL_CON1_OFFSET]

修改为:

/* FOUT of EPLL is 96MHz*/

ldr     r1, =0x80200203

str     r1, [r0, #EPLL_CON0_OFFSET]

ldr     r1, =0x0

str     r1, [r0, #EPLL_CON1_OFFSET]

将#ifndef CONFIG_S3C6400改为#ifndef CONFIG_S3C6410

修改 mmu_table:(ok6410 SDRAM为256M)

/* 128MB for SDRAM0xC0000000 -> 0x50000000 */

.set __base, 0x500

.rept 0xC80 - 0xC00

FL_SECTION_ENTRY __base,3, 0, 1, 1

.set __base, __base + 1

.endr

/* access is not allowed.*/

.rept 0x1000 - 0xc80

.word 0x00000000

.endr

修改为:

/* 256MB for SDRAM0xD0000000 -> 0x50000000 */

.set __base, 0x500

.rept 0xD00 - 0xC00

FL_SECTION_ENTRY __base,3, 0, 1, 1

.set __base, __base + 1

.endr

/* access is not allowed.*/

.rept 0x1000 - 0xD00

.word 0x00000000

.endr

修改板子配置文件include/configs/ok6410.h

修改板子机器id为1626(与内核里的机器id一致):

/*

* Architecture magic and machinetype

*/

#define CONFIG_MACH_TYPE               1270

改为#define CONFIG_MACH_TYPE                1626

#define CONFIG_SYS_PROMPT              "SMDK6400 # "修改为#define CONFIG_SYS_PROMPT               "lavender # "

因为PCLK=50MHz所以将#define CONFIG_SYS_HZ                   1000修改为

#define CONFIG_SYS_HZ                  1562500

修改内存大小:

#define PHYS_SDRAM_1_SIZE       0x08000000      /* 128 MB in Bank #1    */

改为

#define PHYS_SDRAM_1_SIZE       0x10000000      /* 256 MB in Bank #1    */

修改CONFIG_IDENT_STRING 为#define CONFIG_IDENT_STRING     " for lavender"

修改CONFIG_ENV_OFFSET 为#define CONFIG_ENV_OFFSET    0x0080000

将如下代码:

#define CONFIG_SYS_NAND_U_BOOT_OFFS    (4 * 1024)      /* Offset to RAMU-Boot image */

#define CONFIG_SYS_NAND_U_BOOT_SIZE    (252 * 1024)    /* Size of RAMU-Boot image   */

修改为:

#define CONFIG_SYS_NAND_U_BOOT_OFFS    (16 * 1024)     /* Offset to RAMU-Boot image */

#define CONFIG_SYS_NAND_U_BOOT_SIZE    (496 * 1024)    /* Size of RAMU-Boot image   *

接下来根据K9F2G08U0A手册,修改Nandflash配置:

将/* NAND chip page size          */

#define CONFIG_SYS_NAND_PAGE_SIZE      2048

/* NAND chip block size         */

#define CONFIG_SYS_NAND_BLOCK_SIZE     (128 * 1024)

/* NAND chip page per block count */

#define CONFIG_SYS_NAND_PAGE_COUNT     64

/* Location of the bad-block label */

#define CONFIG_SYS_NAND_BAD_BLOCK_POS  0

/* Extra address cycle for > 128MiB */

#define CONFIG_SYS_NAND_5_ADDR_CYCLE

修改为:

/* NAND chip page size          */

#define CONFIG_SYS_NAND_PAGE_SIZE      4096

/* NAND chip block size         */

#define CONFIG_SYS_NAND_BLOCK_SIZE     (512 * 1024)

/* NAND chip page per block count */

#define CONFIG_SYS_NAND_PAGE_COUNT     128

/* Location of the bad-block label */

#define CONFIG_SYS_NAND_BAD_BLOCK_POS  0

/* Extra address cycle for > 128MiB */

#define CONFIG_SYS_NAND_5_ADDR_CYCLE

1.3使uboot支持SD启动

根据三星s3c6410IROM启动手册,在arch/arm/cpu/arm1176/s3c64xx/目录下新建mmcboot.c文件。文件内容见相关附件。

1.3.1修改配置文件ok6410.h添加CONFIG_BOOT_SD宏,支持SD卡启动

/* Boot configuration (define only one of next 3) */

#define CONFIG_BOOT_SD  /* supportsd boot */

#define CONFIG_BOOT_NAND

1.3.2修改Makefile(arch/arm/cpu/arm1176/s3c64xx),增加mmcboot.c的编译。

COBJS-$(CONFIG_S3C6410) += cpu_init.o speed.o

COBJS-$(CONFIG_BOOT_SD) += mmcboot.o

COBJS-y += timer.o

1.3.3在start.S中调用sd启动函数

/* Set stackpointer in internal RAM to call board_init_f */

#if defined(CONFIG_BOOT_SD) && !defined(CONFIG_NAND_SPL)

call_board_init_f:

ldr     sp, =(CONFIG_SYS_INIT_SP_ADDR)

bl      BootCopyMMCtoMem

bic     sp, sp, #7 /* 8-byte alignment for ABIcompliance */

ldr     r0,=0x00000000

ldr     pc, =board_init_f

#else

bic     sp, sp, #7

ldr     r0,=0x0

bl      board_init_f

#endif

1.3.4修改链接脚本(board/samsung/ok6410/u-boot-nand.lds),确保添加的sd启动函数位于uboot的前8k。

.text      :

{

arch/arm/cpu/arm1176/start.o (.text)

board/samsung/ok6410/libok6410.o(.text)

*(.text)

}

编译烧写:可以用在linux用dd命令烧写,也可以用我从网上下载的烧写工具SD_Writer。

结果如下:

Flash错误,ok6410没有Flash存储器直接定位代码,去掉这部分即可。

在arch/arm/lib/board.c文件下找到:

puts(failed);

hang();

修改为:

puts("noFlash devices!\n");

//hang();

重新编译烧写:

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-09 15:10:27

OK6410 uboot移植之sd启动的相关文章

X-009 FriendlyARM tiny4412 uboot移植之SD Card用起来Kernel boot起来

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<  开发环境:

嵌入式linux开发uboot移植(三)——uboot启动过程源码分析

嵌入式linux开发uboot移植(三)--uboot启动过程源码分析 一.uboot启动流程简介 与大多数BootLoader一样,uboot的启动过程分为BL1和BL2两个阶段.BL1阶段通常是开发板的配置等设备初始化代码,需要依赖依赖于SoC体系结构,通常用汇编语言来实现:BL2阶段主要是对外部设备如网卡.Flash等的初始化以及uboot命令集等的自身实现,通常用C语言来实现. 1.BL1阶段 uboot的BL1阶段代码通常放在start.s文件中,用汇编语言实现,其主要代码功能如下:

嵌入式linux开发uboot移植(四)——uboot启动内核的机制

嵌入式linux开发uboot移植(四)--uboot启动内核的机制 一.嵌入式系统的分区 嵌入式系统部署在Flash设备上时,对于不同SoC和Flash设备,bootloader.kernel.rootfs的分区是不同的.三星S5PV210规定启动设备的分区方案如下: SD/MMC设备的分区方案: NandFlash设备的分区方案: 嵌入式系统在启动时,uboot.kernel.rootfs不能随意存放,必须存放在规划好的相应分区,在启动过程中uboot.kernel会到相应分区加载相应内容,

u-boot移植随笔(7):u-boot启动流程简图【转】

转自:http://www.latelee.org/porting-uboot/u-boot-porting-bootstrap.html u-boot移植随笔:u-boot启动流程简图 画上面这张图也花了点时间.虽然很简洁,但对于理解u-boot,从一个较高角度府视u-boot,很有帮助.——其实网上有很多分析教程.资料,相信大多都是大同小异的.因此,山人无谓再写一次了. (小技巧: 如何将上面的图占为已有? 木草山人心地善良,好心地将图片的背景做成白色的,最简单的方法是使用windows系统

u-boot移植启动流程详细分析(2)

学习底层的东西,首要的就是去了解他的架构,整体的思路知道了,就会在出现问题的时候有很清晰的思路,知道哪里出的问题,以及程序是如何执行的,相信做到上面的,所遇到的问题,大都会迎刃而解了吧,高手是有很多的,所谓的高手,不过也就那样吧,努力努力也是可以赶超的. 之前,介绍了u-boot的第一阶段的启动流程,那么接下来就来说说第二阶段的具体执行流程: (1)初始化gloabl data和board data,这里所谓的初始化就是给他们分配一块内存空间. (2)初始化序列(init_sequence) 在

I.MX6Q(TQIMX6Q/TQE9)学习笔记——新版BSP之u-boot移植

前段时间就开始学习I.MX6Q了,但是最近工作实在是忙,间断了一些时间了.为了提高移植效率,还是考虑移植Freescale维护的3.10版本的内核. 源码获取 Freescale维护的3.10的内核是使用git管理的,但是直接使用git下载代码会比较慢,下面是我下载好的uboot和kernel: I.MX6Q BSP源码(Freescale官方维护) 代码下载好后,先将u-boot解压到工作目录,然后在终端下切换到uboot根目录.由于这个版本的bsp是使用git管理的,因此,需要切换到指定分支

uboot移植——uboot源码目录分析

uboot移植(一)--uboot源码目录分析 本文分析的uboot是九鼎官方提供的,是对应s5pv210开发板x210bv3的uboot 一:uboot的概念及移植的原理. uboot就是在内核运行前的一段小程序,用来初始化硬件设备,建立内存空间映射图.从而将系统的软硬件带到合适的状态,主要功能就是为了启动内核,它将内核从flash中拷贝到ddr中,然后跳转到内核入口中,交由内核控制权,uboot严重依赖硬件,因此一个通用的uboot不太可能. 移植原理:uboot中有很多平行代码,各自属于各

I.MX6Q(TQIMX6Q/TQE9)学习笔记——U-Boot移植

其实Freescale的BSP移植文档已经将u-boot的移植步骤讲述的非常详细了,但为了以后方便查阅,还是按照自己的理解记录在这里. 获取源码 根据前一篇文章搭建好LTIB环境后就可以非常方便的导出u-boot源码了.切换到ltib目录,并运行如下指令: [cpp] view plaincopy ./ltib -m prep -p u-boot 该指令执行需要一些时间,指令执行完成后Freescale维护的u-boot-2009.8就会出现在rpm/BUILD目录下. 添加单板 为TQIMX6

uboot移植之九鼎提供的uboot的文件夹分析

文件夹分析 (1)api:提供了uboot在执行时用到的一些函数,这些函数都是硬件无关的,所以和我们的移植没多大关系 (2)api_examples:api的示例代码 (3)board:开发板相关的文件夹,这个文件夹里面存放的一个文件夹对应一款开发板或者是一个芯片厂商.我们在config配置的时候就是根据这个文件夹下面的子文件夹来选择开发板信息.需要注意一点,由于历史原因,一开始开发板种类比较少,所以board存放的子文件夹就是对应的开发板,但是随着电子信息的发展,开发板越来越多,所以就在ubo