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