mbed code for Farrari board
Dependencies: DDRO_Farrari mbed
Fork of DDRO_Farrari by
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 }
Generated on Wed Jul 27 2022 00:15:18 by
1.7.2
