도와주세요!!
linux-src/driver/mtd/nand/falinux_logic_nand.c 에서
static void falinux_nand_hwcontrol(struct mtd_info *mtd, int cmd, unsigned int ctrl)
{
struct nand_chip *chip = mtd->priv;
if ( cmd != NAND_CMD_NONE )
{
#if defined(CONFIG_MACH_EZ_X5) || defined(CONFIG_MACH_ESP_NS) || defined(CONFIG_MACH_ESP_CX) || defined(CONFIG_MACH_EZ_PXA270) || defined(CONFIG_MACH_EZ_EP9312)
if ( ctrl & NAND_CLE ) { writeb( cmd, chip->IO_ADDR_W + 0x100 ); }
else if ( ctrl & NAND_ALE ) { writeb( cmd, chip->IO_ADDR_W + 0x200 ); }
#elif defined(CONFIG_MACH_ESP_MMI)
if ( ctrl & NAND_CLE ) { writeb( cmd, chip->IO_ADDR_W + 0x10000 ); }
else if ( ctrl & NAND_ALE ) { writeb( cmd, chip->IO_ADDR_W + 0x20000 ); }
#else
if ( ctrl & NAND_CLE ) { writeb( cmd, chip->IO_ADDR_W + 0x100 ); }
else if ( ctrl & NAND_ALE ) { writeb( cmd, chip->IO_ADDR_W + 0x200 ); }
#endif
}
}
위소스에서 + 0x100 과 0x200을 각각 해주는데 무슨 의미인지를 잘 모르겠습니다.
어디를 찾아봐야 할지도 막막하고 ㅠㅠ 도와주세요~
static void falinux_nand_select_chip(struct mtd_info *mtd, int chipnr)
{
struct nand_chip *chip = mtd->priv;
#if defined(CONFIG_MACH_EZ_X5) || defined(CONFIG_MACH_ESP_NS) || defined(CONFIG_MACH_EZ_EP9312)
switch (chipnr)
{
case 0:
writeb( 0 , chip->IO_ADDR_W + 0x300 );
writeb( 0 , chip->IO_ADDR_W + 0x000 );
break;
default :
writeb( 0 , chip->IO_ADDR_W + 0x300 );
break;
}
비슷한 부분이 같은 소스에 있네요ㅠㅠ
자답 입니다.. CPLD로 처리되는거였네요ㅜㅜ
부트로더와 플래시 메모리(2)-마소에 연재되었던 곳에서 발취했습니다.
-------------------------------------------------------------
◆ 0x04000000 : CE 신호를 LOW로 만든다.
◆ 0x04000100 : CLE 신호를 HIGH로 만든다.
◆ 0x04000200 : ALE 신호를 HIGH로 만든다.
◆ 0x04000300 : CE 신호를 HIGH로 만든다.
각 번지의 의미를 정확하게 살펴보자. NAND 플래시에서 CE 신호는 원칙적으로 NAND 플래시에 접근했을 때만 LOW로 처리하여야 한다. 그런데 앞에서도 설명했지만 실제로 사용하면 프로세서 버스와 분리시키는 버퍼를 사용하고, NAND 플래시에 대한 접근이 시작될 때부터 CE를 LOW로 만든 후에 모든 처리가 끝나면 CE를 다시 HIGH 신호 상태로 만드는 것이 유리하다. 그래서 EZ-X5에서는 이를 CPLD 회로를 이용하여 구현하고 있다.
이때 CE 신호와 연관된 주소가 바로 0x04000000과 0x04000300이다. 0x04000000 번지를 읽거나 쓰면 CE 단자는 LOW 상태가 되고 유지된다. 반대로 0x04000300 번지에 데이터를 읽거나 쓰면 CE 단자는 HIGH 상태가 되고 유지된다. 소프트웨어 프로그래머 입장에서 보면 0x04000000 번지는 NAND 플래시를 이제부터 사용하겠다고 알려주는 번지가 되고, 0x04000300은 NAND 플래시를 더 이상 사용하지 않겠다고 알려주는 번지로 이해하면 된다. 이 중에서 0x04000000 번지는 데이터를 써넣거나 읽기 용도로도 사용되도록 하드웨어적으로 구성되어 있다.