mbed code for Farrari board

Dependencies:   DDRO_Farrari mbed

Fork of DDRO_Farrari by Liangzhen Lai

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers scan.cpp Source File

scan.cpp

00001 #include "scan.h"
00002 #include "lcd.h"
00003 
00004 
00005 void scan_clear()
00006 {
00007     dual_printf("Clearing Scan Bits");
00008     scan_data_in = 0;
00009     scan_load_chain = 0;
00010     scan_phi = 1;
00011     scan_phi_bar = 1;
00012     scan_load_chip = 1;
00013 
00014     // 0 all inputs again
00015     scan_phi = 0;
00016     scan_phi_bar = 0;
00017     scan_load_chip = 0;
00018 }
00019 
00020 void scan_init()
00021 {
00022     scan_clear();
00023     
00024     //pc.printf("Opening Scan File\r\n");
00025     FILE *fp = fopen("/local/scan.txt", "r");
00026     if(!fp){
00027         dual_printf("ERROR: scan file not found");
00028     }
00029     //pc.printf("Scan File Open\r\n");
00030     {
00031         unsigned int high = 0;
00032         unsigned int low = 0;
00033         char sig_name[255];
00034 
00035         // First pass through file to find number of variables, length of chain, and longest var name
00036         int n = 0;
00037         while (!feof(fp)) {
00038             fscanf(fp, "%d:%d %s", &high, &low, sig_name);
00039             n++;
00040         }
00041         rewind(fp);
00042         scan_num_vars = n;
00043         scan_length = high + 1;
00044         pc.printf("Scan chain length %d, %d variables\r\n", scan_length, scan_num_vars);
00045 
00046         // Declare dynamic memory using sizes just found
00047         scan_bits  = new char[scan_length];
00048         scan_out   = new char[scan_length];
00049         for(int i=0; i<scan_length; i++) {
00050             scan_bits[i] = 0;
00051             scan_out[i] = 0;
00052         }
00053 
00054         scan_highs = new int[scan_num_vars];
00055         scan_lows  = new int[scan_num_vars];
00056         scan_names = new char*[scan_num_vars];
00057 
00058         n = 0;
00059         while (!feof(fp)) {
00060             fscanf(fp, "%d:%d %s", &high, &low, sig_name);
00061             
00062             scan_highs[n] = high;
00063             scan_lows[n] = low;
00064             scan_names[n] = new char[strlen(sig_name)+1];
00065             strcpy(scan_names[n], sig_name);
00066             //pc.printf("Read line signal %s, h=%i, l=%i\r\n", scan_names[n], scan_highs[n], scan_lows[n]);
00067             n++;
00068         }
00069     }
00070     //pc.printf("Closing Scan File\r\n");
00071     fclose(fp);
00072     //pc.printf("File Scan Closed\r\n");
00073 }
00074 
00075 int get_var_idx(char* varname)
00076 {
00077     for(int i=0; i<scan_num_vars; i++) {
00078         if(!strcmp(varname, scan_names[i])) {
00079             return i;
00080         }
00081     }
00082     dual_printf("ERROR - INVALID SCAN VARIABLE");
00083     dual_printf(varname);
00084     return -1;
00085 }
00086 
00087 void set_scan_bits(char* varname, unsigned int value)
00088 {
00089     int idx = get_var_idx(varname);
00090 
00091     int j=0;
00092     for(int i=scan_lows[idx]; i<=scan_highs[idx]; i++) {
00093         scan_bits[i] = (value & (1 << j)) >> j;
00094         j++;
00095     }
00096 }
00097 
00098 unsigned int get_scan_bits(char* varname){
00099     int idx = get_var_idx(varname);
00100     unsigned int value = 0;
00101     
00102     int j = 0;
00103     for(int i=scan_lows[idx]; i<=scan_highs[idx]; i++) {
00104         value = value | (scan_out[i] << j);
00105         j++;
00106     }
00107     
00108     return value;
00109 }
00110 
00111 void load_chip()
00112 {
00113     scan_load_chip = 1;
00114     scan_load_chip = 0;
00115 }
00116 
00117 void load_chain()
00118 {
00119     scan_load_chain = 1;
00120     scan_phi = 1;
00121     scan_phi = 0;
00122     scan_phi_bar = 1;
00123     scan_phi_bar = 0;
00124     scan_load_chain = 0;
00125 }
00126 
00127 void rotate_chain()
00128 {
00129     for(int i=0; i<scan_length; i++) {
00130         scan_data_in = scan_bits[i];
00131         scan_out[i] = scan_data_out;
00132         scan_phi = 1;
00133         scan_phi = 0;
00134         scan_phi_bar = 1;
00135         scan_phi_bar = 0;
00136     }
00137 }