📄 usbmouse.lst
字号:
309 /****************************读端点最后状态**********************************/
310 uint8 read_last_status(uint8 endp)
311 {
312 1 write_usb_command(Read_Last_Status+endp);
313 1 return read_a_usb_data();
314 1 }
315 /******************************************************************************/
316
317 /****************************设置端点状态**************************************/
318 void set_endpoint_status(uint8 endp,uint8 status)
319 {
320 1 write_usb_command(0x40+endp);
321 1 write_a_usb_data(!status);
322 1 }
323 /******************************************************************************/
324
325 /*****************************读端点状态**************************************/
326 uint8 read_endpoint_status(uint8 endp)
327 {
328 1 write_usb_command(0x80+endp);
329 1 return read_a_usb_data();
330 1 }
331 /******************************************************************************/
332
333 /************************清缓冲,在读取缓冲数据后调用**************************/
334 void clear_buffer(void)
335 {
336 1 write_usb_command(Clear_Buffer);
337 1 }
338 /******************************************************************************/
339
340 /***********************缓冲区数据有效,在写缓冲后调用**************************/
341 void validate_buffer(void)
342 {
343 1 write_usb_command(Validate_Buffer);
344 1 }
345 /******************************************************************************/
346
347 /***************************应答建立包************************************/
348 void ack_setup(uint8 endp)
349 {
350 1 select_endpoint(endp);
351 1 write_usb_command(Ack_Setup);
352 1 }
353 /******************************************************************************/
354
355 /***********************出错处理******************************************/
356 void error(uint8 number)
357 {
358 1 Prints("有错误发生!!!",1);
359 1 number=0;
360 1 }
361 /******************************************************************************/
362
363 /*************************读终端点缓冲****************************************/
364 uint8 read_endpoint_buff(uint8 endp,uint8 len,uint8 * buff)
C51 COMPILER V6.12 USBMOUSE 09/21/2007 12:44:30 PAGE 7
365 {
366 1 uint8 i,j;
367 1 read_last_status(endp);
368 1 if(!(select_endpoint(endp))&0x01){error(0); return 0;}
369 1 read_endpoint_status(endp);
370 1 write_usb_command(Read_Buffer);
371 1 read_a_usb_data();
372 1 j=read_a_usb_data();
373 1 if(j>len)
374 1 j=len;
375 1 for(i=0;i<j;i++)
376 1 {
377 2 USB_RD=0;
378 2 *(buff+i)=USB_DATA;
379 2 USB_RD=1;
380 2 }
381 1 clear_buffer();
382 1 return j;
383 1 }
384 /******************************************************************************/
385
386 /*************************写终端点缓冲*****************************************/
387 uint8 write_endpoint_buff(uint8 endp,uint8 len,uint8 * buff)
388 {
389 1 uint8 i;
390 1 read_last_status(endp);
391 1 select_endpoint(endp);
392 1 write_usb_command(Write_Buffer);
393 1 write_a_usb_data(0);
394 1 write_a_usb_data(len);
395 1 for(i=0;i<len;i++)
396 1 {
397 2 USB_DATA=*(buff+i);
398 2 USB_WR=0;
399 2 USB_WR=1;
400 2 }
401 1 USB_DATA=0XFF;
402 1 validate_buffer();
403 1 return len;
404 1 }
405 /******************************************************************************/
406
407 /***************************断开USB连接****************************************/
408 void disconnect_usb(void)
409 {
410 1 Prints("断开USB连接........................",1);
411 1 write_usb_command(0xf3);
412 1 write_a_usb_data(0x0e);
413 1 write_a_usb_data(0x47);
414 1 delay(100);
415 1 }
416 /******************************************************************************/
417
418 /*******************************连接USB**************************************/
419 void connect_usb(void)
420 {
421 1 Prints("连接USB...............",1);
422 1 write_usb_command(0xf3); //初始化USBD12
423 1 write_a_usb_data(0x1e); //连接USB
424 1 write_a_usb_data(0x47); //设置频率
425 1 }
426 /******************************************************************************/
C51 COMPILER V6.12 USBMOUSE 09/21/2007 12:44:30 PAGE 8
427
428 /***************************初始化USB***************************************************/
429 void init_usb(void)
430 {
431 1 Prints("USBD12芯片初始化",1);
432 1 set_usb_addr(0);
433 1 USB_CS=0;
434 1 set_endpoint_enable();
435 1 }
436 /******************************************************************************/
437
438 /****************************USB总线复位处理***********************************/
439 void usb_bus_reset(void)
440 {
441 1 Prints("USB总线复位................................",1);
442 1 usb_flags.Register=0;
443 1 set_endpoint_enable();
444 1 }
445 /******************************************************************************/
446
447 /*****************************USB总线挂起处理**********************************/
448 void usb_bus_suspend(void)
449 {
450 1 Prints("USB Suspend................",1);
451 1 }
452 /******************************************************************************/
453
454 /***************************设置地址***************************************/
455 void set_usb_address(void)
456 {
457 1 usb_flags.flags.set_addr=1;
458 1 set_usb_addr(Control_Data.DeviceRequest.wValue);
459 1 while(select_endpoint(1)&0x01);
460 1 write_endpoint_buff(1,0,0);
461 1 while(select_endpoint(1)&0x01);
462 1 usb_flags.flags.usb_endp0_in=0;
463 1 usb_flags.flags.setup_packet_out=0;
464 1 }
465 /******************************************************************************/
466
467 /**************************获取状态响应*****************************************/
468 void get_status(uint8 receiver)
469 {
470 1 uint8 status[2];
471 1 switch (receiver)
472 1 {
473 2 case 0: //获取设备状态
474 2 status[0]=0x00;
475 2 status[1]=0x00;
476 2 break;
477 2 case 1: //获取接口状态
478 2 status[0]=0x00;
479 2 status[0]=0x00;
480 2 break;
481 2 case 2: //获取端点状态
482 2 status[0]=0x00;
483 2 status[1]=0x00;
484 2 break;
485 2 }
486 1 write_endpoint_buff(1,2,status);
487 1 usb_flags.flags.usb_endp0_in=0;
488 1 }
C51 COMPILER V6.12 USBMOUSE 09/21/2007 12:44:30 PAGE 9
489 /******************************************************************************/
490
491 /*********************清除特性*******************************************/
492 void clear_feature(uint8 receiver)
493 {
494 1 Prints(" 清除特性................................",1);
495 1 receiver=0;
496 1 write_endpoint_buff(1,0,0);
497 1 usb_flags.flags.usb_endp0_in=0;
498 1 usb_flags.flags.setup_packet_out=0;
499 1 }
500 /******************************************************************************/
501
502 /*******************设置特性**************************************************/
503 void set_feature(uint8 receiver)
504 {
505 1 Prints(" 设置特性................................",1);
506 1 receiver=0;
507 1 write_endpoint_buff(1,0,0);
508 1 usb_flags.flags.usb_endp0_in=0;
509 1 usb_flags.flags.setup_packet_out=0;
510 1 }
511 /******************************************************************************/
512
513 /*****************************设置描述*****************************************/
514 void set_descriptor(void)
515 {
516 1 Prints(" 设置描述符................................",1);
517 1 usb_flags.flags.usb_endp0_in=0;
518 1 usb_flags.flags.setup_packet_out=0;
519 1 }
520 /******************************************************************************/
521
522 /***************************设置配置*******************************************/
523 void set_configuration(void)
524 {
525 1 Prints(" 设置配置................................",1);
526 1 write_endpoint_buff(1,0,0);
527 1 usb_flags.flags.usb_endp0_in=0;
528 1 usb_flags.flags.setup_packet_out=0;
529 1 }
530 /******************************************************************************/
531
532 /************************获取配置状态******************************************/
533 void get_configuration(void)
534 {
535 1 uint8 value=0x01;
536 1 Prints(" 获取配置................................",1);
537 1 write_endpoint_buff(1,1,&value);
538 1 usb_flags.flags.usb_endp0_in=0;
539 1 }
540 /******************************************************************************/
541
542 /****************************设置接口************************************/
543 void set_interface(void)
544 {
545 1 Prints(" 设置接口................................",1);
546 1 write_endpoint_buff(1,0,0);
547 1 usb_flags.flags.usb_endp0_in=0;
548 1 usb_flags.flags.setup_packet_out=0;
549 1 }
550 /******************************************************************************/
C51 COMPILER V6.12 USBMOUSE 09/21/2007 12:44:30 PAGE 10
551
552 /***************************获取接口状态***************************************/
553 void get_interface(void)
554 {
555 1 uint8 value=0x01;
556 1 Prints(" 获取接口................................",1);
557 1 write_endpoint_buff(1,1,&value);
558 1 usb_flags.flags.usb_endp0_in=0;
559 1 }
560 /******************************************************************************/
561
562 /***********************获取描述符*********************************************/
563 void get_descriptor(void)
564 {
565 1 Prints(" 获取描述符................................",1);
566 1 if(!usb_flags.flags.not_end)
567 1 {
568 2 switch(MSB(Control_Data.DeviceRequest.wValue))
569 2 {
570 3 case DEVICE_DESCRIPTOR:
571 3 Prints(" 获取设备描述符................................",1);
572 3 Control_Data.wCount=sizeof(DEVICE_DESCRIPTOR_STRUCT);
573 3 Control_Data.pData=(uint8 *)(&device_descriptor);
574 3 break;
575 3 case CONFIGURATION_DESCRIPTOR:
576 3 Prints(" GET CONFIig................................",1);
577 3 Control_Data.wCount=SWAP16(con_int_endp_descriptor.configuration_descriptor.wTotalLength);
578 3 Control_Data.pData=(uint8 *)(&con_int_endp_descriptor);
579 3 if(Control_Data.wLength<Control_Data.wCount)Control_Data.wCount=Control_Data.wLength;
580 3 break;
581 3 case STRING_DESCRIPTOR:
582 3 Prints(" 获取字符串描述符................................",1);
583 3 switch(LSB(Control_Data.DeviceRequest.wValue))
584 3 {
585 4 case 0:
586 4 Prints(" 获取语言ID................................",1);
587 4 Control_Data.wCount=LANGUAGE_ID[0];
588 4 Control_Data.pData=LANGUAGE_ID;
589 4 break;
590 4
591 4 case 1:
592 4 Prints(" 获取厂商字符串................................",1);
593 4 Control_Data.wCount=ManufacturerString[0];
594 4 Control_Data.pData=ManufacturerString;
595 4 break;
596 4
597 4 case 2:
598 4 Prints(" 获取产品字符串................................",1);
599 4 Control_Data.wCount=ProducterString[0];
600 4 Control_Data.pData=ProducterString;
601 4 break;
602 4
603 4 case 3:
604 4 Prints(" 获取设备序列号................................",1);
605 4 Control_Data.wCount=device_serial_number[0];
606 4 Control_Data.pData=device_serial_number;
607 4 break;
608 4
609 4 default: break;
610 4 }
611 3 break;
612 3 default:
C51 COMPILER V6.12 USBMOUSE 09/21/2007 12:44:30 PAGE 11
613 3 Prints(" 获取其它描述符..................描述符索引为:",0);
614 3 PrintLongInt(MSB(Control_Data.DeviceRequest.wValue));
615 3 Prints("",1);
616 3 break;
617 3 }
618 2 if(Control_Data.wLength<Control_Data.wCount)Control_Data.wCount=Control_Data.wLength;
619 2 }
620 1 //写数据到D12输入端点
621 1 if(Control_Data.wCount>=MAX_CONTROL_DATA_SIZE)
622 1 {
623 2 write_endpoint_buff(1,MAX_CONTROL_DATA_SIZE,Control_Data.pData);
624 2 Control_Data.pData+=MAX_CONTROL_DATA_SIZE;
625 2 Control_Data.wCount-=MAX_CONTROL_DATA_SIZE;
626 2 if(usb_flags.flags.set_addr)usb_flags.flags.not_end=1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -