/* * 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; }
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; }
/* * 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; }
/* * 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; }
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; } }