📄 usb.lst
字号:
267 ControlData.DeviceRequest.wLength=SWAP(ControlData.DeviceRequest.wLength);
268
269
270
271 D12_AcknowledgeEndpoint(0);
272 D12_AcknowledgeEndpoint(1);
273 ControlData.wLength=ControlData.DeviceRequest.wLength;
274 ControlData.wCount=0;
275 if(ControlData.DeviceRequest.bmRequestType&(unsigned char)USB_ENDPOINT_DIRECTION_MASK)
276 {
277 EventFlags.Bits.SetupPacket=1; //recv from host? --by newer
278 EventFlags.Bits.ControlState=1; //by newer
279 }
280 else
281 {
282 if(ControlData.DeviceRequest.wLength==0)
283 {
284 EventFlags.Bits.SetupPacket=1;
285 EventFlags.Bits.ControlState=0; //by newer
286 }
287 else
288 {
289 if(ControlData.DeviceRequest.wLength>16)//最大传16byte
290 {
291 EventFlags.Bits.ControlState=0; //by newer
292 D12_SetEndpointStatus(0,1);
293 D12_SetEndpointStatus(1,1);
294 }
295 else
C51 COMPILER V8.02 USB 11/27/2007 19:16:39 PAGE 6
296 {
297 EventFlags.Bits.ControlState=2;//by newer
298 }
299 }
300 }
301 }
302 else if(EventFlags.Bits.ControlState==2)
303 {
304 i=D12_ReadEndpoint_Int(0,EP0_PACKET_SIZE,ControlData.dataBuffer+ControlData.wCount);
305 ControlData.wCount+=i;
306 if(i!=EP0_PACKET_SIZE||ControlData.wCount>=ControlData.wLength)
307 {
308 EventFlags.Bits.SetupPacket=1;
309 EventFlags.Bits.ControlState=0;
310 }
311 }
312 else
313 EventFlags.Bits.ControlState=0;
314 }
315
316 void EP0_In(void)
317 {
318 short i=ControlData.wLength-ControlData.wCount;
319 D12_ReadLastTransactionStatus(1);
320 if(EventFlags.Bits.ControlState!=1) return;
321 if(i>=EP0_PACKET_SIZE)
322 {
323 D12_WriteEndpoint_Int(1,EP0_PACKET_SIZE,ControlData.pData+ControlData.wCount);
324 ControlData.wCount+=EP0_PACKET_SIZE;
325 EventFlags.Bits.ControlState=1;
326 return;
327 }
328 if(i!=0)
329 {
330 D12_WriteEndpoint_Int(1,i,ControlData.pData+ControlData.wCount);
331 ControlData.wCount+=i;
332 EventFlags.Bits.ControlState=0;
333 return;
334 }
335 D12_WriteEndpoint_Int(1,0,0);
336 EventFlags.Bits.ControlState=0;
337 }
338 void EP1_Out(void)
339 {
340 unsigned char Length;
341 D12_ReadLastTransactionStatus(2); /* Clear interrupt flag */
342 Length = D12_ReadEndpoint_Int(2, sizeof(EndPoint1Buffer),EndPoint1Buffer);
343 if(Length != 0)
344 EventFlags.Bits.Port1RxDone = 1;
345 }
346
347 void EP1_In(void)
348 {
349 D12_ReadLastTransactionStatus(3);
350 }
351
352 void EP2_Out(void)
353 {
354 unsigned char Length,EP2Status;
355 D12_ReadLastTransactionStatus(4); /* Clear interrupt flag */
356
357 EP2Status = D12_ReadEndpointStatus(4);
C51 COMPILER V8.02 USB 11/27/2007 19:16:39 PAGE 7
358 EP2Status&=0x60;
359 Length = D12_ReadEndpoint(4,sizeof(EndPoint2Buffer),EndPoint2Buffer);
360 if(EP2Status==0x60)
361 Length = D12_ReadEndpoint(4,sizeof(EndPoint2Buffer),EndPoint2Buffer);
362 if(Length != 0)
363 EventFlags.Bits.Port2RxDone = 1;
364 }
365
366 void EP2_In(void)
367 {
368 D12_ReadLastTransactionStatus(5); /* Clear interrupt flag */
369 }
370 //**************************************************************************
371 //请求处理
372
373 code USB_DEVICE_DESCRIPTOR DeviceDescr=
374 {
375 sizeof(USB_DEVICE_DESCRIPTOR),
376 0x01,//USB_DEVICE_DESCRIPTOR_TYPE,
377 SWAP(0x0100),
378 0xDC,//USB_CLASS_CODE_TEST_CLASS_DEVICE,
379 0, 0,
380 EP0_PACKET_SIZE,
381 SWAP(0x0471),
382 SWAP(0x0666),
383 SWAP(0x0100),
384 0, 0, 0,
385 25
386 };
387
388 code USB_CONFIGURATION_DESCRIPTOR ConfigDescr=
389 {
390 0x09,0x02,0x2e,0x00,0x01,0x01,0x00,0xa0,0x32,
391 0x09,0x04,0x00,0x00,0x04,0xdc,0xa0,0xb0,0x00,
392 0x07,0x05,0x81,0x03,0x02,0x00,0x0a,
393 0x07,0x05,0x01,0x03,0x02,0x00,0x0a,
394 0x07,0x05,0x82,0x02,0x40,0x00,0x0a,
395 0x07,0x05,0x02,0x02,0x40,0x00,0x0a
396 };
397
398 //code_tramsit
399 void code_transmit(unsigned char code *pRomData,unsigned short len)
400 {
401 ControlData.wCount=0;
402 if(ControlData.wLength>len)
403 ControlData.wLength=len;
404 ControlData.pData=pRomData;
405 if(ControlData.wLength>=EP0_PACKET_SIZE)
406 {
407 D12_WriteEndpoint(1,EP0_PACKET_SIZE,ControlData.pData);
408 ControlData.wCount+=EP0_PACKET_SIZE;
409 EA = 0;
410 EventFlags.Bits.ControlState=1;
411 EA = 1;
412 }
413 else
414 {
415 D12_WriteEndpoint(1,ControlData.wLength,pRomData);
416 ControlData.wCount+=ControlData.wLength;
417 EA = 0;
418 EventFlags.Bits.ControlState=0;
419 EA = 1;
C51 COMPILER V8.02 USB 11/27/2007 19:16:39 PAGE 8
420 }
421 }
422 //获取描述符
423 void get_descriptor(void)
424 {
425 if(MSB(ControlData.DeviceRequest.wValue)==USB_DEVICE_DESCRIPTOR_TYPE)
426 {
427 code_transmit((unsigned char code*)&DeviceDescr,sizeof(USB_DEVICE_DESCRIPTOR));
428 return;
429 }
430 if(MSB(ControlData.DeviceRequest.wValue)==USB_CONFIGURATION_DESCRIPTOR_TYPE)
431 {
432 if(ControlData.DeviceRequest.wLength>CONFIG_DESCRIPTOR_LENGTH)
433 {
434 ControlData.DeviceRequest.wLength=CONFIG_DESCRIPTOR_LENGTH;
435 //标识符总大小2E byte,第二次请求时wlength=0x00ff
436 }
437 //这里的ConfigDescr其实应该包括其他标识符!
438 code_transmit((unsigned char code*)&ConfigDescr,ControlData.DeviceRequest.wLength);
439 return;
440 }
441 }
442 //single transmit
443 void single_transmit(unsigned char *buf,unsigned char len)
444 {
445 if(len<=EP0_PACKET_SIZE)
446 {
447 D12_WriteEndpoint(1,len,buf);
448 }
449 }
450 //设置地址
451 void set_address(void)
452 {
453 D12_SetAddressEnable((unsigned char)(ControlData.DeviceRequest.wValue&0xff),1);
454 //比如wValue是"02 00" 应该得到02
455 single_transmit(0,0);
456 }
457
458 //设置配置
459 void set_configuration(void)
460 {
461 if(ControlData.DeviceRequest.wValue==0)
462 {
463 single_transmit(0,0);
464 EventFlags.Bits.Configuration=0;
465 D12_SetEndpointEnable(0);
466 }
467 else if(ControlData.DeviceRequest.wValue==1)
468 {
469 single_transmit(0,0);
470 D12_SetEndpointEnable(0);
471 D12_SetEndpointEnable(1);
472 EventFlags.Bits.Configuration=1;
473 }
474 }
475 //读取配置
476 void get_configuration(void)
477 {
478 unsigned char c=EventFlags.Bits.Configuration;
479 single_transmit(&c,1);
480 }
481 //读取设备接口信息
C51 COMPILER V8.02 USB 11/27/2007 19:16:39 PAGE 9
482 void get_interface(void)
483 {
484 unsigned char txdat=0;
485 single_transmit(&txdat,1);
486 }
487
488 static code void (*StandardDeviceRequest[])(void)=
489 {
490 0,0,0,0,
491 0,set_address,get_descriptor,0,
492 get_configuration,set_configuration,get_interface,0,
493 0,0,0,0
494 };
495
496 static code void (*VendorDeviceRequest[])(void)=
497 {
498 0,0,0,0,
499 0,0,0,0,
500 0,0,0,0,
501 0,0,0,0
502 };
503
504 void ControlHandler(void)
505 {
506 unsigned char type,req;
507 type=ControlData.DeviceRequest.bmRequestType&USB_REQUEST_TYPE_MASK;//0011,0000b
508 req=ControlData.DeviceRequest.bRequest&USB_REQUEST_MASK;//0000,1111b
509 if(type==USB_STANDARD_REQUEST)
510 (*StandardDeviceRequest[req])();
511 else if(type==USB_VENDOR_REQUEST)
512 (*VendorDeviceRequest[req])();
513 }
514
515 void USB_ISR(void) interrupt 0
516 {
517 unsigned int i_st,d;
518
519 EA = 0;
520 EventFlags.Bits.InISR=1;
521 i_st=D12_ReadInterruptRegister();
522
523 printf("i_st=%x\n",i_st);
524 if(i_st!=0)
525 {
526 if(i_st&D12_INT_ENDP0OUT)
527 EP0_Out();
528 if(i_st&D12_INT_ENDP0IN)
529 EP0_In();
530 if(i_st&D12_INT_ENDP1OUT)
531 EP1_Out();
532 if(i_st&D12_INT_ENDP1IN)
533 EP1_In();
534 if(i_st&D12_INT_ENDP2OUT)
535 EP2_Out();
536 if(i_st&D12_INT_ENDP2IN)
537 EP2_In();
538 }
539 EventFlags.Bits.InISR=0;
540 EA = 1;
541 }
542
543
C51 COMPILER V8.02 USB 11/27/2007 19:16:39 PAGE 10
544
C51 COMPILATION COMPLETE. 4 WARNING(S), 1 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -