안녕하세요
제가 낸드플래쉬를 제어하고 싶은데 인터넷에서 본 소스는 제가 하려는 메모리와 Spec상에 차이가 있어 고치려고 하는데 소스중에 이해가 되지 않는 부분이 있어 글을 올리게 되었습니다.
아래는
K9K2G16U0M 용 Page Read 코드인데
{{{
static int NF16_ReadPage(U32 block,U32 page,U32 *buffer)
{
int i;
unsigned int blockPage;
U32 Mecc0, Mecc1, Secc;
U32 *bufPt=buffer;
blockPage=(block<<6)+page;
NF_RSTECC(); // Initialize ECC
NF_MECC_UnLock();
NF_nFCE_L();
NF_CLEAR_RB();
NF_CMD(0x00); // Read command
NF_ADDR(0); // Column (A[7:0]) = 0
NF_ADDR(0); // A[10:8]
NF_ADDR((blockPage)&0xff); // A[18:11]
NF_ADDR((blockPage>>8)&0xff); // A[26:19]
NF_ADDR((blockPage>>16)&0xff); // A27
NF_CMD(0x30); // 2'nd command
NF_DETECT_RB();
}}}
좀 이해가 되지 않는 부분은 바로
{{{
NF_ADDR(0); // Column (A[7:0]) = 0 <----- 무슨 용도인지 설명을 부탁드립니다.
NF_ADDR(0); // A[10:8] <----- 왜 0을 넣죠 ?
NF_ADDR((blockPage)&0xff); // A[18:11]
NF_ADDR((blockPage>>8)&0xff); // A[26:19]
NF_ADDR((blockPage>>16)&0xff); // A27
}}} 입니다.
controller가 있는 녀석이면 위의 코드가 필요없습니다.
CPLD나 FPGA 혹은 로직을 가지고 접근할때 쓰는 코드일 듯 싶네요.
저도 오래되어서 까먹었는데, 유영창씨가 kelp에서 했던 강좌에 보면 자세한 내용이 있을겁니다.
nand에 대해 공부를 했었도, 직접 저런 방식으로 쓰지를 않다보니 다 까먹네요....ㅎㅎ