200 lines
6.0 KiB
Plaintext
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 ¶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
|
|
)
|
|
|