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 44*54841ab5SWolfgang 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; 51d4abc757SPeter Tyser 52d4abc757SPeter Tyser if (!api_search_sig(&sig)) 53d4abc757SPeter Tyser return -1; 54d4abc757SPeter Tyser 55d4abc757SPeter Tyser syscall_ptr = sig->syscall; 56d4abc757SPeter Tyser if (syscall_ptr == NULL) 57d4abc757SPeter Tyser return -2; 58d4abc757SPeter Tyser 59d4abc757SPeter Tyser if (sig->version > API_SIG_VERSION) 60d4abc757SPeter Tyser return -3; 61d4abc757SPeter Tyser 62d4abc757SPeter Tyser printf("API signature found @%x\n", (unsigned int)sig); 63d4abc757SPeter Tyser test_dump_sig(sig); 64d4abc757SPeter Tyser 65d4abc757SPeter Tyser printf("\n*** Consumer API test ***\n"); 66d4abc757SPeter Tyser printf("syscall ptr 0x%08x@%08x\n", (unsigned int)syscall_ptr, 67d4abc757SPeter Tyser (unsigned int)&syscall_ptr); 68d4abc757SPeter Tyser 69d4abc757SPeter Tyser /* console activities */ 70d4abc757SPeter Tyser ub_putc('B'); 71d4abc757SPeter Tyser 72d4abc757SPeter Tyser printf("*** Press any key to continue ***\n"); 73d4abc757SPeter Tyser printf("got char 0x%x\n", ub_getc()); 74d4abc757SPeter Tyser 75d4abc757SPeter Tyser /* system info */ 76d4abc757SPeter Tyser test_dump_si(ub_get_sys_info()); 77d4abc757SPeter Tyser 78d4abc757SPeter Tyser /* timing */ 79d4abc757SPeter Tyser printf("\n*** Timing - wait a couple of secs ***\n"); 80d4abc757SPeter Tyser start = ub_get_timer(0); 81d4abc757SPeter Tyser printf("\ntime: start %lu\n\n", start); 82d4abc757SPeter Tyser for (i = 0; i < WAIT_SECS; i++) 83d4abc757SPeter Tyser for (j = 0; j < 1000; j++) 84d4abc757SPeter Tyser ub_udelay(1000); /* wait 1 ms */ 85d4abc757SPeter Tyser 86d4abc757SPeter Tyser /* this is the number of milliseconds that passed from ub_get_timer(0) */ 87d4abc757SPeter Tyser now = ub_get_timer(start); 88d4abc757SPeter Tyser printf("\ntime: now %lu\n\n", now); 89d4abc757SPeter Tyser 90d4abc757SPeter Tyser /* enumerate devices */ 91d4abc757SPeter Tyser printf("\n*** Enumerate devices ***\n"); 92d4abc757SPeter Tyser devs_no = ub_dev_enum(); 93d4abc757SPeter Tyser 94d4abc757SPeter Tyser printf("Number of devices found: %d\n", devs_no); 95d4abc757SPeter Tyser if (devs_no == 0) 96d4abc757SPeter Tyser return -1; 97d4abc757SPeter Tyser 98d4abc757SPeter Tyser printf("\n*** Show devices ***\n"); 99d4abc757SPeter Tyser for (i = 0; i < devs_no; i++) { 100d4abc757SPeter Tyser test_dump_di(i); 101d4abc757SPeter Tyser printf("\n"); 102d4abc757SPeter Tyser } 103d4abc757SPeter Tyser 104d4abc757SPeter Tyser printf("\n*** Operations on devices ***\n"); 105d4abc757SPeter Tyser 106d4abc757SPeter Tyser /* test opening a device already opened */ 107d4abc757SPeter Tyser h = 0; 108d4abc757SPeter Tyser if ((rv = ub_dev_open(h)) != 0) { 109d4abc757SPeter Tyser errf("open device %d error %d\n", h, rv); 110d4abc757SPeter Tyser return -1; 111d4abc757SPeter Tyser } 112d4abc757SPeter Tyser if ((rv = ub_dev_open(h)) != 0) 113d4abc757SPeter Tyser errf("open device %d error %d\n", h, rv); 114d4abc757SPeter Tyser 115d4abc757SPeter Tyser ub_dev_close(h); 116d4abc757SPeter Tyser 117d4abc757SPeter Tyser /* test storage */ 118d4abc757SPeter Tyser printf("Trying storage devices...\n"); 119d4abc757SPeter Tyser for (i = 0; i < devs_no; i++) { 120d4abc757SPeter Tyser di = ub_dev_get(i); 121d4abc757SPeter Tyser 122d4abc757SPeter Tyser if (di->type & DEV_TYP_STOR) 123d4abc757SPeter Tyser break; 124d4abc757SPeter Tyser 125d4abc757SPeter Tyser } 126d4abc757SPeter Tyser if (i == devs_no) 127d4abc757SPeter Tyser printf("No storage devices available\n"); 128d4abc757SPeter Tyser else { 129d4abc757SPeter Tyser memset(buf, 0, BUF_SZ); 130d4abc757SPeter Tyser 131d4abc757SPeter Tyser if ((rv = ub_dev_open(i)) != 0) 132d4abc757SPeter Tyser errf("open device %d error %d\n", i, rv); 133d4abc757SPeter Tyser 134d4abc757SPeter Tyser else if ((rv = ub_dev_read(i, buf, 1, 0, &rlen)) != 0) 135d4abc757SPeter Tyser errf("could not read from device %d, error %d\n", i, rv); 136d4abc757SPeter Tyser else { 137d4abc757SPeter Tyser printf("Sector 0 dump (512B):\n"); 138d4abc757SPeter Tyser test_dump_buf(buf, 512); 139d4abc757SPeter Tyser } 140d4abc757SPeter Tyser 141d4abc757SPeter Tyser ub_dev_close(i); 142d4abc757SPeter Tyser } 143d4abc757SPeter Tyser 144d4abc757SPeter Tyser /* test networking */ 145d4abc757SPeter Tyser printf("Trying network devices...\n"); 146d4abc757SPeter Tyser for (i = 0; i < devs_no; i++) { 147d4abc757SPeter Tyser di = ub_dev_get(i); 148d4abc757SPeter Tyser 149d4abc757SPeter Tyser if (di->type == DEV_TYP_NET) 150d4abc757SPeter Tyser break; 151d4abc757SPeter Tyser 152d4abc757SPeter Tyser } 153d4abc757SPeter Tyser if (i == devs_no) 154d4abc757SPeter Tyser printf("No network devices available\n"); 155d4abc757SPeter Tyser else { 156d4abc757SPeter Tyser if ((rv = ub_dev_open(i)) != 0) 157d4abc757SPeter Tyser errf("open device %d error %d\n", i, rv); 158d4abc757SPeter Tyser else if ((rv = ub_dev_send(i, &buf, 2048)) != 0) 159d4abc757SPeter Tyser errf("could not send to device %d, error %d\n", i, rv); 160d4abc757SPeter Tyser 161d4abc757SPeter Tyser ub_dev_close(i); 162d4abc757SPeter Tyser } 163d4abc757SPeter Tyser 164d4abc757SPeter Tyser if (ub_dev_close(h) != 0) 165d4abc757SPeter Tyser errf("could not close device %d\n", h); 166d4abc757SPeter Tyser 167d4abc757SPeter Tyser printf("\n*** Env vars ***\n"); 168d4abc757SPeter Tyser 169d4abc757SPeter Tyser printf("ethact = %s\n", ub_env_get("ethact")); 170d4abc757SPeter Tyser printf("old fileaddr = %s\n", ub_env_get("fileaddr")); 171d4abc757SPeter Tyser ub_env_set("fileaddr", "deadbeef"); 172d4abc757SPeter Tyser printf("new fileaddr = %s\n", ub_env_get("fileaddr")); 173d4abc757SPeter Tyser 174d4abc757SPeter Tyser const char *env = NULL; 175d4abc757SPeter Tyser 176d4abc757SPeter Tyser while ((env = ub_env_enum(env)) != NULL) 177d4abc757SPeter Tyser printf("%s = %s\n", env, ub_env_get(env)); 178d4abc757SPeter Tyser 179d4abc757SPeter Tyser /* reset */ 180d4abc757SPeter Tyser printf("\n*** Resetting board ***\n"); 181d4abc757SPeter Tyser ub_reset(); 182d4abc757SPeter Tyser printf("\nHmm, reset returned...?!\n"); 183d4abc757SPeter Tyser 184d4abc757SPeter Tyser return rv; 185d4abc757SPeter Tyser } 186d4abc757SPeter Tyser 187d4abc757SPeter Tyser void test_dump_sig(struct api_signature *sig) 188d4abc757SPeter Tyser { 189d4abc757SPeter Tyser printf("signature:\n"); 190d4abc757SPeter Tyser printf(" version\t= %d\n", sig->version); 191d4abc757SPeter Tyser printf(" checksum\t= 0x%08x\n", sig->checksum); 192d4abc757SPeter Tyser printf(" sc entry\t= 0x%08x\n", (unsigned int)sig->syscall); 193d4abc757SPeter Tyser } 194d4abc757SPeter Tyser 195d4abc757SPeter Tyser void test_dump_si(struct sys_info *si) 196d4abc757SPeter Tyser { 197d4abc757SPeter Tyser int i; 198d4abc757SPeter Tyser 199d4abc757SPeter Tyser printf("sys info:\n"); 200d4abc757SPeter Tyser printf(" clkbus\t= 0x%08x\n", (unsigned int)si->clk_bus); 201d4abc757SPeter Tyser printf(" clkcpu\t= 0x%08x\n", (unsigned int)si->clk_cpu); 202d4abc757SPeter Tyser printf(" bar\t\t= 0x%08x\n", (unsigned int)si->bar); 203d4abc757SPeter Tyser 204d4abc757SPeter Tyser printf("---\n"); 205d4abc757SPeter Tyser for (i = 0; i < si->mr_no; i++) { 206d4abc757SPeter Tyser if (si->mr[i].flags == 0) 207d4abc757SPeter Tyser break; 208d4abc757SPeter Tyser 209d4abc757SPeter Tyser printf(" start\t= 0x%08lx\n", si->mr[i].start); 210d4abc757SPeter Tyser printf(" size\t= 0x%08lx\n", si->mr[i].size); 211d4abc757SPeter Tyser 212d4abc757SPeter Tyser switch(si->mr[i].flags & 0x000F) { 213d4abc757SPeter Tyser case MR_ATTR_FLASH: 214d4abc757SPeter Tyser printf(" type FLASH\n"); 215d4abc757SPeter Tyser break; 216d4abc757SPeter Tyser case MR_ATTR_DRAM: 217d4abc757SPeter Tyser printf(" type DRAM\n"); 218d4abc757SPeter Tyser break; 219d4abc757SPeter Tyser case MR_ATTR_SRAM: 220d4abc757SPeter Tyser printf(" type SRAM\n"); 221d4abc757SPeter Tyser break; 222d4abc757SPeter Tyser default: 223d4abc757SPeter Tyser printf(" type UNKNOWN\n"); 224d4abc757SPeter Tyser } 225d4abc757SPeter Tyser printf("---\n"); 226d4abc757SPeter Tyser } 227d4abc757SPeter Tyser } 228d4abc757SPeter Tyser 229d4abc757SPeter Tyser static char *test_stor_typ(int type) 230d4abc757SPeter Tyser { 231d4abc757SPeter Tyser if (type & DT_STOR_IDE) 232d4abc757SPeter Tyser return "IDE"; 233d4abc757SPeter Tyser 234d4abc757SPeter Tyser if (type & DT_STOR_MMC) 235d4abc757SPeter Tyser return "MMC"; 236d4abc757SPeter Tyser 237d4abc757SPeter Tyser if (type & DT_STOR_SATA) 238d4abc757SPeter Tyser return "SATA"; 239d4abc757SPeter Tyser 240d4abc757SPeter Tyser if (type & DT_STOR_SCSI) 241d4abc757SPeter Tyser return "SCSI"; 242d4abc757SPeter Tyser 243d4abc757SPeter Tyser if (type & DT_STOR_USB) 244d4abc757SPeter Tyser return "USB"; 245d4abc757SPeter Tyser 246d4abc757SPeter Tyser return "Unknown"; 247d4abc757SPeter Tyser } 248d4abc757SPeter Tyser 249d4abc757SPeter Tyser void test_dump_buf(void *buf, int len) 250d4abc757SPeter Tyser { 251d4abc757SPeter Tyser int i; 252d4abc757SPeter Tyser int line_counter = 0; 253d4abc757SPeter Tyser int sep_flag = 0; 254d4abc757SPeter Tyser int addr = 0; 255d4abc757SPeter Tyser 256d4abc757SPeter Tyser printf("%07x:\t", addr); 257d4abc757SPeter Tyser 258d4abc757SPeter Tyser for (i = 0; i < len; i++) { 259d4abc757SPeter Tyser if (line_counter++ > 15) { 260d4abc757SPeter Tyser line_counter = 0; 261d4abc757SPeter Tyser sep_flag = 0; 262d4abc757SPeter Tyser addr += 16; 263d4abc757SPeter Tyser i--; 264d4abc757SPeter Tyser printf("\n%07x:\t", addr); 265d4abc757SPeter Tyser continue; 266d4abc757SPeter Tyser } 267d4abc757SPeter Tyser 268d4abc757SPeter Tyser if (sep_flag++ > 1) { 269d4abc757SPeter Tyser sep_flag = 1; 270d4abc757SPeter Tyser printf(" "); 271d4abc757SPeter Tyser } 272d4abc757SPeter Tyser 273d4abc757SPeter Tyser printf("%02x", *((char *)buf++)); 274d4abc757SPeter Tyser } 275d4abc757SPeter Tyser 276d4abc757SPeter Tyser printf("\n"); 277d4abc757SPeter Tyser } 278d4abc757SPeter Tyser 279d4abc757SPeter Tyser void test_dump_di(int handle) 280d4abc757SPeter Tyser { 281d4abc757SPeter Tyser int i; 282d4abc757SPeter Tyser struct device_info *di = ub_dev_get(handle); 283d4abc757SPeter Tyser 284d4abc757SPeter Tyser printf("device info (%d):\n", handle); 285d4abc757SPeter Tyser printf(" cookie\t= 0x%08x\n", (uint32_t)di->cookie); 286d4abc757SPeter Tyser printf(" type\t\t= 0x%08x\n", di->type); 287d4abc757SPeter Tyser 288d4abc757SPeter Tyser if (di->type == DEV_TYP_NET) { 289d4abc757SPeter Tyser printf(" hwaddr\t= "); 290d4abc757SPeter Tyser for (i = 0; i < 6; i++) 291d4abc757SPeter Tyser printf("%02x ", di->di_net.hwaddr[i]); 292d4abc757SPeter Tyser 293d4abc757SPeter Tyser printf("\n"); 294d4abc757SPeter Tyser 295d4abc757SPeter Tyser } else if (di->type & DEV_TYP_STOR) { 296d4abc757SPeter Tyser printf(" type\t\t= %s\n", test_stor_typ(di->type)); 297d4abc757SPeter Tyser printf(" blk size\t\t= %d\n", (unsigned int)di->di_stor.block_size); 298d4abc757SPeter Tyser printf(" blk count\t\t= %d\n", (unsigned int)di->di_stor.block_count); 299d4abc757SPeter Tyser } 300d4abc757SPeter Tyser } 301