lwp_pty.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. /*
  2. * Copyright (c) 2006-2021, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #ifndef __LWP_PTY_H__
  7. #define __LWP_PTY_H__
  8. #include <rtthread.h>
  9. #include <rtdevice.h>
  10. #include <lwp.h>
  11. #include <lwp_user_mm.h>
  12. #if defined(RT_USING_POSIX_TERMIOS)
  13. #include <posix_termios.h>
  14. #endif
  15. #ifdef __cplusplus
  16. extern "C" {
  17. #endif
  18. #define DBG_ENABLE
  19. #if defined(LWP_PTY_USING_DEBUG)
  20. #define DBG_LEVEL DBG_LOG
  21. #else
  22. #define DBG_LEVEL DBG_INFO
  23. #endif
  24. #define DBG_COLOR
  25. #include <rtdbg.h>
  26. #ifndef LWP_PTY_INPUT_BFSZ
  27. #define LWP_PTY_INPUT_BFSZ 1024
  28. #endif /* LWP_PTY_INPUT_BFSZ */
  29. #ifndef LWP_PTY_PTS_SIZE
  30. #define LWP_PTY_PTS_SIZE 3
  31. #endif /* LWP_PTY_PTS_SIZE */
  32. #ifndef LWP_PTY_HISTORY_LINE_SIZE
  33. #define LWP_PTY_HISTORY_LINE_SIZE 5
  34. #endif /* LWP_PTY_HISTORY_LINE_SIZE */
  35. #define LWP_PTY_GET_PTMX(fd) ((struct rt_ptmx_device *)(fd->fnode->data))
  36. #define LWP_PTY_GET_PTS(fd) ((struct rt_pts_device *)(fd->fnode->data))
  37. enum lwp_pty_init_flag
  38. {
  39. PTY_INIT_FLAG_NONE = 0,
  40. PTY_INIT_FLAG_ALLOCED,
  41. PTY_INIT_FLAG_REGED,
  42. };
  43. typedef enum lwp_pty_init_flag lwp_pty_init_flag_t;
  44. enum lwp_pts_input_stat
  45. {
  46. LWP_PTS_INPUT_WAIT_NORMAL = 0,
  47. LWP_PTS_INPUT_WAIT_SPEC_KEY,
  48. LWP_PTS_INPUT_WAIT_FUNC_KEY,
  49. };
  50. typedef enum lwp_pts_input_stat lwp_pts_input_stat_t;
  51. struct rt_pts_device
  52. {
  53. struct rt_device parent;
  54. int flags;
  55. int pts_lock;
  56. int pts_index; /* index = /dev/pts/%d */
  57. struct rt_mutex mutex;
  58. // ptmx
  59. struct rt_ptmx_device *ptmx;
  60. int ptmx_fd;
  61. // win attribute
  62. struct winsize winsize;
  63. #if defined(RT_USING_POSIX_TERMIOS)
  64. struct termios tio;
  65. #endif /* RT_USING_POSIX_TERMIOS */
  66. /* console echo */
  67. lwp_pts_input_stat_t stat;
  68. rt_uint8_t echo;
  69. char line[LWP_PTY_INPUT_BFSZ+1];
  70. rt_uint16_t line_position;
  71. struct rt_wqueue *mwq;
  72. struct rt_wqueue *swq;
  73. struct rt_wqueue wq; /* for kernel */
  74. struct rt_ringbuffer mrb; /* ptmx w(master) ==> pts r(slave) */
  75. struct rt_ringbuffer srb; /* pts w(slave) ==> ptmx r(master) */
  76. rt_uint8_t mbuf[LWP_PTY_INPUT_BFSZ];
  77. rt_uint8_t sbuf[LWP_PTY_INPUT_BFSZ];
  78. };
  79. struct rt_ptmx_device
  80. {
  81. struct rt_device parent;
  82. int flags;
  83. struct rt_mutex mutex;
  84. struct rt_wqueue wq;
  85. int pts_index;
  86. struct rt_pts_device pts[LWP_PTY_PTS_SIZE];
  87. };
  88. /* pty */
  89. extern int lwp_pts_isbusy(struct rt_pts_device *pts);
  90. extern rt_size_t lwp_pts_push_mrb(struct rt_pts_device *pts, void *buffer, rt_size_t size);
  91. extern rt_size_t lwp_pts_push_srb(struct rt_pts_device *pts, void *buffer, rt_size_t size);
  92. extern int lwp_pts_unregister(struct rt_pts_device *pts);
  93. extern int lwp_pts_register(struct rt_pts_device *pts, int ptmx_fd, int pts_index);
  94. #ifdef __cplusplus
  95. }
  96. #endif
  97. #endif /* __LWP_PTY_H__ */