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