本文开发环境为:uClinux-2.6,BF561,编译器为VDSP4.5
1 norflash: Am29LV320MT
AM29LV320MT是一个4M,16位的NorFlash,支持CFI接口,其地址空间为0x2000 0000 ~ 0x2040 0000。
1、配置异步存储器,以下是几个相关的宏:
#define
CONFIG_C_AMBEN_ALL 1
#define
CONFIG_C_B0PEN 1
#define
CONFIG_C_B1PEN 1
#define
CONFIG_C_B2PEN 1
#define
CONFIG_C_B3PEN 1
#define
CONFIG_BANK_0 0x7BB0
#define
CONFIG_BANK_1 0xFFC2
#define
CONFIG_BANK_2 0xFFC2
#define
CONFIG_BANK_3 0xFFC2
2、定义命令集:
#define
CONFIG_MTD_CFI_AMDSTD 1
3、定义Flash的基本参数:
#define
CONFIG_EBIU_FLASH_BASE 0x20000000
#define
CONFIG_BFIN_FLASH_SIZE 4
4、加入drivers/mtd/maps/ezkit561.c。
5、修改
#define
EZKIT561_FLASH_BASE 0x20000000
#define
EZKIT561_FLASH_SIZE 0x00400000
为板载Flash的地址和大小。
6、修改
ezkit561_parts分区定义为希望的值。
搞定。
2 Nand:K9W8G08U1M
K9W8G08U1M是一个1G的Nand flash,由两片512M的芯片堆叠而成。其RB1与RB2接到PF4和PF5,CE1与CE2接到PF0和PF1,ALE接到PF2,CLE接到PF3。
uClinux下的驱动与u-boot下的驱动相似但略有不同。
1、加入drivers/mtd/nand/bfin_nand.c。
2、修改地址定义:
#define
BFIN_NAND_BASE 0x29000000/*CONFIG_BFIN_NAND_BASE*/
3、修改
bfin_nand_init
函数中设置PF口的代码:
/* Configure GPIO-BFIN_NAND_READY */
*pFIO0_DIR |= 0x000F; // set PF0~PF3 as output , others as inputs
asm("ssync;");
*pFIO0_INEN |= 0x0030; //enable input buffer for PF4,PF5
asm("ssync;");
4、修改以下3个控制函数:
static
void bfin_hwcontrol(struct mtd_info *mtd, int cmd, unsigned int ctrl)
{
register struct nand_chip *this = mtd->priv;
if (cmd == NAND_CMD_NONE)
return;
if(ctrl & NAND_CLE) {
*pFIO0_FLAG_S = 0x04;
*pFIO0_FLAG_C = 0x08;
}
if(ctrl & NAND_ALE) {
*pFIO0_FLAG_C = 0x04;
*pFIO0_FLAG_S = 0x08;
}
this->IO_ADDR_R = this->IO_ADDR_W;
/* Drain the writebuffer */
asm("ssync;");
//__builtin_bfin_ssync();
writeb(cmd, p_nand);
asm("ssync;");
*pFIO0_FLAG_C = 0x04 | 0x08;
/*
if (cmd == NAND_CMD_NONE)
return;
if (ctrl & NAND_CLE)
writeb(cmd, p_nand + BFIN_NAND_CLE);
else
writeb(cmd, p_nand + BFIN_NAND_ALE);
SSYNC();
*/
}
int
bfin_device_ready(struct mtd_info *mtd)
{
return ((*pFIO0_FLAG_D & 0x30) == 0x30) ? 1 : 0;
//return gpio_get_value(CONFIG_BFIN_NAND_READY);
}
/**
* nand_select_chip - [DEFAULT] control CE line
* @mtd: MTD device structure
* @chip: chipnumber to select, -1 for deselect
*
* Default select function for 1 chip devices.
*/
static
int current_chip = -1;
static
void bfin_select_chip(struct mtd_info *mtd, int chip)
{
struct nand_chip *this = mtd->priv;
current_chip = chip;
switch(chip) {
case -1:
*pFIO0_FLAG_S = 0x03;
break;
case 0:
*pFIO0_FLAG_C = 0x01;
asm("ssync;");
*pFIO0_FLAG_S = 0x02;
break;
case 1:
*pFIO0_FLAG_C = 0x02;
asm("ssync;");
*pFIO0_FLAG_S = 0x01;
break;
default:
BUG();
}
asm("ssync;");
}
5、修改
partition_info
中的分区定义。
搞定。
需要注意的是,NandFlash和NorFlash检测完成后都后添加相应的分区,此时用于系统启动的mtdblock号可能会发生变化。默认情况下,NorFlash加入3个分区,NandFlash加入2个分区,所以启动时的root也相应地由/dev/mtdblock0改变为/dev/mtdblock5。