Пример #1
0
/*
 * Check Board Identity:
 */
int checkboard (void)
{
	char str[64];
	int i = getenv_f("serial#", str, sizeof(str));

	puts ("Board: ");

	if (i == -1) {
		puts ("### No HW ID - assuming HUB405");
	} else {
		puts(str);
	}

	if (getenv_f("bd_type", str, sizeof(str)) != -1) {
		printf(" (%s", str);
	} else {
		puts(" (Missing bd_type!");
	}

	gd->board_type = board_revision();
	printf(", Rev 1.%ld)\n", gd->board_type);

	/*
	 * Disable sleep mode in LXT971
	 */
	lxt971_no_sleep();

	return 0;
}
Пример #2
0
int board_early_init_f (void)
{
	/*
	 * First pull fpga-prg pin low, to disable fpga logic
	 */
	out_be32((void*)GPIO0_ODR, 0x00000000);        /* no open drain pins */
	out_be32((void*)GPIO0_TCR, CONFIG_SYS_FPGA_PRG);      /* setup for output   */
	out_be32((void*)GPIO0_OR, 0);                  /* pull prg low       */

	/*
	 * IRQ 0-15  405GP internally generated; active high; level sensitive
	 * IRQ 16    405GP internally generated; active low; level sensitive
	 * IRQ 17-24 RESERVED
	 * IRQ 25 (EXT IRQ 0) CAN0; active low; level sensitive
	 * IRQ 26 (EXT IRQ 1) SER0 ; active low; level sensitive
	 * IRQ 27 (EXT IRQ 2) SER1; active low; level sensitive
	 * IRQ 28 (EXT IRQ 3) FPGA 0; active low; level sensitive
	 * IRQ 29 (EXT IRQ 4) FPGA 1; active low; level sensitive
	 * IRQ 30 (EXT IRQ 5) PCI INTA; active low; level sensitive
	 * IRQ 31 (EXT IRQ 6) COMPACT FLASH; active high; level sensitive
	 */
	mtdcr(UIC0SR, 0xFFFFFFFF);       /* clear all ints */
	mtdcr(UIC0ER, 0x00000000);       /* disable all ints */
	mtdcr(UIC0CR, 0x00000000);       /* set all to be non-critical*/
	mtdcr(UIC0PR, 0xFFFFFF81);       /* set int polarities */
	mtdcr(UIC0TR, 0x10000000);       /* set int trigger levels */
	mtdcr(UIC0VCR, 0x00000001);      /* set vect base=0 */
	mtdcr(UIC0SR, 0xFFFFFFFF);       /* clear all ints */

	/*
	 * EBC Configuration Register: set ready timeout to 512 ebc-clks
	 */
	mtebc(EBC0_CFG, 0xa8400000); /* ebc always driven */

	/*
	 * New boards have a single 32MB flash connected to CS0
	 * instead of two 16MB flashes on CS0+1.
	 */
	if (board_revision() >= 8) {
		/* disable CS1 */
		mtebc(PB1AP, 0);
		mtebc(PB1CR, 0);

		/* resize CS0 to 32MB */
		mtebc(PB0AP, CONFIG_SYS_EBC_PB0AP_HWREV8);
		mtebc(PB0CR, CONFIG_SYS_EBC_PB0CR_HWREV8);
	}

	return 0;
}
/*
 * Check Board Identity
 */
int checkboard(void)
{
	puts("Board: esd GmbH - PMC-CPU/405-DE");

	gd->board_type = board_revision();
	printf(", Rev 1.%ld, ", gd->board_type);

	if (!is_monarch())
		puts("non-");

	printf("monarch, PCI=%s MHz, PLD-Rev 1.%d\n",
	       pci_is_66mhz() ? "66" : "33", cpld_revision());

	return 0;
}
Пример #4
0
/*
 * Check Board Identity:
 */
int checkboard (void)
{
	char str[64];
	int i = getenv_f("serial#", str, sizeof(str));

	puts ("Board: ");

	if (i == -1) {
		puts ("### No HW ID - assuming APC405");
	} else {
		puts(str);
	}

	gd->board_type = board_revision();
	printf(", Rev. 1.%ld\n", gd->board_type);

	return 0;
}
Пример #5
0
/*
 * Check Board Identity:
 */
int checkboard (void)
{
    char str[64];
    int i = getenv_r ("serial#", str, sizeof(str));

    puts ("Board: ");

    if (i == -1) {
        puts ("### No HW ID - assuming PCI405");
    } else {
        puts (str);
    }

    gd->board_type = board_revision();
    printf(" (Rev 1.%ld", gd->board_type);

    if (gd->board_type >= 2) {
        unsigned long CPC0_CR0Reg;
        unsigned long value;

        /*
         * Setup GPIO pins (Trace/GPIO1 to GPIO)
         */
        CPC0_CR0Reg = mfdcr(CPC0_CR0);
        mtdcr(CPC0_CR0, CPC0_CR0Reg & ~0x08000000);
        out_be32((void*)GPIO0_ODR, in_be32((void*)GPIO0_ODR) & ~0x40000000);
        out_be32((void*)GPIO0_TCR, in_be32((void*)GPIO0_TCR) & ~0x40000000);
        udelay(1000);                   /* wait some time before reading input */
        value = in_be32((void*)GPIO0_IR) & 0x40000000;       /* get config bits */
        if (value) {
            puts(", 33 MHz PCI");
        } else {
            puts(", 66 MHz PCI");
        }
    }

    puts(")\n");

    return 0;
}
Пример #6
0
int checkboard (void)
{
	char str[64];
	int i = getenv_r ("serial#", str, sizeof(str));

	puts ("Board: ");

	if (i == -1) {
		puts ("### No HW ID - assuming HH405");
	} else {
		puts(str);
	}

	if (getenv_r("bd_type", str, sizeof(str)) != -1) {
		printf(" (%s", str);
	} else {
		puts(" (Missing bd_type!");
	}

	gd->board_type = board_revision();
	printf(", Rev %ld.x)\n", gd->board_type);

	return 0;
}
/* Program the board ID fuses if not already done */
test_return_t program_board_id(void)
{
    const char* const indent = menu_get_indent();

    char chip_str[64];
    char chip_str_full[64];
    char chip_rev_str[64];
    char board_str[64];
    char board_rev_str[64];

    fsl_board_id_t board_id = get_board_id();

    chip_name(chip_str, board_id.B.CHIP_TYPE_ID, false);
    chip_name(chip_str_full, board_id.B.CHIP_TYPE_ID, true);
    chip_revision(chip_rev_str, board_id.B.CHIP_REV_MAJOR, board_id.B.CHIP_REV_MINOR);
    board_name(board_str, board_id.B.BOARD_TYPE_ID);
    board_revision(board_rev_str, board_id.B.BOARD_REV);

    uint32_t fw_board_type = BOARD_TYPE;
    uint32_t fw_board_rev = BOARD_REVISION;

    /* Special case for MX6SDL/DQ SMART_DEVICE/SABRE_AI REV_B boards.
     * Allow user to choose to program the board as a REV_C or a REV_BX board */
    if ((CHIP_TYPE == CHIP_TYPE_MX6SDL || CHIP_TYPE == CHIP_TYPE_MX6DQ) &&
        (BOARD_TYPE == BOARD_TYPE_SABRE_AI || BOARD_TYPE == BOARD_TYPE_SMART_DEVICE) &&
         BOARD_REVISION == BOARD_REVISION_B)
    {
        printf("%sThis binary will work for REV_D, REV_C, REV_BX, and REV_B boards.\n", indent);
        printf("%sWould you like to use the REV_D board ID for this board?\n", indent);
        if (is_input_char('y', indent)) {
            printf("%sUsing REV_D board ID instead of REV_B board ID.\n\n", indent);
            fw_board_rev = BOARD_REVISION_D;
        }
        else {
            printf("%sWould you like to use the REV_C board ID for this board?\n", indent);
            if (is_input_char('y', indent)) {
                printf("%sUsing REV_C board ID instead of REV_B board ID.\n\n", indent);
                fw_board_rev = BOARD_REVISION_C;
            }
            else if(BOARD_TYPE == BOARD_TYPE_SABRE_AI){
                printf("%sWould you like to use the REV_BX board ID for this board?\n", indent);
                if (is_input_char('y', indent)) {
                    printf("%sUsing REV_BX board ID instead of REV_B board ID.\n\n", indent);
                    fw_board_rev = BOARD_REVISION_BX;
                }
            }
        }
    }

    /* Special case for MX6SL EVB/EVK boards.
     * Allow user to choose to program the board as a EVK_EPDC or EVK_SPDC board */
    if (CHIP_TYPE == CHIP_TYPE_MX6SL)
    {
        printf("%sThis binary will work for both EVB and EVK boards.\n", indent);
        printf("%sWould you like to use the EVK board ID for this board?\n", indent);
        if (is_input_char('y', indent))
        {
            printf("%sUsing BOARD_TYPE_EVK board ID instead of BOARD_TYPE_EVB board ID.\n\n", indent);
            printf("%sUsing BOARD_REVISION_A board ID instead of BOARD_REVISION_B board ID.\n\n", indent);
            fw_board_type = BOARD_TYPE_EVK;
            fw_board_rev = BOARD_REVISION_A;
        }
    }

    if (board_id.B.BOARD_TYPE_ID == 0 || board_id.B.BOARD_REV == 0)
    {
        // Board is not programmed
        printf("%sNo Board ID found in the fuses.\n", indent);
        board_id.B.BOARD_TYPE_ID = fw_board_type;
        board_id.B.BOARD_REV = fw_board_rev;

        printf("%sThis OBDS binary will program Board ID to 0x%08X as detailed below:\n", indent, board_id.U);
        show_board_id(board_id, indent);

        printf_color(g_TextAttributeBold, g_TextColorRed, "%sContinue with irreversible operation to program Board ID?\n", indent);
        if (!is_input_char('y', indent))
        {
            /* Do not program the suggested value to Board ID fuse bank */
            printf("%sNOT programming board ID to fuses.\n", indent);

            return TEST_BYPASSED;
        }

        // DO THE PROGRAMMING
        test_return_t err = program_board_id_fuses(board_id.B.BOARD_TYPE_ID, board_id.B.BOARD_REV, indent);
        if (err == TEST_PASSED)
        {
            printf("%sFuses programmed successfully.\n\n", indent);
            show_board_id(get_board_id(), indent);
        }

        return err;
    }
    else if ((board_id.B.BOARD_TYPE_ID == BOARD_TYPE_SABRE_AI || board_id.B.BOARD_REV == BOARD_REVISION_B) &&
             (fw_board_rev == BOARD_REVISION_BX) )
    {
        // SABRE AI Board is programmed as REV_B , but we need it to be REV_BX
        printf("\n%sSABRE AI Rev. B board ID found in the fuses.\n", indent);
        board_id.B.BOARD_TYPE_ID = fw_board_type;
        board_id.B.BOARD_REV = fw_board_rev;

        printf("%sThis OBDS binary will program Board ID to 0x%08X as detailed below:\n", indent, board_id.U);
        show_board_id(board_id, indent);
        printf("\n");
        printf_color(g_TextAttributeBold, g_TextColorRed, "%sContinue with irreversible operation to program Board ID?\n", indent);
        if (!is_input_char('y', indent))
        {
            /* Do not program the suggested value to Board ID fuse bank */
            printf("%sNOT programming board ID to fuses.\n", indent);

            return TEST_BYPASSED;
        }

        // DO THE PROGRAMMING
        test_return_t err = program_board_id_fuses(board_id.B.BOARD_TYPE_ID, board_id.B.BOARD_REV, indent);
        if (err == TEST_PASSED)
        {
            printf("%sFuses programmed successfully.\n\n", indent);
            show_board_id(get_board_id(), indent);
        }

        return err;
    }
    else if ( board_id.B.CHIP_TYPE_ID  != CHIP_TYPE     ||
              board_id.B.BOARD_TYPE_ID != fw_board_type ||
              board_id.B.BOARD_REV     != fw_board_rev  )
    {
        // Software is not compiled for this board
        printf("\n%sSoftware is not compiled for this board.\n", indent);

        chip_name(chip_str, CHIP_TYPE, false);
        board_name(board_str, fw_board_type);
        board_revision(board_rev_str, fw_board_rev);
        printf("%sSoftware for %s %s %s.\n", indent, chip_str, board_str, board_rev_str);

        chip_name(chip_str, board_id.B.CHIP_TYPE_ID, false);
        board_name(board_str, board_id.B.BOARD_TYPE_ID);
        board_revision(board_rev_str, board_id.B.BOARD_REV);
        printf("%sBoard is %s %s %s.\n", indent, chip_str, board_str, board_rev_str);

        return TEST_FAILED;
    }
    else if ( board_id.B.CHIP_TYPE_ID  == CHIP_TYPE     &&
              board_id.B.BOARD_TYPE_ID == fw_board_type &&
              board_id.B.BOARD_REV     == fw_board_rev  )
    {
        // Board ID fuses are already correct
        printf("\n%sBoard ID fuses are already programmed.\n\n", indent);
        show_board_id(board_id, indent);

        return TEST_PASSED;
    }
    else
    {
        // Unhandled cases
        printf("\n%sUnknown failure.\n\n", indent);
        show_board_id(board_id, indent);

        return TEST_FAILED;
    }
}