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