示例#1
0
文件: bootloader.c 项目: rihuber/ma
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;
}
示例#2
0
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;
}