/MicroFrameworkPK_v4_1/DeviceCode/pal/lwip/tinyclr/sys__tinyclr.cpp

https://bitbucket.org/pmfsampaio/netmf-lpc · C++ · 323 lines · 188 code · 75 blank · 60 comment · 19 complexity · 2fdba4413332a222ca747d3f7b10ba30 MD5 · raw file

  1. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  4. #include "tinyhal.h"
  5. #include "mem.h"
  6. #include "sys.h"
  7. #include "tcpip.h"
  8. //--//
  9. #ifdef __cplusplus
  10. extern "C" {
  11. #endif
  12. //--//
  13. //--//
  14. //--// System Initailization, call before anything else
  15. //--//
  16. sys_timeouts timeout_list;
  17. //--//
  18. void sys_init(void)
  19. {
  20. timeout_list.next = NULL;
  21. }
  22. //--//
  23. //--// Timeout functions
  24. //--//
  25. struct sys_timeouts *sys_arch_timeouts(void)
  26. {
  27. return &timeout_list;
  28. }
  29. //--//
  30. //--// Semaphore functions.
  31. //--//
  32. void AcquireSemaphore(volatile UINT32* semaphore)
  33. {
  34. *semaphore = *semaphore - 1;
  35. }
  36. void ReleaseSemaphore(volatile UINT32* semaphore)
  37. {
  38. *semaphore = *semaphore + 1;
  39. }
  40. bool IsSemaphoreGreen(volatile UINT32* semaphore)
  41. {
  42. return *semaphore != 0;
  43. }
  44. sys_sem_t sys_sem_new(u8_t count)
  45. {
  46. //return dummy_semaphore;
  47. volatile UINT32* semaphore = (volatile UINT32*)mem_malloc(sizeof(UINT32));
  48. *semaphore = count;
  49. return (sys_sem_t)semaphore;
  50. }
  51. void sys_sem_signal(sys_sem_t sem)
  52. {
  53. volatile UINT32* semaphore = (volatile UINT32*)sem;
  54. ReleaseSemaphore(semaphore);
  55. Events_Set(SYSTEM_EVENT_FLAG_NETWORK);
  56. }
  57. u32_t sys_arch_sem_wait(sys_sem_t sem, u32_t timeout)
  58. {
  59. volatile UINT32* semaphore = (volatile UINT32*)sem;
  60. if(timeout != 0)
  61. {
  62. INT64 now = ::HAL_Time_CurrentTime();
  63. INT64 elapsed = now + (timeout * 10000);
  64. while(elapsed > ::HAL_Time_CurrentTime())
  65. {
  66. if(IsSemaphoreGreen(semaphore))
  67. {
  68. AcquireSemaphore(semaphore);
  69. break;
  70. }
  71. if(Events_WaitForEvents(SYSTEM_EVENT_FLAG_NETWORK, timeout))
  72. {
  73. Events_Clear(SYSTEM_EVENT_FLAG_NETWORK);
  74. }
  75. }
  76. }
  77. else
  78. {
  79. while(1)
  80. {
  81. // wait and call the continuation for tcpip_thread
  82. if(IsSemaphoreGreen(semaphore))
  83. {
  84. AcquireSemaphore(semaphore);
  85. break;
  86. }
  87. Events_WaitForEvents(SYSTEM_EVENT_FLAG_NETWORK, EVENTS_TIMEOUT_INFINITE);
  88. Events_Clear(SYSTEM_EVENT_FLAG_NETWORK);
  89. }
  90. }
  91. return *semaphore;
  92. }
  93. void sys_sem_free(sys_sem_t sem)
  94. {
  95. volatile UINT32* semaphore = (volatile UINT32*)sem;
  96. *semaphore = 0;
  97. mem_free(sem);
  98. }
  99. //--//
  100. //--// Time jiffies (since power up)
  101. //--//
  102. u32_t sys_jiffies(void)
  103. {
  104. // IMPLEMENTED AS sys_now
  105. UINT64 currentTime = HAL_Time_CurrentTime() / 10000;
  106. return (u32_t)(currentTime);
  107. }
  108. void sys_signal_sock_event()
  109. {
  110. Events_Set(SYSTEM_EVENT_FLAG_SOCKET);
  111. }
  112. //--//
  113. //--// Mailbox functions.
  114. //--//
  115. sys_mbox_t sys_mbox_new(int size)
  116. {
  117. Hal_Queue_UnknownSize<OpaqueQueueNode>* queue = (Hal_Queue_UnknownSize<OpaqueQueueNode>*)mem_malloc(sizeof(Hal_Queue_UnknownSize<OpaqueQueueNode>));
  118. OpaqueQueueNode* memory = (OpaqueQueueNode*)mem_malloc(sizeof(OpaqueQueueNode) * size);
  119. memset(memory, 0, sizeof(OpaqueQueueNode) * size);
  120. queue->Initialize(memory, size);
  121. return queue;
  122. }
  123. void sys_mbox_post(sys_mbox_t mbox, void *msg)
  124. {
  125. Hal_Queue_UnknownSize<OpaqueQueueNode>* queue = (Hal_Queue_UnknownSize<OpaqueQueueNode>*)mbox;
  126. OpaqueQueueNode* node = NULL;
  127. if((node = queue->Push()) != NULL)
  128. {
  129. //tcpip_msg* m = (tcpip_msg*)mem_malloc(sizeof(tcpip_msg));
  130. //api_msg* a = (api_msg*)mem_malloc(sizeof(api_msg));
  131. //sys_sem_t* s = (sys_sem_t*)mem_malloc(sizeof(sys_sem_t));
  132. //if(!a || !m || !s) return;
  133. //memset(m,0,sizeof(tcpip_msg));
  134. //memset(a,0,sizeof(api_msg));
  135. //memset(s,0,sizeof(sys_sem_t));
  136. //memcpy(s,((tcpip_msg*)msg)->sem,sizeof(sys_sem_t));
  137. //memcpy(a,((tcpip_msg*)msg)->msg.apimsg,sizeof(api_msg));
  138. //memcpy(m,msg,sizeof(tcpip_msg));
  139. //m->msg.apimsg = a;
  140. //node->payload = m;
  141. node->payload = msg;
  142. }
  143. SOCKETS_RestartTcpIpProcessor(0);
  144. }
  145. err_t sys_mbox_trypost(sys_mbox_t mbox, void *msg)
  146. {
  147. Hal_Queue_UnknownSize<OpaqueQueueNode>* queue = (Hal_Queue_UnknownSize<OpaqueQueueNode>*)mbox;
  148. OpaqueQueueNode* node = queue->Push();
  149. if(node != NULL) {
  150. //tcpip_msg* m = (tcpip_msg*)mem_malloc(sizeof(tcpip_msg));
  151. //memset(m,0,sizeof(tcpip_msg));
  152. //memcpy(m,msg,sizeof(tcpip_msg));
  153. //node->payload = m;
  154. node->payload = msg;
  155. return ERR_OK;
  156. }
  157. SOCKETS_RestartTcpIpProcessor(0);
  158. return ERR_MEM;
  159. }
  160. u32_t sys_arch_mbox_fetch(sys_mbox_t mbox, void **msg, u32_t timeout)
  161. {
  162. Hal_Queue_UnknownSize<OpaqueQueueNode>* queue = (Hal_Queue_UnknownSize<OpaqueQueueNode>*)mbox;
  163. // TODO
  164. // TODO
  165. // TODO
  166. // implement timeout
  167. OpaqueQueueNode* node = queue->Pop();
  168. if(node)
  169. {
  170. *msg = node->payload;
  171. return 0;
  172. }
  173. else
  174. {
  175. // schedule the tcp thread to run when the next timeout occurs
  176. // Any incoming data should retrigger the thread prior to timeout
  177. SOCKETS_RestartTcpIpProcessor(timeout * 1000);
  178. *msg = NULL;
  179. return SYS_MBOX_EMPTY;
  180. }
  181. // time needed
  182. // do not return SYS_ARCH_TIMEOUT or the system will wait forever
  183. }
  184. u32_t sys_arch_mbox_tryfetch(sys_mbox_t mbox, void **msg)
  185. {
  186. Hal_Queue_UnknownSize<OpaqueQueueNode>* queue = (Hal_Queue_UnknownSize<OpaqueQueueNode>*)mbox;
  187. OpaqueQueueNode* node = queue->Pop();
  188. if(node)
  189. {
  190. *msg = node->payload;
  191. }
  192. else
  193. {
  194. *msg = NULL;
  195. return SYS_MBOX_EMPTY;
  196. }
  197. return 0;
  198. }
  199. void sys_mbox_free(sys_mbox_t mbox)
  200. {
  201. Hal_Queue_UnknownSize<OpaqueQueueNode>* queue = (Hal_Queue_UnknownSize<OpaqueQueueNode>*)mbox;
  202. mem_free(queue->Storage());
  203. mem_free(queue);
  204. }
  205. //--//
  206. //--// Thread functions.
  207. //--//
  208. sys_thread_t sys_thread_new(char *name, void (* thread)(void *arg), void *arg, int stacksize, int prio)
  209. {
  210. if(strcmp(name,TCPIP_THREAD_NAME) == 0)
  211. {
  212. SOCKETS_CreateTcpIpProcessor(thread, arg);
  213. }
  214. return NULL;
  215. }
  216. void sys_thread_free(char *name)
  217. {
  218. if(strcmp(name,TCPIP_THREAD_NAME) == 0)
  219. {
  220. // the tcip thread will be aborted later
  221. SOCKETS_RestartTcpIpProcessor(0xFFFFFFFF);
  222. }
  223. }
  224. //--//
  225. //--// Time functions.
  226. //--//
  227. // Returns the current time in milliseconds.
  228. u32_t sys_now(void)
  229. {
  230. UINT64 currentTime = HAL_Time_CurrentTime() / 10000;
  231. return (u32_t)(currentTime);
  232. }
  233. //--//
  234. //--// Critical Region Protection.
  235. //--//
  236. #if SYS_LIGHTWEIGHT_PROT
  237. sys_prot_t sys_arch_protect(void)
  238. {
  239. return 0;
  240. }
  241. void sys_arch_unprotect(sys_prot_t pval)
  242. {
  243. }
  244. #endif
  245. //--//
  246. #ifdef __cplusplus
  247. }
  248. #endif