哈尔滨理工大学软件工程专业08-7李万鹏原创作品,转载请标明出处
http://blog.csdn.net/woshixingaaa/archive/2011/02/17/6192146.aspx
从nandflash启动最关键的部分是rellocated,即代码重定位。s3c2440数据手册有这么一段,所以代码重定位是由nandflash控制器自动完成的,而不是一些人说的由CPU完成的。
在include/configs/TE2440II.h中添加nandflash控制器的定义:
/*
* NAND flash setting
*/
#if defined(CONFIG_CMD_NAND)
#define CONFIG_SYS_NAND_BASE 0x4e000000
#define CONFIG_SYS_MAX_NAND_DEVICE 1
#define CONFIG_MTD_NAND_VERIFY_WRITE 1
#define NAND_SAMSUNG_LP_OPTIONS 1 //大页要添加这个
#define CONFIG_NAND_S3C2440 1
#define CONFIG_S3C2440_NAND_BOOT 1
#define NAND_CTL_BASE 0x4E000000
#define oNFCONF 0x00
#define oNFCONT 0x04
#define oNFADDR 0x0c
#define oNFDATA 0x10
#define oNFCMD 0x08
#define oNFSTAT 0x20
#define oNFECC 0x2c
#endif
在
/*
* Command line configuration.
*/
下添加
#define CONFIG_CMD_NAND
修改环境变量那部分
//#undef CONFIG_ENV_IS_IN_FLASH 1
#define CONFIG_ENV_IS_IN_NAND 1
其次,修改cpu/arm920t/start.S这个文件,使u-boot从Nand Flash启动
为了让他自动识别是从norflash还是从nandflash启动添加,BWSCON的第2,1为即OM1,OM0。为00时是从nandflash启动,其他为从norflash启动,判断OM1和OM0,就可以让uboot自动识别启动方式。
#define BWSCON 0x48000000
ldr r0, =BWSCON
ldr r1,[r0]
ands r1, r1, #0x6
beq nand_boot
nor_boot:
#ifndef CONFIG_SKIP_RELOCATE_UBOOT
添加nandflash的启动代码,核心是relocated部分。首先设置nandflash控制器,然后将nandflash中从0开始的uboot复制到SDRAM中的TEXT_BASE处,TEXT_BASE在config.mk中定义,值为0x33f80000。复制好后,比较nandflash和SDRAM中的数据,如果前4K相同,表示搬移成功。下面的汇编代码注意ATPC标准规定r0~r3,用于参数传递和返回值。
/********************************************************/
//#define CONFIG_S3C2440_NAND_BOOT 1
nand_boot:
#define CONFIG_S3C2440_NAND_BOOT 1
#define NAND_CTL_BASE 0x4E000000
/* Offset */
#define oNFCONF 0x00
#define oNFCONT 0x04
#define oNFCMD 0x08
#define oNFSTAT 0x20
#define LENGTH_UBOOT 0x40000
@ reset NAND
mov r1, #NAND_CTL_BASE
ldr r2, =( (7<<12)|(7<<8)|(7<<4)|(0<<0) )
str r2, [r1, #oNFCONF]
ldr r2, [r1, #oNFCONF]
ldr r2, =((1<<4)|(0<<1)|(1<<0) ) @ Active low CE Control
str r2, [r1, #oNFCONT]
ldr r2, [r1, #oNFCONT]
ldr r2, =(0x6) @ RnB Clear
str r2, [r1, #oNFSTAT]
ldr r2, [r1, #oNFSTAT]
mov r2, #0xff @ RESET command
strb r2, [r1, #oNFCMD]
mov r3, #0 @ wait
nand1:
add r3, r3, #0x1
cmp r3, #0xa
blt nand1
nand2:
ldr r2, [r1, #oNFSTAT] @ wait ready
tst r2, #0x4
beq nand2
ldr r2, [r1, #oNFCONT]
orr r2, r2, #0x2 @ Flash Memory Chip Disable
str r2, [r1, #oNFCONT]
@ get read to call C functions (for nand_read())
ldr sp, DW_STACK_START @ setup stack pointer
mov fp, #0 @ no previous frame, so fp=0
@ copy U-Boot to RAM
ldr r0, =TEXT_BASE //传递给C代码的第一个参数:u-boot在RAM中的起始地址
mov r1, #0x0 //传递给C代码的第二个参数:Nand Flash的起始地址
mov r2, #LENGTH_UBOOT //传递给C代码的第三个参数:u-boot的长度大小
/**********************************************************/
/************************************************************/
bl nand_read_ll
tst r0, #0x0
beq ok_nand_read
bad_nand_read:
loop2:
b loop2 @ infinite loop
ok_nand_read:
@ verify
mov r0, #0
ldr r1, =TEXT_BASE
mov r2, #0x400 @ 4 bytes * 1024 = 4K-bytes
go_next:
ldr r3, [r0], #4
ldr r4, [r1], #4
teq r3, r4
bne notmatch
subs r2, r2, #4
beq stack_setup
bne go_next
notmatch:
loop3:
b loop3 @ infinite loop
#endif
/* Set up the stack */
stack_setup:
ldr r0, _TEXT_BASE /* upper 128 KiB: relocated uboot */
sub r0, r0, #CONFIG_SYS_MALLOC_LEN /* malloc area */
sub r0, r0, #CONFIG_SYS_GBL_DATA_SIZE /* bdinfo */
#ifdef CONFIG_USE_IRQ
sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
#endif
sub sp, r0, #12 /* leave 3 words for abort-stack */
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
ldr pc, _start_armboot
_start_armboot: .word start_armboot
#define STACK_BASE 0x33ff8000
#define STACK_SIZE 0x10000
.align 2
DW_STACK_START: .word STACK_BASE+STACK_SIZE-4
在board/samsung/TE2440II/目录下添加nand_read.c文件,内容如下,在K9F2G08的datasheet中有这么一段
所以地址由5个周期传完。前两个周期用来寻页内地址。后三个周期是页间寻址。1device=2048block=2048*64page=2048*64*(2k+64)Bytes
#include <config.h>
#include <linux/mtd/nand.h>
#define __REGb(x) (*(volatile unsigned char *)(x))
#define __REGw(x) (*(volatile unsigned short *)(x))
#define __REGi(x) (*(volatile unsigned int *)(x))
#define NF_BASE 0x4e000000
#define NFCONF __REGi(NF_BASE + 0x0)
#define NFCONT __REGi(NF_BASE + 0x4)
#define NFCMD __REGb(NF_BASE + 0x8)
#define NFADDR __REGb(NF_BASE + 0xc)
#define NFDATA __REGb(NF_BASE + 0x10)
#define NFDATA16 __REGw(NF_BASE + 0x10)
#define NFSTAT __REGb(NF_BASE + 0x20)
#define NFSTAT_BUSY (1 << 2)
#define nand_select() (NFCONT &= ~(1 << 1))
#define nand_deselect() (NFCONT |= (1 << 1))
#define nand_clear_RnB() (NFSTAT |= NFSTAT_BUSY)
static inline void nand_wait(void)
{
int i;
while (!(NFSTAT & NFSTAT_BUSY))
for (i=0; i<10; i++);
}
/* configuration for 2440 with 2048byte sized flash */
#define NAND_5_ADDR_CYCLE
#define NAND_PAGE_SIZE 2048
#define BAD_BLOCK_OFFSET NAND_PAGE_SIZE
#define NAND_BLOCK_MASK (NAND_PAGE_SIZE - 1)
#define NAND_BLOCK_SIZE (NAND_PAGE_SIZE * 64)
static int nand_read_page_ll(unsigned char *buf, unsigned long addr)
{
unsigned int i, page_num;
nand_clear_RnB();
NFCMD = NAND_CMD_READ0;
page_num = addr >> 11; /* addr / 2048 */
/* Write Address */
NFADDR = 0;
NFADDR = 0;
NFADDR = page_num & 0xff;
NFADDR = (page_num >> 8) & 0xff;
NFADDR = (page_num >> 16) & 0xff;
NFCMD = NAND_CMD_READSTART;
nand_wait();
fo
分享到:
相关推荐
在本文中,我们将深入探讨如何将u-boot-2012.04.01版本移植到TQ2440开发板上。这个过程对于理解嵌入式系统的引导加载程序(bootloader)以及硬件平台的初始化至关重要。u-boot是一个广泛应用的开源引导加载程序,而...
《深入解析u-boot-2440-nandflash:打造2440开发板的核心启动技术》 在嵌入式系统领域,u-boot是一个至关重要的组成部分,它扮演着引导加载程序的角色,负责初始化硬件,加载操作系统到内存,并进行必要的设备配置...
【标题】"u-boot-tiny6410-sd.tar.gz"是一个针对Samsung S5PV210(Tiny6410)处理器的定制版U-Boot启动加载器,它被设计用来支持从SD卡进行启动。这个压缩包是基于"u-boot-mini6410-20101106.tar.gz"版本进行修改和...
《移植好的u-boot2009.08在mini2440/micro2440平台的应用详解》 u-boot作为嵌入式系统的重要组成部分,是设备启动时执行的第一段代码,它负责加载操作系统内核,进行硬件初始化,以及提供用户交互界面。本文将深入...
### U-Boot 2010.03 在 S3C2410 开发板上的移植与 NAND Flash 启动配置详解 U-Boot(Universal Boot Loader)是一款开源的引导加载程序,广泛应用于嵌入式系统中。本文将详细介绍如何在S3C2410开发板上移植U-Boot ...
在本文中,我们将深入探讨如何将u-boot-2010.06版本移植到Mini2440开发板上,这是一个基于S3C2440处理器的嵌入式平台。移植工作涉及到多个关键组件,包括对不同类型的闪存(如NOR Flash和NAND Flash)的支持以及网络...
本手册详细介绍了如何为基于S3C2440芯片的开发板移植u-boot 2009.11版本, 包括环境搭建、调试方法的选择、移植步骤的具体操作等。通过遵循这些步骤, 初学者可以顺利地完成u-boot的移植, 并掌握相关的嵌入式系统开发...
u-boot移植过程是指将u-boot移植到特定的开发板上,使其能够正确地运行和启动。这个过程需要对u-boot的源码进行修改,以适应特定的硬件平台。 整个移植过程可以分为以下几个步骤: 1. 准备u-boot的源码:首先需要...
标题中的"arm-linux-gnueabihf-gcc-linaro-7.5.0-x86_64.tar.xz.zip"是一个针对ARM架构的Linux交叉编译工具链的压缩包,它由Linaro组织提供。Linaro是一个非营利组织,专注于优化和维护开源软件在ARM处理器上的性能...
第二步:查看当前系统是否支持arm-linux-gcc 如果不存在 则继续如下步骤: 第三步:在/usr/local创建一个文件夹为arm mkdir /usr/local/arm 第四步:将arm-linux-gcc-4.3.2.bz2解压到/usr/local/arm目录下 sudo tar ...
【u-boot 2011.12 移植】涉及的知识点主要集中在嵌入式Linux系统的引导加载器u-boot的移植过程,特别是针对S3C2440处理器的移植。下面将详细介绍这些内容: 1. **配置编译环境**: - 首先,你需要从指定FTP服务器...
u-boot.bin_tekkaman_2009.11.bz2 参考网站:Tekkaman Ninja github.com/tekkamanninja 直接可用于mini2440开发板 当然在这之前首先必须保证你的开发板上已经有了U-boot。如果没有,就请先烧入一个 已经编译好...
《深入解析u-boot-2010.03-tekkaman-master: Friendly-ARM mini2440的开源启动引导程序》 u-boot是嵌入式系统中广泛使用的开源引导加载程序,它为多种硬件平台提供了启动过程的支持。在本案例中,我们关注的是u-...
6. **多平台兼容**:U-Boot支持广泛的处理器架构,如ARM、PowerPC、MIPS、X86等,以及众多嵌入式开发板。 7. **源代码开放**:作为开源项目,U-Boot的源代码可供开发者研究、定制和改进,促进社区的持续发展。 在...
到友善之臂mini2440_himrce_mini2440_U-Boot_dull3lc_”表明这是一个关于将U-Boot 2010.03版本移植到友善之臂( FriendlyARM)Mini2440开发板上的过程。在这个过程中,我们可能会涉及到多个关键知识点,包括U-Boot的...
对于mini2440平台,U-Boot的配置可能还包括对NAND Flash的支持,因为S3C2440处理器通常使用NAND Flash存储操作系统映像。在U-Boot中,会有专门的驱动来处理NAND Flash的读写操作,确保数据传输的正确性。 总的来说...
个人移植并可以正常使用的uboot,适用于飞凌ok335xd开发板,米尔科技c335x开发板,基于u-boot官方u-boot-2018.05源码移植,并有git记录。 配置文件am335x_ok335xd_defconfig am335x_myd_defconfig
移植 u-boot-2009.11 到广嵌 GEC2440 开发板是一项涉及嵌入式系统开发的关键任务,主要目的是使 u-boot 能够适应特定硬件平台,从而实现从不同的存储介质启动以及支持特定外设。在这个过程中,我们需要关注以下几个...