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