test.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835
  1. /*
  2. * Copyright (c) 2006-2025, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2024-06-17 QT-one first version
  9. */
  10. #include "board.h"
  11. #ifdef BSP_USING_TEST
  12. /* Task stack */
  13. #define THREAD_PRIORITY 25
  14. #define THREAD_STACK_SIZE 512
  15. #define THREAD_TIMESLICE 5
  16. /* Test pins */
  17. #define TEST_LED0_PIN GET_PIN(D, 15)
  18. #define TEST_LED1_PIN GET_PIN(E, 0)
  19. #define TEST_LED2_PIN GET_PIN(E, 2)
  20. #define TEST_WAKEUP_PIN GET_PIN(C, 15)
  21. #define TEST_KEY1_PIN GET_PIN(D, 13)
  22. #define TEST_KEY2_PIN GET_PIN(D, 14)
  23. #define TEST_OTHER_PIN GET_PIN(C, 15)
  24. #define TEST_OUTPUT_PIN GET_PIN(E, 2)
  25. #define TEST_INPUT_PIN GET_PIN(D, 13)
  26. #define TEST_INT_PIN GET_PIN(D, 14)
  27. #define TEST_RES_PIN GET_PIN(E, 2)
  28. /* Event flags */
  29. #define TEST_GPIO_INT_ENV (1 << 10)
  30. #define TEST_GPIO_KEY_ENV (1 << 15)
  31. static struct rt_event led_event; /* LED event */
  32. #define TASK_KILL_FLAG (1 << 10)
  33. static struct rt_event task_event; /* Task event */
  34. /* EEPROM Read/Write Data Structure */
  35. typedef union
  36. {
  37. rt_uint8_t data[30];
  38. struct
  39. {
  40. rt_uint8_t write_addr;
  41. char write_date[29];
  42. }in_data;
  43. }eeprom_write_type;
  44. /* Semaphore variables */
  45. static struct rt_semaphore rx_sem;
  46. /* Mutually exclusive variables */
  47. static rt_mutex_t task_mutex = RT_NULL; /* task mutex */
  48. /* device handle */
  49. #ifdef BSP_USING_UART
  50. static rt_device_t serial;
  51. #endif
  52. #ifdef BSP_USING_WDT
  53. static rt_device_t wdt_dev;
  54. #endif
  55. #ifdef BSP_USING_I2C
  56. struct rt_i2c_bus_device *i2c_dev;
  57. #endif
  58. #ifdef BSP_USING_SPI
  59. static struct rt_spi_device *spi_dev;
  60. #endif
  61. /* In-file function declarations */
  62. static void sys_run_dir(void *parameter);
  63. static void gpio_output_test(void *parameter);
  64. static void gpio_input_test(void *parameter);
  65. static void key_iqr_handle(void *args);
  66. /* Task registration */
  67. int task_registration(void)
  68. {
  69. /* Create a dynamic mutex */
  70. task_mutex = rt_mutex_create("task_mutex", RT_IPC_FLAG_FIFO);
  71. if (task_mutex == RT_NULL)
  72. {
  73. rt_kprintf("rt_mutex_create error.\n");
  74. return -1;
  75. }
  76. /* Create a task event */
  77. if(rt_event_init(&task_event,"task_event",RT_IPC_FLAG_FIFO) != RT_EOK)
  78. {
  79. rt_kprintf("rt_mutex_create error.\n");
  80. return -1;
  81. }
  82. return 0;
  83. }
  84. INIT_BOARD_EXPORT(task_registration);
  85. /* System operation indicator */
  86. #ifdef BSP_USING_GPIO
  87. static void sys_run_dir(void *parameter)
  88. {
  89. rt_uint32_t e;
  90. rt_pin_mode(TEST_LED2_PIN, PIN_MODE_OUTPUT);
  91. while(1)
  92. {
  93. if(rt_event_recv(&task_event,TASK_KILL_FLAG,
  94. RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR,
  95. RT_WAITING_NO, &e) == RT_EOK)
  96. {
  97. rt_thread_t tid = rt_thread_self();
  98. rt_thread_delete(tid);
  99. }
  100. rt_pin_write(TEST_LED2_PIN, PIN_LOW);
  101. rt_thread_mdelay(500);
  102. rt_pin_write(TEST_LED2_PIN, PIN_HIGH);
  103. rt_thread_mdelay(500);
  104. }
  105. }
  106. static int sys_run_task(int argc, char *argv[])
  107. {
  108. if(argc == 2)
  109. {
  110. if(rt_strcmp(argv[1],"start") == 0)
  111. {
  112. if(rt_mutex_take(task_mutex, RT_WAITING_NO) != RT_EOK)
  113. {
  114. rt_kprintf("The test thread is occupied.\n");
  115. return -RT_ERROR;
  116. }
  117. else
  118. {
  119. /* Register the system indicator task */
  120. rt_thread_t sys_led_task = rt_thread_create("sys_led_task",
  121. sys_run_dir, RT_NULL,
  122. THREAD_STACK_SIZE,
  123. THREAD_PRIORITY, THREAD_TIMESLICE);
  124. if (sys_led_task != RT_NULL)
  125. rt_thread_startup(sys_led_task);
  126. rt_kprintf("The sys run task is registered.\n");
  127. }
  128. }
  129. else if(rt_strcmp(argv[1],"end") == 0)
  130. {
  131. rt_event_send(&task_event,TASK_KILL_FLAG);
  132. rt_mutex_release(task_mutex);
  133. rt_kprintf("The sys run task has been deleted.\n");
  134. }
  135. }
  136. else
  137. {
  138. rt_kprintf("Necessary parameters are missing.\n");
  139. rt_kprintf("You can use the following commands.\n");
  140. rt_kprintf("%s start\n",__func__);
  141. rt_kprintf("%s end\n",__func__);
  142. return -1;
  143. }
  144. return -1;
  145. }
  146. MSH_CMD_EXPORT(sys_run_task, sys run task operation);
  147. /* Gpio output test */
  148. static void gpio_output_test(void *parameter)
  149. {
  150. rt_uint32_t e;
  151. rt_pin_mode(TEST_OUTPUT_PIN, PIN_MODE_OUTPUT);
  152. while(1)
  153. {
  154. if(rt_event_recv(&task_event,TASK_KILL_FLAG,
  155. RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR,
  156. RT_WAITING_NO, &e) == RT_EOK)
  157. {
  158. rt_thread_t tid = rt_thread_self();
  159. rt_thread_delete(tid);
  160. }
  161. rt_pin_write(TEST_OUTPUT_PIN, PIN_LOW);
  162. rt_thread_mdelay(500);
  163. rt_pin_write(TEST_OUTPUT_PIN, PIN_HIGH);
  164. rt_thread_mdelay(500);
  165. }
  166. }
  167. static int gpio_output_task(int argc, char *argv[])
  168. {
  169. if(argc == 2)
  170. {
  171. if(rt_strcmp(argv[1],"start") == 0)
  172. {
  173. if(rt_mutex_take(task_mutex, RT_WAITING_NO) != RT_EOK)
  174. {
  175. rt_kprintf("The test thread is occupied.\n");
  176. return -RT_ERROR;
  177. }
  178. else
  179. {
  180. /* Gpio output test tasks */
  181. rt_thread_t gpio_output_task = rt_thread_create("gpio_output_task",
  182. gpio_output_test, RT_NULL,
  183. THREAD_STACK_SIZE,
  184. THREAD_PRIORITY, THREAD_TIMESLICE);
  185. if (gpio_output_task != RT_NULL)
  186. rt_thread_startup(gpio_output_task);
  187. rt_kprintf("The gpio output task is registered.\n");
  188. }
  189. }
  190. else if(rt_strcmp(argv[1],"end") == 0)
  191. {
  192. rt_event_send(&task_event,TASK_KILL_FLAG);
  193. rt_mutex_release(task_mutex);
  194. rt_kprintf("The gpio output task has been deleted.\n");
  195. }
  196. }
  197. else
  198. {
  199. rt_kprintf("Necessary parameters are missing.\n");
  200. rt_kprintf("You can use the following commands.\n");
  201. rt_kprintf("%s start\n",__func__);
  202. rt_kprintf("%s end\n",__func__);
  203. return -1;
  204. }
  205. return -1;
  206. }
  207. MSH_CMD_EXPORT(gpio_output_task, gpio output task operation);
  208. /* Gpio input test */
  209. static void key_iqr_handle(void *args)
  210. {
  211. /* gpio iqr fun */
  212. rt_event_send(&led_event,TEST_GPIO_INT_ENV);
  213. }
  214. static void gpio_input_test(void *parameter)
  215. {
  216. uint8_t led_flag = PIN_LOW;
  217. rt_uint32_t e;
  218. rt_pin_mode(TEST_RES_PIN, PIN_MODE_OUTPUT);
  219. rt_pin_write(TEST_RES_PIN, PIN_LOW);
  220. rt_pin_mode(TEST_WAKEUP_PIN,PIN_MODE_INPUT_PULLDOWN);
  221. rt_pin_mode(TEST_INPUT_PIN,PIN_MODE_INPUT_PULLUP);
  222. rt_pin_attach_irq(TEST_INT_PIN,PIN_IRQ_MODE_FALLING,key_iqr_handle,RT_NULL);
  223. rt_pin_irq_enable(TEST_INT_PIN,PIN_IRQ_ENABLE);
  224. if(rt_event_init(&led_event,"led_event",RT_IPC_FLAG_FIFO) != RT_EOK)
  225. {
  226. rt_kprintf("rt_mutex_create error.\n");
  227. }
  228. while(1)
  229. {
  230. if(PIN_LOW == rt_pin_read(TEST_INPUT_PIN))
  231. {
  232. while(PIN_LOW == rt_pin_read(TEST_INPUT_PIN));
  233. rt_event_send(&led_event,TEST_GPIO_KEY_ENV);
  234. }
  235. if(rt_event_recv(&led_event,(TEST_GPIO_INT_ENV|TEST_GPIO_KEY_ENV),
  236. RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR,
  237. RT_WAITING_NO, &e) == RT_EOK)
  238. {
  239. led_flag = (led_flag == PIN_LOW)?PIN_HIGH:PIN_LOW;
  240. rt_pin_write(TEST_RES_PIN, led_flag);
  241. }
  242. if(rt_event_recv(&task_event,TASK_KILL_FLAG,
  243. RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR,
  244. RT_WAITING_NO, &e) == RT_EOK)
  245. {
  246. rt_thread_t tid = rt_thread_self();
  247. rt_thread_delete(tid);
  248. }
  249. }
  250. }
  251. static int gpio_input_task(int argc, char *argv[])
  252. {
  253. if(argc == 2)
  254. {
  255. if(rt_strcmp(argv[1],"start") == 0)
  256. {
  257. if(rt_mutex_take(task_mutex, RT_WAITING_NO) != RT_EOK)
  258. {
  259. rt_kprintf("The test thread is occupied.\n");
  260. return -RT_ERROR;
  261. }
  262. /* Gpio input test tasks */
  263. rt_thread_t gpio_input_task = rt_thread_create("gpio_input_task",
  264. gpio_input_test, RT_NULL,
  265. THREAD_STACK_SIZE,
  266. THREAD_PRIORITY, THREAD_TIMESLICE);
  267. if (gpio_input_task != RT_NULL)
  268. rt_thread_startup(gpio_input_task);
  269. rt_kprintf("The gpio input task is registered.\n");
  270. }
  271. else if(rt_strcmp(argv[1],"end") == 0)
  272. {
  273. rt_event_send(&task_event,TASK_KILL_FLAG);
  274. rt_mutex_release(task_mutex);
  275. rt_kprintf("The gpio input task has been deleted.\n");
  276. }
  277. }
  278. else
  279. {
  280. rt_kprintf("Necessary parameters are missing.\n");
  281. rt_kprintf("You can use the following commands.\n");
  282. rt_kprintf("%s start\n",__func__);
  283. rt_kprintf("%s end\n",__func__);
  284. return -1;
  285. }
  286. return -1;
  287. }
  288. MSH_CMD_EXPORT(gpio_input_task, gpio input task operation);
  289. #endif
  290. /* uart test */
  291. #ifdef BSP_USING_UART
  292. static rt_err_t uart_iqr_handle(rt_device_t dev, rt_size_t size)
  293. {
  294. /* Serial port callback function */
  295. rt_sem_release(&rx_sem);
  296. return RT_EOK;
  297. }
  298. static void uart_thread(void *parameter)
  299. {
  300. char ch;
  301. while (1)
  302. {
  303. /* Serial port readout */
  304. while (rt_device_read(serial, -1, &ch, 1) != 1)
  305. {
  306. /* semaphore blocking */
  307. rt_sem_take(&rx_sem, RT_WAITING_FOREVER);
  308. }
  309. /* Output the data obtained from the serial port */
  310. rt_device_write(serial, 0, &ch, 1);
  311. rt_device_write(serial,0,"\n",1);
  312. }
  313. }
  314. static int uart_task(int argc, char *argv[])
  315. {
  316. rt_err_t ret = RT_EOK;
  317. char uart_name[RT_NAME_MAX] = "uart1";
  318. char str[] = "hello RT-Thread!\r\n";
  319. if (argc == 3)
  320. {
  321. if(rt_strcmp(argv[2],"start") == 0)
  322. {
  323. rt_strncpy(uart_name, argv[1], RT_NAME_MAX);
  324. }
  325. else
  326. {
  327. rt_kprintf("Necessary parameters are missing.\n");
  328. rt_kprintf("You can use the following commands.\n");
  329. rt_kprintf("%s <uart name> start\n",__func__);
  330. rt_kprintf("%s <uart name> end\n",__func__);
  331. return -1;
  332. }
  333. }
  334. else if(argc == 2)
  335. {
  336. if(rt_strcmp(argv[1],"start") == 0)
  337. {
  338. }
  339. else
  340. {
  341. rt_kprintf("Necessary parameters are missing.\n");
  342. rt_kprintf("You can use the following commands.\n");
  343. rt_kprintf("%s start\n",__func__);
  344. rt_kprintf("%s end\n",__func__);
  345. return -1;
  346. }
  347. }
  348. else
  349. {
  350. rt_kprintf("Incomplete instruction.\n");
  351. rt_kprintf("You can use the following commands.\n");
  352. rt_kprintf("%s <uart name> start/end\n",__func__);
  353. rt_kprintf("or\n");
  354. rt_kprintf("%s start/end\n",__func__);
  355. return -1;
  356. }
  357. /* Find Serial Devices */
  358. serial = rt_device_find(uart_name);
  359. if (!serial)
  360. {
  361. rt_kprintf("find %s failed!\n", uart_name);
  362. return -RT_ERROR;
  363. }
  364. /* Initializing a Signal */
  365. rt_sem_init(&rx_sem, "rx_sem", 0, RT_IPC_FLAG_FIFO);
  366. /* Open the serial device with read/write and interrupt reception. */
  367. rt_device_open(serial, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_INT_RX);
  368. /* Setting the receive callback function */
  369. rt_device_set_rx_indicate(serial, uart_iqr_handle);
  370. /* Send String */
  371. rt_device_write(serial, 0, str, (sizeof(str) - 1));
  372. /* Creating a serial thread */
  373. rt_thread_t thread = rt_thread_create("serial",
  374. uart_thread, RT_NULL,
  375. THREAD_STACK_SIZE,
  376. THREAD_PRIORITY, THREAD_TIMESLICE);
  377. if (thread != RT_NULL)
  378. rt_thread_startup(thread);
  379. return ret;
  380. }
  381. MSH_CMD_EXPORT(uart_task, uart device sample);
  382. #endif
  383. /* hw/sw iic test */
  384. #ifdef BSP_USING_I2C
  385. static void i2c_thread(void *parameter)
  386. {
  387. uint8_t write_addr = 0x00;
  388. eeprom_write_type eeprom_date;
  389. char send_dat[] = "i2c write eeprom";
  390. char read_dat[20] = {0};
  391. struct rt_i2c_msg msg1[2];
  392. eeprom_date.in_data.write_addr = write_addr;
  393. rt_strncpy(eeprom_date.in_data.write_date, send_dat, rt_strlen(send_dat));
  394. msg1[0].addr = 0x51;
  395. msg1[0].flags = RT_I2C_WR;
  396. msg1[0].buf = eeprom_date.data;
  397. msg1[0].len = (rt_strlen(send_dat) + 1);
  398. if (rt_i2c_transfer(i2c_dev, msg1, 1) == 1)
  399. {
  400. rt_kprintf("eeprom write succeed!\n");
  401. rt_kprintf("write_dat = %s\r\n",send_dat);
  402. }
  403. else
  404. {
  405. rt_kprintf("eeprom write error!\n");
  406. }
  407. msg1[0].addr = 0x51;
  408. msg1[0].flags = RT_I2C_WR;
  409. msg1[0].buf = &write_addr;
  410. msg1[0].len = 1;
  411. msg1[1].addr = 0x51;
  412. msg1[1].flags = RT_I2C_RD;
  413. msg1[1].buf = (uint8_t *)read_dat;
  414. msg1[1].len = rt_strlen(send_dat);
  415. if (rt_i2c_transfer(i2c_dev, msg1, 2) == 2)
  416. {
  417. rt_kprintf("eeprom read succeed!\n");
  418. rt_kprintf("read_dat = %s\r\n",read_dat);
  419. }
  420. else
  421. {
  422. rt_kprintf("eeprom read error!\n");
  423. }
  424. }
  425. static int i2c_task(int argc, char *argv[])
  426. {
  427. rt_err_t ret = RT_EOK;
  428. char i2c_name[RT_NAME_MAX] = "hw_i2c0";
  429. if (argc == 3)
  430. {
  431. if(rt_strcmp(argv[2],"start") == 0)
  432. {
  433. rt_strncpy(i2c_name, argv[1], RT_NAME_MAX);
  434. }
  435. else
  436. {
  437. rt_kprintf("Necessary parameters are missing.\n");
  438. rt_kprintf("You can use the following commands.\n");
  439. rt_kprintf("%s <i2c name> start\n",__func__);
  440. rt_kprintf("%s <i2c name> end\n",__func__);
  441. return -1;
  442. }
  443. }
  444. else if(argc == 2)
  445. {
  446. if(rt_strcmp(argv[1],"start") == 0)
  447. {
  448. }
  449. else
  450. {
  451. rt_kprintf("Necessary parameters are missing.\n");
  452. rt_kprintf("You can use the following commands.\n");
  453. rt_kprintf("%s start\n",__func__);
  454. rt_kprintf("%s end\n",__func__);
  455. return -1;
  456. }
  457. }
  458. else
  459. {
  460. rt_kprintf("Incomplete instruction.\n");
  461. rt_kprintf("You can use the following commands.\n");
  462. rt_kprintf("%s <i2c name> start/end\n",__func__);
  463. rt_kprintf("or\n");
  464. rt_kprintf("%s start/end\n",__func__);
  465. return -1;
  466. }
  467. /* Find I2C Devices */
  468. i2c_dev = (struct rt_i2c_bus_device *)rt_device_find(i2c_name);
  469. if (!i2c_dev)
  470. {
  471. rt_kprintf("find %s failed!\n", i2c_name);
  472. return -RT_ERROR;
  473. }
  474. /* Execute I2C read/write eeprom function */
  475. i2c_thread(RT_NULL);
  476. return ret;
  477. }
  478. MSH_CMD_EXPORT(i2c_task, i2c device sample);
  479. #endif
  480. /* spi test */
  481. #ifdef BSP_USING_SPI
  482. static void spi_thread(void *parameter)
  483. {
  484. rt_uint8_t w25x_read_id = 0x9F;
  485. rt_uint8_t id[5] = {0};
  486. /* Use rt_spi_send_then_recv() to send commands to read IDs */
  487. rt_spi_take_bus(spi_dev);
  488. rt_spi_take(spi_dev);
  489. rt_spi_send_then_recv(spi_dev, &w25x_read_id, 1, id, 3);
  490. rt_spi_release(spi_dev);
  491. rt_spi_release_bus(spi_dev);
  492. rt_kprintf("use rt_spi_send_then_recv() read MX25L6406 ID is:0x%X%X%X\n", id[0], id[1], id[2]);
  493. }
  494. static int spi_task(int argc, char *argv[])
  495. {
  496. rt_err_t ret = RT_EOK;
  497. struct rt_spi_configuration cfg;
  498. char spi_name[RT_NAME_MAX] = "spi0";
  499. char flash_name[RT_NAME_MAX] = "flash";
  500. if (argc == 3)
  501. {
  502. if(rt_strcmp(argv[2],"start") == 0)
  503. {
  504. rt_strncpy(spi_name, argv[1], RT_NAME_MAX);
  505. }
  506. else
  507. {
  508. rt_kprintf("Necessary parameters are missing.\n");
  509. rt_kprintf("You can use the following commands.\n");
  510. rt_kprintf("%s <spi name> start\n",__func__);
  511. rt_kprintf("%s <spi name> end\n",__func__);
  512. return -1;
  513. }
  514. }
  515. else if(argc == 2)
  516. {
  517. if(rt_strcmp(argv[1],"start") == 0)
  518. {
  519. }
  520. else
  521. {
  522. rt_kprintf("Necessary parameters are missing.\n");
  523. rt_kprintf("You can use the following commands.\n");
  524. rt_kprintf("%s start\n",__func__);
  525. rt_kprintf("%s end\n",__func__);
  526. return -1;
  527. }
  528. }
  529. else
  530. {
  531. rt_kprintf("Incomplete instruction.\n");
  532. rt_kprintf("You can use the following commands.\n");
  533. rt_kprintf("%s <spi name> start/end\n",__func__);
  534. rt_kprintf("or\n");
  535. rt_kprintf("%s start/end\n",__func__);
  536. return -1;
  537. }
  538. /* Binding CS pin */
  539. ret = rt_hw_spi_device_attach(spi_name,flash_name,HT_GPIOD,GPIO_PIN_9);
  540. if(ret != RT_EOK)
  541. {
  542. rt_kprintf("Failed CS pin binding for %s!\n", spi_name);
  543. return -RT_ERROR;
  544. }
  545. /* Find flash devices */
  546. spi_dev = (struct rt_spi_device*)rt_device_find(flash_name);
  547. if (!spi_dev)
  548. {
  549. rt_kprintf("find %s failed!\n", spi_name);
  550. return -RT_ERROR;
  551. }
  552. /* Configuring the SPI Bus */
  553. cfg.data_width = 8;
  554. cfg.mode = RT_SPI_MASTER | RT_SPI_MODE_3 | RT_SPI_MSB;
  555. cfg.max_hz = 8;
  556. rt_spi_configure(spi_dev,&cfg);
  557. rt_kprintf("SPI0 initialization succeeded!\n");
  558. /* Execute flash read and write functions */
  559. spi_thread(RT_NULL);
  560. rt_device_unregister((rt_device_t)spi_dev);
  561. return ret;
  562. }
  563. MSH_CMD_EXPORT(spi_task, spi device sample);
  564. #endif
  565. /* adc test */
  566. #ifdef BSP_USING_ADC
  567. static void adc_test(void *parameter)
  568. {
  569. rt_uint32_t adc0_ch11_val,adc0_ch12_val;
  570. rt_adc_device_t adc_dev = (rt_adc_device_t)rt_device_find("adc0");
  571. if (!adc_dev)
  572. {
  573. rt_kprintf("No ADC0 device found!\n");
  574. }
  575. else
  576. {
  577. rt_adc_enable(adc_dev,ADC_CH_11);
  578. rt_adc_enable(adc_dev,ADC_CH_12);
  579. }
  580. while(1)
  581. {
  582. adc0_ch11_val = rt_adc_read(adc_dev,11);
  583. adc0_ch12_val = rt_adc_read(adc_dev,12);
  584. rt_kprintf("adc0_ch6_val = %d\n",adc0_ch11_val);
  585. rt_kprintf("adc0_ch7_val = %d\n",adc0_ch12_val);
  586. rt_thread_mdelay(50);
  587. }
  588. }
  589. static int adc_task(int argc, char *argv[])
  590. {
  591. if(argc == 2)
  592. {
  593. if(rt_strcmp(argv[1],"start") == 0)
  594. {
  595. /* Adc test tasks */
  596. rt_thread_t adc_task = rt_thread_create("adc_task",
  597. adc_test, RT_NULL,
  598. THREAD_STACK_SIZE,
  599. THREAD_PRIORITY, THREAD_TIMESLICE);
  600. if (adc_task != RT_NULL)
  601. rt_thread_startup(adc_task);
  602. rt_kprintf("The adc task is registered.\n");
  603. }
  604. else if(rt_strcmp(argv[1],"end") == 0)
  605. {
  606. rt_event_send(&task_event,TASK_KILL_FLAG);
  607. rt_kprintf("The adc task has been deleted.\n");
  608. }
  609. }
  610. else
  611. {
  612. rt_kprintf("Necessary parameters are missing.\n");
  613. rt_kprintf("You can use the following commands.\n");
  614. rt_kprintf("%s start\n",__func__);
  615. rt_kprintf("%s end\n",__func__);
  616. return -1;
  617. }
  618. return -1;
  619. }
  620. MSH_CMD_EXPORT(adc_task, adc task operation);
  621. #endif
  622. /* wdt test */
  623. #ifdef BSP_USING_WDT
  624. static void wdt_test(void)
  625. {
  626. rt_device_control(wdt_dev, RT_DEVICE_CTRL_WDT_KEEPALIVE, RT_NULL);
  627. }
  628. static int wdt_task(int argc, char *argv[])
  629. {
  630. rt_err_t ret = -RT_ERROR;
  631. rt_uint16_t wdt_time = 5;
  632. char dev_name[] = "wdt";
  633. if(argc == 2)
  634. {
  635. if(rt_strcmp(argv[1],"start") == 0)
  636. {
  637. /* Find wdt devices */
  638. wdt_dev = rt_device_find(dev_name);
  639. if(wdt_dev == RT_NULL)
  640. {
  641. rt_kprintf("No corresponding equipment found.\n");
  642. return -1;
  643. }
  644. /* Configuring the Watchdog */
  645. ret = rt_device_control(wdt_dev, RT_DEVICE_CTRL_WDT_SET_TIMEOUT, &wdt_time);
  646. if(ret != RT_EOK)
  647. {
  648. rt_kprintf("wdt configuration failed.\n");
  649. return -1;
  650. }
  651. /* Start the Watchdog */
  652. ret = rt_device_control(wdt_dev, RT_DEVICE_CTRL_WDT_START, RT_NULL);
  653. if(ret != RT_EOK)
  654. {
  655. rt_kprintf("wdt start failed.\n");
  656. return -1;
  657. }
  658. /* Setting up idle threads */
  659. rt_thread_idle_sethook(wdt_test);
  660. rt_kprintf("Watchdog started successfully.\n");
  661. }
  662. else if(rt_strcmp(argv[1],"stop") == 0)
  663. {
  664. /* Verify device handle */
  665. if(wdt_dev == RT_NULL)
  666. {
  667. rt_kprintf("Device handle does not exist.\n");
  668. return -1;
  669. }
  670. /* Stop the Watchdog */
  671. ret = rt_device_control(wdt_dev, RT_DEVICE_CTRL_WDT_STOP, RT_NULL);
  672. if(ret != RT_EOK)
  673. {
  674. rt_kprintf("wdt start failed.\n");
  675. return -1;
  676. }
  677. /* Hook function to delete idle threads */
  678. rt_thread_idle_delhook(wdt_test);
  679. rt_kprintf("Watchdog has stopped.\n");
  680. }
  681. }
  682. else
  683. {
  684. rt_kprintf("Necessary parameters are missing.\n");
  685. rt_kprintf("You can use the following commands.\n");
  686. rt_kprintf("%s start\n",__func__);
  687. rt_kprintf("%s stop\n",__func__);
  688. return -1;
  689. }
  690. return -1;
  691. }
  692. MSH_CMD_EXPORT(wdt_task, wdt task operation);
  693. #endif
  694. /* usbd test */
  695. #ifdef BSP_USING_USBD
  696. static void usbd_test(void *parameter)
  697. {
  698. rt_device_t dev = RT_NULL;
  699. char dev_name[] = "vcom";
  700. char buf[] = "usbd vcom test!\r\n";
  701. dev = rt_device_find(dev_name);
  702. if (dev)
  703. {
  704. rt_device_open(dev, RT_DEVICE_FLAG_RDWR);
  705. }
  706. else
  707. {
  708. rt_kprintf("Device with name %s not found.\n",dev_name);
  709. rt_thread_t tid = rt_thread_self();
  710. rt_thread_delete(tid);
  711. }
  712. while (1)
  713. {
  714. rt_device_write(dev, 0, buf, rt_strlen(buf));
  715. rt_thread_mdelay(500);
  716. }
  717. }
  718. static int usbd_task(int argc, char *argv[])
  719. {
  720. rt_err_t ret = -RT_ERROR;
  721. if(argc == 2)
  722. {
  723. if(rt_strcmp(argv[1],"start") == 0)
  724. {
  725. /* Gpio input test tasks */
  726. rt_thread_t usbd_vcom_task = rt_thread_create("usbd_vcom_task",
  727. usbd_test, RT_NULL,
  728. THREAD_STACK_SIZE,
  729. THREAD_PRIORITY, THREAD_TIMESLICE);
  730. if (usbd_vcom_task != RT_NULL)
  731. {
  732. rt_thread_startup(usbd_vcom_task);
  733. rt_kprintf("The usbd vcom task is registered.\n");
  734. }
  735. else
  736. {
  737. rt_kprintf("usbd vcom task registration failed.\n");
  738. }
  739. ret = RT_EOK;
  740. }
  741. else if(rt_strcmp(argv[1],"stop") == 0)
  742. {
  743. ret = RT_EOK;
  744. }
  745. }
  746. else
  747. {
  748. rt_kprintf("Necessary parameters are missing.\n");
  749. rt_kprintf("You can use the following commands.\n");
  750. rt_kprintf("%s start\n",__func__);
  751. rt_kprintf("%s stop\n",__func__);
  752. }
  753. return ret;
  754. }
  755. MSH_CMD_EXPORT(usbd_task, usbd task operation);
  756. #endif
  757. #ifdef BSP_USING_SDIO
  758. int mnt_init(void)
  759. {
  760. rt_device_t dev = RT_NULL;
  761. char dev_name[] = BSP_USING_SDIO_NAME;
  762. rt_thread_mdelay(1000);
  763. dev = rt_device_find(dev_name);
  764. if(dev)
  765. {
  766. if(dfs_mount("sd0","/","elm",0,0) == RT_EOK)
  767. {
  768. rt_kprintf("dfs mount success!\r\n");
  769. }
  770. else
  771. {
  772. rt_kprintf("dfs mount failed!\r\n");
  773. rt_kprintf("Formatting the SD card!\r\n");
  774. dfs_mkfs("elm",dev_name);
  775. if(dfs_mount("sd0","/","elm",0,0) == RT_EOK)
  776. {
  777. rt_kprintf("dfs mount success!\r\n");
  778. }
  779. else
  780. {
  781. rt_kprintf("dfs mount failed!\r\n");
  782. rt_kprintf("Exit SD card mount!\r\n");
  783. }
  784. }
  785. }
  786. return 0;
  787. }
  788. INIT_FS_EXPORT(mnt_init);
  789. #endif /* BSP_USING_SDIO */
  790. #endif /* BSP_USING_TEST */