; -------------------------------------------------------------------------------- ; @Title: I.MX23 GPMI NAND FLASH Programming Script ; @Description: ; NAND FLASH(SAMSUNG,K9F4G08) is connected to the NAND_CS0 ; ; External SDRAM : 0x40010000 ; APBH-Bridge-DMA Register : 0x80004000 ; GPMIRegister : 0x8000C000 ; ; @Author: jjeong ; @Copyright: (C) 1989-2022 Lauterbach GmbH, licensed for use with TRACE32(R) only ; @Chip: IMX23 ; @Keywords: SAMSUNG K9F4G08 Flash NAND ; -------------------------------------------------------------------------------- ; $Id: imx23-nand2g08.cmm 11733 2023-01-16 08:55:12Z bschroefel $ LOCAL &arg1 ENTRY &arg1 &arg1=STRing.UPpeR("&arg1") // for example "PREPAREONLY" &GPMI_BASE=0x8000C000 &APBHDMA_BASE=0x80004000 &DMABUFF_BASE=0x40017100 ; the any address in the ram PRINT "initializing JTAG..." SYStem.CPU ARM926EJ-VFP SYStem.Option DACR ON ; give Debugger global write permissions TrOnchip.Set DABORT OFF ; used by Linux OS for page miss! TrOnchip.Set PABORT OFF ; used by Linux OS for page miss! TrOnchip.Set UNDEF OFF ; let UNDEF be handled by Linux OS SYStem.Option MMUSpaces OFF ; no space ids used (yet) SYStem.JtagClock 1.Mhz SETUP.IMASKASM ON ; lock interrupts while single stepping SYStem.Option.ResBreak OFF SYStem.Option.EnReset ON SYStem.Option.WaitReset ON SYStem.Mode.Go WAIT 2.s IF STATE.RUN() Break.direct PER.Set.simple C15:0x1 %Long 0x51078 ;MMU disable //pin mux Data.Set A:0x80018100 %LE %Long 0x00000000 Data.Set A:0x80018110 %LE %Long 0xFFF00000 GOSUB InitGPMI GOSUB READ_ID_TEST Break.RESet FLASHFILE.RESet //FLASHFILE.config FLASHFILE.CONFIG &APBHDMA_BASE &GPMI_BASE , , // FLASHFILE.TARGET FLASHFILE.TARGET 0x40010000++0x2FFF 0x40014000++0x3FFF ~~/demo/arm/flash/byte/nand2g08_gpmimx23.bin /KEEP /STACKSIZE 0x200 FLASHFILE.GETID ; Read ID //End of the test prepareonly IF "&arg1"=="PREPAREONLY" ENDDO ;FLASHFILE.DUMP 0x0 ; Read NAND ;FLASHFILE.ERASE 0x0--0xFFFFF /EraseBadBlock ; Erase NAND ;FLASHFILE.LOAD * 0x0 /WriteBadBlock ; Write NAND ENDDO READ_ID_TEST: ( //Write Command Data.Set A:&DMABUFF_BASE+0x00 %LE %Long 0x90 ;cmd Data.Set A:&DMABUFF_BASE+0x04 %LE %Long 0x00000000 ;next_buff Data.Set A:&DMABUFF_BASE+0x08 %LE %Long 0x0001409A ;gdma0.cmd Data.Set A:&DMABUFF_BASE+0x0C %LE %Long (&DMABUFF_BASE+0x00) ;gdma0.buff_ptr Data.Set A:&DMABUFF_BASE+0x10 %LE %Long 0x00c20001 ;gdma0.pioword[0] Data.Set A:&DMABUFF_BASE+0x14 %LE %Long 0x00000000 ;gdma0.pioword[1] Data.Set A:&DMABUFF_BASE+0x18 %LE %Long 0x00000000 ;gdma0.pioword[2] Data.Set A:&DMABUFF_BASE+0x1C %LE %Long 0x00000000 ;gdma0.pioword[3] GOSUB DoDMA //Write Address Data.Set A:&DMABUFF_BASE+0x00 %LE %Long 0x00000000 ;address Data.Set A:&DMABUFF_BASE+0x04 %LE %Long 0x00000000 ;next_buff Data.Set A:&DMABUFF_BASE+0x08 %LE %Long 0x0001109A ;gdma0.cmd Data.Set A:&DMABUFF_BASE+0x0C %LE %Long (&DMABUFF_BASE+0x00) ;gdma0.buff_ptr Data.Set A:&DMABUFF_BASE+0x10 %LE %Long 0x00C40001 ;gdma0.pioword[0] Data.Set A:&DMABUFF_BASE+0x14 %LE %Long 0x00000000 ;gdma0.pioword[1] GOSUB DoDMA //Read Data Data.Set A:&DMABUFF_BASE+0x00 %LE %Long 0x00000000 Data.Set A:&DMABUFF_BASE+0x04 %LE %Long 0x00000000 Data.Set A:&DMABUFF_BASE+0x08 %LE %Long 0x00041089 Data.Set A:&DMABUFF_BASE+0x0C %LE %Long (&DMABUFF_BASE+0x00) Data.Set A:&DMABUFF_BASE+0x10 %LE %Long 0x01C00004 Data.Set A:&DMABUFF_BASE+0x14 %LE %Long 0x00C40001 Data.Set A:&DMABUFF_BASE+0x18 %LE %Long 0x00000000 GOSUB DoDMA &data=Data.Long(A:&DMABUFF_BASE+0x00) PRINT "1st 0x" (&data&0x0FF) " (Manufacturer)" PRINT "2nd 0x" ((&data>>8.)&0x0FF) " (Device ID)" PRINT "3rd 0x" ((&data>>16.)&0x0FF) PRINT "4th 0x" ((&data>>24.)&0x0FF) RETURN ) DoDMA: ( //reset channel 4. Data.Set A:0x80004004 %LE %Long 0x00100000 ;RESET CHANNEL NAND0 Data.Set A:0x80004008 %LE %Long 0x00001000 ;HW_APBH_CTRL0_CLR Data.Set A:0x80004018 %LE %Long 0x00000010 ;HW_APBH_CTRL1_CLR //HW_APBH_CH4_NXTCMDAR Data.Set A:0x80004210 %LE %Long (&DMABUFF_BASE+0x4) Data.Set A:0x80004240 %LE %Long 0x00000001 //check status //print data.long(A:0x400108A0) WAIT 100.ms Data.Set A:0x80004018 %LE %Long 0x10 ; (0x1<