Liangzhen Lai / Mbed 2 deprecated Orange_Ferrari_board_functional

Dependencies:   DDRO_Farrari mbed

Fork of DDRO_Farrari by Liangzhen Lai

Committer:
liangzhen
Date:
Mon Oct 07 22:58:19 2013 +0000
Revision:
0:84a8bcfbdec9
Child:
1:6a820a0ca03b
power sensor tested;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
liangzhen 0:84a8bcfbdec9 1 #include "pll.h"
liangzhen 0:84a8bcfbdec9 2
liangzhen 0:84a8bcfbdec9 3 unsigned long long calc_pll_freqs(unsigned int prediv, unsigned int multint_upper, unsigned int multint,
liangzhen 0:84a8bcfbdec9 4 unsigned int range_upper, unsigned int rangea, unsigned int rangeb){
liangzhen 0:84a8bcfbdec9 5
liangzhen 0:84a8bcfbdec9 6 if(prediv < 1 || prediv > 32){
liangzhen 0:84a8bcfbdec9 7 pc.printf("Prediv out of 1-32 range\r\n");
liangzhen 0:84a8bcfbdec9 8 }
liangzhen 0:84a8bcfbdec9 9 if(multint_upper < 1 || multint_upper > 4){
liangzhen 0:84a8bcfbdec9 10 pc.printf("Multint_upper out of 1-4 range\r\n");
liangzhen 0:84a8bcfbdec9 11 }
liangzhen 0:84a8bcfbdec9 12 if(multint < 1 || multint > 255){
liangzhen 0:84a8bcfbdec9 13 pc.printf("Multint out of 1-255 range\r\n");
liangzhen 0:84a8bcfbdec9 14 }
liangzhen 0:84a8bcfbdec9 15 if(multint_upper * multint > 255){
liangzhen 0:84a8bcfbdec9 16 pc.printf("Multint_upper * Multint out of 1-255 range\r\n");
liangzhen 0:84a8bcfbdec9 17 }
liangzhen 0:84a8bcfbdec9 18 if(!(range_upper == 1 || range_upper == 2 || range_upper == 4)){
liangzhen 0:84a8bcfbdec9 19 pc.printf("Range_upper out of 1,2,4 range\r\n");
liangzhen 0:84a8bcfbdec9 20 }
liangzhen 0:84a8bcfbdec9 21 if(rangea < 1 || rangea > 32){
liangzhen 0:84a8bcfbdec9 22 pc.printf("RangeA out of 1-32 range\r\n");
liangzhen 0:84a8bcfbdec9 23 }
liangzhen 0:84a8bcfbdec9 24 if(rangeb < 1 || rangeb > 32){
liangzhen 0:84a8bcfbdec9 25 pc.printf("RangeB out of 1-32 range\r\n");
liangzhen 0:84a8bcfbdec9 26 }
liangzhen 0:84a8bcfbdec9 27
liangzhen 0:84a8bcfbdec9 28 unsigned long long dco = PLL_REF / prediv * multint_upper * multint;
liangzhen 0:84a8bcfbdec9 29 if(dco < 2500000000 || dco > 5000000000){
liangzhen 0:84a8bcfbdec9 30 pc.printf("Dco out of 2.5G-5G range\r\n");
liangzhen 0:84a8bcfbdec9 31 }
liangzhen 0:84a8bcfbdec9 32 unsigned long long internal = dco / multint_upper;
liangzhen 0:84a8bcfbdec9 33 if(internal < 9800000 || internal > 3200000000){
liangzhen 0:84a8bcfbdec9 34 //\ pc.printf("Dco out of 9.8M-3.2G range\r\n");
liangzhen 0:84a8bcfbdec9 35 }
liangzhen 0:84a8bcfbdec9 36 unsigned long long prescale_dco = dco / range_upper;
liangzhen 0:84a8bcfbdec9 37 if(prescale_dco > 3200000000){
liangzhen 0:84a8bcfbdec9 38 // pc.printf("Prescale DCO out of 0-3.2G range\r\n");
liangzhen 0:84a8bcfbdec9 39 }
liangzhen 0:84a8bcfbdec9 40 unsigned long long out_a = prescale_dco / rangea;
liangzhen 0:84a8bcfbdec9 41 if(out_a < 20000000 || out_a > 3000000000){
liangzhen 0:84a8bcfbdec9 42 pc.printf("Out A out of 20M-3.0G range\r\n");
liangzhen 0:84a8bcfbdec9 43 }
liangzhen 0:84a8bcfbdec9 44 unsigned long long out_b = prescale_dco / rangeb;
liangzhen 0:84a8bcfbdec9 45 if(out_b < 20000000 || out_b > 3000000000){
liangzhen 0:84a8bcfbdec9 46 pc.printf("Out B out of 20M-3.0G range\r\n");
liangzhen 0:84a8bcfbdec9 47 }
liangzhen 0:84a8bcfbdec9 48
liangzhen 0:84a8bcfbdec9 49 return out_a;
liangzhen 0:84a8bcfbdec9 50 }
liangzhen 0:84a8bcfbdec9 51
liangzhen 0:84a8bcfbdec9 52 int get_binline_by_num(char* filename, int linenum){
liangzhen 0:84a8bcfbdec9 53 char value[30];
liangzhen 0:84a8bcfbdec9 54
liangzhen 0:84a8bcfbdec9 55 //pc.printf("Opening %s File\r\n", filename);
liangzhen 0:84a8bcfbdec9 56 FILE *fp = fopen(filename, "r");
liangzhen 0:84a8bcfbdec9 57 if(!fp){
liangzhen 0:84a8bcfbdec9 58 pc.printf("ERROR: %s not found\r\n", filename);
liangzhen 0:84a8bcfbdec9 59 }
liangzhen 0:84a8bcfbdec9 60 //pc.printf("%s Open\r\n", filename);
liangzhen 0:84a8bcfbdec9 61
liangzhen 0:84a8bcfbdec9 62 int i=1;
liangzhen 0:84a8bcfbdec9 63 char lineval[255];
liangzhen 0:84a8bcfbdec9 64 while (!feof(fp)) {
liangzhen 0:84a8bcfbdec9 65 fscanf(fp, "%s", lineval);
liangzhen 0:84a8bcfbdec9 66 if(i == linenum){
liangzhen 0:84a8bcfbdec9 67 strcpy(value, lineval);
liangzhen 0:84a8bcfbdec9 68 break;
liangzhen 0:84a8bcfbdec9 69 }
liangzhen 0:84a8bcfbdec9 70 i++;
liangzhen 0:84a8bcfbdec9 71 }
liangzhen 0:84a8bcfbdec9 72
liangzhen 0:84a8bcfbdec9 73 //pc.printf("Closing %s File\r\n", filename);
liangzhen 0:84a8bcfbdec9 74 fclose(fp);
liangzhen 0:84a8bcfbdec9 75 //pc.printf("File %s Closed\r\n", filename);
liangzhen 0:84a8bcfbdec9 76
liangzhen 0:84a8bcfbdec9 77 return strtol(value, NULL, 2);
liangzhen 0:84a8bcfbdec9 78 }
liangzhen 0:84a8bcfbdec9 79
liangzhen 0:84a8bcfbdec9 80 void scan_pll(unsigned int prediv, unsigned int multint_upper, unsigned int multint,
liangzhen 0:84a8bcfbdec9 81 unsigned int range_upper, unsigned int rangea, unsigned int rangeb){
liangzhen 0:84a8bcfbdec9 82
liangzhen 0:84a8bcfbdec9 83 prediv = get_binline_by_num("/local/Pprediv.txt", prediv);
liangzhen 0:84a8bcfbdec9 84 multint_upper = get_binline_by_num("/local/Pmultup.txt", multint_upper);
liangzhen 0:84a8bcfbdec9 85 multint = get_binline_by_num("/local/Pmultint.txt", multint);
liangzhen 0:84a8bcfbdec9 86 range_upper = get_binline_by_num("/local/Prangeup.txt", range_upper);
liangzhen 0:84a8bcfbdec9 87 rangea = get_binline_by_num("/local/Prange.txt", rangea);
liangzhen 0:84a8bcfbdec9 88 rangeb = get_binline_by_num("/local/Prange.txt", rangeb);
liangzhen 0:84a8bcfbdec9 89
liangzhen 0:84a8bcfbdec9 90 set_scan_bits("PLL_CE1CCB", 1);
liangzhen 0:84a8bcfbdec9 91 set_scan_bits("PLL_CE1MPGC1", 1);
liangzhen 0:84a8bcfbdec9 92 set_scan_bits("PLL_FFTUNE", fftune(0));
liangzhen 0:84a8bcfbdec9 93 set_scan_bits("PLL_LFTUNE", lftune()); // @@@ Fix this. Scan doesn't support more than 32 bits
liangzhen 0:84a8bcfbdec9 94 set_scan_bits("PLL_INTFBK", 1);
liangzhen 0:84a8bcfbdec9 95 set_scan_bits("PLL_PREDIV", prediv);
liangzhen 0:84a8bcfbdec9 96 set_scan_bits("PLL_MULTINT", multint_upper << 8 | multint);
liangzhen 0:84a8bcfbdec9 97 set_scan_bits("PLL_RANGEA", range_upper << 5 | rangea);
liangzhen 0:84a8bcfbdec9 98 set_scan_bits("PLL_RANGEB", range_upper << 5 | rangeb);
liangzhen 0:84a8bcfbdec9 99 }
liangzhen 0:84a8bcfbdec9 100
liangzhen 0:84a8bcfbdec9 101 void jtag_pll(JTAG &jtag, unsigned int prediv, unsigned int multint_upper, unsigned int multint,
liangzhen 0:84a8bcfbdec9 102 unsigned int range_upper, unsigned int rangea, unsigned int rangeb){
liangzhen 0:84a8bcfbdec9 103
liangzhen 0:84a8bcfbdec9 104 prediv = get_binline_by_num("/local/Pprediv.txt", prediv);
liangzhen 0:84a8bcfbdec9 105 multint_upper = get_binline_by_num("/local/Pmultup.txt", multint_upper);
liangzhen 0:84a8bcfbdec9 106 multint = get_binline_by_num("/local/Pmultint.txt", multint);
liangzhen 0:84a8bcfbdec9 107 range_upper = get_binline_by_num("/local/Prangeup.txt", range_upper);
liangzhen 0:84a8bcfbdec9 108 rangea = get_binline_by_num("/local/Prange.txt", rangea);
liangzhen 0:84a8bcfbdec9 109 rangeb = get_binline_by_num("/local/Prange.txt", rangeb);
liangzhen 0:84a8bcfbdec9 110
liangzhen 0:84a8bcfbdec9 111 jtag.writeMemory(PLL_CE1CCB, 1);
liangzhen 0:84a8bcfbdec9 112 jtag.writeMemory(PLL_CE1MPGC1, 1);
liangzhen 0:84a8bcfbdec9 113 jtag.writeMemory(PLL_FFTUNE, fftune(0));
liangzhen 0:84a8bcfbdec9 114 jtag.writeMemory(PLL_LFTUNE_32_0, lftune_lo());
liangzhen 0:84a8bcfbdec9 115 jtag.writeMemory(PLL_LFTUNE_40_32, lftune_hi());
liangzhen 0:84a8bcfbdec9 116 jtag.writeMemory(PLL_INTFBK, 1);
liangzhen 0:84a8bcfbdec9 117 jtag.writeMemory(PLL_PREDIV, prediv);
liangzhen 0:84a8bcfbdec9 118 jtag.writeMemory(PLL_MULTINT, multint_upper << 8 | multint);
liangzhen 0:84a8bcfbdec9 119 jtag.writeMemory(PLL_RANGEA, range_upper << 5 | rangea);
liangzhen 0:84a8bcfbdec9 120 jtag.writeMemory(PLL_RANGEB, range_upper << 5 | rangeb);
liangzhen 0:84a8bcfbdec9 121 }
liangzhen 0:84a8bcfbdec9 122
liangzhen 0:84a8bcfbdec9 123
liangzhen 0:84a8bcfbdec9 124 unsigned int fftune(bool change_rangeab){
liangzhen 0:84a8bcfbdec9 125 if(change_rangeab){
liangzhen 0:84a8bcfbdec9 126 return 0x0120;
liangzhen 0:84a8bcfbdec9 127 }else{
liangzhen 0:84a8bcfbdec9 128 return 0x0100;
liangzhen 0:84a8bcfbdec9 129 }
liangzhen 0:84a8bcfbdec9 130 }
liangzhen 0:84a8bcfbdec9 131
liangzhen 0:84a8bcfbdec9 132 unsigned int lftune_hi(){
liangzhen 0:84a8bcfbdec9 133 return 0x00000050;
liangzhen 0:84a8bcfbdec9 134 }
liangzhen 0:84a8bcfbdec9 135
liangzhen 0:84a8bcfbdec9 136 unsigned int lftune_lo(){
liangzhen 0:84a8bcfbdec9 137 return 0x40100000;
liangzhen 0:84a8bcfbdec9 138 }
liangzhen 0:84a8bcfbdec9 139
liangzhen 0:84a8bcfbdec9 140 unsigned long long lftune(){
liangzhen 0:84a8bcfbdec9 141 // 41 bits
liangzhen 0:84a8bcfbdec9 142 return 0x05040100000L;
liangzhen 0:84a8bcfbdec9 143 }