xref: /utopia/UTPA2-700.0.x/modules/gpio/drv/gpio/mdrvGPIO.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
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