rpmsg.h 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. /*
  2. * Copyright (c) 2006-2023, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2023-02-25 GuEe-GUI the first version
  9. */
  10. #ifndef __RPMSG_H__
  11. #define __RPMSG_H__
  12. #include <rthw.h>
  13. #include <rtthread.h>
  14. #include <drivers/core/dm.h>
  15. #include <drivers/core/driver.h>
  16. #include <drivers/byteorder.h>
  17. #define RT_DEVICE_CTRL_RPMSG_CREATE_EPT (RT_DEVICE_CTRL_BASE(Char) + 'R' + 1)
  18. #define RT_DEVICE_CTRL_RPMSG_DESTROY_EPT (RT_DEVICE_CTRL_BASE(Char) + 'R' + 2)
  19. #define RT_DEVICE_CTRL_RPMSG_DATA_OVERWRITE (RT_DEVICE_CTRL_BASE(Char) + 'R' + 3)
  20. struct rt_rpmsg_device_id
  21. {
  22. #define RT_RPMSG_NAME_SIZE 32
  23. char name[RT_RPMSG_NAME_SIZE];
  24. const void *data;
  25. };
  26. struct rt_rpmsg_ops;
  27. struct rt_rpmsg_endpoint;
  28. struct rt_rpmsg_endpoint_info;
  29. struct rt_rpmsg_device
  30. {
  31. struct rt_device parent;
  32. struct rt_rpmsg_device_id id;
  33. rt_list_t ept_nodes;
  34. struct rt_spinlock lock;
  35. const struct rt_rpmsg_ops *ops;
  36. void *priv;
  37. };
  38. struct rt_rpmsg_driver
  39. {
  40. struct rt_driver parent;
  41. const struct rt_rpmsg_device_id *ids;
  42. rt_err_t (*probe)(struct rt_rpmsg_device *rdev);
  43. rt_err_t (*remove)(struct rt_rpmsg_device *rdev);
  44. rt_err_t (*rx_callback)(struct rt_rpmsg_device *rdev,
  45. rt_uint32_t src, void *data, rt_size_t len);
  46. };
  47. typedef rt_err_t (*rt_rpmsg_rx_callback)(struct rt_rpmsg_device *rdev,
  48. rt_uint32_t src, void *data, rt_size_t len);
  49. struct rt_rpmsg_ops
  50. {
  51. rt_err_t (*create_endpoint)(struct rt_rpmsg_device *, struct rt_rpmsg_endpoint *,
  52. struct rt_rpmsg_endpoint_info *info);
  53. rt_err_t (*destroy_endpoint)(struct rt_rpmsg_device *, struct rt_rpmsg_endpoint *);
  54. rt_err_t (*send)(struct rt_rpmsg_device *, rt_uint32_t src, rt_uint32_t dst,
  55. const void *data, rt_size_t len, rt_int32_t timeout);
  56. };
  57. struct rt_rpmsg_endpoint_info
  58. {
  59. char name[RT_RPMSG_NAME_SIZE];
  60. #define RT_RPMSG_ADDR_ANY 0xffffffff
  61. rt_uint32_t src;
  62. rt_uint32_t dst;
  63. };
  64. struct rt_rpmsg_endpoint
  65. {
  66. rt_list_t list;
  67. struct rt_rpmsg_device *rdev;
  68. struct rt_rpmsg_endpoint_info info;
  69. rt_rpmsg_rx_callback rx_callback;
  70. struct rt_spinlock lock;
  71. void *sysdata;
  72. void *priv;
  73. };
  74. enum rt_rpmsg_ns_flags
  75. {
  76. RT_RPMSG_NS_CREATE = 0,
  77. RT_RPMSG_NS_DESTROY = 1,
  78. };
  79. rt_packed(struct rt_rpmsg_ns_msg
  80. {
  81. char name[RT_RPMSG_NAME_SIZE];
  82. #define RT_RPMSG_NS_ADDR 0x35 /* 0x35 -> 53 */
  83. rt_uint32_t addr;
  84. rt_uint32_t flags;
  85. });
  86. enum
  87. {
  88. RT_RPMSG_MODE_MASTER,
  89. RT_RPMSG_MODE_SLAVE,
  90. RT_RPMSG_MODE_MAX,
  91. };
  92. rt_uint32_t rt_rpmsg_mode(void);
  93. struct rt_rpmsg_endpoint *rt_rpmsg_create_endpoint(struct rt_rpmsg_device *,
  94. struct rt_rpmsg_endpoint_info *info, rt_rpmsg_rx_callback rx_cb);
  95. rt_err_t rt_rpmsg_destroy_endpoint(struct rt_rpmsg_device *,
  96. struct rt_rpmsg_endpoint *);
  97. struct rt_rpmsg_endpoint *rt_rpmsg_find_endpoint(struct rt_rpmsg_device *,
  98. struct rt_rpmsg_endpoint_info *info);
  99. rt_err_t rt_rpmsg_send(struct rt_rpmsg_endpoint *,
  100. const void *data, rt_size_t len);
  101. rt_err_t rt_rpmsg_sendto(struct rt_rpmsg_endpoint *, rt_uint32_t dst,
  102. const void *data, rt_size_t len);
  103. rt_err_t rt_rpmsg_send_wait(struct rt_rpmsg_endpoint *,
  104. const void *data, rt_size_t len, rt_int32_t timeout);
  105. rt_err_t rt_rpmsg_sendto_wait(struct rt_rpmsg_endpoint *, rt_uint32_t dst,
  106. const void *data, rt_size_t len, rt_int32_t timeout);
  107. rt_err_t rt_rpmsg_driver_register(struct rt_rpmsg_driver *rdrv);
  108. rt_err_t rt_rpmsg_device_register(struct rt_rpmsg_device *rdev);
  109. #define RT_RPMSG_DRIVER_EXPORT(driver) RT_DRIVER_EXPORT(driver, rpmsg, BUILIN)
  110. #endif /* __RPMSG_H__ */