📄 sl811.lst
字号:
181 4 // Check if there was data available during the
182 4 // last data transfer
183 4 //------------------------------------------------
184 4 if(bufLen)
185 4 {
186 5 SL811BufRead(((dataX&1)?data0:data1), usbstack.buffer, bufLen);
187 5 usbstack.buffer += bufLen;
188 5 }
189 4
190 4 //------------------------------------------------
191 4 // Terminate on short packets, i.e. remainder!=0
192 4 // a short packet or empty data packet OR when
193 4 // requested data len have completed, i.e.wLen=0
194 4 // For a LOWSPEED device, the 1st device descp,
195 4 // wPayload is default to 64-byte, LS device will
196 4 // only send back a max of 8-byte device descp,
197 4 // and host detect this as a short packet, and
198 4 // terminate with OUT status stage
199 4 //------------------------------------------------
200 4 if(remainder || !usbstack.wLen)
201 4 break;
202 4 }// PID IN
203 3 }
204 2
205 2 //-------------------------NAK----------------------------
206 2 if (result & EP0_NAK) // NAK Detected
207 2 {
208 3 if(usbstack.endpoint==0) // on ep0 during enumeration of LS device
209 3 { // happen when slave is not fast enough,
210 4 SL811Write(IntStatus,INT_CLEAR); // clear interrupt status, need to
211 4 SL811Write(EP0Control,cmd); // re-arm and request for last cmd, IN token
212 4 result = 0; // respond to NAK status only
213 4 }
214 3 else // normal data endpoint, exit now !!! , non-zero ep
215 3 break; // main loop control the interval polling
216 3 }
217 2
218 2 //-----------------------TIMEOUT--------------------------
219 2 if (result & EP0_TIMEOUT) // TIMEOUT Detected
220 2 {
221 3 if(usbstack.endpoint==0) // happens when hub enumeration
222 3 {
223 4 if(++timeout >= TIMEOUT_RETRY)
224 4 {
225 5 timeout--;
226 5 break; // exit on the timeout detected
227 5 }
228 4 SL811Write(IntStatus,INT_CLEAR); // clear interrupt status, need to
229 4 SL811Write(EP0Control,cmd); // re-arm and request for last cmd again
230 4 }
231 3 else
232 3 { // all other data endpoint, data transfer
233 4 bFlags.bits.TIMEOUT_ERR = TRUE; // failed, set flag to terminate transfer
234 4 break; // happens when data transfer on a device
235 4 } // through the hub
236 3 }
237 2
238 2 //-----------------------STALL----------------------------
239 2 if (result & EP0_STALL) // STALL detected
240 2 return TRUE; // for unsupported request.
C51 COMPILER V7.06 SL811 09/18/2004 01:20:11 PAGE 5
241 2
242 2 //----------------------OVEFLOW---------------------------
243 2 if (result & EP0_OVERFLOW) // OVERFLOW detected
244 2 break;
245 2 //-----------------------ERROR----------------------------
246 2 if (result & EP0_ERROR) // ERROR detected
247 2 break;
248 2 } // end of While(1)
249 1
250 1 if (result & EP0_ACK) // on ACK transmission
251 1 return TRUE; // return OK
252 1
253 1 return FALSE; // fail transmission
254 1
255 1 }
256 //*****************************************************************************************
257 // Control Endpoint 0's USB Data Xfer
258 // ep0Xfer, endpoint 0 data transfer
259 //*****************************************************************************************
260 unsigned char ep0Xfer(void)
261 {
262 1 usbstack.endpoint=0;
263 1 //----------------------------------------------------
264 1 // SETUP token with 8-byte request on endpoint 0
265 1 //----------------------------------------------------
266 1 usbstack.pid=PID_SETUP;
267 1 usbstack.wLen=8;
268 1 if (!usbXfer())
269 1 return FALSE;
270 1 usbstack.pid = PID_IN;
271 1 //----------------------------------------------------
272 1 // IN or OUT data stage on endpoint 0
273 1 //----------------------------------------------------
274 1 usbstack.wLen=usbstack.setup.wLength;
275 1 if (usbstack.wLen) // if there are data for transfer
276 1 {
277 2 if (usbstack.setup.bmRequest & 0x80) // host-to-device : IN token
278 2 {
279 3 usbstack.pid = PID_IN;
280 3
281 3 if(!usbXfer())
282 3 return FALSE;
283 3 usbstack.pid = PID_OUT;
284 3 }
285 2 else // device-to-host : OUT token
286 2 {
287 3 usbstack.pid = PID_OUT;
288 3
289 3 if(!usbXfer())
290 3 return FALSE;
291 3 usbstack.pid = PID_IN;
292 3 }
293 2 }
294 1 DelayMs(10);
295 1 //----------------------------------------------------
296 1 // Status stage IN or OUT zero-length data packet
297 1 //----------------------------------------------------
298 1 usbstack.wLen=0;
299 1 if(!usbXfer())
300 1 return FALSE;
301 1
302 1 return TRUE;
C51 COMPILER V7.06 SL811 09/18/2004 01:20:11 PAGE 6
303 1
304 1 }
305
306
307 unsigned char epBulkSend(unsigned char *pBuffer,unsigned int len)
308 {
309 1 usbstack.usbaddr=0x1;
310 1 usbstack.endpoint=usbstack.epbulkout;
311 1 usbstack.pid=PID_OUT;
312 1 usbstack.wPayload=64;
313 1 usbstack.wLen=len;
314 1 usbstack.buffer=pBuffer;
315 1 while(len>0)
316 1 {
317 2 if (len > usbstack.wPayload)
318 2 usbstack.wLen = usbstack.wPayload;
319 2 else
320 2 usbstack.wLen = len;
321 2 if(!usbXfer())
322 2 return FALSE;
323 2 len-=usbstack.wLen;
324 2 usbstack.buffer=usbstack.buffer+usbstack.wLen;
325 2 }
326 1 return TRUE;
327 1 }
328
329 unsigned char epBulkRcv(unsigned char *pBuffer,unsigned int len)
330 {
331 1 usbstack.usbaddr=0x1;
332 1 usbstack.endpoint=usbstack.epbulkin;
333 1 usbstack.pid=PID_IN;
334 1 usbstack.wPayload=64;
335 1 usbstack.wLen=len;
336 1 usbstack.buffer=pBuffer;
337 1 if(usbstack.wLen)
338 1 {
339 2 if(!usbXfer())
340 2 return FALSE;
341 2 }
342 1 return TRUE;
343 1 }
344
345 //*****************************************************************************************
346 // Set Device Address :
347 //*****************************************************************************************
348 unsigned char SetAddress(unsigned char addr)
349 {
350 1 usbstack.usbaddr=0;
351 1 usbstack.setup.bmRequest=0;
352 1 usbstack.setup.bRequest=SET_ADDRESS;
353 1 usbstack.setup.wValue=addr;
354 1 usbstack.setup.wIndex=0;
355 1 usbstack.setup.wLength=0;
356 1 return ep0Xfer();
357 1
358 1 }
359
360 //*****************************************************************************************
361 // Set Device Configuration :
362 //*****************************************************************************************
363 unsigned char Set_Configuration(void)
364 {
C51 COMPILER V7.06 SL811 09/18/2004 01:20:11 PAGE 7
365 1 usbstack.setup.bmRequest=0;
366 1 usbstack.setup.bRequest=SET_CONFIG;
367 1
368 1 usbstack.setup.wIndex=0;
369 1 usbstack.setup.wLength=0;
370 1 usbstack.buffer=NULL;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -