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