35
35
* Private Type Definitions
36
36
****************************************************************************/
37
37
38
- enum aie_state_e
39
- {
40
- AIE_STATE_NOP = 0 ,
41
- AIE_STATE_INITED ,
42
- AIE_STATE_FEEDED ,
43
- AIE_STATE_INFERENCED ,
44
- };
45
-
46
38
/* This structure describes the state of the upper half driver */
47
39
48
40
struct aie_upperhalf_s
49
41
{
50
42
FAR struct aie_lowerhalf_s * lower ; /* The handle of lower half driver */
51
- volatile enum aie_state_e state ; /* The device state */
52
43
mutex_t lock ; /* Mutual exclusion */
53
- uint8_t crefs ; /* The number of times the engine
54
- * has been opend. */
55
44
};
56
45
57
46
/****************************************************************************
@@ -87,52 +76,37 @@ static const struct file_operations g_aie_ops =
87
76
* Name: aie_open
88
77
*
89
78
* Description:
90
- * A open method to increase the crefs .
79
+ * A open method to open the ai engine .
91
80
*
92
81
****************************************************************************/
93
82
94
83
static int aie_open (FAR struct file * filep )
95
84
{
96
- FAR struct inode * inode = filep -> f_inode ;
97
- FAR struct aie_upperhalf_s * upper = inode -> i_private ;
98
- int ret ;
85
+ FAR struct inode * inode = filep -> f_inode ;
86
+ FAR struct aie_upperhalf_s * upper = inode -> i_private ;
87
+ FAR struct aie_lowerhalf_s * lower ;
99
88
100
89
DEBUGASSERT (upper != NULL );
101
- ret = nxmutex_lock (& upper -> lock );
102
- if (ret < 0 )
103
- {
104
- return ret ;
105
- }
106
-
107
- if (upper -> crefs == 0 )
108
- {
109
- upper -> crefs ++ ;
110
- ret = OK ;
111
- }
112
- else
113
- {
114
- ret = - EBUSY ;
115
- }
116
-
117
- nxmutex_unlock (& upper -> lock );
90
+ lower = upper -> lower ;
91
+ DEBUGASSERT (lower != NULL );
118
92
119
- return ret ;
93
+ return OK ;
120
94
}
121
95
122
96
/****************************************************************************
123
97
* Name: aie_close
124
98
*
125
99
* Description:
126
- * A close method to decrease the crefs .
100
+ * A close method to close the ai engine .
127
101
*
128
102
****************************************************************************/
129
103
130
104
static int aie_close (FAR struct file * filep )
131
105
{
132
- FAR struct inode * inode = filep -> f_inode ;
133
- FAR struct aie_upperhalf_s * upper = inode -> i_private ;
134
- FAR struct aie_lowerhalf_s * lower = NULL ;
135
- int ret ;
106
+ FAR struct inode * inode = filep -> f_inode ;
107
+ FAR struct aie_upperhalf_s * upper = inode -> i_private ;
108
+ FAR struct aie_lowerhalf_s * lower ;
109
+ int ret ;
136
110
137
111
DEBUGASSERT (upper != NULL );
138
112
lower = upper -> lower ;
@@ -144,23 +118,15 @@ static int aie_close(FAR struct file *filep)
144
118
return ret ;
145
119
}
146
120
147
- if (upper -> crefs == 1 )
121
+ ret = (int )(intptr_t )filep -> f_priv ;
122
+ if (ret > 0 )
148
123
{
149
- ret = lower -> ops -> deinit (lower , filep );
150
- if (ret == OK )
151
- {
152
- upper -> state = AIE_STATE_NOP ;
153
- upper -> crefs -- ;
154
- }
155
- }
156
- else
157
- {
158
- ret = OK ;
124
+ lower -> ops -> deinit (lower , ret );
159
125
}
160
126
161
127
nxmutex_unlock (& upper -> lock );
162
128
163
- return ret ;
129
+ return OK ;
164
130
}
165
131
166
132
/****************************************************************************
@@ -174,10 +140,10 @@ static int aie_close(FAR struct file *filep)
174
140
175
141
static int aie_ioctl (FAR struct file * filep , int cmd , unsigned long arg )
176
142
{
177
- FAR struct inode * inode = filep -> f_inode ;
178
- FAR struct aie_upperhalf_s * upper = inode -> i_private ;
179
- FAR struct aie_lowerhalf_s * lower = NULL ;
180
- int ret ;
143
+ FAR struct inode * inode = filep -> f_inode ;
144
+ FAR struct aie_upperhalf_s * upper = inode -> i_private ;
145
+ FAR struct aie_lowerhalf_s * lower = NULL ;
146
+ int ret ;
181
147
182
148
DEBUGASSERT (upper != NULL );
183
149
lower = upper -> lower ;
@@ -193,66 +159,38 @@ static int aie_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
193
159
194
160
switch (cmd )
195
161
{
196
- case AIE_CMD_INIT :
197
- ret = lower -> ops -> init ( lower , filep , arg ) ;
198
- if (ret != OK )
162
+ case AIE_CMD_LOAD :
163
+ ret = ( int )( intptr_t ) filep -> f_priv ;
164
+ if (ret > 0 )
199
165
{
200
- break ;
166
+ ret = - EINVAL ; /* Double load is not allowed */
201
167
}
202
-
203
- if (lower -> workspace_len )
168
+ else
204
169
{
205
- lower -> workspace = kmm_malloc ( lower -> workspace_len );
206
- if (! lower -> workspace )
170
+ ret = lower -> ops -> init ( lower , arg /* model */ );
171
+ if (ret > 0 )
207
172
{
208
- ret = - ENOMEM ;
209
- break ;
173
+ filep -> f_priv = ( void * )( intptr_t ) ret ;
174
+ ret = OK ;
210
175
}
211
176
}
212
-
213
- upper -> state = AIE_STATE_INITED ;
214
177
break ;
215
178
216
179
case AIE_CMD_FEED_INPUT :
217
- if (upper -> state == AIE_STATE_INITED ||
218
- upper -> state == AIE_STATE_INFERENCED )
219
- {
220
- lower -> input = (uintptr_t )arg ;
221
- ret = lower -> ops -> feed_input (lower , filep );
222
- if (ret == OK )
223
- {
224
- upper -> state = AIE_STATE_FEEDED ;
225
- }
226
- }
227
- else
228
- {
229
- ret = - EPERM ;
230
- }
180
+ ret = lower -> ops -> feed_input (lower , (int )(intptr_t )filep -> f_priv ,
181
+ arg /* input */ );
231
182
break ;
232
183
233
184
case AIE_CMD_GET_OUTPUT :
234
- if (upper -> state == AIE_STATE_FEEDED )
235
- {
236
- lower -> output = (uintptr_t )arg ;
237
- ret = lower -> ops -> get_output (lower , filep );
238
- if (ret == OK )
239
- {
240
- upper -> state = AIE_STATE_INFERENCED ;
241
- }
242
- }
243
- else
244
- {
245
- ret = - EPERM ;
246
- }
185
+ ret = lower -> ops -> get_output (lower , (int )(intptr_t )filep -> f_priv ,
186
+ arg /* output */ );
247
187
break ;
248
188
249
189
default :
250
-
251
- /* Lowerhalf driver process other cmd. */
252
-
253
190
if (lower -> ops -> control )
254
191
{
255
- ret = lower -> ops -> control (lower , filep , cmd , arg );
192
+ ret = lower -> ops -> control (lower , (int )(intptr_t )filep -> f_priv ,
193
+ cmd , arg );
256
194
}
257
195
else
258
196
{
@@ -281,8 +219,8 @@ static int aie_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
281
219
int aie_register (FAR const char * path ,
282
220
FAR struct aie_lowerhalf_s * lower )
283
221
{
284
- FAR struct aie_upperhalf_s * upper = NULL ;
285
- int ret = - ENOMEM ;
222
+ FAR struct aie_upperhalf_s * upper = NULL ;
223
+ int ret = - ENOMEM ;
286
224
287
225
DEBUGASSERT (path );
288
226
@@ -298,11 +236,7 @@ int aie_register(FAR const char *path,
298
236
299
237
/* Initialize the aie device structure */
300
238
301
- upper -> lower = lower ;
302
- upper -> state = AIE_STATE_NOP ;
303
- upper -> crefs = 0 ;
304
- lower -> priv = upper ;
305
-
239
+ upper -> lower = lower ;
306
240
nxmutex_init (& upper -> lock );
307
241
308
242
/* Register the aie device */
0 commit comments