X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/f7e3ed82874bfd8951c90536bd7185d599d6dbf8..ab6bf11f3fbd32163ac79e1e65d15c496d4ff65e:/bootrom/bootrom.c diff --git a/bootrom/bootrom.c b/bootrom/bootrom.c index 04bc14be..fc1c8a2c 100644 --- a/bootrom/bootrom.c +++ b/bootrom/bootrom.c @@ -1,4 +1,13 @@ +//----------------------------------------------------------------------------- +// This code is licensed to you under the terms of the GNU GPL, version 2 or, +// at your option, any later version. See the LICENSE.txt file for the text of +// the license. +//----------------------------------------------------------------------------- +// Main code for the bootloader +//----------------------------------------------------------------------------- + #include +#include "usb_hid.h" struct common_area common_area __attribute__((section(".commonarea"))); unsigned int start_addr, end_addr, bootrom_unlocked; @@ -21,21 +30,22 @@ static void ConfigClocks(void) (1<PMC_MOR = - PMC_MAIN_OSC_ENABLE | - PMC_MAIN_OSC_STARTUP_DELAY(0x50); + AT91C_CKGR_MOSCEN | + PMC_MAIN_OSC_STARTUP_DELAY(8); // wait for main oscillator to stabilize - while ( !(AT91C_BASE_PMC->PMC_SR & PMC_MAIN_OSC_STABILIZED) ) + while ( !(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MOSCS) ) ; - // minimum PLL clock frequency is 80 MHz in range 00 (96 here so okay) - // frequency is crystal * multiplier / divisor = 16Mhz * 12 / 2 = 96Mhz + // PLL output clock frequency in range 80 - 160 MHz needs CKGR_PLL = 00 + // PLL output clock frequency in range 150 - 180 MHz needs CKGR_PLL = 10 + // PLL output is MAINCK * multiplier / divisor = 16Mhz * 12 / 2 = 96Mhz AT91C_BASE_PMC->PMC_PLLR = PMC_PLL_DIVISOR(2) | PMC_PLL_COUNT_BEFORE_LOCK(0x50) | @@ -44,23 +54,23 @@ static void ConfigClocks(void) PMC_PLL_USB_DIVISOR(1); // wait for PLL to lock - while ( !(AT91C_BASE_PMC->PMC_SR & PMC_MAIN_OSC_PLL_LOCK) ) + while ( !(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCK) ) ; // we want a master clock (MCK) to be PLL clock / 2 = 96Mhz / 2 = 48Mhz - // as per datasheet, this register must be programmed in two operations + // datasheet recommends that this register is programmed in two operations // when changing to PLL, program the prescaler first then the source - AT91C_BASE_PMC->PMC_MCKR = PMC_CLK_PRESCALE_DIV_2; + AT91C_BASE_PMC->PMC_MCKR = AT91C_PMC_PRES_CLK_2; // wait for main clock ready signal - while ( !(AT91C_BASE_PMC->PMC_SR & PMC_MAIN_OSC_MCK_READY) ) + while ( !(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY) ) ; // set the source to PLL - AT91C_BASE_PMC->PMC_MCKR = AT91C_PMC_CSS_PLL_CLK | PMC_CLK_PRESCALE_DIV_2; + AT91C_BASE_PMC->PMC_MCKR = AT91C_PMC_PRES_CLK_2 | AT91C_PMC_CSS_PLL_CLK; // wait for main clock ready signal - while ( !(AT91C_BASE_PMC->PMC_SR & PMC_MAIN_OSC_MCK_READY) ) + while ( !(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY) ) ; } @@ -120,9 +130,9 @@ void UsbPacketReceived(uint8_t *packet, int len) uint32_t sr; - while(!((sr = AT91C_BASE_EFC0->EFC_FSR) & MC_FLASH_STATUS_READY)) + while(!((sr = AT91C_BASE_EFC0->EFC_FSR) & AT91C_MC_FRDY)) ; - if(sr & (MC_FLASH_STATUS_LOCKE | MC_FLASH_STATUS_PROGE)) { + if(sr & (AT91C_MC_LOCKE | AT91C_MC_PROGE)) { dont_ack = 1; c->cmd = CMD_NACK; UsbSendPacket(packet, len); @@ -248,19 +258,9 @@ void BootROM(void) LED_B_OFF(); LED_A_OFF(); - // if 512K FLASH part - TODO make some defines :) - if ((AT91C_BASE_DBGU->DBGU_CIDR | 0xf00) == 0xa00) { - AT91C_BASE_EFC0->EFC_FMR = - MC_FLASH_MODE_FLASH_WAIT_STATES(1) | - MC_FLASH_MODE_MASTER_CLK_IN_MHZ(0x48); - AT91C_BASE_EFC1->EFC_FMR = - MC_FLASH_MODE_FLASH_WAIT_STATES(1) | - MC_FLASH_MODE_MASTER_CLK_IN_MHZ(0x48); - } else { - AT91C_BASE_EFC0->EFC_FMR = - MC_FLASH_MODE_FLASH_WAIT_STATES(0) | - MC_FLASH_MODE_MASTER_CLK_IN_MHZ(48); - } + AT91C_BASE_EFC0->EFC_FMR = + AT91C_MC_FWS_1FWS | + MC_FLASH_MODE_MASTER_CLK_IN_MHZ(48); // Initialize all system clocks ConfigClocks(); @@ -301,6 +301,6 @@ void BootROM(void) flash_mode(1); } else { // jump to Flash address of the osimage entry point (LSBit set for thumb mode) - asm("bx %0\n" : : "r" ( ((int)&_osimage_entry) | 0x1 ) ); + __asm("bx %0\n" : : "r" ( ((int)&_osimage_entry) | 0x1 ) ); } }