Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: Orange_Ferrari_board_functional
Revision 1:6a820a0ca03b, committed 2013-10-21
- Comitter:
- liangzhen
- Date:
- Mon Oct 21 22:36:51 2013 +0000
- Parent:
- 0:84a8bcfbdec9
- Commit message:
- mbed code for Farrari board
Changed in this revision
--- a/main.cpp Mon Oct 07 22:58:19 2013 +0000
+++ b/main.cpp Mon Oct 21 22:36:51 2013 +0000
@@ -9,94 +9,69 @@
#include "lcd.h"
#include "jtag.h"
#include "mmap.h"
-#include "clock.h"
+#include "clock.h"
#include "EasyBMP.h"
+#include "main.h"
-extern "C" void mbed_reset();
-extern "C" void HardFault_Handler() { mbed_reset(); }
-class Watchdog {
-public:
-// Load timeout value in watchdog timer and enable
- void kick(float s) {
- LPC_WDT->WDCLKSEL = 0x1; // Set CLK src to PCLK
- uint32_t clk = SystemCoreClock / 16; // WD has a fixed /4 prescaler, PCLK default is /4
- LPC_WDT->WDTC = s * (float)clk;
- LPC_WDT->WDMOD = 0x3; // Enabled and Reset
- kick();
- }
-// "kick" or "feed" the dog - reset the watchdog timer
-// by writing this required bit pattern
- void kick() {
- LPC_WDT->WDFEED = 0xAA;
- LPC_WDT->WDFEED = 0x55;
- }
-};
-Watchdog wdt;
-void DDRO_Sensor(void);
-int FFT_Freq(float);
+int main()
+{
+ float core_volt = 1;
-int main() {
- float new_power = 0.9;
-
- //wdt.kick(20.0);
+ //wdt.kick(20.0);
pc.printf("Begin FFT\r\n");
- char buffer[21];
-
power_down();
- power_up(new_power); // Power Up Chip
+ power_up(core_volt); // Power Up Chip
pc.printf("Powered up!\r\n");
PORESETn = 0;
CORERESETn = 0;
+ wait_us(100);
PORESETn = 1;
CORERESETn = 1;
-
+
JTAG jtag;
int idcode = jtag.readID();
if(idcode != 0x4ba00477) {
pc.printf("ERROR: IDCode %X\r\n", idcode);
- wait(20);
+ wait(2);
power_down();
return -1;
}
pc.printf("IDCode %X\r\n", idcode);
-
+
jtag.reset();
jtag.leaveState();
jtag.PowerupDAP();
- int freq = FFT_Freq(new_power);
- pc.printf("fft working frequency: %d MHz\r\n", freq);
+ // setup necessary internal clock source selection
+ jtag.writeMemory(intclk_source, 2);
+ jtag.writeMemory(extclk_source, 1);
+ jtag.writeMemory(ext_div_by, 10);
+ power_core(1);
+ /*
+ for (int i=0; i<2; i++) {
+ int upper = 120;
+ int lower = 22;
+ while (upper-lower > 1) {
+ int middle = (upper+lower)/2;
+ middle = middle * 5;
+ if(check_FFT_Freq(jtag, middle)) {
+ lower = middle/5;
+ } else {
+ upper = middle/5;
+ }
+ }
+ pc.printf("fft working frequency: %d MHz\r\n", lower*5);
+ }
+ */
+ set_pll_frequency (200, jtag);
+ DDRO_Sensor(jtag);
+ /*
- DDRO_Sensor();
jtag.writeMemory(ddro_pad_out, 0xffffffff);
- printf("Reading ddro pad out %x\n", jtag.readMemory(ddro_pad_out));
+ printf("Reading ddro pad out %x\r\n", jtag.readMemory(ddro_pad_out));
jtag.writeMemory(ddro_div_by, 0xffffffff);
- printf("Reading ddro div by %x\n", jtag.readMemory(ddro_div_by));
-
- //wdt.kick();
- gain_ctrl=0;
- pc.printf("GAIN_CTRL = 0\r\n");
- pc.printf("SEN: %f\r\n",meas_sen.read());
- pc.printf("MEM1: %f\r\n",meas_mem1.read());
- pc.printf("MEM2: %f\r\n",meas_mem2.read());
- pc.printf("CORE: %f\r\n",meas_core.read());
- pc.getc();
- wait(1);
- gain_ctrl=1;
- pc.printf("GAIN_CTRL = 1\r\n");
- pc.printf("SEN: %f\r\n",meas_sen.read());
- pc.printf("MEM1: %f\r\n",meas_mem1.read());
- pc.printf("MEM2: %f\r\n",meas_mem2.read());
- pc.printf("CORE: %f\r\n",meas_core.read());
- pc.getc();
- wait(1);
- gain_ctrl=0;
- pc.printf("GAIN_CTRL = 0\r\n");
- pc.printf("SEN: %f\r\n",meas_sen.read());
- pc.printf("MEM1: %f\r\n",meas_mem1.read());
- pc.printf("MEM2: %f\r\n",meas_mem2.read());
- pc.printf("CORE: %f\r\n",meas_core.read());
- pc.getc();
+ printf("Reading ddro div by %x\r\n", jtag.readMemory(ddro_div_by));
+
wait(1);
gain_ctrl=1;
pc.printf("GAIN_CTRL = 1\r\n");
@@ -104,243 +79,94 @@
pc.printf("MEM1: %f\r\n",meas_mem1.read());
pc.printf("MEM2: %f\r\n",meas_mem2.read());
pc.printf("CORE: %f\r\n",meas_core.read());
- pc.getc();
- char paus;
+
+ wait(1);
+ gain_ctrl=0;
+ pc.printf("GAIN_CTRL = 0\r\n");
+ pc.printf("SEN: %f\r\n",meas_sen.read());
+ pc.printf("MEM1: %f\r\n",meas_mem1.read());
+ pc.printf("MEM2: %f\r\n",meas_mem2.read());
+ pc.printf("CORE: %f\r\n",meas_core.read());
+ */
+
pc.printf("Powering Down\r\n");
power_down();
pc.printf("Done\r\n");
}
-int FFT_Freq(float vdd) {
-
- JTAG jtag;
- char buffer[21];
- int counter_set=200;
- int flag=0;
- while(flag==0){
- //load program
-
- if(jtag.loadProgram()) {
- dual_printf("Load Failed");
- exit(1);
- }
- jtag.writeMemory(PLL_RESET, 0);
- jtag_pll(jtag, 1, 1, counter_set, 1, 10, 32 );
- jtag.writeMemory(PLL_RESET, 1);
- jtag.writeMemory(PLL_RESET, 0);
- unsigned long long freq = calc_pll_freqs(1, 1, counter_set, 1, 10, 32);
- freq = freq / 1000000; // in MHz
- int fMHz = freq;
- // dual_printf(buffer);
- power_core(vdd);
-
- //dual_printf("Resetting");
- CORERESETn = 0;
- CORERESETn = 1;
- wait(0.2);
- jtag.reset();
- jtag.leaveState();
- jtag.PowerupDAP();
- // dual_printf("Reset finished");
-
-
- unsigned int buffer_fft[64];
- for (int number1=0; number1<=63; number1++) {
- buffer_fft[number1] = jtag.readMemory(0x24000100 + number1*4);
- //printf("new[%d]: %x\n", number1, buffer_fft[number1]);
- }
-
- if ( buffer_fft[0] == 0x0000fffc && buffer_fft[1]==0x0000fffd && buffer_fft[2]==0xffc0000a && buffer_fft[3]==0x0000fffe &&
- buffer_fft[4]==0x0000fffd && buffer_fft[5]==0x0000ffff && buffer_fft[6]==0x0000fffd && buffer_fft[7]==0x00000000 &&
- buffer_fft[8]==0x0000ffff && buffer_fft[9]==0x0000ffff && buffer_fft[10]==0xfffeffff && buffer_fft[11]==0xffff0000 &&
- buffer_fft[12]==0x0000ffff && buffer_fft[13]==0xffff0000 && buffer_fft[14]==0xfffffffe && buffer_fft[15]==0xffff0000 &&
- buffer_fft[16]==0x00010000 && buffer_fft[17]==0x0001ffff && buffer_fft[18]==0x0000ffff && buffer_fft[19]==0x0001ffff &&
- buffer_fft[20]==0x0001fffe && buffer_fft[21]==0x0000fffe && buffer_fft[22]==0x0001fffe && buffer_fft[23]==0x0000ffff &&
- buffer_fft[24]==0x0000ffff && buffer_fft[25]==0x0001fffe && buffer_fft[26]==0x0000ffff && buffer_fft[27]==0x00010000 &&
- buffer_fft[28]==0x0001ffff && buffer_fft[29]==0x00010000 && buffer_fft[30]==0x0000ffff && buffer_fft[31]==0x00010000 &&
- buffer_fft[32]==0x0000ffff && buffer_fft[33]==0x0000ffff && buffer_fft[34]==0x0000ffff && buffer_fft[35]==0x0000ffff &&
- buffer_fft[36]==0x0000fffe && buffer_fft[37]==0x0000ffff && buffer_fft[38]==0x0000fffe && buffer_fft[39]==0x00000000 &&
- buffer_fft[40]==0xffffffff && buffer_fft[41]==0x0000ffff && buffer_fft[42]==0xffffffff && buffer_fft[43]==0x00000000 &&
- buffer_fft[44]==0x0000ffff && buffer_fft[45]==0x00000000 && buffer_fft[46]==0xffffffff && buffer_fft[47]==0x00000000 &&
- buffer_fft[48]==0x00000000 && buffer_fft[49]==0x00000000 && buffer_fft[50]==0x00000000 && buffer_fft[51]==0x00000000 &&
- buffer_fft[52]==0x0000ffff && buffer_fft[53]==0x0000ffff && buffer_fft[54]==0x0000ffff && buffer_fft[55]==0x00000000 &&
- buffer_fft[56]==0xfffeffff && buffer_fft[57]==0xffffffff && buffer_fft[58]==0xffff0000 && buffer_fft[59]==0x00000000 &&
- buffer_fft[60]==0x0000ffff && buffer_fft[61]==0x00000000 && buffer_fft[62]==0x003d000c && buffer_fft[63]==0x00000000 ) {
- //printf("***********************maximum freq *********************** %d", fMHz);
- flag = 1;
- //return fMHz;
- }
- else counter_set = counter_set-1;
+int check_FFT_Freq(JTAG &jtag, int fMHz)
+{
+ if(jtag.loadProgram()) {
+ dual_printf("Load Failed");
+ exit(1);
+ }
+ set_pll_frequency (fMHz, jtag);
+ //dual_printf("Resetting");
+ CORERESETn = 0;
+ CORERESETn = 1;
+ wait(0.2);
+ jtag.reset();
+ jtag.leaveState();
+ jtag.PowerupDAP();
+ unsigned int buffer_fft[64];
+ for (int number1=0; number1<=63; number1++) {
+ buffer_fft[number1] = jtag.readMemory(0x24000100 + number1*4);
+ jtag.writeMemory(0x24000100 + number1*4,0xF0F0F0F0);
+ //printf("new[%d]: %d\r\n", number1, buffer_fft[number1]);
}
- unsigned long long freq = calc_pll_freqs(1, 1, counter_set, 1, 10, 32);
- freq = freq / 1000000; // in MHz
- int fMHz = freq;
- return fMHz;
+ if ( buffer_fft[0] == 0x0000fffc && buffer_fft[1]==0x0000fffd && buffer_fft[2]==0xffc0000a && buffer_fft[3]==0x0000fffe &&
+ buffer_fft[4]==0x0000fffd && buffer_fft[5]==0x0000ffff && buffer_fft[6]==0x0000fffd && buffer_fft[7]==0x00000000 &&
+ buffer_fft[8]==0x0000ffff && buffer_fft[9]==0x0000ffff && buffer_fft[10]==0xfffeffff && buffer_fft[11]==0xffff0000 &&
+ buffer_fft[12]==0x0000ffff && buffer_fft[13]==0xffff0000 && buffer_fft[14]==0xfffffffe && buffer_fft[15]==0xffff0000 &&
+ buffer_fft[16]==0x00010000 && buffer_fft[17]==0x0001ffff && buffer_fft[18]==0x0000ffff && buffer_fft[19]==0x0001ffff &&
+ buffer_fft[20]==0x0001fffe && buffer_fft[21]==0x0000fffe && buffer_fft[22]==0x0001fffe && buffer_fft[23]==0x0000ffff &&
+ buffer_fft[24]==0x0000ffff && buffer_fft[25]==0x0001fffe && buffer_fft[26]==0x0000ffff && buffer_fft[27]==0x00010000 &&
+ buffer_fft[28]==0x0001ffff && buffer_fft[29]==0x00010000 && buffer_fft[30]==0x0000ffff && buffer_fft[31]==0x00010000 &&
+ buffer_fft[32]==0x0000ffff && buffer_fft[33]==0x0000ffff && buffer_fft[34]==0x0000ffff && buffer_fft[35]==0x0000ffff &&
+ buffer_fft[36]==0x0000fffe && buffer_fft[37]==0x0000ffff && buffer_fft[38]==0x0000fffe && buffer_fft[39]==0x00000000 &&
+ buffer_fft[40]==0xffffffff && buffer_fft[41]==0x0000ffff && buffer_fft[42]==0xffffffff && buffer_fft[43]==0x00000000 &&
+ buffer_fft[44]==0x0000ffff && buffer_fft[45]==0x00000000 && buffer_fft[46]==0xffffffff && buffer_fft[47]==0x00000000 &&
+ buffer_fft[48]==0x00000000 && buffer_fft[49]==0x00000000 && buffer_fft[50]==0x00000000 && buffer_fft[51]==0x00000000 &&
+ buffer_fft[52]==0x0000ffff && buffer_fft[53]==0x0000ffff && buffer_fft[54]==0x0000ffff && buffer_fft[55]==0x00000000 &&
+ buffer_fft[56]==0xfffeffff && buffer_fft[57]==0xffffffff && buffer_fft[58]==0xffff0000 && buffer_fft[59]==0x00000000 &&
+ buffer_fft[60]==0x0000ffff && buffer_fft[61]==0x00000000 && buffer_fft[62]==0x003d000c && buffer_fft[63]==0x00000000 ) {
+ return 1;
+ } else {
+ return 0;
+ }
}
-void DDRO_Sensor(void){
- JTAG jtag;
+void DDRO_Sensor(JTAG &jtag)
+{
/**********************enable****************************************/
jtag.writeMemory(ddro_syn_en, 0xffffffff);
- //printf("Reading ddro syn en %x\n", jtag.readMemory(ddro_syn_en));
jtag.writeMemory(ddro_inv_en, 0xffffffff);
- // printf("Reading ddro inv en %x\n", jtag.readMemory(ddro_inv_en));
-
/**********************set ref_clk and samp_clk**********************/
- jtag.writeMemory(ddro_samp_src, 0x00000000);
- //printf("Reading ddro ref src %x\n", jtag.readMemory(ddro_ref_src));
- jtag.writeMemory(ddro_ref_src, 0x00000003);
- //printf("Reading samp src %x\n", jtag.readMemory(ddro_samp_src));
-
+ jtag.writeMemory(ddro_ref_src, 0x00000002);
/**********************write threshold*******************************/
- // printf("Writing threshold\n");
- jtag.writeMemory(ddro_threshold, 10);
- // printf("Reading threshold %d\n", jtag.readMemory(ddro_threshold));
+ jtag.writeMemory(ddro_threshold, 100000);
+ //jtag.writeMemory(0xe000e104, 0x000000ff); // enable interrupts
- jtag.writeMemory(0xe000e104, 0x000000ff); // enable interrupts
-
- /**********************start DDRO************************************/
- // printf("Ready to start DDRO \n");
- // printf("DDRO starting\n");
- jtag.writeMemory(ddro_start, 1);//*ddro_start = 1;
-
- /*********************output*****************************************/
- printf("Reading ddro_count %d\n", jtag.readMemory(ddro_count));
- jtag.writeMemory(ddro_start, 0);//*ddro_start = 1;
-
-
-
-
- jtag.writeMemory(ddro_ref_src, 0x00000004);
- printf("Reading ddro ref src %x\n", jtag.readMemory(ddro_ref_src));
- jtag.writeMemory(ddro_start, 1);//*ddro_start = 1;
- printf("Reading ddro_count %d\n", jtag.readMemory(ddro_count));
- jtag.writeMemory(ddro_start, 0);
-
- jtag.writeMemory(ddro_ref_src, 0x00000005);
- printf("Reading ddro ref src %x\n", jtag.readMemory(ddro_ref_src));
- jtag.writeMemory(ddro_start, 1);
- printf("Reading ddro_count %d\n", jtag.readMemory(ddro_count));
- jtag.writeMemory(ddro_start, 0);
-
- jtag.writeMemory(ddro_ref_src, 0x00000006);
- printf("Reading ddro ref src %x\n", jtag.readMemory(ddro_ref_src));
- jtag.writeMemory(ddro_start, 1);
- printf("Reading ddro_count %d\n", jtag.readMemory(ddro_count));
- jtag.writeMemory(ddro_start, 0);
-
- jtag.writeMemory(ddro_ref_src, 0x00000007);
- printf("Reading ddro ref src %x\n", jtag.readMemory(ddro_ref_src));
- jtag.writeMemory(ddro_start, 1);
- printf("Reading ddro_count %d\n", jtag.readMemory(ddro_count));
- jtag.writeMemory(ddro_start, 0);
-
- jtag.writeMemory(ddro_ref_src, 0x00000008);
- printf("Reading ddro ref src %x\n", jtag.readMemory(ddro_ref_src));
- jtag.writeMemory(ddro_start, 1);
- printf("Reading ddro_count %d\n", jtag.readMemory(ddro_count));
- jtag.writeMemory(ddro_start, 0);
-
- jtag.writeMemory(ddro_ref_src, 0x00000009);
- printf("Reading ddro ref src %x\n", jtag.readMemory(ddro_ref_src));
- jtag.writeMemory(ddro_start, 1);
- printf("Reading ddro_count %d\n", jtag.readMemory(ddro_count));
- jtag.writeMemory(ddro_start, 0);
-
- jtag.writeMemory(ddro_ref_src, 0x0000000a);
- printf("Reading ddro ref src %x\n", jtag.readMemory(ddro_ref_src));
- jtag.writeMemory(ddro_start, 1);
- printf("Reading ddro_count %d\n", jtag.readMemory(ddro_count));
- jtag.writeMemory(ddro_start, 0);
-
- jtag.writeMemory(ddro_ref_src, 0x0000000b);
- printf("Reading ddro ref src %x\n", jtag.readMemory(ddro_ref_src));
- jtag.writeMemory(ddro_start, 1);
- printf("Reading ddro_count %d\n", jtag.readMemory(ddro_count));
- jtag.writeMemory(ddro_start, 0);
-
- jtag.writeMemory(ddro_ref_src, 0x0000000c);
- printf("Reading ddro ref src %x\n", jtag.readMemory(ddro_ref_src));
- jtag.writeMemory(ddro_start, 1);
- printf("Reading ddro_count %d\n", jtag.readMemory(ddro_count));
- jtag.writeMemory(ddro_start, 0);
-
- jtag.writeMemory(ddro_ref_src, 0x0000000d);
- printf("Reading ddro ref src %x\n", jtag.readMemory(ddro_ref_src));
- jtag.writeMemory(ddro_start, 1);
- printf("Reading ddro_count %d\n", jtag.readMemory(ddro_count));
- jtag.writeMemory(ddro_start, 0);
-
- jtag.writeMemory(ddro_ref_src, 0x0000000e);
- printf("Reading ddro ref src %x\n", jtag.readMemory(ddro_ref_src));
- jtag.writeMemory(ddro_start, 1);
- printf("Reading ddro_count %d\n", jtag.readMemory(ddro_count));
- jtag.writeMemory(ddro_start, 0);
-
- jtag.writeMemory(ddro_ref_src, 0x0000000f);
- printf("Reading ddro ref src %x\n", jtag.readMemory(ddro_ref_src));
- jtag.writeMemory(ddro_start, 1);
- printf("Reading ddro_count %d\n", jtag.readMemory(ddro_count));
- jtag.writeMemory(ddro_start, 0);
-
- jtag.writeMemory(ddro_ref_src, 0x00000010);
- printf("Reading ddro ref src %x\n", jtag.readMemory(ddro_ref_src));
- jtag.writeMemory(ddro_start, 1);
- printf("Reading ddro_count %d\n", jtag.readMemory(ddro_count));
- jtag.writeMemory(ddro_start, 0);
-
- jtag.writeMemory(ddro_ref_src, 0x00000011);
- printf("Reading ddro ref src %x\n", jtag.readMemory(ddro_ref_src));
- jtag.writeMemory(ddro_start, 1);
- printf("Reading ddro_count %d\n", jtag.readMemory(ddro_count));
- jtag.writeMemory(ddro_start, 0);
-
- jtag.writeMemory(ddro_ref_src, 0x00000012);
- printf("Reading ddro ref src %x\n", jtag.readMemory(ddro_ref_src));
- jtag.writeMemory(ddro_start, 1);
- printf("Reading ddro_count %d\n", jtag.readMemory(ddro_count));
- jtag.writeMemory(ddro_start, 0);
-
- jtag.writeMemory(ddro_ref_src, 0x00000013);
- printf("Reading ddro ref src %x\n", jtag.readMemory(ddro_ref_src));
- jtag.writeMemory(ddro_start, 1);
- printf("Reading ddro_count %d\n", jtag.readMemory(ddro_count));
- jtag.writeMemory(ddro_start, 0);
-
- jtag.writeMemory(ddro_ref_src, 0x00000014);
- printf("Reading ddro ref src %x\n", jtag.readMemory(ddro_ref_src));
- jtag.writeMemory(ddro_start, 1);
- printf("Reading ddro_count %d\n", jtag.readMemory(ddro_count));
- jtag.writeMemory(ddro_start, 0);
-
- jtag.writeMemory(ddro_ref_src, 0x00000015);
- printf("Reading ddro ref src %x\n", jtag.readMemory(ddro_ref_src));
- jtag.writeMemory(ddro_start, 1);
- printf("Reading ddro_count %d\n", jtag.readMemory(ddro_count));
- jtag.writeMemory(ddro_start, 0);
-
- jtag.writeMemory(ddro_ref_src, 0x00000016);
- printf("Reading ddro ref src %x\n", jtag.readMemory(ddro_ref_src));
- jtag.writeMemory(ddro_start, 1);
- printf("Reading ddro_count %d\n", jtag.readMemory(ddro_count));
- jtag.writeMemory(ddro_start, 0);
-
- jtag.writeMemory(ddro_ref_src, 0x00000017);
- printf("Reading ddro ref src %x\n", jtag.readMemory(ddro_ref_src));
- jtag.writeMemory(ddro_start, 1);
- printf("Reading ddro_count %d\n", jtag.readMemory(ddro_count));
- jtag.writeMemory(ddro_start, 0);
-
- jtag.writeMemory(ddro_ref_src, 0x00000018);
- printf("Reading ddro ref src %x\n", jtag.readMemory(ddro_ref_src));
- jtag.writeMemory(ddro_start, 1);
- printf("Reading ddro_count %d\n", jtag.readMemory(ddro_count));
- jtag.writeMemory(ddro_start, 0);
-
- jtag.writeMemory(ddro_ref_src, 0x00000019);
- printf("Reading ddro ref src %x\n", jtag.readMemory(ddro_ref_src));
- jtag.writeMemory(ddro_start, 1);
- printf("Reading ddro_count %d\n", jtag.readMemory(ddro_count));
- jtag.writeMemory(ddro_start, 0);
-
- }
+ for (int ro_id=3;ro_id<=15;ro_id++) {
+ pc.printf("RO %d\r\n ", ro_id-2);
+ jtag.writeMemory(ddro_samp_src, ro_id);
+ jtag.writeMemory(ddro_start, 0);
+ int meas1 = jtag.readMemory(ddro_count);
+ pc.printf("Counter starts at: %d ", meas1);
+ jtag.writeMemory(ddro_start, 1);
+ wait_us(50000);
+ jtag.writeMemory(ddro_start, 0);
+ meas1 = jtag.readMemory(ddro_count);
+ pc.printf("ends at: %d\r\n", meas1);
+
+ jtag.writeMemory(ddro_samp_src, ro_id);
+ jtag.writeMemory(ddro_start, 0);
+ meas1 = jtag.readMemory(ddro_count);
+ pc.printf("Counter starts at: %d ", meas1);
+ jtag.writeMemory(ddro_start, 1);
+ wait_us(50000);
+ jtag.writeMemory(ddro_start, 0);
+ meas1 = jtag.readMemory(ddro_count);
+ printf("ends at: %d\r\n", meas1);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.h Mon Oct 21 22:36:51 2013 +0000
@@ -0,0 +1,27 @@
+#ifndef MAIN_H
+#define MAIN_H
+
+extern "C" void mbed_reset();
+extern "C" void HardFault_Handler() { mbed_reset(); }
+class Watchdog {
+public:
+// Load timeout value in watchdog timer and enable
+ void kick(float s) {
+ LPC_WDT->WDCLKSEL = 0x1; // Set CLK src to PCLK
+ uint32_t clk = SystemCoreClock / 16; // WD has a fixed /4 prescaler, PCLK default is /4
+ LPC_WDT->WDTC = s * (float)clk;
+ LPC_WDT->WDMOD = 0x3; // Enabled and Reset
+ kick();
+ }
+// "kick" or "feed" the dog - reset the watchdog timer
+// by writing this required bit pattern
+ void kick() {
+ LPC_WDT->WDFEED = 0xAA;
+ LPC_WDT->WDFEED = 0x55;
+ }
+};
+Watchdog wdt;
+
+void DDRO_Sensor(JTAG &jtag);
+int check_FFT_Freq(JTAG &jtag, int fMHz);
+#endif
\ No newline at end of file
--- a/mmap.h Mon Oct 07 22:58:19 2013 +0000 +++ b/mmap.h Mon Oct 21 22:36:51 2013 +0000 @@ -40,6 +40,56 @@ #define ext_div_by 0x44100018/////////////////////////////////////// #define extclk_source 0x4410001c +/* + always @* + begin + case (intclk_source) + 2'b00 : HCLK = HCLK_EXT; + 2'b01 : HCLK = ring_osc_HCLK; + 2'b10 : HCLK = PLL_PLLOUTA; + 2'b11 : HCLK = PLL_PLLOUTB; + default : HCLK = HCLK_EXT; + endcase + end + + + + always @* + begin + case (extclk_source) + 2'b00 : HCLK_div_down = HCLK_EXT; + 2'b01 : HCLK_div_down = HCLK_divider; + 2'b10 : HCLK_div_down = PLL_PLLOUTA; + 2'b11 : HCLK_div_down = PLL_PLLOUTB; + default : HCLK_div_down = HCLK_EXT; + endcase + end + + always @* + begin + case (ext_div_by) +4'd0 : HCLK_divider = HCLK_div_2; +4'd1 : HCLK_divider = HCLK_div_2; +4'd2 : HCLK_divider = HCLK_div_4; +4'd3 : HCLK_divider = HCLK_div_8; +4'd4 : HCLK_divider = HCLK_div_16; +4'd5 : HCLK_divider = HCLK_div_32; +4'd6 : HCLK_divider = HCLK_div_64; +4'd7 : HCLK_divider = HCLK_div_128; +4'd8 : HCLK_divider = HCLK_div_256; +4'd9 : HCLK_divider = HCLK_div_512; +4'd10 : HCLK_divider = HCLK_div_1024; +4'd11 : HCLK_divider = HCLK_div_2048; +4'd12 : HCLK_divider = HCLK_div_4096; +4'd13 : HCLK_divider = HCLK_div_8192; +4'd14 : HCLK_divider = HCLK_div_16384; +4'd15 : HCLK_divider = HCLK_div_32768; + default : HCLK_divider = HCLK_div_2; + endcase + end + +*/ + // Resets #define reset_reg 0x44000004 #define RESET_scan 0x44100020 @@ -57,6 +107,42 @@ #define ddro_done 0x44100060 #define ddro_count 0x44100064 +/* + reg ref_clk; + always @* + begin + case(ref_src) + 5'h0: ref_clk = HCLK; + 5'h1: ref_clk = ring_osc_HCLK; + 5'h2: ref_clk = PLL_REFCLK; + 5'h3: ref_clk = syn_out[0]; + 5'h4: ref_clk = syn_out[1]; + 5'h5: ref_clk = syn_out[2]; + 5'h6: ref_clk = syn_out[3]; + 5'h7: ref_clk = syn_out[4]; + 5'h8: ref_clk = syn_out[5]; + 5'h9: ref_clk = syn_out[6]; + 5'ha: ref_clk = syn_out[7]; + 5'hb: ref_clk = syn_out[8]; + 5'hc: ref_clk = inv_out[0]; + 5'hd: ref_clk = inv_out[1]; + 5'he: ref_clk = inv_out[2]; + 5'hf: ref_clk = inv_out[3]; + 5'h10: ref_clk = inv_out[4]; + 5'h11: ref_clk = inv_out[5]; + 5'h12: ref_clk = inv_out[6]; + 5'h13: ref_clk = inv_out[7]; + 5'h14: ref_clk = inv_out[8]; + 5'h15: ref_clk = inv_out[9]; + 5'h16: ref_clk = OXIDE_CLK; + 5'h17: ref_clk = PMOS_CLK; + 5'h18: ref_clk = NMOS_CLK; + 5'h19: ref_clk = TEMP_CLK; + default: ref_clk = HCLK; + endcase + end +*/ + // Sensors #define sensor_disable 0x44100048 #define sensor_oxide_stress 0x4410004c
--- a/pinout.h Mon Oct 07 22:58:19 2013 +0000 +++ b/pinout.h Mon Oct 21 22:36:51 2013 +0000 @@ -73,4 +73,4 @@ #define RING_OSC_NBIAS ADDR_0,CHAN_F // 20 MHz Crystal -#define PLL_REF 20000000 \ No newline at end of file +#define PLL_REF 20000 \ No newline at end of file
--- a/pll.cpp Mon Oct 07 22:58:19 2013 +0000
+++ b/pll.cpp Mon Oct 21 22:36:51 2013 +0000
@@ -25,24 +25,24 @@
pc.printf("RangeB out of 1-32 range\r\n");
}
- unsigned long long dco = PLL_REF / prediv * multint_upper * multint;
- if(dco < 2500000000 || dco > 5000000000){
- pc.printf("Dco out of 2.5G-5G range\r\n");
+ int dco = (PLL_REF / prediv) * multint_upper * multint;
+ if(dco < 2500000 || dco > 5000000){
+ pc.printf("Dco=%d out of 2.5G-5G range\r\n",dco);
}
- unsigned long long internal = dco / multint_upper;
- if(internal < 9800000 || internal > 3200000000){
- //\ pc.printf("Dco out of 9.8M-3.2G range\r\n");
+ int internal = dco / multint_upper;
+ if(internal < 9800 || internal > 3200000){
+ pc.printf("internal=%d out of 9.8M-3.2G range\r\n",internal);
}
- unsigned long long prescale_dco = dco / range_upper;
- if(prescale_dco > 3200000000){
- // pc.printf("Prescale DCO out of 0-3.2G range\r\n");
+ int prescale_dco = dco / range_upper;
+ if(prescale_dco > 3200000){
+ pc.printf("Prescale DCO out of 0-3.2G range\r\n");
}
- unsigned long long out_a = prescale_dco / rangea;
- if(out_a < 20000000 || out_a > 3000000000){
+ int out_a = prescale_dco / rangea;
+ if(out_a < 20000 || out_a > 3000000){
pc.printf("Out A out of 20M-3.0G range\r\n");
}
- unsigned long long out_b = prescale_dco / rangeb;
- if(out_b < 20000000 || out_b > 3000000000){
+ int out_b = prescale_dco / rangeb;
+ if(out_b < 20000 || out_b > 3000000){
pc.printf("Out B out of 20M-3.0G range\r\n");
}
@@ -107,7 +107,6 @@
range_upper = get_binline_by_num("/local/Prangeup.txt", range_upper);
rangea = get_binline_by_num("/local/Prange.txt", rangea);
rangeb = get_binline_by_num("/local/Prange.txt", rangeb);
-
jtag.writeMemory(PLL_CE1CCB, 1);
jtag.writeMemory(PLL_CE1MPGC1, 1);
jtag.writeMemory(PLL_FFTUNE, fftune(0));
@@ -115,9 +114,9 @@
jtag.writeMemory(PLL_LFTUNE_40_32, lftune_hi());
jtag.writeMemory(PLL_INTFBK, 1);
jtag.writeMemory(PLL_PREDIV, prediv);
- jtag.writeMemory(PLL_MULTINT, multint_upper << 8 | multint);
jtag.writeMemory(PLL_RANGEA, range_upper << 5 | rangea);
jtag.writeMemory(PLL_RANGEB, range_upper << 5 | rangeb);
+ jtag.writeMemory(PLL_MULTINT, multint_upper << 8 | multint);
}
@@ -140,4 +139,61 @@
unsigned long long lftune(){
// 41 bits
return 0x05040100000L;
+}
+
+/*
+unsigned long long calc_pll_freqs(unsigned int prediv, unsigned int multint_upper, unsigned int multint,
+ unsigned int range_upper, unsigned int rangea, unsigned int rangeb)
+ dco = (PLL_REF / prediv) * multint_upper * multint;
+ prescale_dco = dco / range_upper;
+ out_a = prescale_dco / rangea;
+*/
+int set_pll_frequency (int fMHz, JTAG &jtag) {
+ jtag.writeMemory(intclk_source, 0);
+ int counter = fMHz / 5;
+ int frequency = counter * 5;
+ if (frequency >= 625) {
+ pc.printf("Frequency > 625 MHz out of range!\r\nClock source changed to HCLK_EXT\r\n");
+ return 1;
+ } /*
+ else if (frequency >= 625) {
+ //counter between 125 and 200
+ // 20*125/4=625
+ // 20*200/4=1G
+ jtag_pll(jtag, 1, 1, counter, 1, 4, 4);
+ calculated_f = calc_pll_freqs(1, 1, counter, 1, 4, 4)/1000;
+ if (calculated_f != frequency) {
+ pc.printf("PLL frequency not match!\r\n");
+ }
+ } */
+ else if (frequency >= 325) {
+ //counter between 65 and 125
+ // 20*2*65/8=325
+ // 20*2*125/8=625
+ jtag_pll(jtag, 1, 2, counter, 1, 8, 8);
+ } else if (frequency >= 210) {
+ //counter between 42 and 65
+ // 20*3*42/12=210
+ // 20*3*65/12=325
+ jtag_pll(jtag, 1, 3, counter, 1, 12, 12);
+ } else if (frequency >= 105) {
+ //counter between 21 and 42
+ // 20*6*21/24=125
+ // 20*6*42/24=210
+ jtag_pll(jtag, 1, 3, 2*counter, 1, 24, 24);
+ } else {
+ pc.printf("Frequency < 105M out of range!\r\nClock source changed to HCLK_EXT\r\n");
+ return 1;
+ }
+ jtag.writeMemory(PLL_RESET, 1);
+ wait_us(10);
+ jtag.writeMemory(PLL_RESET, 0);
+ wait_us(10);
+ if(jtag.readMemory(PLL_PLLLOCK)==0) {
+ pc.printf("PLL lock failed!\r\nClock source changed to HCLK_EXT\r\n");
+ return 1;
+ } else {
+ jtag.writeMemory(intclk_source, 2);
+ return 0;
+ }
}
\ No newline at end of file
--- a/pll.h Mon Oct 07 22:58:19 2013 +0000
+++ b/pll.h Mon Oct 21 22:36:51 2013 +0000
@@ -4,6 +4,11 @@
#include "jtag.h"
#include "mmap.h"
+// Main utility function, this function will automatically
+// round fMHz to multiple of 5MHz.
+// Current supported range: 105MHz - 625MHz
+int set_pll_frequency (int fMHz, JTAG &jtag);
+
unsigned long long calc_pll_freqs(unsigned int prediv, unsigned int multint_upper, unsigned int multint,
unsigned int range_upper, unsigned int rangea, unsigned int rangeb);
--- a/power.cpp Mon Oct 07 22:58:19 2013 +0000
+++ b/power.cpp Mon Oct 21 22:36:51 2013 +0000
@@ -21,17 +21,18 @@
void power_core(float core_volt)
{
float periph_volt = core_volt;
-
-
- if(core_volt > 1.1){
- periph_volt = 1.1;
+ float mem_volt = periph_volt;
+ if(core_volt > 1){
+ periph_volt = 1;
+ core_volt = 1;
+ mem_volt = 1;
}
if(core_volt < 0.9){
periph_volt = 0.9;
}
-
- float mem_volt = core_volt;
-
+ if(core_volt < 0.8){
+ mem_volt = core_volt + 0.05;
+ }
power_chan(PADVDD, periph_volt);
wait(POWER_UP_TIME);
@@ -48,6 +49,14 @@
wait(POWER_UP_TIME);
power_chan(PLLAVDD, periph_volt);
wait(POWER_UP_TIME);
+
+ // Sensor
+ power_chan(SENSORVDD, core_volt);//power_chan(SENSORVDD, 1.0);
+ wait(POWER_UP_TIME);
+ power_chan(SENSORLOWVDD, 0.35);
+ wait(POWER_UP_TIME);
+ power_chan(SENSORSTRESSVDD, periph_volt);//power_chan(SENSORSTRESSVDD, 1.0);
+ wait(POWER_UP_TIME);
}
@@ -59,7 +68,18 @@
power_chan(DVDD2, 1.8);
wait(POWER_UP_TIME);
- float new_power = core_volt;//////////////////////////////////////////////////////////
+ float periph_volt = core_volt;
+
+
+ if(core_volt > 1){
+ periph_volt = 1;
+ core_volt = 1;
+ }
+ if(core_volt < 0.95){
+ periph_volt = 0.95;
+ }
+
+ float mem_volt = periph_volt;
// Other padring
power_chan(ADVDD, 3.3);
@@ -70,15 +90,15 @@
wait(POWER_UP_TIME);
// Core and Memory
- power_chan(COREVDD, 1.0);
+ power_chan(COREVDD, core_volt);
wait(POWER_UP_TIME);
- power_chan(MEM1VDD, new_power);//power_chan(MEM1VDD, 1.0);
+ power_chan(MEM1VDD, mem_volt);//power_chan(MEM1VDD, 1.0);
wait(POWER_UP_TIME);
- power_chan(MEM2VDD, new_power);//power_chan(MEM2VDD, 1.0);
+ power_chan(MEM2VDD, mem_volt);//power_chan(MEM2VDD, 1.0);
wait(POWER_UP_TIME);
// Clock
- power_chan(CLOCKVDD, 1.0);//power_chan(CLOCKVDD, 1.0);
+ power_chan(CLOCKVDD, periph_volt);//power_chan(CLOCKVDD, 1.0);
wait(POWER_UP_TIME);
power_chan(PLLAVDD, 1.0);//power_chan(PLLAVDD, 1.0);
wait(POWER_UP_TIME);
@@ -86,7 +106,7 @@
wait(POWER_UP_TIME);
// Sensor Supplies
- power_chan(SENSORVDD, 1.0);//power_chan(SENSORVDD, 1.0);
+ power_chan(SENSORVDD, core_volt);//power_chan(SENSORVDD, 1.0);
wait(POWER_UP_TIME);
power_chan(SENSORLOWVDD, 0.35);
wait(POWER_UP_TIME);
--- a/power.h Mon Oct 07 22:58:19 2013 +0000 +++ b/power.h Mon Oct 21 22:36:51 2013 +0000 @@ -1,7 +1,7 @@ #include "dac.h" -void power_up(float core_volt = 1.0); -void power_core(float core_volt = 1.0); +void power_up(float core_volt); +void power_core(float core_volt); //float current_meas(bool core); void power_down();