📄 host_811.lst
字号:
176 1 else // for current SETUP/OUT tokens
177 1 {
178 2 if(xferLen) // only when there are
C51 COMPILER V8.08 HOST_811 04/25/2009 23:03:20 PAGE 4
179 2 SL811BufWrite(data0,buffer,xferLen); // data to transfer on USB
180 2 cmd = sDATA0_WR;
181 2
182 2 }
183 1 //------------------------------------------------
184 1 // For EP0's IN/OUT token data, start with DATA1
185 1 // Control Endpoint0's status stage.
186 1 // For data endpoint, IN/OUT data, start ????
187 1 //------------------------------------------------
188 1 if (endpoint == 0 && pid != PID_SETUP) // for Ep0's IN/OUT token
189 1 cmd |= 0x40; // always set DATA1
190 1
191 1 //------------------------------------------------
192 1 // Arming of USB data transfer for the first pkt
193 1 //------------------------------------------------
194 1 SL811Write(EP0Status,((endpoint&0x0F)|pid)); // PID + EP address
195 1 SL811Write(EP0Counter,usbaddr); // USB address
196 1 SL811Write(EP0Address,data0); // buffer address, start with "data0"
197 1 SL811Write(EP0XferLen,xferLen); // data transfer length
198 1 SL811Write(IntStatus,INT_CLEAR);
199 1 // clear interrupt status
200 1 SL811Write(EP0Control,cmd); // Enable ARM and USB transfer start here
201 1 //------------------------------------------------
202 1 // Main loop for completing a wLen data trasnfer
203 1 //---------------------- --------------------------
204 1 while(TRUE)
205 1 {
206 2 //---------------Wait for done interrupt------------------
207 2 while(TRUE) // always ensure requested device is
208 2 {
209 3 SL811Write(IntStatus,INT_CLEAR); // inserted at all time, then you will
210 3 intr = SL811Read(IntStatus); // wait for interrupt to be done, and
211 3 intr=0x81;
212 3 result = SL811Read(EP0Status);
213 3 remainder = SL811Read(EP0Counter);
214 3
215 3 DelayMs(7);
216 3
217 3 if((intr & USB_RESET) || (intr & INSERT_REMOVE)) // proceed to parse result from slave
218 3 { // device.
219 4 USB_Control.DATA_STOP = TRUE; // if dhevice is removed, set DATA_STOP
220 4 return FALSE; // flag true, so that main loop will
221 4 } // know tis condition and exit gracefully
222 3 if(intr & USB_A_DONE)
223 3 break; // interrupt done !!!
224 3 }
225 2
226 2 SL811Write(IntStatus,INT_CLEAR); // clear interrupt status
227 2 result = SL811Read(0x03); // read EP0status register
228 2 remainder = SL811Read(EP0Counter); // remainder value in last pkt xfer
229 2
230 2 //-------------------------ACK----------------------------
231 2 if (result & EP0_ACK) // Transmission ACK
232 2 {
233 3
234 3 // SETUP TOKEN
235 3 if(pid == PID_SETUP) // do nothing for SETUP/OUT token
236 3 break; // exit while(1) immediately
237 3
238 3 // OUT TOKEN
239 3 else if(pid == PID_OUT)
240 3 break;
C51 COMPILER V8.08 HOST_811 04/25/2009 23:03:20 PAGE 5
241 3
242 3 // IN TOKEN
243 3 else if(pid == PID_IN)
244 3 { // for IN token only
245 4 wLen -= (WORD)xferLen; // update remainding wLen value
246 4 cmd ^= 0x40; // toggle DATA0/DATA1
247 4 dataX++; // point to next dataX
248 4
249 4 //------------------------------------------------
250 4 // If host requested for more data than the slave
251 4 // have, and if the slave's data len is a multiple
252 4 // of its endpoint payload size/last xferLen. Do
253 4 // not overwrite data in previous buffer.
254 4 //------------------------------------------------
255 4 if(remainder==xferLen) // empty data detected
256 4 bufLen = 0; // do not overwriten previous data
257 4 else // reset bufLen to zero
258 4 bufLen = xferLen; // update previous buffer length
259 4
260 4 //------------------------------------------------
261 4 // Arm for next data transfer when requested data
262 4 // length have not reach zero, i.e. wLen!=0, and
263 4 // last xferlen of data was completed, i.e.
264 4 // remainder is equal to zero, not a short pkt
265 4 //------------------------------------------------
266 4 if(!remainder && wLen) // remainder==0 when last xferLen
267 4 { // was all completed or wLen!=0
268 5 addr = (dataX & 1) ? data1:data0; // select next address for data
269 5 xferLen = (BYTE)(wLen>=wPayload) ? wPayload:wLen; // get data length required
270 5 // if (FULL_SPEED) // sync with SOF transfer
271 5 cmd |= 0x20; // always sync SOF when FS, regardless
272 5 SL811Write(EP0XferLen, xferLen); // select next xfer length
273 5 SL811Write(EP0Address, addr); // data buffer addr
274 5 SL811Write(IntStatus,INT_CLEAR); // is a LS is on Hub.
275 5 SL811Write(EP0Control,cmd); // Enable USB transfer and re-arm
276 5 }
277 4
278 4 //------------------------------------------------
279 4 // Copy last IN token data pkt from prev transfer
280 4 // Check if there was data available during the
281 4 // last data transfer
282 4 //------------------------------------------------
283 4 if(bufLen)
284 4 {
285 5 SL811BufRead(((dataX&1)?data0:data1), buffer, bufLen);
286 5 buffer += bufLen;
287 5 }
288 4
289 4 //------------------------------------------------
290 4 // Terminate on short packets, i.e. remainder!=0
291 4 // a short packet or empty data packet OR when
292 4 // requested data len have completed, i.e.wLen=0
293 4 // For a LOWSPEED device, the 1st device descp,
294 4 // wPayload is default to 64-byte, LS device will
295 4 // only send back a max of 8-byte device descp,
296 4 // and host detect this as a short packet, and
297 4 // terminate with OUT status stage
298 4 //------------------------------------------------
299 4 if(remainder || !wLen)
300 4 break;
301 4 }
302 3 }
C51 COMPILER V8.08 HOST_811 04/25/2009 23:03:20 PAGE 6
303 2
304 2 //-------------------------NAK----------------------------
305 2 if (result & EP0_NAK) // NAK Detected
306 2 {
307 3 if(endpoint==0) // on ep0 during enumeration of LS device
308 3 { // happen when slave is not fast enough,
309 4 SL811Write(IntStatus,INT_CLEAR); // clear interrupt status, need to
310 4 SL811Write(EP0Control,cmd); // re-arm and request for last cmd, IN token
311 4 result = 0; // respond to NAK status only
312 4 }
313 3 else // normal data endpoint, exit now !!! , non-zero ep
314 3 break; // main loop control the interval polling
315 3 }
316 2
317 2 //-----------------------TIMEOUT--------------------------
318 2 if (result & EP0_TIMEOUT) // TIMEOUT Detected
319 2 {
320 3 if(endpoint==0) // happens when hub enumeration
321 3 {
322 4 if(++timeout >= TIMEOUT_RETRY)
323 4 {
324 5 timeout--;
325 5 break; // exit on the timeout detected
326 5 }
327 4 SL811Write(IntStatus ,INT_CLEAR); // clear interrupt status, need to
328 4 SL811Write(EP0Control,cmd); // re-arm and request for last cmd again
329 4 }
330 3 else
331 3 { // all other data endpoint, data transfer
332 4 USB_Control.TIMEOUT_ERR = TRUE; // failed, set flag to terminate transfer
333 4 break; // happens when data transfer on a device
334 4 } // through the hub
335 3 }
336 2
337 2 //-----------------------STALL----------------------------
338 2 if (result & EP0_STALL) // STALL detected
339 2 return TRUE; // for unsupported request.
340 2
341 2 //----------------------OVEFLOW---------------------------
342 2 if (result & EP0_OVERFLOW) // OVERFLOW detected
343 2 break;
344 2 //-----------------------ERROR----------------------------
345 2 if (result & EP0_ERROR) // ERROR detected
346 2 break;
347 2 } // end of While(1)
348 1
349 1 if (result & EP0_ACK) // on ACK transmission
350 1 return TRUE; // return OK
351 1
352 1 return FALSE; // fail transmission
353 1 }
354 //*****************************************************************************************
355 // Control Endpoint 0's USB Data Xfer
356 // ep0Xfer, endpoint 0 data transfer
357 //*****************************************************************************************
358 unsigned char ep0Xfer(BYTE usbaddr, WORD payload, pSetupPKG setup, BYTE *pData)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -