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