xref: /utopia/UTPA2-700.0.x/modules/uart/drv/uart/mdrvUART.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1 #include "MsTypes.h"
2 #include <stdio.h>
3 #include "utopia_dapi.h"
4 #include "utopia.h"
5 #include "drvUART.h"
6 #include "drvUART_private.h"
7 #include "MsOS.h"
8 
9 #include "ULog.h"
10 
11 #define TAG_UART "UART"
12 
13 enum
14 {
15     UART_POOL_ID_UART=0
16 } eUARTPoolID;
17 
UARTRegisterToUtopia(FUtopiaOpen ModuleType)18 void UARTRegisterToUtopia(FUtopiaOpen ModuleType)
19 {
20     // 1. deal with module
21     void* pUtopiaModule = NULL;
22     UtopiaModuleCreate(MODULE_UART, 8, &pUtopiaModule);
23     UtopiaModuleRegister(pUtopiaModule);
24     UtopiaModuleSetupFunctionPtr(pUtopiaModule, (FUtopiaOpen)UARTOpen, (FUtopiaClose)UARTClose, (FUtopiaIOctl)UARTIoctl);
25 
26     // 2. deal with resource
27     void* psResource = NULL;
28     UtopiaModuleAddResourceStart(pUtopiaModule, UART_POOL_ID_UART);
29     UtopiaResourceCreate("UART", sizeof(UART_RESOURCE_PRIVATE), &psResource);
30     UtopiaResourceRegister(pUtopiaModule, psResource, UART_POOL_ID_UART);
31     UtopiaModuleAddResourceEnd(pUtopiaModule, UART_POOL_ID_UART);
32 
33     // FLASHRegisterToUtopia only call once, so driver init code can put here,
34 }
35 
UARTOpen(void ** ppInstance,MS_U32 u32ModuleVersion,void * pAttribute)36 MS_U32 UARTOpen(void** ppInstance, MS_U32 u32ModuleVersion, void* pAttribute)
37 {
38     UART_INSTANT_PRIVATE *pUartPri = NULL;
39     UtopiaInstanceCreate(sizeof(UART_INSTANT_PRIVATE), ppInstance);
40     UtopiaInstanceGetPrivate(*ppInstance, (void**)&pUartPri);
41 
42     // setup func in private and assign the calling func in func ptr in instance private
43 
44     pUartPri->fpUARTConnect = mdrv_uart_connect;
45     pUartPri->fpUARTSetBaudRate = mdrv_uart_set_baudrate;
46     pUartPri->fpUARTOpen= mdrv_uart_open;
47     pUartPri->fpUARTClose = mdrv_uart_close;
48 
49     UART_INSTANT_ATTRIBUTE* pUartAttribue = (UART_INSTANT_ATTRIBUTE*) pAttribute;
50 
51     MDrv_UART_Init( pUartAttribue->eUartType, pUartAttribue->u32BaudRate);
52 
53     return TRUE;
54 
55 }
56 
UARTIoctl(void * pInstance,MS_U32 u32Cmd,void * pArgs)57 MS_U32 UARTIoctl(void* pInstance, MS_U32 u32Cmd, void* pArgs)
58 {
59     UART_INSTANT_PRIVATE* psUARTInstPri ;
60     void* pResource = NULL;
61     void* pModule = NULL;
62 
63     PUART_OPEN pUartOpen = NULL;
64     PUART_CLOSE pUartClose = NULL;
65     PUART_CONNECT pUartConnect = NULL;
66     PUART_SET_BUAD_RATE pUartSetBaudRate = NULL;
67     MS_U32 u32Ret;
68     UtopiaInstanceGetPrivate(pInstance, (void*)&psUARTInstPri);
69     UtopiaInstanceGetModule(pInstance, &pModule);
70 
71     switch(u32Cmd)
72     {
73         case MDrv_CMD_UART_Open:
74             pUartOpen = (PUART_OPEN)pArgs;
75             if(UtopiaResourceObtain(pModule, UART_POOL_ID_UART, &pResource) != 0)
76             {
77                 ULOGE(TAG_UART, "UtopiaResourceObtainToInstant fail\n");
78                 return 0xFFFFFFFF;
79             }
80             u32Ret = (MS_U32)psUARTInstPri->fpUARTOpen(pUartOpen->eUartType);
81             return u32Ret;
82 
83         case MDrv_CMD_UART_Close:
84             pUartClose = (PUART_CLOSE)pArgs;
85             if(UtopiaResourceObtain(pModule, UART_POOL_ID_UART, &pResource) != 0)
86             {
87                 ULOGE(TAG_UART, "UtopiaResourceObtainToInstant fail\n");
88                 return 0xFFFFFFFF;
89             }
90 
91             u32Ret = (MS_U32)psUARTInstPri->fpUARTClose(pUartClose->u32Fd);
92             return u32Ret;
93 
94         case MDrv_CMD_UART_Connect:
95             pUartConnect = (PUART_CONNECT)pArgs;
96             if(UtopiaResourceObtain(pModule, UART_POOL_ID_UART, &pResource) != 0)
97             {
98                 ULOGE(TAG_UART, "UtopiaResourceObtainToInstant fail\n");
99                 return 0xFFFFFFFF;
100             }
101 
102             u32Ret = (MS_U32)psUARTInstPri->fpUARTConnect(pUartConnect->ePortType, pUartConnect->eDeviceType);
103             return u32Ret;
104 
105         case MDrv_CMD_UART_SetBaudRate:
106             pUartSetBaudRate = (PUART_SET_BUAD_RATE)pArgs;
107             if(UtopiaResourceObtain(pModule, UART_POOL_ID_UART, &pResource) != 0)
108             {
109                 ULOGE(TAG_UART, "UtopiaResourceObtainToInstant fail\n");
110                 return 0xFFFFFFFF;
111             }
112 
113             u32Ret = (MS_U32)psUARTInstPri->fpUARTSetBaudRate(pUartSetBaudRate->u32Uart, pUartSetBaudRate->u32BaudRate);
114             return u32Ret;
115         default:
116             return 0;
117     }
118 }
119 
UARTClose(void * pInstance)120 MS_U32 UARTClose(void* pInstance)
121 {
122     UtopiaInstanceDelete(pInstance);
123     return TRUE;
124 }
125 
126 
127