📄 halusbhost.lst
字号:
214 1 pIntfDesc pIfc; // interface descriptor
215 1 pEPDesc pEnp; // end-point descriptor
216 1
217 1 TxAddr = 0x0; // double make sure Address is zero
218 1 // Get the first 8 bytes of USB Device Descriptors on EP0 & Addr 0
219 1 uDev.wPayLoad[0] = 8; // default 8-byte payload for EP0
220 1 usbstack.wPayload = 8;
221 1 usbstack.buffer=DBUF; // setup source and destination buffer
222 1 usbstack.usbaddr = 0; // default address
223 1 //if (!getDesc(DEVICE, 8))
224 1 UartOutText("-I-: GET_DESCRIPTOR, DEVICE, 8 \r\n ");
225 1 _halStdDevReq(0x80, GET_DESCRIPTOR, WordSwap(DEVICE), 0, 8);
226 1
227 1 pDev =(pDevDesc)DBUF; // device descriptor data structure overlay
228 1 uDev.wPayLoad[0] = pDev->bMaxPacketSize0;
229 1 usbstack.wPayload = pDev->bMaxPacketSize0;
230 1
231 1 //------------------------------------------------
232 1 // Set Slave USB Device Address
233 1 //------------------------------------------------
234 1 //if (!setAddress(USB_DEV_ADDR)) // set to specific USB address
235 1 UartOutText("-I-: SET_ADDRESS \r\n ");
236 1 _halStdDevReq(0x00, SET_ADDRESS, USB_DEV_ADDR, 0, 0);
237 1 TxAddr = USB_DEV_ADDR;
238 1 //------------------------------------------------
239 1 // Get USB Device Descriptors on EP0 & Addr X
C51 COMPILER V8.01 HALUSBHOST 04/17/2008 09:46:30 PAGE 5
240 1 //------------------------------------------------
241 1 usbstack.usbaddr=USB_DEV_ADDR;
242 1 //usbstack.setup.wLength=pDev->bLength;
243 1 //usbstack.setup.wValue=DEVICE;
244 1 //usbstack.setup.wIndex=0;
245 1 usbstack.buffer=DBUF;
246 1
247 1 // if (!getDesc(DEVICE, pDev->bLength))
248 1 //Get the whle device descriptor, len=0x12
249 1 _halStdDevReq(0x80, GET_DESCRIPTOR, WordSwap(DEVICE), 0, 0x12);
250 1
251 1 //------------------------------------------------
252 1 // Get Slave USB Configuration Descriptors
253 1 //------------------------------------------------
254 1 //usbstack.setup.wValue=CONFIGURATION;
255 1 //usbstack.setup.wIndex=0;
256 1 //usbstack.setup.wLength=9;
257 1 usbstack.buffer=DBUF;
258 1 // if (!getDesc(CONFIGURATION, 9))
259 1 _halStdDevReq(0x80, GET_DESCRIPTOR, WordSwap(CONFIGURATION), 0, 0x09);
260 1
261 1 pCfg = (pCfgDesc)DBUF;
262 1 //usbstack.setup.wLength=WordSwap(pCfg->wLength);
263 1 usbstack.buffer=DBUF;
264 1 // usbstack.setup.wLength=32;
265 1 //if (!getDesc(CONFIGURATION, WordSwap(pCfg->wLength)))
266 1 _halStdDevReq(0x80, GET_DESCRIPTOR, WordSwap(CONFIGURATION), 0, WordSwap(pCfg->wLength));
267 1
268 1 // the DBUF now should contain 32 bytes of configuration data:
269 1 // 0-8: configuration descriptor
270 1 // 9-17: interface descriptor
271 1 // 18-24: EP0 descriptor
272 1 // 25-31: EP1 descriptor
273 1
274 1 pIfc = (pIntfDesc)(DBUF + 9); // point to Interface Descp
275 1 uDev.bClass = pIfc->iClass; // update to class type
276 1 uDev.bNumOfEPs = (pIfc->bEndPoints <= MAX_EP) ? pIfc->bEndPoints : MAX_EP;
277 1
278 1 // if(uDev.bClass==8) //mass storage device
279 1 // {
280 1 // bXXGFlags.bMassDevice=TRUE;
281 1 // }
282 1 //------------------------------------------------
283 1 // Set configuration (except for HUB device)
284 1 //------------------------------------------------
285 1 //usbstack.setup.wValue=DEVICE;
286 1 //------------------------------------------------
287 1 // For each slave endpoints, get its attributes
288 1 // Excluding endpoint0, only data endpoints
289 1 //------------------------------------------------
290 1 //if (!setConfiguration())
291 1 _halStdDevReq(0x00, SET_CONFIG, 0x01, 0x00, 0x00);
292 1
293 1 epLen = 0;
294 1 for (i=1; i<=uDev.bNumOfEPs; i++) // For each data endpoint
295 1 {
296 2 pEnp = (pEPDesc)(DBUF + 18 + epLen); // point to Endpoint Descp(non-HID)
297 2 //if(pIfc->iClass == HIDCLASS)
298 2 // pEnp = (pEPDesc)(DBUF + 9 + 9 + 9 + epLen); // update pointer to Endpoint(HID)
299 2 uDev.bEPAddr[i] = pEnp->bEPAdd; // Ep address and direction
300 2 uDev.bAttr[i] = pEnp->bAttr; // Attribute of Endpoint
301 2
C51 COMPILER V8.01 HALUSBHOST 04/17/2008 09:46:30 PAGE 6
302 2 uDev.wPayLoad[i] = WordSwap(pEnp->wPayLoad); // Payload of Endpoint
303 2 uDev.wPayLoad[i] = (uDev.wPayLoad[i] > 64) ? 64: uDev.wPayLoad[i];
304 2
305 2 //uDev.bInterval[i] = pEnp->bInterval; // Polling interval
306 2 uDev.bData1[i] = 0; // init data toggle
307 2 epLen += 7;
308 2 //////////////////////////////
309 2 if(uDev.bAttr[i]==0x2){ // bulk endpoint
310 3 if(uDev.bEPAddr[i]&0x80)
311 3 usbstack.epbulkin=i; // bulk in
312 3 else
313 3 usbstack.epbulkout=i; // bulk out
314 3 }
315 2
316 2 }
317 1
318 1 return TRUE;
319 1 }
320
321
322 //Control transfer: setup stage + data in/out + status
323 BYTE _halHostEp0Xfer(void)
324 {
325 1 TxEpnum = 0x0; // always set end point to zero!!
326 1
327 1 // SETUP Transaction: setup + data0 + ACK
328 1 usbstack.wLen = sizeof(SetupPKG); // set for 8-byte descriptor length
329 1 usbstack.pid = PID_SETUP;
330 1 _halSetupTrans();
331 1 UartOutText("-I-: Setup stage \r\n");
332 1
333 1 usbstack.pid = PID_IN; // default for setup stage
334 1 // IN or OUT data stage on endpoint 0
335 1 usbstack.wLen = usbstack.setup.wLength;
336 1 bXXGFlags.bToggle=1; // expect data1 from device
337 1 if (usbstack.wLen){ // if there are data for transfer
338 2 if (usbstack.setup.bmRequest & 0x80){ // IN token
339 3 usbstack.pid = PID_IN;
340 3 _halInTrans();
341 3 //UartOutText("-I-: Data IN \r\n");
342 3
343 3 usbstack.pid = PID_OUT;
344 3 }else{ // OUT token
345 3 usbstack.pid = PID_OUT;
346 3 _halOutTrans();
347 3 //UartOutText("-I-: Data OUT \r\n");
348 3
349 3 usbstack.pid = PID_IN;
350 3 }
351 2 UartOutText("-I-: DATA stage \r\n");
352 2 }
353 1
354 1 // Status stage IN or OUT zero-length data packet
355 1 usbstack.wLen=0;
356 1 bXXGFlags.bToggle=1; // status stage is always Data1
357 1 if(usbstack.pid == PID_IN){
358 2 _halInTrans();
359 2 //UartOutText("-I-: Status IN \r\n");
360 2 }else{
361 2 _halOutTrans();
362 2 //UartOutText("-I-: Status OUT \r\n");
363 2 }
C51 COMPILER V8.01 HALUSBHOST 04/17/2008 09:46:30 PAGE 7
364 1 UartOutText("-I-: Status stage \r\n");
365 1
366 1 return TRUE;
367 1
368 1 }
369
370 //setup stage: setup + data0 + ACK
371 void _halSetupTrans(void)
372 {
373 1 //WORD tmp;
374 1 BYTE data stat0;
375 1 //BYTE cmd;
376 1
377 1 WDT = 0X1F;
378 1 TxPktlen = sizeof(SetupPKG); // data transfer length
379 1
380 1 //tmp = usbstack.setup.wLength;
381 1 usbstack.setup.wValue = WordSwap(usbstack.setup.wValue);
382 1 usbstack.setup.wIndex = WordSwap(usbstack.setup.wIndex);
383 1 usbstack.setup.wLength = WordSwap(usbstack.setup.wLength);
384 1
385 1 _halBufRst(0x03);
386 1 BufSel = MCU2USB; //src=CPU,dest=USB
387 1
388 1 usbBufWrite((BYTE *)&usbstack.setup,sizeof(SetupPKG));
389 1 usbstack.setup.wLength = WordSwap(usbstack.setup.wLength);
390 1 _halBufRst(0x03); //flip rw buffer
391 1
392 1 SieStat0 = 0xff; // clear status register before each transfer
393 1 //SieStat1 = 0xff;
394 1 TxCtrl = SETUP; // setup + data0
395 1
396 1 while(1){
397 2 stat0 = SieStat0;
398 2
399 2 if(stat0 & DEV_ACK){ //The function receiving a SETUP must accept the SETUP data and respond with ACK,
400 3 SieStat0 = DEV_ACK;
401 3 break;
402 3 }else if(stat0 & DEV_TO){ // turnaround time expired
403 3 SieStat0 = DEV_TO; //if the data is corrupted, discard the data and return no handshake. So we just re
-send the cmd.
404 3 // glitch filter, don't need to clear
405 3 if (SieStat0 & DEV_TO){ // packet is not coming!
406 4 _halBufRst(0x02); // reset read pointer
407 4 TxCtrl = SETUP; // Send SETUP/OUT again!
408 4 }
409 3 }
410 2 }
411 1 WDT = 0X00;
412 1
413 1 return;
414 1 }
415
416 //usbstack.pid==PID_OUT
417 BYTE _halOutTrans(void)
418 {
419 1 BYTE data xferLen;
420 1 BYTE data cmd;
421 1 BYTE data stat0;
422 1 WORD bufpos;
423 1 BYTE data toFlag;
424 1
C51 COMPILER V8.01 HALUSBHOST 04/17/2008 09:46:30 PAGE 8
425 1 WDT = 0X1F;
426 1 bufpos = 0;
427 1 BufSel = MCU2USB; //src=CPU,dest=USB
428 1 do{
429 2 toFlag = FALSE;
430 2
431 2 // Define data transfer payload
432 2 if (usbstack.wLen >= usbstack.wPayload) // select proper data payload
433 2 xferLen = usbstack.wPayload; // limit to wPayload size
434 2 else // else take < payload len
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -