U-boot移植(四)

住上篇!!!!!!!!!!!

5.添加支持nandflash读写驱动:(此部分程序是在内核里的nandflash驱动移植过来的)

 (1)增加nand_flash.c文件:cpu/arm920t/s3c24x0/nand_flash.c内容如下:

#include <common.h>

#if (CONFIG_COMMANDS & CFG_CMD_NAND) && !defined(CFG_NAND_LEGACY)
#include <s3c2410.h>
#include <nand.h>

DECLARE_GLOBAL_DATA_PTR;
#define S3C2440_NFSTAT_READY    (1<<0)
#define S3C2440_NFCONT_nFCE     (1<<1)


static void s3c2440_nand_select_chip(struct mtd_info *mtd, int chip)
{
    S3C2440_NAND * const s3c2440nand = S3C2440_GetBase_NAND();

    if (chip == -1) {
        s3c2440nand->NFCONT |= S3C2440_NFCONT_nFCE;
    } else {
        s3c2440nand->NFCONT &= ~S3C2440_NFCONT_nFCE;
    }
}


static void s3c2440_nand_hwcontrol(struct mtd_info *mtd, int cmd)
{
    S3C2440_NAND * const s3c2440nand = S3C2440_GetBase_NAND();
    struct nand_chip *chip = mtd->priv;

    switch (cmd) {
    case NAND_CTL_SETNCE:
    case NAND_CTL_CLRNCE:
        printf("%s: called for NCE\n", __FUNCTION__);
        break;

    case NAND_CTL_SETCLE:
        chip->IO_ADDR_W = (void *)&s3c2440nand->NFCMD;
        break;

    case NAND_CTL_SETALE:
        chip->IO_ADDR_W = (void *)&s3c2440nand->NFADDR;
        break;

       
       
    default:
        chip->IO_ADDR_W = (void *)&s3c2440nand->NFDATA;
        break;
    }
}


static int s3c2440_nand_devready(struct mtd_info *mtd)
{
    S3C2440_NAND * const s3c2440nand = S3C2440_GetBase_NAND();

    return (s3c2440nand->NFSTAT & S3C2440_NFSTAT_READY);
}


static void s3c24x0_nand_inithw(void)
{
    S3C2440_NAND * const s3c2440nand = S3C2440_GetBase_NAND();

#define TACLS   0
#define TWRPH0  4
#define TWRPH1  2
       
        s3c2440nand->NFCONF = (TACLS<<12)|(TWRPH0<<8)|(TWRPH1<<4);
       
        s3c2440nand->NFCONT = (1<<4)|(0<<1)|(1<<0);
}


void board_nand_init(struct nand_chip *chip)
{
    S3C2440_NAND * const s3c2440nand = S3C2440_GetBase_NAND();

    s3c24x0_nand_inithw();
        chip->IO_ADDR_R    = (void *)&s3c2440nand->NFDATA;
        chip->IO_ADDR_W    = (void *)&s3c2440nand->NFDATA;
        chip->hwcontrol    = s3c2440_nand_hwcontrol;
        chip->dev_ready    = s3c2440_nand_devready;
        chip->select_chip  = s3c2440_nand_select_chip;
        chip->options      = 0;

    chip->eccmode       = NAND_ECC_SOFT;
}

#endif

(2)跟住修改该目录下既Makefile:大概29行

   COBJS = i2c.o interrupts.o serial.o speed.o \
   usb_ohci.o nand_flash.o  

(3)系include/s3c24x0.h中定义S3C2440_NAND结构体,大概在168行

  typedef struct {
  S3C24X0_REG32 NFCONF;
  S3C24X0_REG32 NFCONT;
  S3C24X0_REG32 NFCMD;
  S3C24X0_REG32 NFADDR;
  S3C24X0_REG32 NFDATA;
  S3C24X0_REG32 NFMECCD0;
  S3C24X0_REG32 NFMECCD1;

    S3C24X0_REG32 NFSECCD;
  S3C24X0_REG32 NFSTAT; 

  S3C24X0_REG32 NFESTAT0;
    S3C24X0_REG32 NFESTAT1;
    S3C24X0_REG32 NFMECC0;
    S3C24X0_REG32 NFMECC1;
    S3C24X0_REG32 NFSECC;
    S3C24X0_REG32 NFSBLK;
    S3C24X0_REG32 NFEBLK;
} S3C2440_NAND;

(4)跟住在include/s3c2410.h的大概100行位置加:

   static inline S3C2440_NAND * const S3C2440_GetBase_NAND(void)
{
 return (S3C2440_NAND * const)S3C2410_NAND_BASE;
}

(5)跟住就修改配置文件include/configs/yangyi2440.h修改Flash的配置

     和NAND的设置:178行

     //#define CFG_ENV_IS_IN_FLASH 1(屏蔽左距)

     #define CFG_ENV_IS_IN_NAND 1

     #define CFG_ENV_OFFSET  0x40000//偏移地址,呢个系因为它接在bank的地址

     #define CFG_ENV_SIZE  0xc000    //64M

     #define CFG_NAND_BASE  0

     #define CFG_MAX_NAND_DEVICE  1//板上有多少个nandflash设备

     #define NAND_MAX_CHIPS  1 //一个NANDFLASH设备有多少片

(6)修改配置文件include/configs/yangyi2440.h,增加nandflash命令:

    把#define CONFIG_COMMANDS 离得CFG_CMD_NAND屏蔽去掉。

    执行make clean 再 make all 。编译Ok通过。艮就支持呢NANDFLASH读写擦操作功能啦

你可能感兴趣的:(c,struct,function,cmd,Flash,makefile)