S3C2440A的NAND FLASH驱动移植到S3C2410还是有些不一样的,最主要的这两个IC的NAND FLASH的寄存器有些不一样,请看下面的两者之间不同:
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
//------------------------------------------------------------------------------
//
// Header: s3c2410x_nand.h
//
// Defines the NAND controller CPU register layout and definitions.
//
#ifndef __S3C2410X_NAND_H
#define __S3C2410X_NAND_H
#if __cplusplus
extern "C"
{
#endif
//------------------------------------------------------------------------------
// Type: S3C2410X_NAND_REG
//
// NAND Flash controller register layout. This register bank is located
// by the constant CPU_BASE_REG_XX_NAND in the configuration file
// cpu_base_reg_cfg.h.
//
typedef struct
{
UINT32 NFCONF; // configuration reg
UINT8 NFCMD; // command set reg
UINT8 pad1[3]; // pad
UINT8 NFADDR; // address set reg
UINT8 pad2[3]; // pad
UINT8 NFDATA; // data reg
UINT8 pad3[3]; // pad
UINT32 NFSTAT; // operation status reg
UINT32 NFECC; // error correction code 0
} S3C2410X_NAND_REG, *PS3C2410X_NAND_REG;
#if __cplusplus
}
#endif
#endif
上面的代码是S3C2410A的寄存器,我们在看看S3C2440A的寄存器地址说明:
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
//------------------------------------------------------------------------------
//
// Header: s3c2440a_nand.h
//
// Defines the NAND controller CPU register layout and definitions.
//
#ifndef __S3C2440A_NAND_H
#define __S3C2440A_NAND_H
#if __cplusplus
extern "C"
{
#endif
//------------------------------------------------------------------------------
// Type: S3C2440A_NAND_REG
//
// NAND Flash controller register layout. This register bank is located
// by the constant CPU_BASE_REG_XX_NAND in the configuration file
// cpu_base_reg_cfg.h.
//
typedef struct
{
UINT32 NFCONF; // configuration reg
UINT32 NFCONT;
UINT8 NFCMD; // command set reg
UINT8 d0[3];
UINT8 NFADDR; // address set reg
UINT8 d1[3];
UINT8 NFDATA; // data reg
UINT8 d2[3];
UINT32 NFMECCD0;
UINT32 NFMECCD1;
UINT32 NFSECCD;
UINT32 NFSTAT; // operation status reg
UINT32 NFESTAT0;
UINT32 NFESTAT1;
UINT32 NFMECC0; // error correction code 0
UINT32 NFMECC1; // error correction code 1
UINT32 NFSECC;
UINT32 NFSBLK;
UINT32 NFEBLK; // error correction code 2
} S3C2440A_NAND_REG, *PS3C2440A_NAND_REG;
#if __cplusplus
}
#endif
#endif
这两者之间的差别是很大的。因此移植起来的难点主要是ECC部分,同时还有个别寄存器位地址不一样,需要修改,见下面:
// Use Macros here to avoid extra over head for c function calls
#define READ_REGISTER_BYTE(p) (*(PBYTE)(p))
#define WRITE_REGISTER_BYTE(p, v) (*(PBYTE)(p)) = (v)
#define READ_REGISTER_USHORT(p) (*(PUSHORT)(p))
#define WRITE_REGISTER_USHORT(p, v) (*(PUSHORT)(p)) = (v)
#define READ_REGISTER_ULONG(p) (*(PULONG)(p))
#define WRITE_REGISTER_ULONG(p, v) (*(PULONG)(p)) = (v)
以上的代码不论S3C2410还是S3C2440都可以用,我在移植的时候,这两部是一样的。当然至于S3C2443和S3C2450这部分的寄存器改变并不多,不过S3C2450的BSP中NAND FLASH驱动还是有很大的变化,那以后再来分析吧,现在还是分析这个,WINCE5.0下的。WINCE6.0的我还没有来得急移植呢。我一般喜欢动手自己移植一遍,这样能深入的了解WINCE的流程,同时对这颗IC,也更熟悉。看看两者之间的不同吧。
S3C2440A的寄存器宏定义:
// MACROS
-
#define NF_CE_L() WRITE_REGISTER_USHORT(pNFCONT, (USHORT) (READ_REGISTER_USHORT(pNFCONT) & ~(1<<1)))