第七章之S5PV210移植到Nandflash

发布者:jingyun最新更新时间:2024-12-20 来源: cnblogs关键字:S5PV210  移植  Nandflash 手机看文章 扫描二维码
随时随地手机看文章

1,之前的操作都是基于SD卡进行运行的,如今在Nandfalsh中运行u-boot.因为s5p_goni.h配置文件没有配置Nand相关文件,所以先配置Nand文件.

在include/configs/s5p_goni.h中添加一个:#define CONFIG_CMD_NAND

2,根据board_init_r函数中nand_init()如下图:

3,进行nand_init();

4,所以配置文件还需要添加#defnie CONFIG_SYS_MAX_NAND_DEVICE  1,及其 nand基地址#define CONFIG_SYS_NAND_BASE  0xB0E00000

 

5,查看common/Makefie如图:先把环境变量设成nand

6,在nand_init()中,发现drives/mtd/nand/没有相关的board_nand_init()函数.根据s3c2410修改成s5pv210nand.c:


/*************************************************************************

> File Name: s5pv210_nand.c

> Author:

> Mail:

> Created Time: Wed 09 Aug 2017 03:34:27 PM CST

************************************************************************/

/* name:Sourcelink

* (C) Copyright 2006 OpenMoko, Inc.


* Author: Harald Welte


*

* SPDX-License-Identifier: GPL-2.0+

*/


#include


#include

#include

#include


#define MP0_1CON (*(volatile unsigned long *)0xE02002E0)

#define MP0_3CON (*(volatile unsigned long *)0xE0200320)

#define MP0_6CON (*(volatile unsigned long *)0xE0200380)


/* Nand Flash Configuration Register */

#define AddrCycle 1 /* 5 address cycle */

#define PageSize 0 /* 2KBytes/Page */

#define MLCFlash 0 /* SLC NAND Flash */

#define TWRPH1 1 /* (0+1) * 7.5 > 5ns (tCLH/tALH) */

#define TWRPH0 2 /* (1+1) * 7.5ns > 12ns (tWP) */

#define TACLS 1 /* 7.5ns * 2 > 12ns tALS tCLS */


/* Control Register */

#define MODE 1 /* ENABLE NAND Flash Controller */

#define Reg_nCE0 1 /* Disable chip select */


/* modied by Sourcelink */

static void s5pv210_hwcontrol(struct mtd_info *mtd, int cmd, unsigned int ctrl)

{

struct nand_chip *chip = mtd->priv;

struct s5pv210_nand *nand = (struct s5pv210_nand *)s5pv210_get_base_nand();

debug('hwcontrol(): 0x%02x 0x%02xn', cmd, ctrl);

ulong IO_ADDR_W = (ulong)nand;

if (ctrl & NAND_CTRL_CHANGE) {


if (ctrl & NAND_CLE)

IO_ADDR_W = IO_ADDR_W | 0x8; /* Command Register */

else if (ctrl & NAND_ALE)

IO_ADDR_W = IO_ADDR_W | 0xC; /* Address Register */


chip->IO_ADDR_W = (void *)IO_ADDR_W;


if (ctrl & NAND_NCE) /* select */

writel(readl(&nand->nfcont) & ~(1 << 1), &nand->nfcont);

else /* deselect */

writel(readl(&nand->nfcont) | (1 << 1), &nand->nfcont);

}


if (cmd != NAND_CMD_NONE)

writeb(cmd, chip->IO_ADDR_W);

else

chip->IO_ADDR_W = &nand->nfdata;


}


static int s5pv210_dev_ready(struct mtd_info *mtd)

{

struct s5pv210_nand *nand = (struct s5pv210_nand *)s5pv210_get_base_nand();

debug('dev_readyn');

return readl(&nand->nfstat) & 0x01;

}


#ifdef CONFIG_S3C2410_NAND_HWECC

void s5pv210_nand_enable_hwecc(struct mtd_info *mtd, int mode)

{

struct s5pv210_nand *nand = (struct s5pv210_nand *)s5pv210_get_base_nand();

debug('s5pv210_nand_enable_hwecc(%p, %d)n', mtd, mode);

writel(readl(&nand->nfconf) | S3C2410_NFCONF_INITECC, &nand->nfconf);

}


static int s5pv210_nand_calculate_ecc(struct mtd_info *mtd, const u_char *dat,

u_char *ecc_code)

{

struct s5pv210_nand *nand = (struct s5pv210_nand *)s5pv210_get_base_nand();

ecc_code[0] = readb(&nand->nfecc);

ecc_code[1] = readb(&nand->nfecc + 1);

ecc_code[2] = readb(&nand->nfecc + 2);

debug('s5pv210_nand_calculate_hwecc(%p,): 0x%02x 0x%02x 0x%02xn',

mtd , ecc_code[0], ecc_code[1], ecc_code[2]);


return 0;

}


static int s5pv210_nand_correct_data(struct mtd_info *mtd, u_char *dat,

u_char *read_ecc, u_char *calc_ecc)

{

if (read_ecc[0] == calc_ecc[0] &&

read_ecc[1] == calc_ecc[1] &&

read_ecc[2] == calc_ecc[2])

return 0;


printf('s5pv210_nand_correct_data: not implementedn');

return -1;

}

#endif


/*

* add by Sourcelink

* nand_select_chip

* @mtd: MTD device structure

* @ctl: 0 to select, -1 for deselect

*

* Default select function for 1 chip devices.

*/

static void s5pv210_nand_select_chip(struct mtd_info *mtd, int ctl)

{

struct nand_chip *chip = mtd->priv;


switch (ctl) {

case -1: /* deselect the chip */

chip->cmd_ctrl(mtd, NAND_CMD_NONE, 0 | NAND_CTRL_CHANGE);

break;

case 0: /* Select the chip */

chip->cmd_ctrl(mtd, NAND_CMD_NONE, NAND_NCE | NAND_CTRL_CHANGE);

break;


default:

BUG();

}

}


/* modied by Sourcelink */

int board_nand_init(struct nand_chip *nand)

{

u32 cfg;

struct s5pv210_nand *nand_reg = (struct s5pv210_nand *)(struct s5pv210_nand *)s5pv210_get_base_nand();


debug('board_nand_init()n');


/* initialize hardware */

/* HCLK_PSYS=133MHz(7.5ns) */

cfg = ((AddrCycle << 1) | (PageSize << 2) | (MLCFlash << 3) | (TWRPH1 << 4) | (TWRPH0 << 8) | (TACLS << 12));


writel(cfg, &nand_reg->nfconf);


writel((Reg_nCE0 << 1) | (MODE << 0), &nand_reg->nfcont);

/* Disable chip select and Enable NAND Flash Controller */


/*

* port map

* CE1-> Xm0CSn2 -> MP01_2

* CLE-> Xm0FCLE -> MP03_0

* ALE-> Xm0FALE -> MP03_1

* WE -> Xm0FWEn -> MP03_2

* RE -> Xm0FREn -> MP03_3

* R/B1->Xm0FRnB0-> MP03_4

* IO[7:0]->Xm0DATA[7:0]->MP0_6[7:0]

* */


/* 设置片选引脚 CSN[0] */

MP0_1CON &= ~(0x00000F00);

MP0_1CON |= (3 << 8);


/* CLE,ALE,WE,RE,R/B1 */

MP0_3CON &= ~(0x000FFFFF);

MP0_3CON |= 0x00022222;


/* DATA */

MP0_6CON = 0x22222222;


/* initialize nand_chip data structure */

nand->IO_ADDR_R = (void *)&nand_reg->nfdata;

nand->IO_ADDR_W = (void *)&nand_reg->nfdata;


nand->select_chip = s5pv210_nand_select_chip;


/* read_buf and write_buf are default */

/* read_byte and write_byte are default */


/* hwcontrol always must be implemented */

nand->cmd_ctrl = s5pv210_hwcontrol;


nand->dev_ready = s5pv210_dev_ready;


#ifdef CONFIG_S3C2410_NAND_HWECC

nand->ecc.hwctl = s5pv210_nand_enable_hwecc;

nand->ecc.calculate = s5pv210_nand_calculate_ecc;

nand->ecc.correct = s5pv210_nand_correct_data;

nand->ecc.mode = NAND_ECC_HW;

nand->ecc.size = CONFIG_SYS_NAND_ECCSIZE;

nand->ecc.bytes = CONFIG_SYS_NAND_ECCBYTES;

nand->ecc.strength = 1;

#else

nand->ecc.mode = NAND_ECC_SOFT;

#endif


#ifdef CONFIG_S3C2410_NAND_BBT

nand->bbt_options |= NAND_BBT_USE_FLASH;

#endif


debug('end of nand_initn');


return 0;

}


7,在vim arch/arm/include/asm/arch-s5pc1xx/cpu.h  下添加:

在62行添加#define S5PV210_NAND_BASE       0xB0E00000


8,然后在arch/arm/include/asm/arch-s5pc1xx/下创建文件nand_reg.h,定义 NAND 的寄存器结构体


/*************************************************************************

> File Name: nand_reg.h

> Author:

> Mail:

> Created Time: Wed 09 Aug 2017 04:11:49 PM CST

************************************************************************/


#ifndef _NAND_REG_H

#define _NAND_REG_H



#ifndef __ASSEMBLY__

static inline struct s5pv210_nand *s5pv210_get_base_nand(void)

{

return (struct s5pv210_nand *)S5PV210_NAND_BASE;

}


struct s5pv210_nand {

unsigned int nfconf;

unsigned int nfcont;

unsigned int nfcmmd;

unsigned int nfaddr;

unsigned int nfdata;

unsigned int nfmeccd0;

unsigned int nfmeccd1;

unsigned int nfseccd;

unsigned int nfsblk;

unsigned int nfeblk;

unsigned int nfstat;

unsigned int nfeccerr0;

unsigned int nfeccerr1;

unsigned int nfmecc0;

unsigned int nfmecc1;

unsigned int nfsecc;

unsigned int nfmlcbitpt;

};


#endif

#endif


 

9,修改drivers/mtd/nand/Makefile,将s5pv210_nand.c编译进uboot

 10,添加环境变量偏移量,在配置文件里添加:#define CONFIG_ENV_OFFSET,移植NAND,必需要OFFSET

 

11,然后,再make,生成可以移值到Nand falsh的u-boot.




关键字:S5PV210  移植  Nandflash 引用地址:第七章之S5PV210移植到Nandflash

上一篇:第六章之S5PV210正确启动u-boot
下一篇:S5PV210开发系列八_Yaffs的移植

推荐阅读最新更新时间:2026-03-22 12:35

u-boot-2011.06在基于s3c2440开发板的移植nandflash启动
由于价格的原因,相对于norflash,nandflash对于存储大容量的数据来说更具有优势。但是程序不能直接在nandflash上运行,因此s3c2440提供了一个机制,即系统会自动把nandflash中前4k的内容复制到名为“Steppingstone”的内部SRAM中,利用这段SRAM,程序员需要再把程序复制到其余的SRAM中,然后运行刚刚复制到SRAM中的程序。 本文就介绍如何使u-boot在nandflash中启动,该工作原理类似于u-boot-2011.06自带的smdk6400开发板的nandflash启动过程,即最终生成的烧写文件为u-boot-nand.bin,它是由两个文件组成的: nand_spl/u-boo
[单片机]
基于s5pv210嵌入式linux系统sqlite3数据库移植
1、下载源码 http://www.sqlite.org/download.html 最新源码为3080100 2、解压 tar xvf XXXXX 3、配置编译环境 运行 ./configure –host=你的交叉编译工具的前缀 –prefix=你想编译安装的位置 我的host为arm-none-linux-gnueabi,prefix为/home/linux/sqlit3-arm 运行后会生成Makefile文件。 4、编译并安装 编译:make 安装:make install 安装完成后会在你设定的目录下生成安装好的文件: bin、include、lib、share bin:为编译完成的sqlite3可执行文件
[单片机]
基于<font color='red'>s5pv210</font>嵌入式linux系统sqlite3数据库<font color='red'>移植</font>
S5PV210之beep驱动从linux2.6.35.7移植到linux3.0.8
beep驱动从linux2.6.35.7内核移植到linux3.0.8,修改的部分为:   '='后面的为修改后的   .ioctl  =  .unlocked_ioctl   static int beep_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)   = static int beep_ioctl(struct file *file, unsigned int cmd, unsigned long arg)   beep_ioctl函数中struct inode *inode去掉,原因是b
[单片机]
s5pv210移植Minigui3.0.12
移植平台: ubuntu:14.04 开发板:s5pv210(A8) Minigui版本:3.0.12 ----------------------------------------------------- 以下软件是开发板正常运行的必须安装包,在MiniGui官网可以下载 http://www.minigui.org/zhcn/【已放在嵌入式软件组资料共享文件夹】 ----------------------------------------------------- ├── freetype-2.3.9-fm20100818.tar.gz ├── jpegsrc.v7.tar.gz ├── libmgplus-1.2.4
[单片机]
-boot移植(十一)---代码修改---支持nandflash
一、移植前的修改 1.1 include/configs/jz2440修改   原来的定义:      可以看出,要先定义CONFIG_CMD_NAND才能使能NANDFlash。   这个在我们文件中的82行有定义,所以不需要定义了。      将里面的S3C2410全部改为S3C2440:    1.2 drivers/mtd/nand/修改   拷贝s3c2410_nand.c 成 s3c2440_nand.c      在此目录的makefile中添加 s3c2440_nand.c      修改s3c2440_nand.c 文件,从board_nand_init 逐行检测修改,代码如下: 1 #include
[单片机]
-boot<font color='red'>移植</font>(十一)---代码修改---支持<font color='red'>nandflash</font>
u-boot-2016.03 在mini2440移植nandflash读写
在“NorFlash启动”一文中,我们把drivers/mtd/nand/s3c2410_nand.c文件复制为s3c2440_nand.c文件,并把该文件内的所有有关“2410”的地方一律改为“2440”。这么修改仅仅是能够让系统编译成功,并没有真正实现NandFlash的读写。在这里,我们就来介绍如何让u-boot支持NandFlash的读写。 由于s3c2410与s3c2440的NandFlash控制器不一样,因此s3c2440_nand.c文件并不能直接应用,需要进行适当的修改,而主要修改的内容就是s3c2440的相关寄存器。 首先重新定义要用到的寄存器,把原文中第27行至第37行之间的宏定义去掉,改为下面的形式:
[单片机]
u-boot-2016.03 在mini2440<font color='red'>移植</font>之<font color='red'>nandflash</font>读写
S3C2440移植uboot之支持NANDFLASH操作
上一节我们移植了uboot,S3C2440移植uboot之支持NORFLASH。这节我们继续移植,支持NANDFLASH。 目录 编译报错 拷贝s3c2410_nand.c,修改宏定义支持SC32440 修改s3c2440_nand.c 中的NFCONF,NFCONT,支持S3C2440 修改s3c2440_hwcontrol区分命令和地址 添加选中芯片函数 编译报错   之前由于nand部分报错,直接注释了 u-boot- 2012.04.01includeconfigssmdk2440.h 中的#define CONFIG_CMD_NAND。现在我们去掉注释,重新编译。报错如下   我们没有定义CONFIG_S
[单片机]
S3C2440<font color='red'>移植</font>uboot之支持<font color='red'>NANDFLASH</font>操作
s3c6410学习笔记-将内核zImage、文件系统写到nandflash、屏幕校准
1、之前已经将uboot写到nandflash里面了,接下来将内核zImage、文件系统写到nandflash。 2、编译内核 cd linux-2.6.28_smdk6410 make clean make distclean cp smdk6410_config .config make menuconfig    将Device Drivers ---》Graphics support --- Support for frame buffer devices --- select LCD       Type 分辨率调到480*272 保存(之后要校准屏幕) make   make 完成之后将 /arch/a
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved