You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
230 lines
7.5 KiB
230 lines
7.5 KiB
#------------------------------------------------
|
|
# SDRAM initialization script for the AT91SAM9260
|
|
#------------------------------------------------
|
|
|
|
#----------------------------------------------------------------------------
|
|
# _InitRSTC()
|
|
# Function description
|
|
# Initializes the RSTC (Reset controller).
|
|
# This makes sense since the default is to not allow user resets, which makes it impossible to
|
|
# apply a second RESET via J-Link
|
|
#----------------------------------------------------------------------------
|
|
|
|
define _InitRSTC
|
|
# Allow user reset
|
|
set *0xFFFFFD08=0xA5000001
|
|
end
|
|
|
|
#----------------------------------------------------------------------------
|
|
# _MapRAMAt0()
|
|
# Function description: Maps RAM at 0.
|
|
#----------------------------------------------------------------------------
|
|
define _MapRAMAt0
|
|
echo "---------- SRAM remapped to 0 --------" \n
|
|
# Test and set Remap
|
|
set $__mac_i = *0xFFFFEF00
|
|
if ( (($__mac_i & 0x01) == 0) || (($__mac_i & 0x02) == 0))
|
|
#toggle remap bits
|
|
set *0xFFFFEF00 = 0x03
|
|
else
|
|
echo "---------- The Remap is done ---------" \n
|
|
end
|
|
end
|
|
|
|
#----------------------------------------------------------------------------
|
|
#
|
|
# _PllSetting()
|
|
# Function description
|
|
# Initializes the PMC.
|
|
# 1. Enable the Main Oscillator
|
|
# 2. Configure PLL
|
|
# 3. Switch Master
|
|
#----------------------------------------------------------------------------
|
|
|
|
define __PllSetting
|
|
if ((*(0xFFFFFC30)&0x3) != 0 )
|
|
# Disable all PMC interrupt ( $$ JPP)
|
|
# AT91C_PMC_IDR ((AT91_REG *) 0xFFFFFC64) #(PMC) Interrupt Disable Register
|
|
# pPmc->PMC_IDR = 0xFFFFFFFF;
|
|
set *0xFFFFFC64 = 0xFFFFFFFF
|
|
# AT91C_PMC_PCDR ((AT91_REG *) 0xFFFFFC14) #(PMC) Peripheral Clock Disable Register
|
|
set *0xFFFFFC14 = 0xFFFFFFFF
|
|
# Disable all clock only Processor clock is enabled.
|
|
set *0xFFFFFC04 = 0xFFFFFFFE
|
|
# AT91C_PMC_MCKR ((AT91_REG *) 0xFFFFFC30) # (PMC) Master Clock Register
|
|
set *0xFFFFFC30 = 0x00000001
|
|
|
|
while ((*0xFFFFFC68 & 0x8) == 0)
|
|
end
|
|
|
|
|
|
# write reset value to PLLA and PLLB
|
|
# AT91C_PMC_PLLAR ((AT91_REG *) 0xFFFFFC28) # (PMC) PLL A Register
|
|
set *0xFFFFFC28 = 0x00003F00
|
|
|
|
# AT91C_PMC_PLLBR ((AT91_REG *) 0xFFFFFC2C) # (PMC) PLL B Register
|
|
set *0xFFFFFC2C 0x00003F00
|
|
while ((*0xFFFFFC68 & 0x2) == 0)
|
|
end
|
|
while ((*0xFFFFFC68 & 0x4) == 0)
|
|
end
|
|
|
|
echo "---------- PLL Enable ---------------" \n
|
|
|
|
else
|
|
echo "---------- Core in SLOW CLOCK mode ---" \n
|
|
end
|
|
end
|
|
|
|
|
|
#----------------------------------------------------------------------------
|
|
#
|
|
# __PllSetting100MHz()
|
|
# Function description
|
|
# Set core at 200 MHz and MCK at 100 MHz
|
|
#----------------------------------------------------------------------------
|
|
|
|
define __PllSetting100MHz
|
|
echo "---------- PLL Set at 100 MHz --------" \n
|
|
|
|
#* pPmc->PMC_MOR = (( AT91C_CKGR_OSCOUNT & (0x40 <<8) | AT91C_CKGR_MOSCEN ));
|
|
set *0xFFFFFC20=0x00004001
|
|
while ((*0xFFFFFC68 & 0x1) == 0)
|
|
end
|
|
# AT91C_PMC_MCKR ((AT91_REG *) 0xFFFFFC30) # (PMC) Master Clock Register
|
|
set *0xFFFFFC30=0x00000001
|
|
while ((*0xFFFFFC68 & 0x8) == 0)
|
|
end
|
|
#* AT91C_BASE_CKGR->CKGR_PLLAR = (AT91C_CKGR_SRCA | ((96 << 16) & AT91C_CKGR_MULA) |
|
|
# (AT91C_CKGR_PLLACOUNT | (AT91C_CKGR_OUTA_0 | (9);
|
|
set *0xFFFFFC28=0x2060BF09
|
|
while ((*0xFFFFFC68 & 0x2) == 0)
|
|
end
|
|
# Configure PLLB
|
|
set *0xFFFFFC2C=0x207C3F0C
|
|
while ((*0xFFFFFC68 & 0x4) == 0)
|
|
end
|
|
#* AT91C_BASE_PMC->PMC_MCKR = AT91C_PMC_CSS_PLLA_CLK | AT91C_PMC_PRES_CLK | AT91C_PMC_MDIV_2;;
|
|
set *0xFFFFFC30=0x00000102
|
|
while ((*0xFFFFFC68 & 0x8) == 0)
|
|
end
|
|
end
|
|
|
|
|
|
#----------------------------------------------------------------------------
|
|
# __initSDRAM()
|
|
# Function description
|
|
# Set SDRAM for works at 100 MHz
|
|
#----------------------------------------------------------------------------
|
|
|
|
define __initSDRAM
|
|
|
|
# Configure EBI Chip select
|
|
# pCCFG->CCFG_EBICSA |= AT91C_EBI_CS1A_SDRAMC;
|
|
# AT91C_CCFG_EBICSA ((AT91_REG *) 0xFFFFEF1C) # (CCFG) EBI Chip Select Assignement Register
|
|
set *0xFFFFEF1C=0x0001003A
|
|
|
|
# Configure PIOs
|
|
# AT91F_PIO_CfgPeriph( AT91C_BASE_PIOC, AT91C_PC16_D16 to AT91C_PC16_D31
|
|
# pPio->PIO_ASR = periphAEnable; AT91C_PIOC_ASR ((AT91_REG *) 0xFFFFF870) # (PIOC) Select A Register
|
|
# pPio->PIO_BSR = periphBEnable;AT91C_PIOC_BSR ((AT91_REG *) 0xFFFFF874) # (PIOC) Select B Register
|
|
# pPio->PIO_PDR = (periphAEnable | periphBEnable # Set in Periph mode
|
|
set *0xFFFFF870=0xFFFF0000
|
|
set *0xFFFFF874=0x00000000
|
|
set *0xFFFFF804=0xFFFF0000
|
|
|
|
# psdrc->SDRAMC_CR = AT91C_SDRAMC_NC_9 | AT91C_SDRAMC_NR_13 | AT91C_SDRAMC_CAS_2 |
|
|
# AT91C_SDRAMC_NB_4_BANKS | AT91C_SDRAMC_DBW_32_BITS | AT91C_SDRAMC_TWR_2 | AT91C_SDRAMC_TRC_7 |
|
|
# AT91C_SDRAMC_TRP_2 | AT91C_SDRAMC_TRCD_2 | AT91C_SDRAMC_TRAS_5 | AT91C_SDRAMC_TXSR_8 ;
|
|
set *0xFFFFEA08=0x85227259
|
|
set $i = 0
|
|
while $i != 100
|
|
set $i += 1
|
|
end
|
|
# psdrc->SDRAMC_MR = 0x00000002; # Set PRCHG AL
|
|
set *0xFFFFEA00=0x00000002
|
|
# *AT91C_SDRAM = 0x00000000; # Perform PRCHG
|
|
set *0x20000000=0x00000000
|
|
set $i = 0
|
|
while $i != 100
|
|
set $i += 1
|
|
end
|
|
|
|
# psdrc->SDRAMC_MR = AT91C_SDRAMC_MODE_RFSH_CMD; # Set 1st CBR
|
|
set *0xFFFFEA00=0x00000004
|
|
|
|
# *(AT91C_SDRAM+4) = 0x00000001; # Perform CBR
|
|
set *0x20000010=0x00000001
|
|
|
|
# psdrc->SDRAMC_MR = 0x00000004; # Set 2 CBR
|
|
set *0xFFFFEA00=0x00000004
|
|
# *(AT91C_SDRAM+8) = 0x00000002; # Perform CBR
|
|
set *0x20000020=0x00000002
|
|
|
|
# psdrc->SDRAMC_MR = AT91C_SDRAMC_MODE_RFSH_CMD; # Set 3 CBR
|
|
set *0xFFFFEA00=0x00000004
|
|
# *(AT91C_SDRAM+0xc) = 0x00000003; # Perform CBR
|
|
set *0x20000030=0x00000003
|
|
|
|
# psdrc->SDRAMC_MR = AT91C_SDRAMC_MODE_RFSH_CMD; # Set 4 CBR
|
|
set *0xFFFFEA00=0x00000004
|
|
# *(AT91C_SDRAM+0x10) = 0x00000004; # Perform CBR
|
|
set *0x20000040=0x00000004
|
|
|
|
# psdrc->SDRAMC_MR = AT91C_SDRAMC_MODE_RFSH_CMD; # Set 5 CBR
|
|
set *0xFFFFEA00=0x00000004
|
|
# *(AT91C_SDRAM+0x14) = 0x00000005; # Perform CBR
|
|
set *0x20000050=0x00000005
|
|
|
|
# psdrc->SDRAMC_MR = AT91C_SDRAMC_MODE_RFSH_CMD; # Set 6 CBR
|
|
set *0xFFFFEA00=0x00000004
|
|
# *(AT91C_SDRAM+0x18) = 0x00000006; # Perform CBR
|
|
set *0x20000060=0x00000006
|
|
|
|
# psdrc->SDRAMC_MR = AT91C_SDRAMC_MODE_RFSH_CMD; # Set 7 CBR
|
|
set *0xFFFFEA00=0x00000004
|
|
# *(AT91C_SDRAM+0x1c) = 0x00000007; # Perform CBR
|
|
set *0x20000070=0x00000007
|
|
|
|
# psdrc->SDRAMC_MR = AT91C_SDRAMC_MODE_RFSH_CMD; # Set 8 CBR
|
|
set *0xFFFFEA00=0x00000004
|
|
# *(AT91C_SDRAM+0x20) = 0x00000008; # Perform CBR
|
|
set *0x20000080=0x00000008
|
|
|
|
# psdrc->SDRAMC_MR = AT91C_SDRAMC_MODE_LMR_CMD; # Set LMR operation
|
|
set *0xFFFFEA00=0x00000003
|
|
# *(AT91C_SDRAM+0x24) = 0xcafedede; # Perform LMR burst=1, lat=2
|
|
set *0x20000090=0xCAFEDEDE
|
|
|
|
# psdrc->SDRAMC_TR = (AT91C_MASTER_CLOCK * 7)/1000000; # Set Refresh Timer 390 for 25MHz (TR= 15.6 * F )
|
|
set *0xFFFFEA04=0x000002B9
|
|
|
|
#* psdrc->SDRAMC_MR = AT91C_SDRAMC_MODE_NORMAL_CMD; # Set Normal mode
|
|
set *0xFFFFEA00=0x00000000
|
|
|
|
#* *AT91C_SDRAM = 0x00000000; # Perform Normal mode
|
|
set *0x20000000=0x00000000
|
|
echo "---------- SDRAM Done at 100 MHz -----" \n
|
|
end
|
|
|
|
# Step1: Connect to the J-Link gdb server
|
|
define reset
|
|
#target remote localhost:2331
|
|
monitor reset
|
|
|
|
# Step2: Reset peripheral (RSTC_CR)
|
|
#Init PLL
|
|
__PllSetting
|
|
__PllSetting100MHz
|
|
__initSDRAM
|
|
#* Set the RAM memory at 0x0020 0000 & 0x0000 0000
|
|
_MapRAMAt0
|
|
_InitRSTC
|
|
|
|
# Step3: Load file(eg. getting-started project)
|
|
load
|
|
|
|
mon reg pc=0x20000000
|
|
#info reg
|
|
|
|
end |