int main() { SYSACE_FILE *srec_file; char file_name[20]; char *p; uint8_t ret; int choice, bytes, total_bytes; /* Set a well-known "return to loader" vector*/ set_ret_to_loader_vec(); /* Initialize RS232_Uart_1 - Set baudrate and number of stop bits */ XUartNs550_SetBaud(XPAR_RS232_UART_1_BASEADDR, XPAR_XUARTNS550_CLOCK_HZ, 9600); XUartNs550_SetLineControlReg(XPAR_RS232_UART_1_BASEADDR, XUN_LCR_8_DATA_BITS); print("\n\r********************************************************"); print("\n\r********************************************************"); print("\n\r** Xilinx Virtex-6 FPGA ML605 Evaluation Kit **"); print("\n\r********************************************************"); print("\n\r********************************************************\r\n"); do { print("Choose Feature to Test:\r\n"); print("1: UART Test\r\n"); print("2: LED Test\r\n"); print("3: Timer Test\r\n"); print("4: FLASH Test\r\n"); print("5: IIC Test\r\n"); print("6: Ethernet Loopback Test\r\n"); print("7: Switch Test\r\n"); print("8: External Memory Test\r\n"); print("9: System Monitor Test\r\n"); print("A: PushButton Test\r\n"); print("B: LCD Test\r\n"); print("C: System ACE CF Test\r\n"); print("D: DVI/VGA Test\r\n"); choice = inbyte(); if (isalpha(choice)) { choice = toupper(choice); } } while (!isdigit(choice) && (choice < 'A' || choice > 'D')) ; xil_printf("%c\r\n", choice); sprintf(file_name, "bist\\%c.rec", choice); srec_file = sysace_fopen(file_name, "r"); if (srec_file == 0) { printf("\r\nUnable to open %s\r\n", file_name); return 1; } /* * Read the SRECORDS in the selected file into RAM. */ flbuf = (char*)(XPAR_DDR3_SDRAM_MPMC_BASEADDR + 0x100000); p = flbuf; total_bytes = 0; xil_printf("Reading SRECORDS from Compact Flash file %s:\r\n", file_name); do { bytes = sysace_fread(p, 1, 0x100000, srec_file); p += bytes; total_bytes += bytes; } while (bytes > 0); sysace_fclose(srec_file); xil_printf("\r\n%d bytes read from file. SRECORDS at: 0x%x\r\n", total_bytes, (unsigned)flbuf); ret = load_exec (); /* If we reach here, we are in error */ #ifdef VERBOSE if (ret > LD_SREC_LINE_ERROR) { print ("ERROR in SREC line: "); putnum (srec_line); print (errors[ret]); } else { print ("ERROR: "); print (errors[ret]); } #endif return ret; }
XStatus read_SRecord(SYSACE_FILE *filename, SRecord *sr) { /* * Selon http://www.amelek.gda.pl/avr/uisp/srecord.htm, il faudrait prévoir * un buffer de 255*2 caractères. powerpc-eabi-objcopy semble respecter la * norme Motorola et ne jamais utiliser plus de 64 caractères de données par * S-record. Et une petite économie de faire sur la taille du bootloader ! */ Xuint8 readBuffer[64]; Xint32 numread, count, i; // initialisation du checksum calculé sr->computed_checksum = 0; // lecture du champ "type" numread = sysace_fread(readBuffer, 1, 2, filename); if (numread != 2) { return XST_FAILURE; } switch (readBuffer[1]) { case '0': sr->type = S0; break; case '1': sr->type = S1; break; case '2': sr->type = S2; break; case '3': sr->type = S3; break; case '5': sr->type = S5; break; case '7': sr->type = S7; break; case '8': sr->type = S8; break; case '9': sr->type = S9; break; default: return 0; } // lecture du champ "count" numread = sysace_fread(readBuffer, 1, 2, filename); if (numread != 2) { return XST_FAILURE; } count = hex2_to_int(readBuffer); sr->computed_checksum += count; sr->data_size = count - 1; // lecture du champ "address" if (sr->type == S0 || sr->type == S1 || sr->type == S5 || sr->type == S9) { numread = sysace_fread(readBuffer, 1, 4, filename); if (numread != 4) { return XST_FAILURE; } sr->data_size -= 2; sr->address = hex4_to_int(readBuffer); sr->computed_checksum += hex2_to_int(readBuffer); sr->computed_checksum += hex2_to_int(readBuffer + 2); } else if (sr->type == S2 || sr->type == S8) { numread = sysace_fread(readBuffer, 1, 6, filename); if (numread != 6) { return XST_FAILURE; } sr->data_size -= 3; sr->address = hex6_to_int(readBuffer); sr->computed_checksum += hex2_to_int(readBuffer); sr->computed_checksum += hex2_to_int(readBuffer + 2); sr->computed_checksum += hex2_to_int(readBuffer + 4); } else // S3, S7 { numread = sysace_fread(readBuffer, 1, 8, filename); if (numread != 8) { return XST_FAILURE; } sr->data_size -= 4; sr->address = hex8_to_int(readBuffer); sr->computed_checksum += hex2_to_int(readBuffer); sr->computed_checksum += hex2_to_int(readBuffer + 2); sr->computed_checksum += hex2_to_int(readBuffer + 4); sr->computed_checksum += hex2_to_int(readBuffer + 6); } // lecture du champ "data" numread = sysace_fread(readBuffer, 1, 2 * sr->data_size, filename); if (numread != 2 * sr->data_size) { return XST_FAILURE; } for (i = 0; i < sr->data_size; i++) { sr->data[i] = (Xuint8)(hex2_to_int(readBuffer + 2 * i)); sr->computed_checksum += sr->data[i]; } // lecture du champ "cheksum" numread = sysace_fread(readBuffer, 1, 2, filename); if (numread != 2) { return XST_FAILURE; } sr->read_checksum = (Xuint8)(hex2_to_int(readBuffer)); // lecture du retour charriot numread = sysace_fread(readBuffer, 1, 2, filename); if (numread != 2) { return XST_FAILURE; } // OK desu ! return XST_SUCCESS; }