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