drv_common.c 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #include "drv_common.h"
  2. #define DRV_THREAD_PRIORITY 18
  3. #define DRV_THREAD_STACK_SIZE 512
  4. #define DRV_THREAD_TIMESLICE 5
  5. enum {
  6. MSG_UART0_IRQ,
  7. MSG_UART1_IRQ,
  8. MSG_UART2_IRQ,
  9. };
  10. static rt_thread_t drv_tid = RT_NULL;
  11. static rt_mq_t drv_mq = RT_NULL;
  12. void uart0_irq_process(void);
  13. void uart1_irq_process(void);
  14. rt_section(".irq.uart")
  15. void uart0_irq_post(void)
  16. {
  17. rt_uint8_t mq_msg = MSG_UART0_IRQ;
  18. rt_mq_send(drv_mq, &mq_msg, 1);
  19. }
  20. rt_section(".irq.uart")
  21. void uart1_irq_post(void)
  22. {
  23. rt_uint8_t mq_msg = MSG_UART1_IRQ;
  24. rt_mq_send(drv_mq, &mq_msg, 1);
  25. }
  26. rt_section(".irq.uart")
  27. void uart2_irq_post(void)
  28. {
  29. rt_uint8_t mq_msg = MSG_UART2_IRQ;
  30. rt_mq_send(drv_mq, &mq_msg, 1);
  31. }
  32. static void drv_thread_entry(void *parameter)
  33. {
  34. rt_uint8_t mq_msg = 0;
  35. while (1) {
  36. rt_mq_recv(drv_mq, &mq_msg, 1, RT_WAITING_FOREVER);
  37. switch (mq_msg) {
  38. #ifdef BSP_USING_UART0
  39. case MSG_UART0_IRQ:
  40. uart0_irq_process();
  41. break;
  42. #endif
  43. #ifdef BSP_USING_UART1
  44. case MSG_UART1_IRQ:
  45. uart1_irq_process();
  46. break;
  47. #endif
  48. #ifdef BSP_USING_UART2
  49. case MSG_UART2_IRQ:
  50. uart2_irq_process();
  51. break;
  52. #endif
  53. default:
  54. break;
  55. }
  56. }
  57. }
  58. static int drv_thread_init(void)
  59. {
  60. drv_mq = rt_mq_create("drv", 1, 128, RT_IPC_FLAG_FIFO);
  61. drv_tid = rt_thread_create("drv",
  62. drv_thread_entry,
  63. RT_NULL,
  64. DRV_THREAD_STACK_SIZE,
  65. DRV_THREAD_PRIORITY,
  66. DRV_THREAD_TIMESLICE);
  67. if (drv_tid != RT_NULL)
  68. rt_thread_startup(drv_tid);
  69. }
  70. INIT_PREV_EXPORT(drv_thread_init);