1 #if !defined(MSOS_TYPE_LINUX_KERNEL)
2 #include "string.h"
3 #include <stdio.h>
4 #else
5 #include <linux/string.h>
6 #include <linux/slab.h>
7 #endif
8 #include "MsTypes.h"
9 #include "utopia_dapi.h"
10 #include "drvGPIO.h"
11 #include "drvGPIO_private.h"
12 #include "MsOS.h"
13 #include "utopia.h"
14
15
16 enum
17 {
18 GPIO_POOL_ID_GPIO0=0
19 } eGPIOPoolID;
20
21
22 // this func will be call to init by utopia20 framework
GPIORegisterToUtopia(FUtopiaOpen ModuleType)23 void GPIORegisterToUtopia(FUtopiaOpen ModuleType)
24 {
25 void* pUtopiaModule = NULL;
26 UtopiaModuleCreate(MODULE_GPIO, 8, &pUtopiaModule);
27 UtopiaModuleRegister(pUtopiaModule);
28 // register func for module, after register here, then ap call UtopiaOpen/UtopiaIoctl/UtopiaClose can call to these registered standard func
29 UtopiaModuleSetupFunctionPtr(pUtopiaModule, (FUtopiaOpen)GPIOOpen, (FUtopiaClose)GPIOClose, (FUtopiaIOctl)GPIOIoctl);
30 // 2. Resource register
31 void* psResource = NULL;
32 // start func to add resources of a certain Resource_Pool
33 UtopiaModuleAddResourceStart(pUtopiaModule, GPIO_POOL_ID_GPIO0);
34 // create a resouce and regiter it to a certain Resource_Pool, resource can alloc private for internal use
35 UtopiaResourceCreate("gpio0", sizeof(GPIO_RESOURCE_PRIVATE), &psResource);
36 UtopiaResourceRegister(pUtopiaModule, psResource, GPIO_POOL_ID_GPIO0);
37
38 //UtopiaResourceCreate("cmdq1", sizeof(CMDQ_RESOURCE_PRIVATE), &psResource);
39 //UtopiaResourceRegister(pUtopiaModule, psResource, CMDQ_POOL_ID_CMDQ0);
40 // end func to add resources of a certain Resource_Pool(this will set the ResourceSemaphore of this ResourcePool)
41 UtopiaModuleAddResourceEnd(pUtopiaModule, GPIO_POOL_ID_GPIO0);
42 }
43
GPIOOpen(void ** ppInstance,MS_U32 u32ModuleVersion,void * pAttribute)44 MS_U32 GPIOOpen(void** ppInstance, MS_U32 u32ModuleVersion, void* pAttribute)
45 {
46 GPIO_INSTANT_PRIVATE *pGpioPri = NULL;
47 void *pGpioPriVoid = NULL;
48
49 //UTOPIA_TRACE(MS_UTOPIA_DB_LEVEL_TRACE,printf("enter %s %d\n",__FUNCTION__,__LINE__));
50 // instance is allocated here, also can allocate private for internal use, ex, BDMA_INSTANT_PRIVATE
51 UtopiaInstanceCreate(sizeof(GPIO_INSTANT_PRIVATE), ppInstance);
52 // setup func in private and assign the calling func in func ptr in instance private
53 UtopiaInstanceGetPrivate(*ppInstance, &pGpioPriVoid);
54 pGpioPri= (GPIO_INSTANT_PRIVATE*)pGpioPriVoid;
55 pGpioPri->fpGpioInit= (IOCTL_GPIO_INIT)mdrv_gpio_init_U2K;
56 pGpioPri->fpGpioGetSts= (IOCTL_GPIO_GET_STS)MDrv_GPIO_GetStatus_U2K;
57 pGpioPri->fpGpioSetH= (IOCTL_GPIO_SET_H)mdrv_gpio_set_high_U2K;
58 pGpioPri->fpGpioSetL= (IOCTL_GPIO_SET_L)mdrv_gpio_set_low_U2K;
59 pGpioPri->fpGpioSetInput= (IOCTL_GPIO_SET_INPUT)mdrv_gpio_set_input_U2K;
60 pGpioPri->fpGpioGetInout= (IOCTL_GPIO_GET_INOUT)mdrv_gpio_get_inout_U2K;
61 pGpioPri->fpGpioGetLevel= (IOCTL_GPIO_GET_LEVEL)mdrv_gpio_get_level_U2K;
62 pGpioPri->fpGpioAttachInterrupt= (IOCTL_GPIO_ATTACH_INTERRUPT)mdrv_gpio_attach_interrupt_U2K;
63 pGpioPri->fpGpioDetachInterrupt= (IOCTL_GPIO_DETACH_INTERRUPT)mdrv_gpio_detach_interrupt_U2K;
64 pGpioPri->fpGpioDisableInterrupt = (IOCTL_GPIO_DISABLE_INTERRUPT)mdrv_gpio_disable_interrupt_U2K;
65 pGpioPri->fpGpioEnableInterrupt = (IOCTL_GPIO_ENALBE_INTERRUPT)mdrv_gpio_enable_interrupt_U2K;
66 pGpioPri->fpGpioDisableInterruptAll= (IOCTL_GPIO_DISABLE_INTERRUPT_ALL)mdrv_gpio_disable_interrupt_all_U2K;
67 pGpioPri->fpGpioEnableInterruptAll = (IOCTL_GPIO_ENABLE_INTERRUPT_ALL)mdrv_gpio_enable_interrupt_all_U2K;
68 pGpioPri->fpGpioInterruptAction = (IOCTL_GPIO_INTERRUPT_ACTION) mdrv_gpio_interrupt_action_U2K;
69 return UTOPIA_STATUS_SUCCESS;
70 }
71
72 // FIXME: why static?
GPIOIoctl(void * pInstance,MS_U32 u32Cmd,void * pArgs)73 MS_U32 GPIOIoctl(void* pInstance, MS_U32 u32Cmd, void* pArgs)
74 {
75 void* pModule = NULL;
76 GPIO_INSTANT_PRIVATE* psGpioInstPri = NULL;
77 MS_U32 u32Ret = TRUE;
78 MS_U32 u32InOutVal;
79 MS_U32 u32LevelVal;
80
81 UtopiaInstanceGetModule(pInstance, &pModule);
82 UtopiaInstanceGetPrivate(pInstance, (void**)&psGpioInstPri);
83 GPIO_PRIVATE_PARAM *param = NULL;
84 if (pArgs != NULL)
85 param= (GPIO_PRIVATE_PARAM *) pArgs;
86
87 switch(u32Cmd)
88 {
89 case MDrv_CMD_GPIO_Init:
90 psGpioInstPri->fpGpioInit();
91 break;
92 case MDrv_CMD_GPIO_GetStauts:
93 psGpioInstPri->fpGpioGetSts(param->privatGpioSts.pSts);
94 break;
95 case MDrv_CMD_GPIO_Set_High:
96 psGpioInstPri->fpGpioSetH(param->privateGpioSetHigh.gpio_num);
97 break;
98 case MDrv_CMD_GPIO_Set_Low:
99 psGpioInstPri->fpGpioSetL(param->privateGpioSetLow.gpio_num);
100 break;
101 case MDrv_CMD_GPIO_Set_Input:
102 psGpioInstPri->fpGpioSetInput(param->privateGpioInput.gpio_num);
103 break;
104 case MDrv_CMD_GPIO_Get_Inout:
105 u32InOutVal = psGpioInstPri->fpGpioGetInout(param->privateGpioGetInout.gpio_num);
106 param->privateGpioGetInout.u32InOut=u32InOutVal;
107 break;
108 case MDrv_CMD_GPIO_Get_Level:
109 u32LevelVal = psGpioInstPri->fpGpioGetLevel(param->privateGpioGetLevel.gpio_num);
110 param->privateGpioGetLevel.u32Level=u32LevelVal;
111 break;
112 case MDrv_CMD_GPIO_Attach_Interrupt:
113 u32Ret = psGpioInstPri->fpGpioAttachInterrupt(param->privateGpioAttachInterrupt.gpio_num,param->privateGpioAttachInterrupt.gpio_edge_type,param->privateGpioAttachInterrupt.GPIO_Callback);
114 break;
115 case MDrv_CMD_GPIO_Detach_Interrupt:
116 u32Ret = psGpioInstPri->fpGpioDetachInterrupt(param->privateGpioDetachInterrupt.gpio_num);
117 break;
118 case MDrv_CMD_GPIO_En_Interrupt:
119 u32Ret = psGpioInstPri->fpGpioEnableInterrupt(param->privateGpioEnableInterrupt.gpio_num);
120 case MDrv_CMD_GPIO_Dis_Interrupt:
121 u32Ret = psGpioInstPri->fpGpioDisableInterrupt(param->privateGpioDisableInterrupt.gpio_num);
122 break;
123 case MDrv_CMD_GPIO_Dis_Interrupt_All:
124 psGpioInstPri->fpGpioDisableInterruptAll();
125 break;
126 case MDrv_CMD_GPIO_En_Interrupt_All:
127 psGpioInstPri->fpGpioEnableInterruptAll();
128 break;
129 case MDrv_CMD_GPIO_Interrupt_Action:
130 psGpioInstPri->fpGpioInterruptAction();
131 break;
132 default:
133 break;
134 }
135 return (u32Ret==TRUE?UTOPIA_STATUS_SUCCESS:UTOPIA_STATUS_FAIL); // FIXME: error code
136 }
137
GPIOClose(void * pInstance)138 MS_U32 GPIOClose(void* pInstance)
139 {
140 UtopiaInstanceDelete(pInstance);
141
142 return UTOPIA_STATUS_SUCCESS;
143 }
144
145
146