blob: 60eed5f68a75937b1e8cc61f46e0bdae7cac40fc [file] [log] [blame]
Mike Frysingeradb01a62009-02-22 16:26:35 -05001/*
2 * BF537-STAMP POST code
3 *
4 * Enter bugs at http://blackfin.uclinux.org/
5 *
6 * Copyright (c) 2005-2009 Analog Devices Inc.
7 *
8 * Licensed under the GPL-2 or later.
9 */
10
11#include <common.h>
12#include <config.h>
13#include <command.h>
14#include <asm/blackfin.h>
Mike Frysinger78f69672010-07-25 17:16:50 -040015#include <asm/gpio.h>
Mike Frysingeradb01a62009-02-22 16:26:35 -050016
Mike Frysingeradb01a62009-02-22 16:26:35 -050017/* Using sw10-PF5 as the hotkey */
18int post_hotkeys_pressed(void)
19{
20 int delay = 3;
21 int i;
22 unsigned short value;
23
Mike Frysinger78f69672010-07-25 17:16:50 -040024 gpio_request(GPIO_PF5, "post");
25 gpio_direction_input(GPIO_PF5);
Mike Frysingeradb01a62009-02-22 16:26:35 -050026
27 printf("########Press SW10 to enter Memory POST########: %2d ", delay);
28 while (delay--) {
29 for (i = 0; i < 100; i++) {
Mike Frysinger78f69672010-07-25 17:16:50 -040030 value = gpio_get_value(GPIO_PF5);
Mike Frysingeradb01a62009-02-22 16:26:35 -050031 if (value != 0) {
32 break;
33 }
34 udelay(10000);
35 }
36 printf("\b\b\b%2d ", delay);
37 }
38 printf("\b\b\b 0");
39 printf("\n");
40 if (value == 0)
41 return 0;
42 else {
43 printf("Hotkey has been pressed, Enter POST . . . . . .\n");
44 return 1;
45 }
Mike Frysinger78f69672010-07-25 17:16:50 -040046
47 gpio_free(GPIO_PF5);
Mike Frysingeradb01a62009-02-22 16:26:35 -050048}
49
Mike Frysingeradb01a62009-02-22 16:26:35 -050050int uart_post_test(int flags)
51{
52 return 0;
53}
54
55#define BLOCK_SIZE 0x10000
56#define VERIFY_ADDR 0x2000000
57extern int erase_block_flash(int);
58extern int write_data(long lStart, long lCount, uchar * pnData);
59int flash_post_test(int flags)
60{
61 unsigned short *pbuf, *temp;
62 int offset, n, i;
63 int value = 0;
64 int result = 0;
65 printf("\n");
66 pbuf = (unsigned short *)VERIFY_ADDR;
67 temp = pbuf;
68 for (n = FLASH_START_POST_BLOCK; n < FLASH_END_POST_BLOCK; n++) {
69 offset = (n - 7) * BLOCK_SIZE;
70 printf("--------Erase block:%2d..", n);
71 erase_block_flash(n);
72 printf("OK\r");
73 printf("--------Program block:%2d...", n);
74 write_data(CONFIG_SYS_FLASH_BASE + offset, BLOCK_SIZE, pbuf);
75 printf("OK\r");
76 printf("--------Verify block:%2d...", n);
77 for (i = 0; i < BLOCK_SIZE; i += 2) {
78 if (*(unsigned short *)(CONFIG_SYS_FLASH_BASE + offset + i) !=
79 *temp++) {
80 value = 1;
81 result = 1;
82 }
83 }
84 if (value)
85 printf("failed\n");
86 else
87 printf("OK %3d%%\r",
88 (int)(
89 (n + 1 -
90 FLASH_START_POST_BLOCK) *
91 100 / (FLASH_END_POST_BLOCK -
92 FLASH_START_POST_BLOCK)));
93
94 temp = pbuf;
95 value = 0;
96 }
97 printf("\n");
98 if (result)
99 return -1;
100 else
101 return 0;
102}
103
104/****************************************************
105 * LED1 ---- PF6 LED2 ---- PF7 *
106 * LED3 ---- PF8 LED4 ---- PF9 *
107 * LED5 ---- PF10 LED6 ---- PF11 *
108 ****************************************************/
109int led_post_test(int flags)
110{
Mike Frysinger78f69672010-07-25 17:16:50 -0400111 unsigned int leds[] = {
112 GPIO_PF6, GPIO_PF7, GPIO_PF8,
113 GPIO_PF9, GPIO_PF10, GPIO_PF11,
114 };
115 int i;
116
117 for (i = 0; i < ARRAY_SIZE(leds); ++i) {
118 gpio_request(leds[i], "post");
119 gpio_direction_output(leds[i], 0);
120
121 printf("LED%i on", i + 1);
122 gpio_set_value(leds[i], 1);
123 udelay(1000000);
124 printf("\b\b\b\b\b\b\b");
125
126 gpio_free(leds[i]);
127 }
128
Mike Frysingeradb01a62009-02-22 16:26:35 -0500129 return 0;
130}
131
132/************************************************
133 * SW10 ---- PF5 SW11 ---- PF4 *
134 * SW12 ---- PF3 SW13 ---- PF2 *
135 ************************************************/
136int button_post_test(int flags)
137{
Mike Frysinger78f69672010-07-25 17:16:50 -0400138 unsigned int buttons[] = {
139 GPIO_PF2, GPIO_PF3, GPIO_PF4, GPIO_PF5,
140 };
141 unsigned int sws[] = { 13, 12, 11, 10, };
Mike Frysingeradb01a62009-02-22 16:26:35 -0500142 int i, delay = 5;
143 unsigned short value = 0;
144 int result = 0;
145
Mike Frysinger78f69672010-07-25 17:16:50 -0400146 for (i = 0; i < ARRAY_SIZE(buttons); ++i) {
147 gpio_request(buttons[i], "post");
148 gpio_direction_input(buttons[i]);
Mike Frysingeradb01a62009-02-22 16:26:35 -0500149
Mike Frysinger78f69672010-07-25 17:16:50 -0400150 delay = 5;
151 printf("\n--------Press SW%i: %2d ", sws[i], delay);
152 while (delay--) {
153 for (i = 0; i < 100; i++) {
154 value = gpio_get_value(buttons[i]);
155 if (value != 0)
156 break;
157 udelay(10000);
Mike Frysingeradb01a62009-02-22 16:26:35 -0500158 }
Mike Frysinger78f69672010-07-25 17:16:50 -0400159 printf("\b\b\b%2d ", delay);
Mike Frysingeradb01a62009-02-22 16:26:35 -0500160 }
Mike Frysinger78f69672010-07-25 17:16:50 -0400161 if (value != 0)
162 puts("\b\bOK");
163 else {
164 result = -1;
165 puts("\b\bfailed");
Mike Frysingeradb01a62009-02-22 16:26:35 -0500166 }
Mike Frysingeradb01a62009-02-22 16:26:35 -0500167
Mike Frysinger78f69672010-07-25 17:16:50 -0400168 gpio_free(buttons[i]);
Mike Frysingeradb01a62009-02-22 16:26:35 -0500169 }
170
Mike Frysinger78f69672010-07-25 17:16:50 -0400171 puts("\n");
172
Mike Frysingeradb01a62009-02-22 16:26:35 -0500173 return result;
174}