usb_osal_rtems.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. /*
  2. * Copyright (c) 2022, sakumisu
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #ifdef __rtems__
  7. #include "usb_osal.h"
  8. #include "usb_errno.h"
  9. #include <rtems.h>
  10. #define SYS_USB_MBOX_SIZE (sizeof(void *))
  11. usb_osal_thread_t usb_osal_thread_create(const char *name, uint32_t stack_size, uint32_t prio, usb_thread_entry_t entry, void *args)
  12. {
  13. rtems_id id = 0;
  14. rtems_status_code res;
  15. res = rtems_task_create(
  16. rtems_build_name(name[0], name[1], name[2], name[3]),
  17. prio,
  18. stack_size,
  19. RTEMS_PREEMPT,
  20. 0,
  21. &id);
  22. if (res != RTEMS_SUCCESSFUL) {
  23. return NULL;
  24. }
  25. res = rtems_task_start(id, (rtems_task_entry)entry, (rtems_task_argument)args);
  26. if (res != RTEMS_SUCCESSFUL) {
  27. rtems_task_delete(id);
  28. return NULL;
  29. }
  30. return (usb_osal_thread_t)id;
  31. }
  32. void usb_osal_thread_delete(usb_osal_thread_t thread)
  33. {
  34. rtems_task_delete(thread);
  35. }
  36. usb_osal_sem_t usb_osal_sem_create(uint32_t initial_count)
  37. {
  38. rtems_id semaphore = 0;
  39. rtems_status_code ret = rtems_semaphore_create(
  40. rtems_build_name('U', 'S', 'B', 's'),
  41. initial_count,
  42. RTEMS_COUNTING_SEMAPHORE,
  43. 0,
  44. &semaphore);
  45. return semaphore;
  46. }
  47. void usb_osal_sem_delete(usb_osal_sem_t sem)
  48. {
  49. rtems_semaphore_delete(sem);
  50. }
  51. int usb_osal_sem_take(usb_osal_sem_t sem, uint32_t timeout)
  52. {
  53. rtems_status_code status;
  54. status = rtems_semaphore_obtain(sem, RTEMS_WAIT, timeout);
  55. return status == RTEMS_SUCCESSFUL ? 0 : -USB_ERR_TIMEOUT;
  56. }
  57. int usb_osal_sem_give(usb_osal_sem_t sem)
  58. {
  59. rtems_status_code status = rtems_semaphore_release(sem);
  60. return (status == RTEMS_SUCCESSFUL) ? 0 : -USB_ERR_TIMEOUT;
  61. }
  62. usb_osal_mutex_t usb_osal_mutex_create(void)
  63. {
  64. rtems_id mutex;
  65. rtems_status_code ret = rtems_semaphore_create(
  66. rtems_build_name('U', 'S', 'B', 'm'),
  67. 1,
  68. RTEMS_PRIORITY | RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY | RTEMS_LOCAL,
  69. 0,
  70. &mutex);
  71. return mutex;
  72. }
  73. void usb_osal_mutex_delete(usb_osal_mutex_t mutex)
  74. {
  75. rtems_semaphore_delete(mutex);
  76. }
  77. int usb_osal_mutex_take(usb_osal_mutex_t mutex)
  78. {
  79. return (rtems_semaphore_obtain(mutex, RTEMS_WAIT, RTEMS_NO_TIMEOUT) == RTEMS_SUCCESSFUL) ? 0 : -USB_ERR_TIMEOUT;
  80. }
  81. int usb_osal_mutex_give(usb_osal_mutex_t mutex)
  82. {
  83. return (rtems_semaphore_release(mutex) == RTEMS_SUCCESSFUL) ? 0 : -USB_ERR_TIMEOUT;
  84. }
  85. usb_osal_mq_t usb_osal_mq_create(uint32_t max_msgs)
  86. {
  87. rtems_status_code ret;
  88. rtems_id mailbox = 0;
  89. ret = rtems_message_queue_create(
  90. rtems_build_name('U', 'S', 'B', 'q'),
  91. max_msgs,
  92. SYS_USB_MBOX_SIZE,
  93. RTEMS_DEFAULT_ATTRIBUTES,
  94. &mailbox);
  95. return mailbox;
  96. }
  97. int usb_osal_mq_send(usb_osal_mq_t mq, uintptr_t addr)
  98. {
  99. rtems_status_code ret;
  100. ret = rtems_message_queue_send(mq, &addr, SYS_USB_MBOX_SIZE);
  101. return (ret == RTEMS_SUCCESSFUL) ? 0 : -USB_ERR_TIMEOUT;
  102. }
  103. int usb_osal_mq_recv(usb_osal_mq_t mq, uintptr_t *addr, uint32_t timeout)
  104. {
  105. size_t size;
  106. rtems_status_code sc;
  107. sc = rtems_message_queue_receive(
  108. mq,
  109. addr,
  110. &size,
  111. RTEMS_WAIT,
  112. timeout);
  113. return (sc == RTEMS_SUCCESSFUL) ? 0 : -USB_ERR_TIMEOUT;
  114. }
  115. uint32_t usb_osal_enter_critical_section(void)
  116. {
  117. rtems_interrupt_level pval;
  118. #if RTEMS_SMP
  119. rtems_recursive_mutex_lock(&sys_arch_lock);
  120. #else
  121. rtems_interrupt_disable(pval);
  122. #endif
  123. return pval;
  124. }
  125. void usb_osal_leave_critical_section(size_t flag)
  126. {
  127. #if RTEMS_SMP
  128. rtems_recursive_mutex_unlock(&sys_arch_lock);
  129. #else
  130. rtems_interrupt_enable(flag);
  131. #endif
  132. }
  133. void usb_osal_msleep(uint32_t delay)
  134. {
  135. rtems_task_wake_after(RTEMS_MILLISECONDS_TO_TICKS(delay));
  136. }
  137. #endif