1 /******************************************************************************
2  *
3  * Copyright (C) 2022-2023 Maxim Integrated Products, Inc. (now owned by
4  * Analog Devices, Inc.),
5  * Copyright (C) 2023-2024 Analog Devices, Inc.
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *     http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  ******************************************************************************/
20 
21 #include <string.h>
22 #include "usb.h"
23 #include "usb_event.h"
24 
25 /***** File Scope Data *****/
26 static maxusb_usbio_events_t events;
27 static MXC_USB_event_callback_t callback[MAXUSB_NUM_EVENTS];
28 
29 /******************************************************************************/
MXC_USB_EventEnable(maxusb_event_t event,int (* func)(maxusb_event_t,void *),void * cbdata)30 int MXC_USB_EventEnable(maxusb_event_t event, int (*func)(maxusb_event_t, void *), void *cbdata)
31 {
32   if ( (event >= MAXUSB_NUM_EVENTS) || (func == NULL) ) {
33     return -1;
34   }
35 
36   callback[event].func = func;
37   callback[event].cbdata = cbdata;
38 
39   return MXC_USB_IrqEnable(event);
40 }
41 
42 /******************************************************************************/
MXC_USB_EventDisable(maxusb_event_t event)43 int MXC_USB_EventDisable(maxusb_event_t event)
44 {
45   int result = -1;
46 
47   if (event >= MAXUSB_NUM_EVENTS) {
48     return -1;
49   }
50 
51   result = MXC_USB_IrqDisable(event);
52 
53   callback[event].func = NULL;
54   callback[event].cbdata = NULL;
55 
56   return result;
57 }
58 
59 /******************************************************************************/
MXC_USB_EventClear(maxusb_event_t event)60 int MXC_USB_EventClear(maxusb_event_t event)
61 {
62   if (event >= MAXUSB_NUM_EVENTS) {
63     return -1;
64   }
65 
66   return MXC_USB_IrqClear(event);
67 }
68 
69 /******************************************************************************/
MXC_USB_EventHandler(void)70 void MXC_USB_EventHandler(void)
71 {
72   MXC_USB_IrqHandler(&events);
73 
74   if (events.novbus && callback[MAXUSB_EVENT_NOVBUS].func)
75   {
76     callback[MAXUSB_EVENT_NOVBUS].func(MAXUSB_EVENT_NOVBUS, callback[MAXUSB_EVENT_NOVBUS].cbdata);
77   }
78 
79   if (events.vbus && callback[MAXUSB_EVENT_VBUS].func)
80   {
81     callback[MAXUSB_EVENT_VBUS].func(MAXUSB_EVENT_VBUS, callback[MAXUSB_EVENT_VBUS].cbdata);
82   }
83 
84   if (events.brst && callback[MAXUSB_EVENT_BRST].func)
85   {
86     callback[MAXUSB_EVENT_BRST].func(MAXUSB_EVENT_BRST, callback[MAXUSB_EVENT_BRST].cbdata);
87   }
88 
89   if (events.brstdn && callback[MAXUSB_EVENT_BRSTDN].func)
90   {
91     callback[MAXUSB_EVENT_BRSTDN].func(MAXUSB_EVENT_BRSTDN, callback[MAXUSB_EVENT_BRSTDN].cbdata);
92   }
93 
94   if (events.dpact && callback[MAXUSB_EVENT_DPACT].func)
95   {
96     callback[MAXUSB_EVENT_DPACT].func(MAXUSB_EVENT_DPACT, callback[MAXUSB_EVENT_DPACT].cbdata);
97   }
98 
99   if (events.rwudn && callback[MAXUSB_EVENT_RWUDN].func)
100   {
101     callback[MAXUSB_EVENT_RWUDN].func(MAXUSB_EVENT_RWUDN, callback[MAXUSB_EVENT_RWUDN].cbdata);
102   }
103 
104   if (events.bact && callback[MAXUSB_EVENT_BACT].func)
105   {
106     callback[MAXUSB_EVENT_BACT].func(MAXUSB_EVENT_BACT, callback[MAXUSB_EVENT_BACT].cbdata);
107   }
108 
109   if (events.susp && callback[MAXUSB_EVENT_SUSP].func)
110   {
111     callback[MAXUSB_EVENT_SUSP].func(MAXUSB_EVENT_SUSP, callback[MAXUSB_EVENT_SUSP].cbdata);
112   }
113 
114   if (events.sudav && callback[MAXUSB_EVENT_SUDAV].func)
115   {
116     callback[MAXUSB_EVENT_SUDAV].func(MAXUSB_EVENT_SUDAV, callback[MAXUSB_EVENT_SUDAV].cbdata);
117   }
118 }
119 /**  */
120