U-Boot-2011.03移植nandflash到mini2440

发布者:TranquilDreamer最新更新时间:2024-06-24 来源: elecfans关键字:U-Boot  移植  nandflash  mini2440 手机看文章 扫描二维码
随时随地手机看文章

u-boot2011.03支持s3c2440,寄存器在arch/arm/includer/asm/目录下s3c24x0_cpu.h中定义。

代码中包含了s3c2410读写nandflash函数,因此在s3c2410基础上进行修改

U-Boot源代码下载地址 http://www.linuxidc.com/Linux/2011-07/38897.htm

建一个s3c2440_nand.c文件

cd   drivers/mtd/nand/
cp     s3c2410_nand.c   s3c2440_nand.c
代码如下
寄存器操作说明:
readl函数原型
#define   readl(addr)       (*(volatile unsigned int*)(addr))
writeb函数原型
#define   writel(b,addr)          ((*(volatile unsigned int *) (addr)) = (b))
 
 
#include
#include
#include
#include
 
#define S3C2440_NFCONT_EN          (1<<0)
#define S3C2440_NFCONT_nFCE        (0<<1)
#define S3C2440_NFCONT_INITECC      (1<<4)
#define S3C2440_NFCONF_TACLS(x)    ((x)<<12)
#define S3C2440_NFCONF_TWRPH0(x)   ((x)<<8)
#define S3C2440_NFCONF_TWRPH1(x)   ((x)<<4)
 
#define S3C2440_ADDR_NALE 0x0c
#define S3C2440_ADDR_NCLE 0x08
 
#ifdef CONFIG_NAND_SPL
 
/* in the early stage of NAND flash booting, printf() is not available */
#define printf(fmt, args...)
 
static void nand_read_buf(struct mtd_info *mtd, u_char *buf, int len)
{
         int i;
         struct nand_chip *this = mtd->priv;
 
         for (i = 0; i < len; i++)
                   buf[i] = readb(this->IO_ADDR_R);
}
#endif
 
static void s3c2440_hwcontrol(struct mtd_info *mtd, int cmd, unsigned int ctrl)
{
         struct nand_chip *chip = mtd->priv;
         struct s3c2440_nand *nand = s3c2440_get_base_nand();
 
         debugX(1, 'hwcontrol(): 0x%02x 0x%02xn', cmd, ctrl);
 
         if (ctrl & NAND_CTRL_CHANGE) {
                   ulong IO_ADDR_W = (ulong)nand;
 
                   if (!(ctrl & NAND_CLE))
                            IO_ADDR_W |= S3C2440_ADDR_NALE;
                   if (!(ctrl & NAND_ALE))
                            IO_ADDR_W |= S3C2440_ADDR_NCLE;//特别注意修改
                   chip->IO_ADDR_W = (void *)IO_ADDR_W;
 
                   if (ctrl & NAND_NCE)
                            writel(readl(&nand->nfcont) & (~(1<<1)),
                                   &nand->nfcont);
                   else
                            writel(readl(&nand->nfcont) | (1<<1),
                                   &nand->nfcont);
         }
 
         if (cmd != NAND_CMD_NONE)
                   writeb(cmd, chip->IO_ADDR_W);
}
 
static int s3c2440_dev_ready(struct mtd_info *mtd)
{
         struct s3c2440_nand *nand = s3c2440_get_base_nand();
         debugX(1, 'dev_readyn');
         return readl(&nand->nfstat) & 0x01;
}
 
#ifdef CONFIG_S3C2440_NAND_HWECC
void s3c2440_nand_enable_hwecc(struct mtd_info *mtd, int mode)
{
         struct s3c2440_nand *nand = s3c2440_get_base_nand();
         debugX(1, 's3c2440_nand_enable_hwecc(%p, %d)n', mtd, mode);
         writel(readl(&nand->nfconf) | S3C2440_NFCONF_INITECC, &nand->nfconf);
}
 
static int s3c2440_nand_calculate_ecc(struct mtd_info *mtd, const u_char *dat, u_char *ecc_code)
{
         struct s3c2440_nand *nand = s3c2440_get_base_nand();
         ecc_code[0] = readb(&nand->nfecc);
         ecc_code[1] = readb(&nand->nfecc + 1);
         ecc_code[2] = readb(&nand->nfecc + 2);
         debugX(1, 's3c2440_nand_calculate_hwecc(%p,): 0x%02x 0x%02x 0x%02xn',
                mtd , ecc_code[0], ecc_code[1], ecc_code[2]);
 
         return 0;
}
 
static int s3c2440_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('s3c2440_nand_correct_data: not implementedn');
         return -1;
}
#endif
int board_nand_init(struct nand_chip *nand)
{
         u_int32_t cfg;
         u_int8_t tacls, twrph0, twrph1;
         struct s3c24x0_clock_power *clk_power = s3c24x0_get_base_clock_power();
         struct s3c2440_nand *nand_reg = s3c2440_get_base_nand();
         debugX(1, 'board_nand_init()n');
         writel(readl(&clk_power->clkcon) | (1 << 4), &clk_power->clkcon);
         /* initialize hardware */
#if defined(CONFIG_S3C24XX_CUSTOM_NAND_TIMING)
         tacls  = CONFIG_S3C24XX_TACLS;
         twrph0 = CONFIG_S3C24XX_TWRPH0;
         twrph1 =  CONFIG_S3C24XX_TWRPH1;
#else
         tacls = 4;
         twrph0 = 8;
         twrph1 = 8;
#endif
         cfg = S3C2440_NFCONF_TACLS(tacls - 1);
         cfg |= S3C2440_NFCONF_TWRPH0(twrph0 - 1);
         cfg |= S3C2440_NFCONF_TWRPH1(twrph1 - 1);
         writel(cfg, &nand_reg->nfconf);
 
         cfg = S3C2440_NFCONT_EN;
         cfg |= S3C2440_NFCONT_nFCE;
         cfg |= S3C2440_NFCONT_INITECC;
         writel(cfg, &nand_reg->nfcont);
         /* initialize nand_chip data structure */
         nand->IO_ADDR_R = (void *)&nand_reg->nfdata;
         nand->IO_ADDR_W = (void *)&nand_reg->nfdata;
 
         nand->select_chip = NULL;
 
         /* read_buf and write_buf are default */
         /* read_byte and write_byte are default */
#ifdef CONFIG_NAND_SPL
         nand->read_buf = nand_read_buf;
#endif
 
         /* hwcontrol always must be implemented */
         nand->cmd_ctrl = s3c2440_hwcontrol;
         nand->dev_ready = s3c2440_dev_ready;
 
#ifdef CONFIG_S3C2440_NAND_HWECC
         nand->ecc.hwctl = s3c2440_nand_enable_hwecc;
         nand->ecc.calculate = s3c2440_nand_calculate_ecc;
         nand->ecc.correct = s3c2440_nand_correct_data;
         nand->ecc.mode = NAND_ECC_HW;
         nand->ecc.size = CONFIG_SYS_NAND_ECCSIZE;
         nand->ecc.bytes = CONFIG_SYS_NAND_ECCBYTES;
#else
         nand->ecc.mode = NAND_ECC_SOFT;
#endif
#ifdef CONFIG_S3C2440_NAND_BBT
         nand->options = NAND_USE_FLASH_BBT;
#else
         nand->options = 0;
#endif
         debugX(1, 'end of nand_initn');
         return 0;
}
再在include/configs/mini2440.h中添加
#define CONFIG_NAND_S3C2440
#define CONFIG_SYS_MAX_NAND_DEVICE 1
#define CONFIG_SYS_NAND_BASE    0x4E000000
#define CONFIG_MTD_DEVICE
#define CONFIG_CMD_NAND
 
 
编译好后使用supervivi   的d命令下载到sdram的0x33f80000地指出执行
U-Boot 2011.03 (Nov 29 2011 - 09:21:34)
DRAM:  64 MiB
Flash:   2 MiB
NAND:  256 MiB
*** Warning - bad CRC, using default environment
In:    serial
Out:   serial
Err:   serial
Net:   dm9000
mini2440 # nand info
Device 0: nand0, sector size 128 KiB
mini2440 #
mini2440已经能够很好的支持nand flash

[1] [2]
关键字:U-Boot  移植  nandflash  mini2440 引用地址:U-Boot-2011.03移植nandflash到mini2440

上一篇:mini2440 驱动ds18b20
下一篇:QT_MPlayer移植到mini2440

推荐阅读最新更新时间:2026-03-21 17:18

U-Boot-2011.03移植nandflashmini2440
u-boot2011.03支持s3c2440,寄存器在arch/arm/includer/asm/目录下s3c24x0_cpu.h中定义。 代码中包含了s3c2410读写nandflash函数,因此在s3c2410基础上进行修改 U-Boot源代码下载地址 http://www.linuxidc.com/Linux/2011-07/38897.htm 建一个s3c2440_nand.c文件 cd drivers/mtd/nand/ cp s3c2410_nand.c s3c2440_nand.c 代码如下 寄存器操作说明: readl函数原型 #define readl(addr) (*(volatile unsi
[单片机]
初试mini2440 nandflash驱动移植
首先按照步骤修改相关信息之后执行make zImage出现了不少错误: 其中有代表性的错误如下: arch/arm/mach-s3c2440/mach-mini2440.c:189: error: array type has incomplete element type arch/arm/mach-s3c2440/mach-mini2440.c:190: error: array index in non-array initializer arch/arm/mach-s3c2440/mach-mini2440.c:190: error: (near initialization for 'smdk_default_
[单片机]
mini2440 u-boot linux 内核启动,移植较新(Linux3.19)内核至mini2440开发板(一)
s3c24xx-nand s3c2440-nand: Tacls=1, 9ns Twrph0=3 29ns, Twrph1=2 19ns s3c24xx-nand s3c2440-nand: NAND soft ECC nand: device found, Manufacturer ID: 0xec, Chip ID: 0xda nand: Samsung NAND 256MiB 3,3V 8-bit nand: 256 MiB, SLC, erase size: 128 KiB, page size: 2048, OOB size: 64 Creating 5 MTD partitions on nand : 0x000000
[单片机]
【嵌入式】从零开始移植U-bootmini2440(二)——烧录篇
烧录 相关工具:j-link 软件:j-flash ARM V4.70 在编译成功之后,会生成u-boot.bin在output目录下,这个二进制文件就可以直接用于烧录。 烧录位置的确定方法 烧录的时候,我这里选择直接烧写在NOR中,看S3C2440的SPEC和开发板的原理图(找NOR的CE接口和S3C2440哪个引脚相连),当我们选择从NOR启动的时候,NOR Flash被映射到内存0x0000_0000 ~ 0x0800_0000,也就是说我们直接把bin文件烧录到0地址即可。 这里有一篇写的蛮好的blog,解释了ARM是如何通过NOR和NAND启动的。 https://www.cnblogs.com/aaron
[单片机]
【嵌入式】从零开始<font color='red'>移植</font><font color='red'>U-boot</font>到<font color='red'>mini2440</font>(二)——烧录篇
mini2440开发板 u-boot 移植
本实验所用的u-boot源码包,是国嵌提供的u-boot-2008.10 1.解压源码包 命令:tar jxvf u-boot-2008.10.tar.bz2 2.在顶层的Makefile中找到 smdk2410_config : unconfig @$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0 参照此方法,添加: mini2440_config : unconfig @$(MKCONFIG) $(@:_config=) arm arm920t mini2440 NULL s3c24x0 3.修改/cpu/arm920t/star
[单片机]
u-bootnandflash初始化流程分析
下面对nand flash的初始化代码nand_init()进行分析: 1.如果定义(CONFIG_COMMANDS & CFG_CMD_NAND)没定义(CFG_NAND_LEGACY) 则start_armboot()调用driver/nand/nand.c中的nand_init(),否则如果定义(CONFIG_COMMANDS & CFG_CMD_NAND)并且有定义了CFG_NAND_LEGACY,则调用自己定义的nand_init()。在我当前的情景中是使用driver/nand/nand.c中的nand_init()。 2.nand_init()调用本文件中的nand_init_chip()对nand进行初始化。
[单片机]
mini2440通过NFS启动的U-Boot参数设置
// 编译内核 cd /home/guoqian/4-3-1/linux-2.6.29 make disclean cp config-mini2440 .config make menuconfig ARCH=arm make uImage ARCH=arm CROSS_COMPILE=arm-linux- // 将uImage拷至TFTP cp arch/arm/boot/uImage /tftpboot/ // u-boot参数设置 set ipaddr 192.168.1.230 set serverip 192.168.1.123 set gatewayip 192.168.1.1 set bootcmd 'tf
[单片机]
搭建一个mini2440开发板U-Boot的框架
一、移植环境 主 机: Ubuntu 开发板:友善之臂mini2440 编译器:arm-linux-gcc-4.3.2 u-boot:u-boot-2009.03.tar.bz2 二、移植步骤 目前u-boot对很多CPU直接支持,可以查看board目录的一些子目录,如:board/samsung/目录下就是对三星一些ARM处理器的支持,有smdk2400、smdk2410和smdk6400,但没有2440,所以我们就在这里建立自己的开发板项目。 1)因2440和2410的资源差不多,主频和外设有点差别,所以我们就在board/samsung/下建立自己开发板的项目,取名叫mini2440 #tar -jx
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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