// Initialize the NAND device char NandInitialize(void) { FLASH_INIT_PINS(); // Setup the pins as in HardwareProfile FLASH_WAIT_RB_TIMEOUT(); // wait for startup cycle NandPSPOn(); // Enable HW support if provided FlashReset(); // Issue the reset command return (TRUE); // Return }
static void FlashStandby(void) { FLASH_INIT_PINS(); FLASH_WAIT_RB_TIMEOUT();// Wait for previous operations FlashReset(); // Shouldn't really be needed, but at least we'll know what state it's in FLASH_CE_PIN = 0; // Ensure CE is high (active low) FLASH_CE = 1; // Chip deselect return; }
/******************************************************************** 函数功能:Flash初始化。 入口参数:无。 返 回:无。 备 注:无。 ********************************************************************/ void FlashInit(void) { *AT91C_PIOA_PER=(1<<2)|(1<<15)|(1<<26)|(1<<27)|(1<<28)|(0xFF<<17); //Enable Flash IO *AT91C_PIOA_OER=(1<<2)|(1<<15)|(1<<26)|(1<<27)|(1<<28); //Output Enable Flash IO *AT91C_PIOA_ODR=(1<<29); //Output Disable PA29, R/B *AT91C_PIOA_SODR=(1<<26)|(1<<27)|(1<<28); //Set IO *AT91C_PIOA_OWER=(0xFF<<17); //使能直接操作端口的模式 FlashClrCle(); FlashClrAle(); FlashClrCe(); //选中芯片 FlashReset(); //FLASH复位 FlashSetCe(); //释放芯片 FlashCurrentWriteSectorAddr=-1; //初始化当前读、写地址为无效 FlashCurrentReadSectorAddr=-1; FlashNeedWriteBack=0; //初始化不用回写 FlashSwapBlockInit(); //初始化交换块 FlashClrCe(); //选中芯片 FlashLoadBadBlockTable(); //从FLASH中加载坏块表 FlashSetCe(); //释放芯片 }
/*************************************************************************** * NAME: void SelfTestCmd (void) - 0xFE * DESCRIPTION: * This routine is to Execute the LAA006's Self-Test Command. * ***************************************************************************/ void SelfTestCmd(void) { gc_bCSWStatus = 0x00; gc_ST_ErrorCode = 0; switch (COMD_IN[7]) { case ASK_PARA: //0x02 USB_BUF_Bank0[0x00] = 'L'; USB_BUF_Bank0[0x01] = 'A'; USB_BUF_Bank0[0x02] = 'A'; USB_BUF_Bank0[0x03] = '0'; USB_BUF_Bank0[0x04] = '2'; USB_BUF_Bank0[0x05] = '6'; USB_BUF_Bank0[0x06] = '-'; USB_BUF_Bank0[0x07] = ' '; USB_BUF_Bank0[0x08] = 'B'; USB_BUF_Bank0[0x09] = 'a'; USB_BUF_Bank0[0x0A] = 'n'; USB_BUF_Bank0[0x0B] = 'k'; USB_BUF_Bank0[0x0C] = ' '; USB_BUF_Bank0[0x0D] = '1'; USB_BUF_Bank0[0x0E] = '0'; USB_BUF_Bank0[0x0F] = '0'; USB_BUF_Bank0[0x10] = '5'; USB_BUF_Bank0[0x11] = '1'; USB_BUF_Bank0[0x12] = '6'; USB_BUF_Bank0[0x13] = ' '; USB_BUF_Bank0[0x14] = NAND_INFO.cDEVICE_NUM; USB_BUF_Bank0[0x15] = (UBYTE)NAND_INFO.wPAGE_NUM; USB_BUF_Bank0[0x16] = (UBYTE)(NAND_INFO.wBLOCK_NUM>> 8); USB_BUF_Bank0[0x17] = (UBYTE)(NAND_INFO.wBLOCK_NUM); USB_BUF_Bank0[0x18] = NAND_INFO.cPLANE_NUM; USB_BUF_Bank0[0x19] = NAND_INFO.cINADDRMAX; FlashReset(); DEVICE_REG[0x0F] =0x00; CHK_Flash_Ready(); FLASH_REG [0x00] = 0x00; //強迫進IO Mode DEVICE_REG[0x23] = 0x0A; //CLE = '1', ALE = '0', nWP = '1', nCE = '0' DEVICE_REG[0x20] = 0x90; DEVICE_REG[0x23] = 0x06; //CLE = '0', ALE = '1', nWP = '1', nCE = '0' DEVICE_REG[0x20] = 0x00; DEVICE_REG[0x23] = 0x02; //CLE = '0', ALE = '0', nWP = '1', nCE = '0' USB_BUF_Bank0[0x1A] = DEVICE_REG[0x20]; //Maker Code gc_Global_I = 0; USB_BUF_Bank0[0x1B] = DEVICE_REG[0x20]; //Device Code gc_Global_I = 0; USB_BUF_Bank0[0x1C] = DEVICE_REG[0x20]; //多取一些預防新的Flash gc_Global_I = 0; USB_BUF_Bank0[0x1D] = DEVICE_REG[0x20]; gc_Global_I = 0; USB_BUF_Bank0[0x1E] = DEVICE_REG[0x20]; FLASH_REG [0x00] = 0x01; //進ACC Mode USB_BUF_Bank0[0x20] = 1; USB_BUF_Bank0[0X21] = (UBYTE)(SYS_ZONE.wZONE_SIZE>>8); USB_BUF_Bank0[0x22] = (UBYTE)(SYS_ZONE.wZONE_SIZE); USB_BUF_Bank0[0x23] = NAND_INFO.cFMAP; //Bit 4~7 表示HW不支持需要使用SW方式轉換 USB_BUF_Bank0[0x24] = 0; USB_BUF_Bank0[0x25] = NAND_INFO.cSUPPORT_MULT_PLANE; USB_BUF_Bank0[0x26] = NAND_INFO.cFLASH_TYPE;//0:SLC 1:MLC, 2:TLC USB_BUF_Bank0[0x27] = gbt_newFlash; // 當ID table 中沒有支援 //-------------------------------------// 081212 Jay for flash capacity USB_BUF_Bank0[0x30] = Capacity.BY[0]; USB_BUF_Bank0[0x31] = Capacity.BY[1]; USB_BUF_Bank0[0x32] = Capacity.BY[2]; USB_BUF_Bank0[0x33] = Capacity.BY[3]; //-- 2010 03 new LDZ039 parameter --// USB_BUF_Bank0[0x40] = (UBYTE)(NAND_INFO.wPAGE_NUM>>8); USB_BUF_Bank0[0X41] = NAND_INFO.cECC_MODE;// 0-->24 1-->16 USB_BUF_Bank0[0x42] = NAND_INFO.cECC_NUM; USB_BUF_Bank0[0x43] = 0xFF;//temp USB_BUF_Bank0[0x44] = 0xFF;//temp USB_BUF_Bank0[0x45] = 0xFF;//temp USB_BUF_Bank0[0x46] = 0xFF;//temp USB_BUF_Bank0[0x47] = 0xFF;//temp //-------------------------------------// USB_REG[0x10] = 0x01; //BulkInEn auto turn-on(dma over) USB_REG[0x16] = 0x02; USB_REG[0x15] = 0x00; USB_REG[0xA1] = 0x01; while (USB_REG[0xA1] & 0x01); USB_REG[0x10] = 0x00; //BulkInEn auto turn-off(dma over) USB_REG[0xE9] = 0x01; break; default: gc_bCSWStatus = 0x01; gc_RequestSenseCode = 0x03; //參數不支援 break; } if (gc_ST_ErrorCode) { gc_bCSWStatus = 0x01; gc_RequestSenseCode = 0x88; } }