test_device.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463
  1. /*
  2. * File : test_driver.h
  3. * Copyright (c) 2006-2021, RT-Thread Development Team
  4. *
  5. * SPDX-License-Identifier: Apache-2.0
  6. *
  7. * Change Logs:
  8. * Date Author Notes
  9. * 2019-07-29 zdzn first version
  10. */
  11. #include <rtthread.h>
  12. #include <rtdevice.h>
  13. #include <rthw.h>
  14. #include <string.h>
  15. #include <drivers/hwtimer.h>
  16. #include <raspi.h>
  17. #include <sys/time.h>
  18. #ifdef BSP_USING_HDMI
  19. #include "drv_fb.h"
  20. #endif
  21. void test_hdmi()
  22. {
  23. rt_kprintf("Hello Test hdmi!\n");
  24. #ifdef BSP_USING_HDMI
  25. print_fb_info();
  26. #ifdef BSP_USING_HDMI_DISPLAY
  27. rt_kprintf("hdmi is tested!\n");
  28. #else
  29. rt_console_set_device("hdmi");
  30. rt_kprintf("hdmi is testing!\n");
  31. #endif
  32. rt_kprintf("search hdmi device");
  33. rt_device_t hdmi = rt_device_find("hdmi");
  34. if (hdmi == RT_NULL)
  35. {
  36. rt_kprintf("cannot find hdmi device");
  37. }
  38. int color = COLOR_YELLOW;
  39. rt_kprintf("begin test hdmi deivice");
  40. rt_graphix_ops(hdmi) -> set_pixel((char *)&color, 5, 5);
  41. rt_graphix_ops(hdmi) -> get_pixel((char *)&color, 5, 5);
  42. rt_kprintf("color is %x\n",color);
  43. rt_graphix_ops(hdmi) -> draw_hline((char *)&color, 10, 100, 10);
  44. color = COLOR_GREEN;
  45. rt_graphix_ops(hdmi) -> draw_vline((char *)&color, 10, 10, 100);
  46. int colors[100];
  47. int i=0;
  48. for (; i < 20; i++) colors[i] = COLOR_RED;
  49. rt_graphix_ops(hdmi) -> blit_line((char *)colors, 20, 20, 20);
  50. #endif
  51. }
  52. #ifdef RT_USING_SMP
  53. #define _CPUS_NR RT_CPUS_NR
  54. #else
  55. #define _CPUS_NR 1
  56. #endif
  57. #ifdef RT_USING_SMP
  58. static rt_uint8_t rt_thread_stack[_CPUS_NR][128];
  59. static struct rt_thread smp[_CPUS_NR];
  60. void smp_test_entry()
  61. {
  62. rt_kprintf("cpu %d is running.\n",rt_hw_cpu_id());
  63. }
  64. #endif
  65. void test_cpusmp(void)
  66. {
  67. rt_kprintf("Hello Test SMP!\n");
  68. #ifdef RT_USING_SMP
  69. int i;
  70. char test_name[RT_NAME_MAX];
  71. for (i = 0; i < _CPUS_NR; i++)
  72. {
  73. rt_sprintf(test_name, "smp%d", i);
  74. rt_thread_init(&smp[i],
  75. test_name,
  76. smp_test_entry,
  77. RT_NULL,
  78. &rt_thread_stack[i][0],
  79. sizeof(rt_thread_stack[i]),
  80. RT_THREAD_PRIORITY_MAX - 2,
  81. 32);
  82. rt_thread_control(&smp[i], RT_THREAD_CTRL_BIND_CPU, (void*)i);
  83. /* startup */
  84. rt_thread_startup(&smp[i]);
  85. rt_thread_delay(RT_TICK_PER_SECOND);
  86. }
  87. #endif
  88. }
  89. #ifdef BSP_USING_PIN
  90. #define TEST_PIN_OUT 33
  91. #define TEST_PIN_IN 37
  92. void gpio_rising_test()
  93. {
  94. rt_kprintf("gpio rising irq function ok!\n");
  95. }
  96. #endif
  97. void test_gpio(void)
  98. {
  99. #ifdef BSP_USING_PIN
  100. rt_uint32_t ret;
  101. rt_kprintf("Hello Test GPIO!\n");
  102. rt_pin_mode(TEST_PIN_OUT, PIN_MODE_OUTPUT);
  103. rt_pin_write(TEST_PIN_OUT, PIN_HIGH);
  104. rt_pin_mode(TEST_PIN_IN, PIN_MODE_INPUT);
  105. ret = rt_pin_read(TEST_PIN_IN);
  106. rt_kprintf("common high input test read result: %d\n",ret);
  107. rt_pin_write(TEST_PIN_OUT, PIN_LOW);
  108. ret = rt_pin_read(TEST_PIN_IN);
  109. rt_kprintf("common low input test read result: %d\n",ret);
  110. rt_pin_mode(TEST_PIN_IN, PIN_MODE_INPUT_PULLDOWN);
  111. rt_pin_attach_irq(TEST_PIN_IN, PIN_IRQ_MODE_RISING, gpio_rising_test, RT_NULL);
  112. rt_pin_irq_enable(TEST_PIN_IN, PIN_IRQ_ENABLE);
  113. rt_pin_write(TEST_PIN_OUT, PIN_HIGH);
  114. rt_pin_irq_enable(TEST_PIN_IN, PIN_IRQ_DISABLE);
  115. #endif
  116. }
  117. #ifdef BSP_USING_I2C1
  118. #define DS3231_I2C_BUS_NAME "i2c1"
  119. #define DS3231_ADDR 0x68
  120. struct rt_i2c_bus_device *i2c_bus = RT_NULL;
  121. static rt_err_t read_regs(struct rt_i2c_bus_device *bus, rt_uint8_t len, rt_uint8_t *buf)
  122. {
  123. struct rt_i2c_msg msgs;
  124. msgs.addr = DS3231_ADDR;
  125. msgs.flags = RT_I2C_RD;
  126. msgs.buf = buf;
  127. msgs.len = len;
  128. if (rt_i2c_transfer(bus, &msgs, 1) == 1)
  129. return RT_EOK;
  130. else
  131. return -RT_ERROR;
  132. }
  133. #endif
  134. void test_i2c(void)
  135. {
  136. #ifdef BSP_USING_I2C1
  137. rt_kprintf("Hello Test I2C!\n");
  138. char name[RT_NAME_MAX];
  139. rt_uint8_t buf[]={0x00,0x00,0x43,0x15,0x05,0x01,0x03,0x19};
  140. rt_strncpy(name, DS3231_I2C_BUS_NAME, RT_NAME_MAX);
  141. i2c_bus = (struct rt_i2c_bus_device *)rt_device_find(name);
  142. if (i2c_bus == RT_NULL)
  143. rt_kprintf("can't find %s device!\n", name);
  144. else
  145. {
  146. read_regs(i2c_bus, 7, buf);
  147. buf[0] = buf[0]&0x7F; //sec
  148. buf[1] = buf[1]&0x7F; //min
  149. buf[2] = buf[2]&0x3F; //hour
  150. buf[3] = buf[3]&0x07; //week
  151. buf[4] = buf[4]&0x3F; //day
  152. buf[5] = buf[5]&0x1F; //mouth
  153. //year/month/day
  154. rt_kprintf("20%02x-%02x-%02x ",buf[6],buf[5],buf[4]);
  155. //hour:minute/second
  156. rt_kprintf("%02x:%02x:%02x \n",buf[2],buf[1],buf[0]);
  157. }
  158. #endif
  159. }
  160. #define W25Q_SPI_DEVICE_NAME "spi0.0"
  161. void test_spi(void)
  162. {
  163. #ifdef BSP_USING_SPI
  164. rt_kprintf("Hello Test SPI!\n");
  165. struct rt_spi_device *spi0_dev0;
  166. struct rt_spi_device *spi0_dev1;
  167. char name0[RT_NAME_MAX];
  168. char name1[RT_NAME_MAX];
  169. rt_uint8_t w25x_read_id = 0x90;
  170. rt_uint8_t id[5] = {0};
  171. rt_strncpy(name0, "spi0.0", RT_NAME_MAX);
  172. rt_strncpy(name1, "spi0.1", RT_NAME_MAX);
  173. spi0_dev0 = (struct rt_spi_device *)rt_device_find(name0);
  174. spi0_dev1 = (struct rt_spi_device *)rt_device_find(name1);
  175. if (!spi0_dev0 || !spi0_dev1)
  176. {
  177. rt_kprintf("spi sample run failed! can't find %s device!\n", name0);
  178. }
  179. else
  180. {
  181. struct rt_spi_message msg1, msg2;
  182. msg1.send_buf = &w25x_read_id;
  183. msg1.recv_buf = RT_NULL;
  184. msg1.length = 1;
  185. msg1.cs_take = 1;
  186. msg1.cs_release = 0;
  187. msg1.next = &msg2;
  188. msg2.send_buf = RT_NULL;
  189. msg2.recv_buf = id;
  190. msg2.length = 5;
  191. msg2.cs_take = 0;
  192. msg2.cs_release = 1;
  193. msg2.next = RT_NULL;
  194. rt_spi_transfer_message(spi0_dev0, &msg1);
  195. rt_kprintf("use rt_spi_transfer_message() read w25q ID is:%x%x\n", id[3], id[4]);
  196. }
  197. #endif
  198. }
  199. #ifdef BSP_USING_SYSTIMER
  200. #define TIMER "timer1"
  201. static rt_err_t timer_timeout_cb(rt_device_t dev, rt_size_t size)
  202. {
  203. rt_kprintf("enter hardware timer isr\n");
  204. return 0;
  205. }
  206. #endif
  207. rt_err_t test_hwtimer(void)
  208. {
  209. #ifdef BSP_USING_SYSTIMER
  210. rt_kprintf("Hello Test HW Timer!\n");
  211. rt_err_t err;
  212. rt_hwtimerval_t val;
  213. rt_device_t dev = RT_NULL;
  214. rt_tick_t tick;
  215. rt_hwtimer_mode_t mode;
  216. int t = 5;
  217. if ((dev = rt_device_find(TIMER)) == RT_NULL)
  218. {
  219. rt_kprintf("No Device: %s\n", TIMER);
  220. return -1;
  221. }
  222. if (rt_device_open(dev, RT_DEVICE_OFLAG_RDWR) != RT_EOK)
  223. {
  224. rt_kprintf("Open %s Fail\n", TIMER);
  225. return -1;
  226. }
  227. mode = HWTIMER_MODE_PERIOD;
  228. err = rt_device_control(dev, HWTIMER_CTRL_MODE_SET, &mode);
  229. tick = rt_tick_get();
  230. rt_kprintf("Start Timer> Tick: %d\n", tick);
  231. val.sec = t;
  232. val.usec = 0;
  233. rt_kprintf("SetTime: Sec %d, Usec %d\n", val.sec, val.usec);
  234. if (rt_device_write(dev, 0, &val, sizeof(val)) != sizeof(val))
  235. {
  236. rt_kprintf("SetTime Fail\n");
  237. goto EXIT;
  238. }
  239. rt_kprintf("Sleep %d sec\n", t);
  240. rt_thread_delay(t*RT_TICK_PER_SECOND);
  241. err = rt_device_control(dev, HWTIMER_CTRL_STOP, RT_NULL);
  242. rt_kprintf("Timer Stoped\n");
  243. rt_device_read(dev, 0, &val, sizeof(val));
  244. rt_kprintf("Read: Sec = %d, Usec = %d\n", val.sec, val.usec);
  245. rt_device_set_rx_indicate(dev, timer_timeout_cb);
  246. mode = HWTIMER_MODE_PERIOD;
  247. err = rt_device_control(dev, HWTIMER_CTRL_MODE_SET, &mode);
  248. val.sec = t;
  249. val.usec = 0;
  250. rt_kprintf("SetTime: Sec %d, Usec %d\n", val.sec, val.usec);
  251. if (rt_device_write(dev, 0, &val, sizeof(val)) != sizeof(val))
  252. {
  253. rt_kprintf("SetTime Fail\n");
  254. goto EXIT;
  255. }
  256. rt_thread_delay((t *5 + 1)*RT_TICK_PER_SECOND);
  257. EXIT:
  258. err = rt_device_close(dev);
  259. rt_kprintf("Close %s\n", TIMER);
  260. return err;
  261. #endif
  262. }
  263. #ifdef RT_USING_WDT
  264. #define WDT_DEVICE_NAME "wdg" /* 鐪嬮棬鐙楄澶囧悕绉� */
  265. static rt_device_t wdg_dev; /* 鐪嬮棬鐙楄澶囧彞鏌� */
  266. static void idle_hook(void)
  267. {
  268. /* 鍦ㄧ┖闂茬嚎绋嬬殑鍥炶皟鍑芥暟閲屽杺鐙� */
  269. rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_KEEPALIVE, NULL);
  270. //rt_kprintf("feed the dog!\n ");
  271. }
  272. rt_err_t test_wdt(void)
  273. {
  274. rt_kprintf("Hello Test WDT!\n");
  275. rt_err_t ret = RT_EOK;
  276. rt_uint32_t timeout = 1; /* 婧㈠嚭鏃堕棿锛屽崟浣嶏細绉� */
  277. char device_name[RT_NAME_MAX];
  278. rt_strncpy(device_name, WDT_DEVICE_NAME, RT_NAME_MAX);
  279. /* 鏍规嵁璁惧鍚嶇О鏌ユ壘鐪嬮棬鐙楄澶囷紝鑾峰彇璁惧鍙ユ焺 */
  280. wdg_dev = rt_device_find(device_name);
  281. if (!wdg_dev)
  282. {
  283. rt_kprintf("find %s failed!\n", device_name);
  284. return RT_ERROR;
  285. }
  286. /* 鍒濆鍖栬澶� */
  287. ret = rt_device_init(wdg_dev);
  288. if (ret != RT_EOK)
  289. {
  290. rt_kprintf("initialize %s failed!\n", device_name);
  291. return RT_ERROR;
  292. }
  293. /* 璁剧疆鐪嬮棬鐙楁孩鍑烘椂闂� */
  294. ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_SET_TIMEOUT, &timeout);
  295. if (ret != RT_EOK)
  296. {
  297. rt_kprintf("set %s timeout failed!\n", device_name);
  298. return RT_ERROR;
  299. }
  300. /* 鍚姩鐪嬮棬鐙� */
  301. ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_START, RT_NULL);
  302. if (ret != RT_EOK)
  303. {
  304. rt_kprintf("start %s failed!\n", device_name);
  305. return -RT_ERROR;
  306. }
  307. /* 璁剧疆绌洪棽绾跨▼鍥炶皟鍑芥暟 */
  308. rt_thread_idle_sethook(idle_hook);
  309. return ret;
  310. }
  311. #else
  312. rt_err_t test_wdt(void)
  313. {
  314. return RT_EOK;
  315. }
  316. #endif
  317. int test_rtc(void)
  318. {
  319. #ifdef BSP_USING_RTC
  320. rt_kprintf("Hello Test RTC!\n");
  321. rt_uint8_t i;
  322. time_t now;
  323. rt_err_t ret = RT_EOK;
  324. rt_kprintf("[RTC Test]RTC Test Start...\n");
  325. rt_thread_delay(RT_TICK_PER_SECOND);
  326. rt_kprintf("[RTC Test]Set RTC 2017-04-01 12:30:46\n\n");
  327. rt_thread_delay(RT_TICK_PER_SECOND);
  328. ret = set_date(2017, 4, 1);
  329. if (ret != RT_EOK)
  330. {
  331. rt_kprintf("[RTC Test]Set RTC Date failed\n");
  332. return RT_ERROR;
  333. }
  334. rt_thread_delay(RT_TICK_PER_SECOND);
  335. ret = set_time(12, 30, 46);
  336. if (ret != RT_EOK)
  337. {
  338. rt_kprintf("[RTC Test]Set RTC Time failed\n");
  339. return RT_ERROR;
  340. }
  341. rt_thread_delay(RT_TICK_PER_SECOND);
  342. for (i = 0; i < 10; i++)
  343. {
  344. rt_kprintf("[RTC Test]Read RTC Date and Time: ");
  345. now = time(RT_NULL);
  346. rt_kprintf("%s", ctime(&now));
  347. rt_thread_delay(RT_TICK_PER_SECOND);
  348. }
  349. rt_kprintf("\n");
  350. #endif
  351. return RT_EOK;
  352. }
  353. void test_device(int argc, char**argv)
  354. {
  355. if (0 == strcmp(argv[1],"smp"))
  356. {
  357. test_cpusmp();
  358. return;
  359. }
  360. if (0 == strcmp(argv[1],"gpio"))
  361. {
  362. test_gpio();
  363. return;
  364. }
  365. if (0 == strcmp(argv[1],"i2c"))
  366. {
  367. test_i2c();
  368. return;
  369. }
  370. if (0 == strcmp(argv[1],"spi"))
  371. {
  372. test_spi();
  373. return;
  374. }
  375. if (0 == strcmp(argv[1],"hwtimer"))
  376. {
  377. test_hwtimer();
  378. return;
  379. }
  380. if (0 == strcmp(argv[1],"wdt"))
  381. {
  382. test_wdt();
  383. return;
  384. }
  385. if (0 == strcmp(argv[1],"rtc"))
  386. {
  387. test_rtc();
  388. return;
  389. }
  390. if (0 == strcmp(argv[1],"hdmi"))
  391. {
  392. test_hdmi();
  393. return;
  394. }
  395. rt_kprintf("param err, please entry test_device <smp|gpio|i2c|spi|hwtimer|wdt|rtc|hdmi>\n");
  396. }
  397. MSH_CMD_EXPORT(test_device, sample: test_device <smp|gpio|i2c|spi|hwtimer|wdt|rtc>);