demo.c 6.9 KB

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