]>
Commit | Line | Data |
---|---|---|
500856eb | 1 | /* |
f2302d44 | 2 | * (C) Copyright 2007-2008 Semihalf |
500856eb RJ |
3 | * |
4 | * Written by: Rafal Jaworowski <[email protected]> | |
5 | * | |
6 | * See file CREDITS for list of people who contributed to this | |
7 | * project. | |
8 | * | |
9 | * This program is free software; you can redistribute it and/or | |
10 | * modify it under the terms of the GNU General Public License as | |
11 | * published by the Free Software Foundation; either version 2 of | |
12 | * the License, or (at your option) any later version. | |
13 | * | |
14 | * This program is distributed in the hope that it will be useful, | |
15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
17 | * GNU General Public License for more details. | |
18 | * | |
19 | * You should have received a copy of the GNU General Public License | |
20 | * along with this program; if not, write to the Free Software | |
21 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, | |
22 | * MA 02111-1307 USA | |
23 | * | |
24 | */ | |
25 | ||
26 | #include <common.h> | |
27 | #include <linux/types.h> | |
28 | #include <api_public.h> | |
29 | ||
30 | #include "glue.h" | |
31 | ||
32 | #define errf(fmt, args...) do { printf("ERROR @ %s(): ", __func__); printf(fmt, ##args); } while (0) | |
33 | ||
f2302d44 SR |
34 | #define BUF_SZ 2048 |
35 | #define WAIT_SECS 5 | |
36 | ||
37 | void test_dump_buf(void *, int); | |
500856eb | 38 | void test_dump_di(int); |
f2302d44 | 39 | void test_dump_si(struct sys_info *); |
500856eb RJ |
40 | void test_dump_sig(struct api_signature *); |
41 | ||
f2302d44 | 42 | static char buf[BUF_SZ]; |
500856eb RJ |
43 | |
44 | int main(int argc, char *argv[]) | |
45 | { | |
46 | int rv = 0; | |
47 | int h, i, j; | |
48 | int devs_no; | |
49 | struct api_signature *sig = NULL; | |
50 | ulong start, now; | |
51 | struct device_info *di; | |
52 | ||
53 | if (!api_search_sig(&sig)) | |
54 | return -1; | |
55 | ||
56 | syscall_ptr = sig->syscall; | |
57 | if (syscall_ptr == NULL) | |
58 | return -2; | |
59 | ||
60 | if (sig->version > API_SIG_VERSION) | |
61 | return -3; | |
62 | ||
f2302d44 | 63 | printf("API signature found @%x\n", (unsigned int)sig); |
500856eb RJ |
64 | test_dump_sig(sig); |
65 | ||
66 | printf("\n*** Consumer API test ***\n"); | |
f2302d44 SR |
67 | printf("syscall ptr 0x%08x@%08x\n", (unsigned int)syscall_ptr, |
68 | (unsigned int)&syscall_ptr); | |
500856eb RJ |
69 | |
70 | /* console activities */ | |
71 | ub_putc('B'); | |
72 | ||
73 | printf("*** Press any key to continue ***\n"); | |
74 | printf("got char 0x%x\n", ub_getc()); | |
75 | ||
76 | /* system info */ | |
77 | test_dump_si(ub_get_sys_info()); | |
78 | ||
79 | /* timing */ | |
80 | printf("\n*** Timing - wait a couple of secs ***\n"); | |
81 | start = ub_get_timer(0); | |
82 | printf("\ntime: start %lu\n\n", start); | |
83 | for (i = 0; i < WAIT_SECS; i++) | |
84 | for (j = 0; j < 1000; j++) | |
85 | ub_udelay(1000); /* wait 1 ms */ | |
86 | ||
87 | /* this is the number of milliseconds that passed from ub_get_timer(0) */ | |
88 | now = ub_get_timer(start); | |
89 | printf("\ntime: now %lu\n\n", now); | |
90 | ||
91 | /* enumerate devices */ | |
92 | printf("\n*** Enumerate devices ***\n"); | |
93 | devs_no = ub_dev_enum(); | |
d3a6532c | 94 | |
500856eb RJ |
95 | printf("Number of devices found: %d\n", devs_no); |
96 | if (devs_no == 0) | |
97 | return -1; | |
98 | ||
99 | ||
100 | printf("\n*** Show devices ***\n"); | |
101 | for (i = 0; i < devs_no; i++) { | |
102 | test_dump_di(i); | |
103 | printf("\n"); | |
104 | } | |
105 | ||
106 | printf("\n*** Operations on devices ***\n"); | |
107 | ||
108 | /* test opening a device already opened */ | |
109 | h = 0; | |
110 | if ((rv = ub_dev_open(h)) != 0) { | |
111 | errf("open device %d error %d\n", h, rv); | |
112 | return -1; | |
113 | } | |
114 | if ((rv = ub_dev_open(h)) != 0) | |
115 | errf("open device %d error %d\n", h, rv); | |
116 | ||
117 | ub_dev_close(h); | |
118 | ||
119 | /* test storage */ | |
120 | printf("Trying storage devices...\n"); | |
121 | for (i = 0; i < devs_no; i++) { | |
122 | di = ub_dev_get(i); | |
123 | ||
124 | if (di->type & DEV_TYP_STOR) | |
125 | break; | |
126 | ||
127 | } | |
128 | if (i == devs_no) | |
129 | printf("No storage devices available\n"); | |
130 | else { | |
f2302d44 SR |
131 | memset(buf, 0, BUF_SZ); |
132 | ||
500856eb RJ |
133 | if ((rv = ub_dev_open(i)) != 0) |
134 | errf("open device %d error %d\n", i, rv); | |
f2302d44 SR |
135 | |
136 | else if ((rv = ub_dev_read(i, buf, 1, 0)) != 0) | |
500856eb RJ |
137 | errf("could not read from device %d, error %d\n", i, rv); |
138 | ||
f2302d44 SR |
139 | printf("Sector 0 dump (512B):\n"); |
140 | test_dump_buf(buf, 512); | |
141 | ||
500856eb RJ |
142 | ub_dev_close(i); |
143 | } | |
144 | ||
145 | /* test networking */ | |
146 | printf("Trying network devices...\n"); | |
147 | for (i = 0; i < devs_no; i++) { | |
148 | di = ub_dev_get(i); | |
149 | ||
150 | if (di->type == DEV_TYP_NET) | |
151 | break; | |
152 | ||
153 | } | |
154 | if (i == devs_no) | |
155 | printf("No network devices available\n"); | |
156 | else { | |
157 | if ((rv = ub_dev_open(i)) != 0) | |
158 | errf("open device %d error %d\n", i, rv); | |
159 | else if ((rv = ub_dev_send(i, &buf, 2048)) != 0) | |
160 | errf("could not send to device %d, error %d\n", i, rv); | |
161 | ||
162 | ub_dev_close(i); | |
163 | } | |
164 | ||
165 | if (ub_dev_close(h) != 0) | |
166 | errf("could not close device %d\n", h); | |
167 | ||
168 | printf("\n*** Env vars ***\n"); | |
169 | ||
170 | printf("ethact = %s\n", ub_env_get("ethact")); | |
171 | printf("old fileaddr = %s\n", ub_env_get("fileaddr")); | |
172 | ub_env_set("fileaddr", "deadbeef"); | |
173 | printf("new fileaddr = %s\n", ub_env_get("fileaddr")); | |
174 | ||
175 | const char *env = NULL; | |
176 | ||
177 | while ((env = ub_env_enum(env)) != NULL) | |
178 | printf("%s = %s\n", env, ub_env_get(env)); | |
179 | ||
180 | /* reset */ | |
181 | ub_reset(); | |
182 | printf("\nHmm, reset returned...?!\n"); | |
183 | ||
184 | return rv; | |
185 | } | |
186 | ||
187 | void test_dump_sig(struct api_signature *sig) | |
188 | { | |
189 | printf("signature:\n"); | |
190 | printf(" version\t= %d\n", sig->version); | |
191 | printf(" checksum\t= 0x%08x\n", sig->checksum); | |
f2302d44 | 192 | printf(" sc entry\t= 0x%08x\n", (unsigned int)sig->syscall); |
500856eb RJ |
193 | } |
194 | ||
195 | void test_dump_si(struct sys_info *si) | |
196 | { | |
197 | int i; | |
198 | ||
199 | printf("sys info:\n"); | |
f2302d44 SR |
200 | printf(" clkbus\t= 0x%08x\n", (unsigned int)si->clk_bus); |
201 | printf(" clkcpu\t= 0x%08x\n", (unsigned int)si->clk_cpu); | |
202 | printf(" bar\t\t= 0x%08x\n", (unsigned int)si->bar); | |
500856eb RJ |
203 | |
204 | printf("---\n"); | |
205 | for (i = 0; i < si->mr_no; i++) { | |
206 | if (si->mr[i].flags == 0) | |
207 | break; | |
208 | ||
209 | printf(" start\t= 0x%08lx\n", si->mr[i].start); | |
210 | printf(" size\t= 0x%08lx\n", si->mr[i].size); | |
211 | ||
212 | switch(si->mr[i].flags & 0x000F) { | |
213 | case MR_ATTR_FLASH: | |
214 | printf(" type FLASH\n"); | |
215 | break; | |
216 | case MR_ATTR_DRAM: | |
217 | printf(" type DRAM\n"); | |
218 | break; | |
219 | case MR_ATTR_SRAM: | |
220 | printf(" type SRAM\n"); | |
221 | break; | |
222 | default: | |
223 | printf(" type UNKNOWN\n"); | |
224 | } | |
225 | printf("---\n"); | |
226 | } | |
227 | } | |
228 | ||
f2302d44 | 229 | static char *test_stor_typ(int type) |
500856eb RJ |
230 | { |
231 | if (type & DT_STOR_IDE) | |
232 | return "IDE"; | |
233 | ||
f2302d44 SR |
234 | if (type & DT_STOR_MMC) |
235 | return "MMC"; | |
236 | ||
237 | if (type & DT_STOR_SATA) | |
238 | return "SATA"; | |
239 | ||
500856eb RJ |
240 | if (type & DT_STOR_SCSI) |
241 | return "SCSI"; | |
242 | ||
243 | if (type & DT_STOR_USB) | |
244 | return "USB"; | |
245 | ||
500856eb RJ |
246 | return "Unknown"; |
247 | } | |
248 | ||
f2302d44 SR |
249 | void test_dump_buf(void *buf, int len) |
250 | { | |
251 | int i; | |
252 | int line_counter = 0; | |
253 | int sep_flag = 0; | |
254 | int addr = 0; | |
255 | ||
256 | printf("%07x:\t", addr); | |
257 | ||
258 | for (i = 0; i < len; i++) { | |
259 | if (line_counter++ > 15) { | |
260 | line_counter = 0; | |
261 | sep_flag = 0; | |
262 | addr += 16; | |
263 | i--; | |
264 | printf("\n%07x:\t", addr); | |
265 | continue; | |
266 | } | |
267 | ||
268 | if (sep_flag++ > 1) { | |
269 | sep_flag = 1; | |
270 | printf(" "); | |
271 | } | |
272 | ||
273 | printf("%02x", *((char *)buf++)); | |
274 | } | |
275 | ||
276 | printf("\n"); | |
277 | } | |
278 | ||
500856eb RJ |
279 | void test_dump_di(int handle) |
280 | { | |
281 | int i; | |
282 | struct device_info *di = ub_dev_get(handle); | |
283 | ||
284 | printf("device info (%d):\n", handle); | |
285 | printf(" cookie\t= 0x%08x\n", (uint32_t)di->cookie); | |
286 | printf(" type\t\t= 0x%08x\n", di->type); | |
287 | ||
288 | if (di->type == DEV_TYP_NET) { | |
289 | printf(" hwaddr\t= "); | |
290 | for (i = 0; i < 6; i++) | |
291 | printf("%02x ", di->di_net.hwaddr[i]); | |
292 | ||
293 | printf("\n"); | |
294 | ||
295 | } else if (di->type & DEV_TYP_STOR) { | |
296 | printf(" type\t\t= %s\n", test_stor_typ(di->type)); | |
f2302d44 SR |
297 | printf(" blk size\t\t= %d\n", (unsigned int)di->di_stor.block_size); |
298 | printf(" blk count\t\t= %d\n", (unsigned int)di->di_stor.block_count); | |
500856eb RJ |
299 | } |
300 | } |