test_device.c 11 KB

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