demo.c 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * (C) Copyright 2007-2008 Semihalf
  4. *
  5. * Written by: Rafal Jaworowski <raj@semihalf.com>
  6. */
  7. #include <common.h>
  8. #include <linux/types.h>
  9. #include <api_public.h>
  10. #include "glue.h"
  11. #define errf(fmt, args...) do { printf("ERROR @ %s(): ", __func__); printf(fmt, ##args); } while (0)
  12. #define BUF_SZ 2048
  13. #define WAIT_SECS 5
  14. void test_dump_buf(void *, int);
  15. void test_dump_di(int);
  16. void test_dump_si(struct sys_info *);
  17. void test_dump_sig(struct api_signature *);
  18. static char buf[BUF_SZ];
  19. int main(int argc, char * const argv[])
  20. {
  21. int rv = 0, h, i, j, devs_no;
  22. struct api_signature *sig = NULL;
  23. ulong start, now;
  24. struct device_info *di;
  25. lbasize_t rlen;
  26. struct display_info disinfo;
  27. if (!api_search_sig(&sig))
  28. return -1;
  29. syscall_ptr = sig->syscall;
  30. if (syscall_ptr == NULL)
  31. return -2;
  32. if (sig->version > API_SIG_VERSION)
  33. return -3;
  34. printf("API signature found @%x\n", (unsigned int)sig);
  35. test_dump_sig(sig);
  36. printf("\n*** Consumer API test ***\n");
  37. printf("syscall ptr 0x%08x@%08x\n", (unsigned int)syscall_ptr,
  38. (unsigned int)&syscall_ptr);
  39. /* console activities */
  40. ub_putc('B');
  41. printf("*** Press any key to continue ***\n");
  42. printf("got char 0x%x\n", ub_getc());
  43. /* system info */
  44. test_dump_si(ub_get_sys_info());
  45. /* timing */
  46. printf("\n*** Timing - wait a couple of secs ***\n");
  47. start = ub_get_timer(0);
  48. printf("\ntime: start %lu\n\n", start);
  49. for (i = 0; i < WAIT_SECS; i++)
  50. for (j = 0; j < 1000; j++)
  51. ub_udelay(1000); /* wait 1 ms */
  52. /* this is the number of milliseconds that passed from ub_get_timer(0) */
  53. now = ub_get_timer(start);
  54. printf("\ntime: now %lu\n\n", now);
  55. /* enumerate devices */
  56. printf("\n*** Enumerate devices ***\n");
  57. devs_no = ub_dev_enum();
  58. printf("Number of devices found: %d\n", devs_no);
  59. if (devs_no == 0)
  60. return -1;
  61. printf("\n*** Show devices ***\n");
  62. for (i = 0; i < devs_no; i++) {
  63. test_dump_di(i);
  64. printf("\n");
  65. }
  66. printf("\n*** Operations on devices ***\n");
  67. /* test opening a device already opened */
  68. h = 0;
  69. if ((rv = ub_dev_open(h)) != 0) {
  70. errf("open device %d error %d\n", h, rv);
  71. return -1;
  72. }
  73. if ((rv = ub_dev_open(h)) != 0)
  74. errf("open device %d error %d\n", h, rv);
  75. ub_dev_close(h);
  76. /* test storage */
  77. printf("Trying storage devices...\n");
  78. for (i = 0; i < devs_no; i++) {
  79. di = ub_dev_get(i);
  80. if (di->type & DEV_TYP_STOR)
  81. break;
  82. }
  83. if (i == devs_no)
  84. printf("No storage devices available\n");
  85. else {
  86. memset(buf, 0, BUF_SZ);
  87. if ((rv = ub_dev_open(i)) != 0)
  88. errf("open device %d error %d\n", i, rv);
  89. else if ((rv = ub_dev_read(i, buf, 1, 0, &rlen)) != 0)
  90. errf("could not read from device %d, error %d\n", i, rv);
  91. else {
  92. printf("Sector 0 dump (512B):\n");
  93. test_dump_buf(buf, 512);
  94. }
  95. ub_dev_close(i);
  96. }
  97. /* test networking */
  98. printf("Trying network devices...\n");
  99. for (i = 0; i < devs_no; i++) {
  100. di = ub_dev_get(i);
  101. if (di->type == DEV_TYP_NET)
  102. break;
  103. }
  104. if (i == devs_no)
  105. printf("No network devices available\n");
  106. else {
  107. if ((rv = ub_dev_open(i)) != 0)
  108. errf("open device %d error %d\n", i, rv);
  109. else if ((rv = ub_dev_send(i, &buf, 2048)) != 0)
  110. errf("could not send to device %d, error %d\n", i, rv);
  111. ub_dev_close(i);
  112. }
  113. if (ub_dev_close(h) != 0)
  114. errf("could not close device %d\n", h);
  115. printf("\n*** Env vars ***\n");
  116. printf("ethact = %s\n", ub_env_get("ethact"));
  117. printf("old fileaddr = %s\n", ub_env_get("fileaddr"));
  118. ub_env_set("fileaddr", "deadbeef");
  119. printf("new fileaddr = %s\n", ub_env_get("fileaddr"));
  120. const char *env = NULL;
  121. while ((env = ub_env_enum(env)) != NULL)
  122. printf("%s = %s\n", env, ub_env_get(env));
  123. printf("\n*** Display ***\n");
  124. if (ub_display_get_info(DISPLAY_TYPE_LCD, &disinfo)) {
  125. printf("LCD info: failed\n");
  126. } else {
  127. printf("LCD info:\n");
  128. printf(" pixel width: %d\n", disinfo.pixel_width);
  129. printf(" pixel height: %d\n", disinfo.pixel_height);
  130. printf(" screen rows: %d\n", disinfo.screen_rows);
  131. printf(" screen cols: %d\n", disinfo.screen_cols);
  132. }
  133. if (ub_display_get_info(DISPLAY_TYPE_VIDEO, &disinfo)) {
  134. printf("video info: failed\n");
  135. } else {
  136. printf("video info:\n");
  137. printf(" pixel width: %d\n", disinfo.pixel_width);
  138. printf(" pixel height: %d\n", disinfo.pixel_height);
  139. printf(" screen rows: %d\n", disinfo.screen_rows);
  140. printf(" screen cols: %d\n", disinfo.screen_cols);
  141. }
  142. printf("*** Press any key to continue ***\n");
  143. printf("got char 0x%x\n", ub_getc());
  144. /*
  145. * This only clears messages on screen, not on serial port. It is
  146. * equivalent to a no-op if no display is available.
  147. */
  148. ub_display_clear();
  149. /* reset */
  150. printf("\n*** Resetting board ***\n");
  151. ub_reset();
  152. printf("\nHmm, reset returned...?!\n");
  153. return rv;
  154. }
  155. void test_dump_sig(struct api_signature *sig)
  156. {
  157. printf("signature:\n");
  158. printf(" version\t= %d\n", sig->version);
  159. printf(" checksum\t= 0x%08x\n", sig->checksum);
  160. printf(" sc entry\t= 0x%08x\n", (unsigned int)sig->syscall);
  161. }
  162. void test_dump_si(struct sys_info *si)
  163. {
  164. int i;
  165. printf("sys info:\n");
  166. printf(" clkbus\t= 0x%08x\n", (unsigned int)si->clk_bus);
  167. printf(" clkcpu\t= 0x%08x\n", (unsigned int)si->clk_cpu);
  168. printf(" bar\t\t= 0x%08x\n", (unsigned int)si->bar);
  169. printf("---\n");
  170. for (i = 0; i < si->mr_no; i++) {
  171. if (si->mr[i].flags == 0)
  172. break;
  173. printf(" start\t= 0x%08lx\n", si->mr[i].start);
  174. printf(" size\t= 0x%08lx\n", si->mr[i].size);
  175. switch(si->mr[i].flags & 0x000F) {
  176. case MR_ATTR_FLASH:
  177. printf(" type FLASH\n");
  178. break;
  179. case MR_ATTR_DRAM:
  180. printf(" type DRAM\n");
  181. break;
  182. case MR_ATTR_SRAM:
  183. printf(" type SRAM\n");
  184. break;
  185. default:
  186. printf(" type UNKNOWN\n");
  187. }
  188. printf("---\n");
  189. }
  190. }
  191. static char *test_stor_typ(int type)
  192. {
  193. if (type & DT_STOR_IDE)
  194. return "IDE";
  195. if (type & DT_STOR_MMC)
  196. return "MMC";
  197. if (type & DT_STOR_SATA)
  198. return "SATA";
  199. if (type & DT_STOR_SCSI)
  200. return "SCSI";
  201. if (type & DT_STOR_USB)
  202. return "USB";
  203. return "Unknown";
  204. }
  205. void test_dump_buf(void *buf, int len)
  206. {
  207. int i;
  208. int line_counter = 0;
  209. int sep_flag = 0;
  210. int addr = 0;
  211. printf("%07x:\t", addr);
  212. for (i = 0; i < len; i++) {
  213. if (line_counter++ > 15) {
  214. line_counter = 0;
  215. sep_flag = 0;
  216. addr += 16;
  217. i--;
  218. printf("\n%07x:\t", addr);
  219. continue;
  220. }
  221. if (sep_flag++ > 1) {
  222. sep_flag = 1;
  223. printf(" ");
  224. }
  225. printf("%02x", *((char *)buf++));
  226. }
  227. printf("\n");
  228. }
  229. void test_dump_di(int handle)
  230. {
  231. int i;
  232. struct device_info *di = ub_dev_get(handle);
  233. printf("device info (%d):\n", handle);
  234. printf(" cookie\t= 0x%08x\n", (uint32_t)di->cookie);
  235. printf(" type\t\t= 0x%08x\n", di->type);
  236. if (di->type == DEV_TYP_NET) {
  237. printf(" hwaddr\t= ");
  238. for (i = 0; i < 6; i++)
  239. printf("%02x ", di->di_net.hwaddr[i]);
  240. printf("\n");
  241. } else if (di->type & DEV_TYP_STOR) {
  242. printf(" type\t\t= %s\n", test_stor_typ(di->type));
  243. printf(" blk size\t\t= %d\n", (unsigned int)di->di_stor.block_size);
  244. printf(" blk count\t\t= %d\n", (unsigned int)di->di_stor.block_count);
  245. }
  246. }