📄 rw_spruceflash.cmd
字号:
#----------------------------------------------------------------------# IBM RISCWatch command file for updating the Sruce board flash with a VxWorks# bootrom image (bootrom.hex or bootrom_uncmp.hex). JTAG RISCWatch is required.### Usage: From a RISCWatch command line type one the following commands:## exec rw_spruceflash.cmd {"bootrom_uncmp.hex"}## exec rw_spruceflash.cmd {"bootrom.hex"}## Assumptions:# - Using AMD29F040 flash part# - Using Micron MT8LSDT264AG-662C1# 16Mb (2Mx64 bit) single sided DIMM. This is# the DIMM that shipped with 60x/7xx EVB. If a different# DIMM is used, this command file would not work properly# and would need to be modified.#----------------------------------------------------------------------parms {input_file}unload allwindow output#----------------------------------------------------------------------# reset the processor# Use probe's "halt on" command to guarantee good reset# even from empty flash#----------------------------------------------------------------------stop#jtag pass halt on#post note "Cycle power on the 6xx/7xx target board, the select OK"print "Initializing the Spruce board"reset chip#----------------------------------------------------------------------# Variables#----------------------------------------------------------------------create datacreate baudcreate refresh#----------------------------------------------------------------------# Set write enable for flash in bank 0 and NVRAM in bank 3#----------------------------------------------------------------------write dmem 0xFF500008 0x90write dmem 0xFF50000C 0x90000000#----------------------------------------------------------------------# Set timings for flash bank 0#----------------------------------------------------------------------write dmem 0xFF500008 0xE0 # index word to RPB0Pwrite dmem 0xFF50000C 0x1C0190F0 # set TW=7, THDRD=3, THDWR=2, FWT=F#----------------------------------------------------------------------# NVRAM setup#----------------------------------------------------------------------write dmem 0xFF500008 0x44 # index word to MB3SAwrite dmem 0xFF50000C 0xFF800000 # set starting addr 0xFF800000write dmem 0xFF500008 0x64 # index word to MB3EAwrite dmem 0xFF50000C 0xFF800000 # set ending addr 0xFF8FFFFF (1M)write dmem 0xFF500008 0xEC # index word to RPB3Pwrite dmem 0xFF50000C 0x2D0310F0 # set TW=B, CSON=1,THDRD=6, THDWR=2, FWT=F#----------------------------------------------------------------------# Determine baud rate to use for Serial port1 via FPGA_REG_A# UART_CLK_33 bit - if bit set then 33Mhz, if not then assume 30Mhz.#----------------------------------------------------------------------readb 0xFF820000 dataif ((data & 0x02) == 0) set baud = 0x31 # baud for 30Mhz CPC700endifif ((data & 0x02) == 0x02) set baud = 0x36 # baud for 33.33Mhz CPC700endif#----------------------------------------------------------------------# Initialize Serial Port 1#----------------------------------------------------------------------writeb dmem 0xFF600303 0x80writeb dmem 0xFF600300 baudwriteb dmem 0xFF600301 0x00writeb dmem 0xFF600303 0x03writeb dmem 0xFF600302 0x00writeb dmem 0xFF600304 0x03readb 0xFF600305readb 0xFF600300writeb dmem 0xFF600307 0x00writeb dmem 0xFF600301 0x00#----------------------------------------------------------------------# Set write enable for flash in bank 0#----------------------------------------------------------------------write dmem 0xFF500008 0x90write dmem 0xFF50000C 0x80000000#----------------------------------------------------------------------# Set up SDRAM bank (assumes 16MB 2Mx64 single-sided DIMM that was# shipped with the board is plugged)#----------------------------------------------------------------------write dmem 0xFF500008 0x24 # index word to MBENwrite dmem 0xFF50000C 0xD0000000 # enable bank 0,1,3 (flash,SDRAM,NVRAM)write dmem 0xFF500008 0x28 # index word to MEMTYPEwrite dmem 0xFF50000C 0x10000000 # set MT_1='01'if ((data & 0x02) == 0) set refresh = 0x03920000 # refresh for 30Mhz CPC700/60Mhz SDRAMendifif ((data & 0x02) == 0x02) set refresh = 0x03F80000 # refresh for 33.3Mhz CPC700/66.6Mhz SDRAMendifwrite dmem 0xFF500008 0x30 # index word to RTRwrite dmem 0xFF50000C refresh # set refreshwrite dmem 0xFF500008 0x34 # index word to DAMwrite dmem 0xFF50000C 0x00000000 # set DAM_1='00' Mode 1(11x9)write dmem 0xFF500008 0x3C # index word to MB1SAwrite dmem 0xFF50000C 0x00000000 # set starting addr 0x00000000write dmem 0xFF500008 0x5C # index word to MB1EAwrite dmem 0xFF50000C 0x00FFFFFF # set ending addr 0x00FFFFFF (16M)write dmem 0xFF500008 0x80 # index word to SDTR1write dmem 0xFF50000C 0x0004880A # set SD_APGE=0, SD_PTA=1, SD_WTP=2, # SD_RTP=2, SD_RFTA=2, SD_RCD=2write dmem 0xFF500008 0x94 # index word to ECCCFwrite dmem 0xFF50000C 0x00000000delay 2 # ensure 200usec expired since resetwrite dmem 0xFF500008 0x20 # index word to MCOPT1write dmem 0xFF50000C 0x85000000 # set DC_EN=1, DRAMTYP=2, BOOTROMP=1#----------------------------------------------------------------------# Initialize interrupt controller#----------------------------------------------------------------------write dmem 0xFF500880 0xFFFFFFFF # clear all intswrite dmem 0xFF500888 0x00000000 # disable all## Initialize SDRAM between 0x00000000 and 0x00080000 to look like a blank# flash (all 0xff).#print "Initializing SDRAM."memfill 0x00000000 0x00080000 0xff## Load the new bootrom image into SDRAM on top of the memory just initialized.##fprint "Loading new VxWorks bootrom image ", input_file, " into SDRAM.\n"create beforeset before = $ERRORSload mot input_fileif ($ERRORS > before) end # exit command fileendifprint "Loading flash update code into SDRAM."## Put assembly code in SDRAM that will program the bootrom image into an# AMD 29F040 flash device## progflash:write r3 0xffe00000 # flash base addresswrite r4 0x00000000 # base address of new ROM imagewrite r5 0xffe00000 # flash base address for incrementset hid0.ice = 1 # Turn icache on for faster execution # Don't place MMIO addresses past this point# Set r3 to base flash addressassm "addi r0, 0, 0xF0" 0x80000assm "stb r0, 0x0000(r3)" 0x80004assm "addi r0, 0, 0xAA" 0x80008assm "stb r0, 0x5555(r3)" 0x8000cassm "addi r0, 0, 0x55" 0x80010assm "stb r0, 0x2AAA(r3)" 0x80014assm "addi r0, 0, 0x90" 0x80018assm "stb r0, 0x5555(r3)" 0x8001c# r10 = MFG code# r11 = Device codeassm "lbz r10, 0x0000(r3)" 0x80020assm "lbz r11, 0x0001(r3)" 0x80024# Reset flash for read accessassm "addi r0, 0, 0xf0" 0x80028assm "stb r0, 0x0000(r3)" 0x8002c# Does MFG code = 0x01 (AMD)?assm "cmpwi r10, 0x01" 0x80030assm "bne $+0x0c" 0x80034 # to device_err:# Does Device code = 0xa4 (29F040)?assm "cmpwi r11, 0xa4" 0x80038assm "beq $+0x0c" 0x8003c # to device_ok:#device_err:assm "addi r0, 0, -1" 0x80040assm "bl $+0xd8" 0x80044 # to done:#device_ok:# erase whole chipassm "addi r0, 0, 0xaa" 0x80048assm "stb r0, 0x5555(r3)" 0x8004cassm "addi r0, 0, 0x55" 0x80050assm "stb r0, 0x2aaa(r3)" 0x80054assm "addi r0, 0, 0x80" 0x80058assm "stb r0, 0x5555(r3)" 0x8005cassm "addi r0, 0, 0xaa" 0x80060assm "stb r0, 0x5555(r3)" 0x80064assm "addi r0, 0, 0x55" 0x80068assm "stb r0, 0x2aaa(r3)" 0x8006cassm "addi r0, 0, 0x10" 0x80070assm "stb r0, 0x5555(r3)" 0x80074#erase_loop:assm "lbz r0, 0x0000(r3)" 0x80078assm "rlwinm r0,r0,0x0,0x18,0x18" 0x8007cassm "cmpwi cr0, r0, 0" 0x80080assm "bne $+0x28" 0x80084 # to program_flash:assm "lbz r0, 0x0000(r3)" 0x80088assm "rlwinm r0, r0, 0x0, 0x1a, 0x1a" 0x8008cassm "cmpwi cr0, r0, 0" 0x80090assm "beq $-0x1c" 0x80094 # to erase_loop:assm "lbz r0, 0x0000(r3)" 0x80098assm "rlwinm r0, r0, 0x0, 0x18, 0x18" 0x8009cassm "cmpwi cr0, r0, 0" 0x800a0assm "bne $+0x08" 0x800a4 # to program_flash:# err condition so set return code and leaveassm "bl $-0x68" 0x800a8 # to device_err:#program_flash:# Set (size) counter to 0x80000 bytes (512KB)assm "addis r0, 0, 0x0008" 0x800acassm "ori r0, r0, 0x0000" 0x800b0assm "mtctr r0" 0x800b4#top_of_loop:assm "addi r0, 0, 0xaa" 0x800b8assm "stb r0, 0x5555(r3)" 0x800bcassm "addi r0, 0, 0x55" 0x800c0assm "stb r0, 0x2aaa(r3)" 0x800c4assm "addi r0, 0, 0xa0" 0x800c8assm "stb r0, 0x5555(r3)" 0x800ccassm "lbz r2, 0x0000(r4)" 0x800d0assm "stb r2, 0x0(r5)" 0x800d4#poll:assm "lbz r0, 0x0000(r5)" 0x800d8assm "rlwinm r0, r0, 0x0, 0x18, 0x18" 0x800dcassm "rlwinm r1, r2, 0x0, 0x18, 0x18" 0x800e0assm "cmpw cr0, r0, r1" 0x800e4assm "beq $+0x28" 0x800e8 # to increment countersassm "lbz r0, 0x0(r5)" 0x800ecassm "rlwinm r0, r0, 0x0, 0x1a, 0x1a" 0x800f0assm "cmpwi cr0, r0, 0" 0x800f4assm "beq $-0x20" 0x800f8 # to poll:assm "lbz r0, 0x0(r5)" 0x800fcassm "rlwinm r0, r0, 0x0, 0x18, 0x18" 0x80100assm "rlwinm r1, r2, 0x0, 0x18, 0x18" 0x80104assm "cmpw cr0, r0, r1" 0x80108assm "bne $-0xcc" 0x8010c # to device_err# increment countersassm "addi r4, r4, 1" 0x80110assm "addi r5, r5, 1" 0x80114assm "bdnz $-0x60" 0x80118 # to top_of_loop:#done:assm "b $+0" 0x8011cwrite iar 0x80000bp set 0x8011c # set a breakpoint at the endprint "Starting flash update."set hid0.icfi = 1 # Invalidate icacheexpr hid0.icfirunif (r0 == -1) print "Flash update failed."else print "Flash update successful." bp clear allendifbp clear all# Rebootreset sys
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -