diff --git a/usb-loader/samba_applets/at91lib/boards/at91sam9g45-ek/board_memories.c b/usb-loader/samba_applets/at91lib/boards/at91sam9g45-ek/board_memories.c index dc506e1a72bb2ac27427605aa9d0fad276a7c9de..1efc83ae1a6537bd800a58bb1ffd0cd3e23f444a 100644 --- a/usb-loader/samba_applets/at91lib/boards/at91sam9g45-ek/board_memories.c +++ b/usb-loader/samba_applets/at91lib/boards/at91sam9g45-ek/board_memories.c @@ -38,6 +38,7 @@ #include <board.h> #include <pio/pio.h> #include "board_memories.h" +#include <utility/trace.h> /* Macros: @@ -49,6 +50,12 @@ #define READ(peripheral, register) (peripheral->register) #define WRITE(peripheral, register, value) (peripheral->register = value) +//------------------------------------------------------------------------------ +// External definitions +//------------------------------------------------------------------------------ +#ifndef AT91C_DDRC2_NR_VAL + #define AT91C_DDRC2_NR_VAL 13 //This value should be 13 for WRS3-18 +#endif //------------------------------------------------------------------------------ // Internal functions @@ -78,20 +85,20 @@ void BOARD_RemapRam() } - -void BOARD_ConfigureVddMemSel(unsigned char VddMemSel) -{ - - if (VddMemSel == VDDMEMSEL_3V3) { - AT91C_BASE_MATRIX->MATRIX_EBICSA |= (1 << 16); - AT91C_BASE_MATRIX->MATRIX_EBICSA &= ~(1 << 17); - } - else { - AT91C_BASE_MATRIX->MATRIX_EBICSA &= ~(1 << 16); - AT91C_BASE_MATRIX->MATRIX_EBICSA &= ~(1 << 17); - } - } - + +void BOARD_ConfigureVddMemSel(unsigned char VddMemSel) +{ + + if (VddMemSel == VDDMEMSEL_3V3) { + AT91C_BASE_MATRIX->MATRIX_EBICSA |= (1 << 16); + AT91C_BASE_MATRIX->MATRIX_EBICSA &= ~(1 << 17); + } + else { + AT91C_BASE_MATRIX->MATRIX_EBICSA &= ~(1 << 16); + AT91C_BASE_MATRIX->MATRIX_EBICSA &= ~(1 << 17); + } + } + //------------------------------------------------------------------------------ /// Configure DDR //------------------------------------------------------------------------------ @@ -135,18 +142,25 @@ void BOARD_ConfigureDdram(unsigned char ddrModel, unsigned char busWidth) // 4. Program the features of DDR2-SDRAM device into the Timing Register HDDRSDRC2_T2PR. WRITE(pDdrc, HDDRSDRC2_CR, AT91C_DDRC2_NC_DDR10_SDR9 | // 10 column bits (1K) - AT91C_DDRC2_NR_13 | // 14 row bits (8K) + AT91C_DDRC2_NR_VAL | // 13 row bits (8K) AT91C_DDRC2_CAS_3 | // CAS Latency 3 AT91C_DDRC2_DLL_RESET_DISABLED ); // DLL not reset + TRACE_INFO("\tDDR2 Config: 0x%x (NC=%d, NR=%d, CAS=%d) \n\r", + READ(pDdrc, HDDRSDRC2_CR), + (READ(pDdrc, HDDRSDRC2_CR) & AT91C_DDRC2_NC) + 9, + ((READ(pDdrc, HDDRSDRC2_CR) & AT91C_DDRC2_NR) >> 2) + 11, + (READ(pDdrc, HDDRSDRC2_CR) & AT91C_DDRC2_CAS) >> 4); + + // assume timings for 7.5ns min clock period WRITE(pDdrc, HDDRSDRC2_T0PR, AT91C_DDRC2_TRAS_6 | // 6 * 7.5 = 45 ns AT91C_DDRC2_TRCD_2 | // 2 * 7.5 = 15 ns AT91C_DDRC2_TWR_2 | // 2 * 7.5 = 15 ns AT91C_DDRC2_TRC_8 | // 8 * 7.5 = 60 ns AT91C_DDRC2_TRP_2 | // 2 * 7.5 = 15 ns - AT91C_DDRC2_TRRD_2 | // 2 * 7.5 = 15 ns + AT91C_DDRC2_TRRD_1 | // 1 * 7.5 = 7.5 ns AT91C_DDRC2_TWTR_1 | // 1 clock cycle AT91C_DDRC2_TMRD_2); // 2 clock cycles @@ -156,8 +170,8 @@ void BOARD_ConfigureDdram(unsigned char ddrModel, unsigned char busWidth) AT91C_DDRC2_TRFC_14 << 0); // 14 * 7.5 = 105 ns (must be 105 ns for 512M DDR) WRITE(pDdrc, HDDRSDRC2_T2PR, AT91C_DDRC2_TRTP_1 | // 1 * 7.5 = 7.5 ns - AT91C_DDRC2_TRPA_2 | - AT91C_DDRC2_TXARDS_8 | // 7 clock cycles + AT91C_DDRC2_TRPA_0 | + AT91C_DDRC2_TXARDS_7 | // 7 clock cycles AT91C_DDRC2_TXARD_2); // 2 clock cycles // Step 3: An NOP command is issued to the DDR2-SDRAM to enable clock.