📄 k9s1208_new.cpp
字号:
#include "stdafx.h"
#include <string.h>
#include "def.h"
#include "option.h"
#include "2410addr.h"
#include "2410lib.h"
#include "2410slib.h"
#define BAD_CHECK (0)
#define ECC_CHECK (0)
#define S2410_MAX_CELL_INDEX 426 //0~426
#define DATA0_7_CON (99)
#define DATA0_IN (100)
#define DATA0_OUT (98)
#define DATA1_IN (97)
#define DATA1_OUT (96)
#define DATA2_IN (95)
#define DATA2_OUT (94)
#define DATA3_IN (93)
#define DATA3_OUT (92)
#define DATA4_IN (91)
#define DATA4_OUT (90)
#define DATA5_IN (89)
#define DATA5_OUT (88)
#define DATA6_IN (87)
#define DATA6_OUT (86)
#define DATA7_IN (85)
#define DATA7_OUT (84)
#define DATA8_15_CON (82)
#define DATA8_IN (83)
#define DATA8_OUT (81)
#define DATA9_IN (80)
#define DATA9_OUT (79)
#define DATA10_IN (78)
#define DATA10_OUT (77)
#define DATA11_IN (76)
#define DATA11_OUT (75)
#define DATA12_IN (74)
#define DATA12_OUT (73)
#define DATA13_IN (72)
#define DATA13_OUT (71)
#define DATA14_IN (70)
#define DATA14_OUT (69)
#define DATA15_IN (68)
#define DATA15_OUT (67)
#define DATA16_23_CON (65)
#define DATA16_IN (66)
#define DATA16_OUT (64)
#define DATA17_IN (63)
#define DATA17_OUT (62)
#define DATA18_IN (61)
#define DATA18_OUT (60)
#define DATA19_IN (59)
#define DATA19_OUT (58)
#define DATA20_IN (57)
#define DATA20_OUT (56)
#define DATA21_IN (55)
#define DATA21_OUT (54)
#define DATA22_IN (53)
#define DATA22_OUT (52)
#define DATA23_IN (51)
#define DATA23_OUT (50)
#define DATA24_31_CON (48)
#define DATA24_IN (49)
#define DATA24_OUT (47)
#define DATA25_IN (46)
#define DATA25_OUT (45)
#define DATA26_IN (44)
#define DATA26_OUT (43)
#define DATA27_IN (42)
#define DATA27_OUT (41)
#define DATA28_IN (40)
#define DATA28_OUT (39)
#define DATA29_IN (38)
#define DATA29_OUT (37)
#define DATA30_IN (36)
#define DATA30_OUT (35)
#define DATA31_IN (34)
#define DATA31_OUT (33)
#define ADDR0_CON (140)
#define ADDR0 (139)
#define ADDR1_15_CON (138)
#define ADDR1 (137)
#define ADDR2 (136)
#define ADDR3 (135)
#define ADDR4 (134)
#define ADDR5 (133)
#define ADDR6 (132)
#define ADDR7 (131)
#define ADDR8 (130)
#define ADDR9 (129)
#define ADDR10 (128)
#define ADDR11 (127)
#define ADDR12 (126)
#define ADDR13 (125)
#define ADDR14 (124)
#define ADDR15 (123)
#define ADDR16_CON (122)
#define ADDR16 (121)
#define ADDR17_CON (120)
#define ADDR17 (119)
#define ADDR18_CON (118)
#define ADDR18 (117)
#define ADDR19_CON (116)
#define ADDR19 (115)
#define ADDR20_CON (114)
#define ADDR20 (113)
#define ADDR21_CON (112)
#define ADDR21 (111)
#define ADDR22_CON (110)
#define ADDR22 (109)
#define ADDR23_CON (108)
#define ADDR23 (107)
#define ADDR24_CON (106)
#define ADDR24 (105)
#define ADDR25_CON (104)
#define ADDR25 (103)
#define ADDR26_CON (102)
#define ADDR26 (101)
#define CLE (168)
#define ALE (169)
#define nFCE (172)
#define nFWE (170)
#define nFRE (171)
#define nWE (148)
#define nOE (147)
#define nBE0 (146)
#define nBE1 (145)
#define nBE2 (144)
#define nBE3 (143)
#define nSRAS (142)
#define nSCAS (141)
#define NCON0 (229)
#define nWAIT (167)
#define nGCS67_CON (166)
#define nGCS7 (165)
#define nGCS6 (164)
#define nGCS5_CON (163)
#define nGCS5 (162)
#define nGCS4_CON (161)
#define nGCS4 (160)
#define nGCS3_CON (159)
#define nGCS3 (158)
#define nGCS2_CON (157)
#define nGCS2 (156)
#define nGCS1_CON (155)
#define nGCS1 (154)
#define nGCS0_ETC_CON (153) //nGCS0,nWE,nOE,nBEn,nSRAS,nSCAS
#define nGCS0 (152)
#define LOW '0'
#define HIGH '1'
int dataOutCellIndex[32];
int dataInCellIndex[32];
char inCellValue[S2410_MAX_CELL_INDEX+2];
int DownloadData(void);
static void InputTargetBlock(void);
static U32 srcAddress;
static U32 targetBlock; // Block number (0 ~ 4095)
static U32 targetSize; // Total byte size
U32 downloadAddress;
U32 downloadProgramSize=0x0;
//*************** JTAG dependent functions ***************
void K9S1208_JtagInit(void);
static void NF_CMD(U8 cmd);
static void NF_ADDR(U8 addr);
static void NF_nFCE_L(void);
static void NF_nFCE_H(void);
static U8 NF_RDDATA(void);
static void NF_WRDATA(U8 data);
static void NF_WAITRB(void);
//*************** H/W dependent functions ***************
static U16 NF_CheckId(void);
static int NF_EraseBlock(U32 blockNum);
static int NF_ReadPage(U32 block,U32 page,U8 *buffer,U8 *spareBuf);
static int NF_WritePage(U32 block,U32 page,U8 *buffer,U8 *spareBuf);
//buffer size is 512 bytes
static int NF_IsBadBlock(U32 block);
static int NF_MarkBadBlock(U32 block);
static void NF_Reset(void);
static void NF_Init(void);
//*******************************************************
void K9S1208_PrintBlock(void);
void K9S1208_Program(void);
static U8 blockBuf[0x4000];
char outCellValue[S2410_MAX_CELL_INDEX+2];
int TestECC(void)
{
int i;
return 0;
}
U8 S2410_GetDataByte(void)
{
int i;
U8 data=0;
for(i=0;i<8;i++)
{
if(inCellValue[dataInCellIndex[i]]==HIGH)
{
data = (data | (1<<i));
}
}
return data;
}
void S2410_SetDataByte(U8 data)
{
int i;
for(i=0;i<8;i++)
{
if(data & (1<<i))
outCellValue[dataOutCellIndex[i]]=HIGH;
else
outCellValue[dataOutCellIndex[i]]=LOW;
}
}
void S2410_SetPin(int index, char value)
{
outCellValue[index] = value;
}
static void *function[][2]=
{
(void *)K9S1208_Program, "K9S1208 Program ",
(void *)K9S1208_PrintBlock, "K9S1208 Pr BlkPage ",
(void *)1, "Exit ",
0,0
};
void K9S1208_Menu(void)
{
int i;
U16 id;
printf("\n[K9S1208 NAND Flash JTAG Programmer]\n");
K9S1208_JtagInit();
NF_Init();
id=NF_CheckId();
if(id!=0xec76)
{
printf("ERROR: K9S1208 is not detected. Detected ID=0x%x.\n",id);
return;
}
else
{
printf("K9S1208 is detected. ID=0x%x\n",id);
}
while(1)
{
i=0;
while(1)
{ //display menu
printf("%2d:%s",i,function[i][1]);
i++;
if((int)(function[i][0])==0)
{
printf("\n");
break;
}
if((i%4)==0)
printf("\n");
}
printf("Select the function to test :");
scanf("%d",&i);
if( i>=0 && (i<((sizeof(function)/8)-2)) )
( (void (*)(void)) (function[i][0]) )();
else
break; //Exit menu
}
}
U8 flash_data[512]={'H','E','L','L','O',',','W','O','R','L','D'};
void K9S1208_Program(void)
{
int i;
int programError=0;
U32 blockIndex;
int noLoad=0,imageSize;
U8 spareBuf[16]=
{0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
U8 *srcPt;
U32 progSize=0;
Uart_Printf("\n[SMC(K9S1208V0M) NAND Flash Writing Program]\n");
Uart_Printf("\nAvailable target block number: 0~1023\n");
Uart_Printf("Input target block number:");
targetBlock=Uart_GetIntNum();
targetSize=0x4000;
Uart_Printf("target start block number =%d\n",targetBlock);
Uart_Printf("target size (0x4000*n) =0x%x\n",targetSize);
Uart_Printf("STATUS:");
blockIndex=targetBlock;
imageSize=0x4000;
#if BAD_CHECK
if(NF_IsBadBlock(blockIndex) && blockIndex!=0 ) // 1:bad 0:good
{
blockIndex++; // for next block
noLoad=1;
return ;
}
#endif
if(!NF_EraseBlock(blockIndex))
{
blockIndex++; // for next block
noLoad=1;
return ;
}
Uart_Printf("E");
srcPt=(U8 *)flash_data;
for(i=0;i<32;i++)
{
if(!NF_WritePage(blockIndex,i,srcPt,NULL/*spareBuf*/))// block num, page num, buffer
{
programError=1;
break;
}
srcPt+=512; // Increase buffer addr one pase size
Uart_Printf("p");
}
Uart_Printf("\n");
if(programError==1)
{
blockIndex++;
noLoad=1;
programError=0;
return;
}
progSize+=0x4000;
if(progSize>=imageSize)
return; // Exit while loop
blockIndex++;
}
void K9S1208_PrintBlock(void)// Printf one page
{
int i;
U16 id;
U32 block,page;
U8 buffer[512+16];
printf("\n[SMC(K9S1208) NAND Flash block read]\n");
NF_Init();
id=NF_CheckId();
Uart_Printf("ID=%x(0xec76)\n",id);
if(id!=0xec76)
return;
Uart_Printf("Input target block number:");
block=Uart_GetIntNum();
Uart_Printf("Input target page number:");
page=Uart_GetIntNum();
NF_ReadPage(block,page,buffer,buffer+512);
Uart_Printf("block=%d,page=%d:",block,page);
for(i=0;i<512;i++)
{
if(i%16==0)
Uart_Printf("\n%3xh:",i);
Uart_Printf("%02x ",buffer[i]);
}
Uart_Printf("\nS.A.:",i);
for(i=512;i<512+16;i++)
{
Uart_Printf("%02x ",buffer[i]);
}
Uart_Printf("\n");
}
//*************************************************
//*************************************************
//** H/W dependent functions **
//*************************************************
//*************************************************
// NAND Flash Memory Commands
#define SEQ_DATA_INPUT (0x80)
#define READ_ID (0x90)
#define RESET (0xFF)
#define READ_1_1 (0x00)
#define READ_1_2 (0x01)
#define READ_2 (0x50)
#define PAGE_PROGRAM (0x10)
#define BLOCK_ERASE (0x60)
#define BLOCK_ERASE_CONFIRM (0xD0)
#define READ_STATUS (0x70)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -