📄 read_reg.lst
字号:
632 2 PW_RST_PORT_DIR_OUT;
633 2 IO_BUS_RESET_HIGH;//PW_RST_PORT_LOW;
634 2 RISC_sleep_cycles(UMO_RESET_IDLE_TICKS);
635 2 IO_BUS_RESET_LOW;//PW_RST_PORT_HIGH;
636 2 RISC_sleep_cycles(UMO_RESET_IDLE_TICKS);
637 2 IO_BUS_RESET_HIGH;//PW_RST_PORT_LOW;
638 2 RISC_sleep_cycles(UMO_RESET_IDLE_TICKS);
639 2 IO_BUS_RESET_LOW;//PW_RST_PORT_HIGH;
640 2 RISC_sleep_cycles(UMO_RESET_IDLE_TICKS);
641 2 }
642 1
643 1 IO_BUS_RESET_HIGH;
644 1 MCU_SEL_OUT=0x01;
645 1 RISC_sleep_cycles(UMO_RESET_IDLE_TICKS);
646 1 DEV_WriteReg(RH_CHIP_CTR2,0x20);
647 1 //RISC_sleep_cycles(UMO_RESET_IDLE_TICKS);
648 1 UH_ENFORCE_HOST_MODE();
649 1 UH_ENFORCE_HOST_MODE();
650 1
651 1 DEV_WriteReg(RH_CHIP_CTR2,0x00); //suspend 120msec before USB reset
652 1 // EPRINTF(("DEV_ResetChip!!!\n"));
653 1 return RES_OK;
654 1 }
655
656
657
658
659 /******************************************************************************
660 * Reset USB Device (for about 12msec)
661 * and wait for (?) msec for device init
662 *
663 * RETURN:
664 * - RES_OK : reset + delay OK
665 * - RES_ERR: on SOF --> device plugged-off
666 ******************************************************************************/
667 U8 DEV_ResetUsbDevice(U8 msIdle)
668 {
669 1 U8 i;
670 1
671 1 //050131 捞惑窍霸 咯扁辑 吧府绰淀窃!!! if(!UH_DEV_IS_PLUGGEDIN()) return RES_ERR;
672 1 if(!UH_DEV_IS_PLUGGEDIN()) return RES_ERR;
673 1
674 1 DEV_WriteReg(RH_INT_EN,UH_IRQ_SOF);
675 1 DEV_WriteReg(RH_CHIP_CTR2,0x10); //SOF
C51 COMPILER V6.12 READ_REG 03/13/2007 09:54:33 PAGE 12
676 1 DEV_WriteReg(RH_CHIP_CTR1,0xC0); //reset device
677 1 for(i=0;i<msIdle;i++){
678 2 RISC_sleep_nsec(1000000); //1msec
679 2 }
680 1 return RES_OK;
681 1 }
682
683 void DEV_StopTriggerIn(U8 fReset)
684 {
685 1 U8 i=0;
686 1 U32 j;
687 1
688 1 DEV_WriteReg(RH_DEV_ADDR,0x0F);
689 1 UH_SET_FIFO_SZ_EACH(0,1);
690 1 UH_FIFO_ROLLBACK_OUT();
691 1 DEV_WriteReg(RH_CHIP_CTR1,0x01);
692 1
693 1 for(j=0;j<300;j++){
694 2 RISC_sleep_nsec(10000); //3msec
695 2 }
696 1
697 1 if(fReset){
698 2 U8 temp = DEV_ReadReg(RH_MASS_ADDR2);
699 2 DEV_WriteReg(RH_CHIP_CTR2,0x20);
700 2 UH_ENFORCE_HOST_MODE();
701 2 UH_ENFORCE_HOST_MODE();
702 2 DEV_WriteReg(RH_USB_HOST_BASE_LEN,gMxPkSz);
703 2 if(temp==UMO_DEVICE_INIT_OK) DEV_WriteReg(RH_MASS_ADDR2,UMO_DEVICE_INIT_OK);
704 2 }
705 1 DEV_WriteReg(RH_CHIP_CTR1,0x00);
706 1 UH_FIFO_ROLLBACK_OUT();
707 1 DEV_WriteReg(RH_DEV_ADDR,gDevAddr);
708 1 DEV_WriteReg(RH_INT_EN,0);
709 1 DEV_ReadReg(RH_INT_STS);
710 1 }
711
712
713 U8 DEV_SafeTriggerAndWaitForInPacket(U8 ep, U16 bytCnt, U16 msec)
714 {
715 1 U32 time;
716 1
717 1 UH_FIFO_ROLLBACK_IN();
718 1 DEV_WriteReg(RH_FIFO_SZ_LO,(U8)bytCnt);
719 1 DEV_WriteReg(RH_FIFO_SZ_HI,(U8)(bytCnt>>8));
720 1 DEV_WriteReg(RH_INT_EN,UH_IRQ_SOF);//UH_IRQ_READ_READY);//UH_IRQ_USB_PKT_DONE);
721 1 DEV_ReadReg(RH_INT_STS); //??
722 1 //printf("RH_INT_STS");
723 1 time = 20000*1000;
724 1 while(time--){ if(UBi9021_IRQ_PENDING()){ DEV_ReadReg(RH_INT_STS); break; } _nop_(); } //sync to SOF
725 1 DEV_WriteReg(RH_EP_ADDR_N_PID,ep);
726 1
727 1 for(time=0; time<msec; )//for(ticks=0; ticks<gWaitPktTicks; ticks++)
728 1 {
729 2 if(UBi9021_IRQ_PENDING())
730 2 {
731 3 RISC_sleep_nsec(100); //200usec
732 3 GET_UBi9021_IRQ_STS(gUsbIrq);
733 3 if(gUsbIrq&(UH_IRQ_READ_READY|UH_IRQ_USB_PKT_DONE)) break;
734 3 else if(gUsbIrq&UH_IRQ_SOF) time++;
735 3 gUsbIrq = 0;
736 3 }
737 2 if( (0xD0!=ep) && DEV_ReadReg(RH_LAST_PKT_STS)==UH_LST_PKT_STS_STALL){
C51 COMPILER V6.12 READ_REG 03/13/2007 09:54:33 PAGE 13
738 3 DEV_StopTriggerIn(1);
739 3 USB_ResetPipe(gEPIN);
740 3 USB_ResetPipe(gEPOUT);
741 3 return UH_IRQ_FAKE_STALL; //STALL mark
742 3 }
743 2 if(gDevAddr!=DEV_ReadReg(RH_DEV_ADDR)||UMO_DEVICE_INIT_OK!=DEV_ReadReg(RH_MASS_ADDR2)) break;
744 2 }
745 1
746 1 if((0x80&ep)&&(0xD0!=ep)&&(gUsbIrq&UH_IRQ_READ_READY)==0) DEV_StopTriggerIn(0);//Short-Packet
747 1
748 1 DEV_WriteReg(RH_INT_EN,0);
749 1 return gUsbIrq;
750 1 }
751 /******************************************************************************
752 * wait until (small) packet tranfer done
753 ******************************************************************************/
754
755 U8 WaitSmallPacket(U8 ep)
756 {
757 1 U8 usbIrq,res=RES_ERR;
758 1 //U32 ticks;
759 1
760 1 if(!UH_DEV_IS_PLUGGEDIN()) return RES_ERR;
761 1 DEV_TimerStart(100);
762 1 while(gUsbTimeOver==0) //wait maximum 100msec
763 1 {
764 2 if(UBi9021_IRQ_PENDING())
765 2 {
766 3 GET_UBi9021_IRQ_STS(usbIrq);
767 3 if( (!(0x80&ep)||(0xD0==ep)) &&
768 3 (DEV_ReadReg(RH_LAST_PKT_STS)&UH_LST_PKT_STS_NAK) ){
769 4 DEV_WriteReg(RH_EP_ADDR_N_PID,ep);
770 4 continue;
771 4 }
772 3 if(usbIrq&UH_IRQ_USB_PKT_DONE){
773 4 DEV_WriteReg(RH_INT_EN,0);
774 4 return RES_OK;
775 4 }
776 3 }
777 2 if((0xD0!=ep) && (DEV_ReadReg(RH_LAST_PKT_STS)==UH_LST_PKT_STS_STALL)){
778 3 res = UH_IRQ_FAKE_STALL; //STALL mark
779 3 break;
780 3 }
781 2 }
782 1
783 1 DEV_StopTriggerIn(0);
784 1 DEV_WriteReg(RH_INT_EN,0);
785 1 return res;
786 1 }
787
788
789
790 /******************************************************************************
791 * clear feature
792 ******************************************************************************/
793
794 U8 USB_ResetPipe(U8 bEpAddr)//reset pipe
795 {
796 1 U8* buf = (U8*)(gCBW+18);
797 1
798 1 MemFill(buf, 0, 8);
799 1 buf[0]=0x02;//type:standard,recipient:endpoint
C51 COMPILER V6.12 READ_REG 03/13/2007 09:54:33 PAGE 14
800 1 buf[1]=0x01;//CLEAR_FEATURE
801 1 buf[4]=(bEpAddr&~0x10);//endpoint address
802 1
803 1 DEV_WriteReg(RH_USB_HOST_BASE_LEN,gMxPkSzCtr);
804 1 UH_FIFO_ROLLBACK_OUT();
805 1 UH_SET_FIFO_SZ_EACH(0,8);
806 1 DEV_WriteReg(RH_INT_EN,UH_IRQ_USB_PKT_DONE);
807 1 DEV_WriteRegMulti(RH_USB_HOST_BASE_ADDR,8,buf);
808 1 DEV_WriteReg(RH_EP_ADDR_N_PID,gEP=0xD0);
809 1 if(ISERR(WaitSmallPacket(0xD0))) return RES_ERR;
810 1 MemFill(buf,0,31-18);
811 1 DEV_WaitMS(1);//??
812 1
813 1 DEV_WriteReg(RH_DEV_ADDR,gDevAddr);
814 1 UH_FIFO_ROLLBACK_IN();
815 1 DEV_WriteReg(RH_USB_HOST_BASE_LEN,0);//zero packet
816 1 UH_SET_FIFO_SZ_EACH(0,0);
817 1 UH_IRQ_EN(UH_IRQ_USB_PKT_DONE);
818 1 UH_Trigger(0x90); ///PID=DATA1
819 1 if(ISERR(WaitSmallPacket(0x90))) return RES_ERR;
820 1
821 1 DEV_WriteReg(RH_INT_EN,0);
822 1 DEV_WriteReg(RH_USB_HOST_BASE_LEN,gMxPkSz); //restore max packet size
823 1 return RES_OK;
824 1 }
825
826
827
828 /******************************************************************************
829 *
830 * OPERATION:
831 * parse configuration descriptor and get some parameters
832 *
833 * INPUT:
834 * -bcnt: byte count of the configuration descriptors
835 *
836 * OUTPUT:
837 * - gMxPkSz : maximum packet size of a bulk-pipe
838 * - gEPIN : bulk-in pipe
839 * - gEPOUT : bulk-out pipe
840 * - gUsbCfg : value to be used in set-configuration
841 *
842 * RETURN:
843 * - RES_OK : BulkOnly type mass storage
844 * bInterfaceClass = 8 : Mass Storage
845 * bInterfaceProtocol = 0x50 : BulkOnly
846 * - RES_ERR :
847 * - RES_ERR+1: Unknown Device
848 * - RES_ERR+2: CBI type mass storage
849 * bInterfaceClass = 8 : Mass Storage
850 * bInterfaceProtocol = 1 : CBI
851 * - RES_ERR+3: PTP (Picture Tranfer Protocol) type
852 * bInterfaceClass = 6 : Imaging
853 * bInterfaceSubClass = 1 : Still Image Capture
854 * bInterfaceProtocol = 1 : Picture Transfer Protocol (PIMA 15470)
855 *
856 ******************************************************************************/
857 U8 ParseConfigDesc(IN U8 bcnt, IN U8* pDesc)
858 {
859 1 while(bcnt>0)
860 1 {
861 2 switch(pDesc[1])
C51 COMPILER V6.12 READ_REG 03/13/2007 09:54:33 PAGE 15
862 2 {
863 3 case DESC_CONFIG:
864 3 if(pDesc[4]<1)return RES_ERR; //number of interfaces
865 3 gUsbCfg = pDesc[5];
866 3 gIFSC = nOK08;
867 3 gEPIN = gEPOUT = nOK08;
868 3 break;
869 3 case DESC_INTERFACE:
870 3 gIFSC = nOK08;
871 3 gEPIN = gEPOUT = nOK08;
872 3 if(pDesc[5]==IFC_MASSSTORAGE){
873 4 if(pDesc[7]==IFP_CBI) return RES_ERR+2;
874 4 if(pDesc[7]==IFP_BULKONLY) gIFSC = pDesc[6]; //interface subclass
875 4 }
876 3 else if(pDesc[5]==IFC_IMAGING){
877 4 return RES_ERR+3;
878 4 }
879 3 break;
880 3 case DESC_ENDPOINT:
881 3 if(gIFSC!=nOK08 && pDesc[3]==EPTYPE_BULK){
882 4 if(pDesc[2]&0x80){ gEPIN = pDesc[2]; gMxPkSz = pDesc[4]; }
883 4 else{ gEPOUT = pDesc[2]; gMxPkSz = pDesc[4]; }
884 4 }
885 3 break;
886 3 }
887 2 if((gEPIN!=nOK08)&&(gEPOUT!=nOK08)) break;
888 2 if((pDesc[0]<3)||(pDesc[0]>9)) return RES_ERR;
889 2 if(bcnt<=pDesc[0]) break;
890 2
891 2 bcnt -= pDesc[0];
892 2 pDesc += pDesc[0];
893 2 }
894 1
895 1 if((gEPIN==nOK08)||(gEPOUT==nOK08)) return RES_ERR+1;
896 1
897 1 gEPIN |= 0x10; //BULK-IN
898 1 gEPOUT |= 0x10; //BULK-OUT
899 1 DEV_WriteReg(RH_USB_HOST_BASE_LEN,gMxPkSz); //set MAX-PACKET-SIZE for BULK
900 1
901 1 return RES_OK;
902 1 }
903
904
905
906
907
908 /******************************************************************************
909 * INPUT:
910 * - type: type of the usb setup transfer
911 * - arg : type==USB_SETUP_GET_DEV_DESC_INIT -> byte length
912 * type==USB_SETUP_GET_DEV_DESC -> byte length
913 * type==USB_SETUP_GET_CFG_DESC -> byte length
914 * type==USB_SETUP_SET_ADDR -> new address
915 * type==USB_SETUP_SET_CFG -> new configuration
916 * type==others -> no use
917 * - buf :
918 *
919 * RETURN:
920 * RES_OK
921 * RES_ERR: timeout
922 *
923 * NOTE: 老窜 ep0甫 烹秦辑 背券登绰 data绰 128俺 捞窍扼绊 啊沥.
C51 COMPILER V6.12 READ_REG 03/13/2007 09:54:33 PAGE 16
924 *
925 ******************************************************************************/
926 int disable_debug=0;
927
928 U8 USB_ControlTransfer(U8 type, U8 arg, U8* buf)
929 {
930 1 U8 dataByteCnt,res;
931 1 //printf("control pipe start.\n");
932 1 if(type==USB_SETUP_GET_DEV_DESC_INIT)
933 1 {
934 2 //printf("Type:%d\n",type);
935 2 if(disable_debug==0)
936 2 enable_debug=1;
937 2 }
938 1 //enable_debug=1;
939 1 MemFill(buf,0,8);
940 1
941 1 switch(type)
942 1 {
943 2 case USB_SETUP_GET_DEV_DESC_INIT:
944 2 case USB_SETUP_GET_DEV_DESC:
945 2 case USB_SETUP_GET_CFG_DESC:
946 2 buf[0]=0x80,buf[1]=0x06,buf[6]=arg;
947 2 buf[3]=(type==USB_SETUP_GET_CFG_DESC)?0x02:0x01;
948 2 break;
949 2 case USB_SETUP_SET_ADDR:
950 2 buf[1]=0x05,buf[2]=arg;
951 2 break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -