X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fcpu%2Farm%2Fhw%2Fcrtat91sam7_rom.S;h=a73b70d58ad9ff51386606d112fa1154c82b1787;hb=fe0a14d1434098bfd0780d06a2a7e55f27940d27;hp=0a2fa4a791be63a6c3fbe0b246cb1bb6c756654a;hpb=345f93de1963f49bdb194d2b06c8c5d7ba0a3e5f;p=bertos.git diff --git a/bertos/cpu/arm/hw/crtat91sam7_rom.S b/bertos/cpu/arm/hw/crtat91sam7_rom.S index 0a2fa4a7..a73b70d5 100644 --- a/bertos/cpu/arm/hw/crtat91sam7_rom.S +++ b/bertos/cpu/arm/hw/crtat91sam7_rom.S @@ -70,16 +70,19 @@ * */ -#include "hw_cpu.h" #include +#include "cfg/cfg_arch.h" -#if CLOCK_FREQ != 48023000L -#error Clock registers set for 48MHz operation, revise following code if you want a different clock. +#if CPU_FREQ != 48023000L + /* Avoid errors on nightly test */ + #if !defined(ARCH_NIGHTTEST) || !(ARCH & ARCH_NIGHTTEST) + #warning Clock registers set for 48.023MHz operation, revise following code if you want a different clock. + #endif #endif -#if CPU_ARM_AT91SAM7S256 || CPU_ARM_AT91SAM7X256 +#if CPU_ARM_SAM7S_LARGE || CPU_ARM_SAM7X /** * With a 18.420MHz cristal, master clock is: * (((18.420 * PLL_MUL_VAL + 1) / PLL_DIV_VAL) / AT91MCK_PRES) = 48.023MHz @@ -105,14 +108,25 @@ #define WDT_WDDIS (1 << 15) #define PMC_BASE 0xFFFFFC00 + #define PMC_PCER_OFF 0x00000010 #define PMC_SR_OFF 0x00000068 #define PMC_MCKR_OFF 0x00000030 #define PMC_MOSCS (1 << 0) #define PMC_LOCK (1 << 2) #define PMC_MCKRDY (1 << 3) + #define PMC_CSS_MASK 0x00000003 #define PMC_CSS_PLL_CLK 0x00000003 + #define PMC_PRES_MASK 0x0000001C #define PMC_PRES_CLK_2 0x00000004 + #if CPU_ARM_SAM7S_LARGE + #define PMC_PIO_CLK_EN (1 << 2) + #elif CPU_ARM_SAM7X + #define PMC_PIO_CLK_EN ((1 << 2) | (1 << 3)) + #else + #error CPU not supported + #endif + #define CKGR_MOR_OFF 0x00000020 #define CKGR_PLLR_OFF 0x0000002C #define CKGR_MOSCEN (1 << 0) @@ -228,6 +242,28 @@ wait_moscs: tst r0, #PMC_MOSCS beq wait_moscs + /* + * Switch to Slow oscillator clock. + */ + ldr r0, [r1, #PMC_MCKR_OFF] + and r0, r0, #~PMC_CSS_MASK + str r0, [r1, #PMC_MCKR_OFF] +wait_slowosc: + ldr r0, [r1, #PMC_SR_OFF] + tst r0, #PMC_MCKRDY + beq wait_slowosc + + /* + * Switch to prescaler div 1 factor. + */ + ldr r0, [r1, #PMC_MCKR_OFF] + and r0, r0, #~PMC_PRES_MASK + str r0, [r1, #PMC_MCKR_OFF] +wait_presc: + ldr r0, [r1, #PMC_SR_OFF] + tst r0, #PMC_MCKRDY + beq wait_presc + /* * Set PLL: * PLLfreq = crystal / divider * (multiplier + 1) @@ -319,6 +355,15 @@ _41: */ ldr r13, =__stack_end + + /* + * Enable clock for PIO(s) + */ + ldr r1, =PMC_BASE + mov r0, #PMC_PIO_CLK_EN + str r0, [r1, #PMC_PCER_OFF] + + /* * Jump to main */