Files
2025-10-14 09:52:32 +09:00

200 lines
6.0 KiB
Plaintext

; --------------------------------------------------------------------------------
; @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 &parameters
ENTRY %LINE &parameters
PRIVATE &param_prepareonly &param_dualport
&parameters=STRing.UPpeR("&parameters")
&param_prepareonly=(STRing.SCAN("&parameters","PREPAREONLY",0)!=-1)
&param_dualport=STRing.SCANAndExtract("&parameters","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 ("&param_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 &param_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
)