vbus_echo.c 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. #include <stdlib.h>
  2. #include <rtthread.h>
  3. #include <rtdevice.h>
  4. #include <vbus.h>
  5. #define BUFLEN 1024
  6. static char buf[BUFLEN];
  7. static void _vbus_on_tx_cmp(void *p)
  8. {
  9. struct rt_completion *cmp = p;
  10. rt_completion_done(cmp);
  11. }
  12. static rt_size_t _vbus_write_sync(rt_device_t dev, void *buf, rt_size_t len)
  13. {
  14. rt_size_t sd;
  15. struct rt_completion cmp;
  16. struct rt_vbus_dev_liscfg liscfg;
  17. rt_completion_init(&cmp);
  18. liscfg.event = RT_VBUS_EVENT_ID_TX;
  19. liscfg.listener = _vbus_on_tx_cmp;
  20. liscfg.ctx = &cmp;
  21. rt_device_control(dev, VBUS_IOC_LISCFG, &liscfg);
  22. sd = rt_device_write(dev, 0, buf, len);
  23. rt_completion_wait(&cmp, RT_WAITING_FOREVER);
  24. return sd;
  25. }
  26. static void _rev_str(char *buf, rt_size_t len)
  27. {
  28. char tmp;
  29. rt_size_t i, mid;
  30. RT_ASSERT(buf);
  31. if (!len)
  32. return;
  33. mid = len / 2;
  34. for (i = 0; i < mid; i++)
  35. {
  36. tmp = buf[i];
  37. buf[i] = buf[len - 1 - i];
  38. buf[len - 1 - i] = tmp;
  39. }
  40. }
  41. static void _test_write(void *devname)
  42. {
  43. int i;
  44. rt_device_t dev;
  45. dev = rt_device_find(devname);
  46. if (!dev)
  47. {
  48. rt_kprintf("could not find %s\n", devname);
  49. return;
  50. }
  51. again:
  52. i = rt_device_open(dev, RT_DEVICE_OFLAG_RDWR);
  53. if (i)
  54. {
  55. rt_kprintf("open dev err:%d\n", i);
  56. return;
  57. }
  58. for (i = 0; i < sizeof(buf) - 1;i++)
  59. {
  60. int len;
  61. len = rt_device_read(dev, 0, buf + i, 1);
  62. if (len != 1 || buf[i] == '\n')
  63. break;
  64. }
  65. buf[i] = '\0';
  66. rt_kprintf("recv: %s\n", buf);
  67. /* Don't swap the \n. */
  68. _rev_str(buf, i - 1);
  69. /* Don't write the \0. */
  70. rt_kprintf("write: %s\n", buf);
  71. _vbus_write_sync(dev, buf, i - 1);
  72. rt_device_close(dev);
  73. goto again;
  74. }
  75. int vser_echo_init(void)
  76. {
  77. rt_thread_t tid;
  78. tid = rt_thread_create("vecho", _test_write, "vecho",
  79. 1024, 0, 20);
  80. RT_ASSERT(tid);
  81. return rt_thread_startup(tid);
  82. }
  83. #ifdef RT_USING_COMPONENTS_INIT
  84. INIT_APP_EXPORT(vser_echo_init);
  85. #endif