| /* |
| * BF537-STAMP POST code |
| * |
| * Enter bugs at http://blackfin.uclinux.org/ |
| * |
| * Copyright (c) 2005-2009 Analog Devices Inc. |
| * |
| * Licensed under the GPL-2 or later. |
| */ |
| |
| #include <common.h> |
| #include <config.h> |
| #include <command.h> |
| #include <asm/blackfin.h> |
| |
| #define POST_WORD_ADDR 0xFF903FFC |
| |
| /* Using sw10-PF5 as the hotkey */ |
| int post_hotkeys_pressed(void) |
| { |
| int delay = 3; |
| int i; |
| unsigned short value; |
| |
| *pPORTF_FER &= ~PF5; |
| *pPORTFIO_DIR &= ~PF5; |
| *pPORTFIO_INEN |= PF5; |
| |
| printf("########Press SW10 to enter Memory POST########: %2d ", delay); |
| while (delay--) { |
| for (i = 0; i < 100; i++) { |
| value = *pPORTFIO & PF5; |
| if (value != 0) { |
| break; |
| } |
| udelay(10000); |
| } |
| printf("\b\b\b%2d ", delay); |
| } |
| printf("\b\b\b 0"); |
| printf("\n"); |
| if (value == 0) |
| return 0; |
| else { |
| printf("Hotkey has been pressed, Enter POST . . . . . .\n"); |
| return 1; |
| } |
| } |
| |
| void post_word_store(ulong a) |
| { |
| volatile ulong *save_addr = (volatile ulong *)POST_WORD_ADDR; |
| *save_addr = a; |
| } |
| |
| ulong post_word_load(void) |
| { |
| volatile ulong *save_addr = (volatile ulong *)POST_WORD_ADDR; |
| return *save_addr; |
| } |
| |
| int uart_post_test(int flags) |
| { |
| return 0; |
| } |
| |
| #define BLOCK_SIZE 0x10000 |
| #define VERIFY_ADDR 0x2000000 |
| extern int erase_block_flash(int); |
| extern int write_data(long lStart, long lCount, uchar * pnData); |
| int flash_post_test(int flags) |
| { |
| unsigned short *pbuf, *temp; |
| int offset, n, i; |
| int value = 0; |
| int result = 0; |
| printf("\n"); |
| pbuf = (unsigned short *)VERIFY_ADDR; |
| temp = pbuf; |
| for (n = FLASH_START_POST_BLOCK; n < FLASH_END_POST_BLOCK; n++) { |
| offset = (n - 7) * BLOCK_SIZE; |
| printf("--------Erase block:%2d..", n); |
| erase_block_flash(n); |
| printf("OK\r"); |
| printf("--------Program block:%2d...", n); |
| write_data(CONFIG_SYS_FLASH_BASE + offset, BLOCK_SIZE, pbuf); |
| printf("OK\r"); |
| printf("--------Verify block:%2d...", n); |
| for (i = 0; i < BLOCK_SIZE; i += 2) { |
| if (*(unsigned short *)(CONFIG_SYS_FLASH_BASE + offset + i) != |
| *temp++) { |
| value = 1; |
| result = 1; |
| } |
| } |
| if (value) |
| printf("failed\n"); |
| else |
| printf("OK %3d%%\r", |
| (int)( |
| (n + 1 - |
| FLASH_START_POST_BLOCK) * |
| 100 / (FLASH_END_POST_BLOCK - |
| FLASH_START_POST_BLOCK))); |
| |
| temp = pbuf; |
| value = 0; |
| } |
| printf("\n"); |
| if (result) |
| return -1; |
| else |
| return 0; |
| } |
| |
| /**************************************************** |
| * LED1 ---- PF6 LED2 ---- PF7 * |
| * LED3 ---- PF8 LED4 ---- PF9 * |
| * LED5 ---- PF10 LED6 ---- PF11 * |
| ****************************************************/ |
| int led_post_test(int flags) |
| { |
| *pPORTF_FER &= ~(PF6 | PF7 | PF8 | PF9 | PF10 | PF11); |
| *pPORTFIO_DIR |= PF6 | PF7 | PF8 | PF9 | PF10 | PF11; |
| *pPORTFIO_INEN &= ~(PF6 | PF7 | PF8 | PF9 | PF10 | PF11); |
| *pPORTFIO &= ~(PF6 | PF7 | PF8 | PF9 | PF10 | PF11); |
| udelay(1000000); |
| printf("LED1 on"); |
| *pPORTFIO |= PF6; |
| udelay(1000000); |
| printf("\b\b\b\b\b\b\b"); |
| printf("LED2 on"); |
| *pPORTFIO |= PF7; |
| udelay(1000000); |
| printf("\b\b\b\b\b\b\b"); |
| printf("LED3 on"); |
| *pPORTFIO |= PF8; |
| udelay(1000000); |
| printf("\b\b\b\b\b\b\b"); |
| printf("LED4 on"); |
| *pPORTFIO |= PF9; |
| udelay(1000000); |
| printf("\b\b\b\b\b\b\b"); |
| printf("LED5 on"); |
| *pPORTFIO |= PF10; |
| udelay(1000000); |
| printf("\b\b\b\b\b\b\b"); |
| printf("lED6 on"); |
| *pPORTFIO |= PF11; |
| printf("\b\b\b\b\b\b\b "); |
| return 0; |
| } |
| |
| /************************************************ |
| * SW10 ---- PF5 SW11 ---- PF4 * |
| * SW12 ---- PF3 SW13 ---- PF2 * |
| ************************************************/ |
| int button_post_test(int flags) |
| { |
| int i, delay = 5; |
| unsigned short value = 0; |
| int result = 0; |
| |
| *pPORTF_FER &= ~(PF5 | PF4 | PF3 | PF2); |
| *pPORTFIO_DIR &= ~(PF5 | PF4 | PF3 | PF2); |
| *pPORTFIO_INEN |= (PF5 | PF4 | PF3 | PF2); |
| |
| printf("\n--------Press SW10: %2d ", delay); |
| while (delay--) { |
| for (i = 0; i < 100; i++) { |
| value = *pPORTFIO & PF5; |
| if (value != 0) { |
| break; |
| } |
| udelay(10000); |
| } |
| printf("\b\b\b%2d ", delay); |
| } |
| if (value != 0) |
| printf("\b\bOK"); |
| else { |
| result = -1; |
| printf("\b\bfailed"); |
| } |
| |
| delay = 5; |
| printf("\n--------Press SW11: %2d ", delay); |
| while (delay--) { |
| for (i = 0; i < 100; i++) { |
| value = *pPORTFIO & PF4; |
| if (value != 0) { |
| break; |
| } |
| udelay(10000); |
| } |
| printf("\b\b\b%2d ", delay); |
| } |
| if (value != 0) |
| printf("\b\bOK"); |
| else { |
| result = -1; |
| printf("\b\bfailed"); |
| } |
| |
| delay = 5; |
| printf("\n--------Press SW12: %2d ", delay); |
| while (delay--) { |
| for (i = 0; i < 100; i++) { |
| value = *pPORTFIO & PF3; |
| if (value != 0) { |
| break; |
| } |
| udelay(10000); |
| } |
| printf("\b\b\b%2d ", delay); |
| } |
| if (value != 0) |
| printf("\b\bOK"); |
| else { |
| result = -1; |
| printf("\b\bfailed"); |
| } |
| |
| delay = 5; |
| printf("\n--------Press SW13: %2d ", delay); |
| while (delay--) { |
| for (i = 0; i < 100; i++) { |
| value = *pPORTFIO & PF2; |
| if (value != 0) { |
| break; |
| } |
| udelay(10000); |
| } |
| printf("\b\b\b%2d ", delay); |
| } |
| if (value != 0) |
| printf("\b\bOK"); |
| else { |
| result = -1; |
| printf("\b\bfailed"); |
| } |
| printf("\n"); |
| return result; |
| } |