; -------------------------------------------------------------------------------- ; @Title: OSPI FLASH Program script for the G9H (SemiDrive) ; @Description: ; The OSPI flash is connected to the OSPI1_CS0 controller. ; Supported OSPI1 flash memories: ; - MT35XU256 ; OSPI1_DATA[0:7] - DQ[0:7] ; OSPI1_DQS - DQS ; OSPI1_SCLK - CK ; OSPI1_SS0 - CS1 ; OSPI1_RST_N(GPIO_B5) - RESET ; ; SRAM: ; OSPI(controller) Base: 0xF0020000 ; OSPI memory mapped ADDRESS: 0x04000000 ; ; @Keywords: ARM, Cortex-R5 ; @Chip: G9090 ; @Board: SD012-G9H-REF ; @Author: JIM ; @Copyright: (C) 1989-2023 Lauterbach GmbH, licensed for use with TRACE32(R) only ; -------------------------------------------------------------------------------- ; $Id: g9h-ospi.cmm 12099 2023-05-10 08:08:14Z jjeong $ PRIVATE ¶meters ENTRY %LINE ¶meters PRIVATE ¶m_prepareonly ¶m_dualport ¶meters=STRing.UPpeR("¶meters") ¶m_prepareonly=(STRing.SCAN("¶meters","PREPAREONLY",0)!=-1) ¶m_dualport=STRing.SCANAndExtract("¶meters","DUALPORT=","1") LOCAL &pdd &pdd=OS.PresentDemoDirectory() LOCAL &OSPI_BASE &OSPI_MEMORY_BASE &OSPI_BASE=0xF0020000 &OSPI_MEMORY_BASE=0x04000000 ; flash contents memory mapped address ; -------------------------------------------------------------------------------- ; initialize and start the debugger RESet SYStem.CPU G9090-SAF SYStem.MemAccess DAP SYStem.JtagClock 10MHz SYStem.Up ; Re-enable I cache Data.Set C15:0x0001 %Long (Data.Long(C15:0x1)|(0x1<<12.)) ; enable I cache Data.Set C15:0x0001 %Long 0yXXXXxxxxXXXXxxxxXXXXxxxxXXXXxxx0 ; Disable MPU GOSUB CLK_INIT GOSUB PIN_MUX GOSUB OSPI_INIT GOSUB READ_ID_TEST &pdd=OS.PresentDemoDirectory() Break.RESet FLASH.RESet FLASH.Create 1. &OSPI_MEMORY_BASE++0x01FFFFFF 0x20000 TARGET Byte ; for MT35XU256 IF ("¶m_dualport"!="1") FLASH.TARGET 0x00180000 0x00180000+0x2000 0x1000 ~~/demo/arm/flash/byte/snor_g9x.bin ELSE FLASH.TARGET 0x00180000 E:0x00180000+0x2000 0x1000 ~~/demo/arm/flash/byte/snor_g9x.bin /DualPort ; Read FLASH Manufacturer and Device ID SILENT.FLASH.SPI.CMD 1. 0x9F /READ 0x4 vm:0x0 GOSUB SPI_4B_ADDRMODE_ENABLE ; Flash script ends here if called with parameter PREPAREONLY IF ¶m_prepareonly ENDDO PREPAREDONE ; -------------------------------------------------------------------------------- ; Flash programming example DIALOG.YESNO "Program flash memory?" LOCAL &progflash ENTRY &progflash IF &progflash ( FLASH.ReProgram.ALL Data.LOAD.auto * ;Data.LOAD.Binary * &OSPI_MEMORY_BASE FLASH.ReProgram.off ; Reset device PRINT "Please power-cycle the board after flash program is complete" ) ENDDO READ_ID_TEST: ( ; In case of errors you can try to read the ID via: ; GOSUB READ_ID_TEST ; ; Check the output of the AREA window. ; Expected output ID: ; 0x2C ; 0x5B (or 0x5A) ; 0x1A ; 0x10 ; 0x41 ; 0x00 (or 0x04) ; ... (Unique ID code) LOCAL &rdata &CTRLREG=&OSPI_BASE+0x090 &RXDATA0=&OSPI_BASE+0x0A0 &RXDATA1=&OSPI_BASE+0x0A4 &cmd=0x9f<<24. //cmd &rd=0x1<<23. //rd data enable &rd_num=0x7<<20. //7+1==8bytes &cmd_exec=0x1 //cmd execution Data.Set A:&CTRLREG %LE %Long (&cmd|&cmd_exec|&rd_num|&rd) ;write cmd + write data WAIT 100.ms &rdata=Data.Long(A:&RXDATA0) ;read lower , 8byte fifo PRINT "1st 0x" (&rdata)&0xFF " (Manufacturer)" ; //RXFIFO0 PRINT "2nd 0x" (&rdata>>8.)&0xFF " (Device ID)" PRINT "3rd 0x" (&rdata>>16.)&0xFF PRINT "4th 0x" (&rdata>>24.)&0xFF &rdata=Data.Long(A:&RXDATA1) ;read upper , 8byte fifo PRINT "5th 0x" (&rdata)&0xFF PRINT "6th 0x" (&rdata>>8.)&0xFF PRINT "7th 0x" (&rdata>>16.)&0xFF PRINT "8th 0x" (&rdata>>24.)&0xFF RETURN ) OSPI_INIT: ( &MSTR_BAUD_DIV=(0x8<<19.) ;Master mode baud rate, [22:19] &CS_LINES=(0xE<<10.) ;ss[3:0] == 1110 &ENB_DIR_ACC_CTRL=(0x1<<7.) ;Enable Direct Access Controller &RESET_CFG=(0x1<<6.) ;GPIO_B5 for reset_out &RESET_PIN=(0x1<<5.) ;reset activation & de-activation &ENB_SPI=0x1 //RESET QuadSPI flash with OSPI_RESET_N (GPIO_B5) Data.Set A:&OSPI_BASE+0x0 %LE %Long &ENB_DIR_ACC_CTRL|&RESET_CFG|&RESET_PIN|&ENB_SPI WAIT 100.ms Data.Set A:&OSPI_BASE+0x0 %LE %Long &ENB_DIR_ACC_CTRL|&RESET_CFG|&ENB_SPI WAIT 100.ms Data.Set A:&OSPI_BASE+0x0 %LE %Long &ENB_DIR_ACC_CTRL|&RESET_CFG|&CS_LINES Data.Set A:&OSPI_BASE+0x4 %LE %Long 0x00000013 ; 4B Addr Read Data.Set A:&OSPI_BASE+0x8 %LE %Long 0x00000012 ; 4B Addr Write Data.Set A:&OSPI_BASE+0x0 %LE %Long Data.Long(A:&OSPI_BASE+0x0)|&MSTR_BAUD_DIV|&ENB_SPI Data.Set A:&OSPI_BASE+0x14 %LE %Long 0x1003; 4B Address mode, 3B Addr: 0x1002 Data.Set A:&OSPI_BASE+0x10 %LE %Long 0x21 Data.Set A:&OSPI_BASE+0x1C %LE %Long 0xFFFFFFFF Data.Set A:&OSPI_BASE+0x0C %LE %Long (0xFF<<16.)|(0xFF<<8.) ; !!!!! OSPI_DEV_DELAY_REG because of writing !!!!! Data.Set A:&OSPI_BASE+0x1C %LE %Long 0x04000000 ;ospi_setdirectcutoff, end of the flash address RETURN ) PIN_MUX: ( Data.Set A:0xFC500000+(0x200<<10.) %Long 0x1 ;alt1 ,PIN_MUX_OSPI1_SCLK Data.Set A:0xFC500000+(0x204<<10.) %Long 0x1 ;alt1 ,PIN_MUX_OSPI1_SS0 Data.Set A:0xFC500000+(0x208<<10.) %Long 0x1 ;alt1 ,PIN_MUX_OSPI1_DATA0 Data.Set A:0xFC500000+(0x20C<<10.) %Long 0x1 ;alt1 ,PIN_MUX_OSPI1_DATA1 Data.Set A:0xFC500000+(0x210<<10.) %Long 0x1 ;alt1 ,PIN_MUX_OSPI1_DATA2 Data.Set A:0xFC500000+(0x214<<10.) %Long 0x1 ;alt1 ,PIN_MUX_OSPI1_DATA3 Data.Set A:0xFC500000+(0x218<<10.) %Long 0x1 ;alt1 ,PIN_MUX_OSPI1_DATA4 Data.Set A:0xFC500000+(0x21C<<10.) %Long 0x1 ;alt1 ,PIN_MUX_OSPI1_DATA5 Data.Set A:0xFC500000+(0x220<<10.) %Long 0x1 ;alt1 ,PIN_MUX_OSPI1_DATA6 Data.Set A:0xFC500000+(0x224<<10.) %Long 0x1 ;alt1 ,PIN_MUX_OSPI1_DATA7 Data.Set A:0xFC500000+(0x228<<10.) %Long 0x1 ;alt1 ,PIN_MUX_OSPI1_DQS //OSPI_RESET_N, PIN_MUX_GPIO_B5 Data.Set A:0xFC500000+(0x2A4<<10.) %Long 0x4 ;alt4 ,PIN_MUX_OSPI1_RESET_N RETURN ) CLK_INIT: ( RETURN ) //ISSI ENTER 4-BYTE, default is 3bytes SPI_4B_ADDRMODE_ENABLE: ( SILENT.FLASH.SPI.CMD 1. 0xB7 //Switch to 4Byte address mode RETURN )