📄 upsd3400_usb_app.lst
字号:
912 5 break;
913 5 }
914 4
915 4 case OP_MODE_SELECT10:
916 4 {
917 5 OnModeSelect10();
918 5 break;
919 5 }
920 4
921 4
922 4 case OP_MODE_SENSE6:
923 4 {
C51 COMPILER V7.50 UPSD3400_USB_APP 09/13/2005 18:00:20 PAGE 16
924 5 OnModeSense6();
925 5 break;
926 5 }
927 4
928 4 case OP_MODE_SELECT6:
929 4 {
930 5 OnModeSelect6();
931 5 break;
932 5 }
933 4
934 4
935 4 case OP_READ_CAPACITY:
936 4 {
937 5 DoReadCapacity();
938 5 break;
939 5 }
940 4
941 4 case OP_READ_FORMAT_CAPACITIES:
942 4 {
943 5 DoReadFormatCapacity();
944 5 break;
945 5 }
946 4
947 4
948 4 case OP_MEDIA_REMOVEAL:
949 4 {
950 5 gbCSWStatus = FAIL;
951 5 ReturnCSW(); // return status
952 5 break;
953 5 }
954 4
955 4 case OP_VERIFY:
956 4 {
957 5 gbCSWStatus = FAIL; //implement your own checking mechanism
958 5 ReturnCSW(); // return status
959 5 break;
960 5 }
961 4
962 4 default:
963 4 {
964 5 gbCSWStatus = FAIL;
965 5 STALL_EP1(); // unknown command
966 5 gbBulkPipeStage = BS_CSW_PHASE;
967 5 break;
968 5 }
969 4 }
970 3 }
971 2 else
972 2 {
973 3 ReturnCSW(); // no command, return status
974 3 }
975 2
976 2 }
977 1 else
978 1 {
979 2 gbCSWStatus = FAIL;
980 2 STALL_EP1(); // unknown command block type, STALL
981 2 gbBulkPipeStage = BS_CBW_PHASE;
982 2 }
983 1 }
984
985 unsigned char USB_ISR_Counter; // incremented every USB INT event
C51 COMPILER V7.50 UPSD3400_USB_APP 09/13/2005 18:00:20 PAGE 17
986
987 void UsbIsr(void) interrupt USB_VECTOR using 2
988 /******************************************************************************
989 Function : void UsbIsr()
990 Parameters : none
991 Description: USB interrupt service routine.
992 Note: Do not modify this routine !!!
993 ******************************************************************************/
994 {
995 1 UCTL |= VISIBLE; // enable USB FIFO mapping in XDATA
996 1
997 1 if (RSTF)
998 1 {
999 2 OnUsbReset(); // USB Reset int
1000 2
1001 2 UIE1 |= UMSC_MASK_IN_ENDPOINT; //Enable EP0 IN INT
1002 2 UIE2 |= UMSC_MASK_OUT_ENDPOINT; //Enable EP0 OUT INT
1003 2
1004 2 USEL = OUTDIR | UMSC_OUT_ENDPOINT; //Select EP OUT
1005 2 UCON = ENABLE_FIFO | EPFIFO_BSY;
1006 2
1007 2 USEL = INDIR | UMSC_IN_ENDPOINT; //Select EP IN
1008 2 UCON = ENABLE_FIFO;
1009 2
1010 2 UIF1 = 0;
1011 2 UIF2 = 0;
1012 2 UIF3 = 0;
1013 2 UIF0 = 0;
1014 2 RSTF = 0;
1015 2 SUSPNDF = 0;
1016 2
1017 2 if (UCON & TOGGLE) //only silicon revision #0
1018 2 {
1019 3 USIZE = 0; //send an empty packet to reach DATA=0
1020 3 }
1021 2
1022 2 USTA = 0; //silicon revision #0
1023 2 UADDR = 0; //Reset device address, silicon revision #0
1024 2
1025 2 gbBulkPipeStage = BS_CBW_PHASE;
1026 2
1027 2 }
1028 1
1029 1 /* IN packets servicing, invoked when TuPSD+ sent an ACKed packet to a host */
1030 1 if (INF)
1031 1 {
1032 2 if (UIF1 & IN0F) // EP0 IN
1033 2 {
1034 3 UIF1 &= ~IN0F;
1035 3 TransmitEP0();
1036 3 if (usbState == US_ADDRESSED) // DEVICE ADDRESS change after SET_ADDRESS
1037 3 {
1038 4 UADDR = setupPacket.wValue.lo; //device address
1039 4 usbState = US_DEFAULT;
1040 4 }
1041 3 }
1042 2 if (UIF1 & UMSC_MASK_IN_ENDPOINT) // EP IN
1043 2 {
1044 3 switch (gbBulkPipeStage)
1045 3 {
1046 4 case BS_DATA_PHASE:
1047 4 {
C51 COMPILER V7.50 UPSD3400_USB_APP 09/13/2005 18:00:20 PAGE 18
1048 5 UIF1 &= ~UMSC_MASK_IN_ENDPOINT;
1049 5 ReadBufferFromFlash();
1050 5 break;
1051 5 }
1052 4 case BS_CBW_PHASE:
1053 4 {
1054 5 //UIF1 &= ~UMSC_MASK_IN_ENDPOINT;
1055 5 break;
1056 5 }
1057 4 case BS_CSW_PHASE: // DATA phase finished, preparing CSW
1058 4 {
1059 5 UIF1 &= ~UMSC_MASK_IN_ENDPOINT;
1060 5 ReturnCSW();
1061 5 break;
1062 5 }
1063 4 case BS_CSW_DONE_PHASE: //CSW sent, IN FIFO became empty
1064 4 {
1065 5 UIF1 &= ~UMSC_MASK_IN_ENDPOINT;
1066 5 gbBulkPipeStage = BS_CBW_PHASE; //CBW
1067 5 break;
1068 5 }
1069 4 }
1070 3 }
1071 2 /*
1072 2 if (UIF1 & IN2F) //EP2 IN
1073 2 {
1074 2 UIF1 &= ~IN2F; // User code area
1075 2 }
1076 2
1077 2 if (UIF1 & IN3F) //EP3 IN
1078 2 {
1079 2 UIF1 &= ~IN3F; // User code area
1080 2 }
1081 2
1082 2 if (UIF1 & IN4F) //EP4 IN
1083 2 {
1084 2 UIF1 &= ~IN4F; // User code area
1085 2 }
1086 2 */
1087 2 }
1088 1
1089 1 /* OUT packets servicing,invoked when TuPSD+ receives an OUT packet from a host*/
1090 1 if (OUTF)
1091 1 {
1092 2 if (UIF2 & OUT0F) // EP0 OUT
1093 2 {
1094 3 UIF2 &= ~OUT0F;
1095 3 if (USTA & SETUP)
1096 3 {
1097 4 ReadSetupPacket();
1098 4 OnSetupPacket();
1099 4 if (usbState == US_CONFIGURED)
1100 4 {
1101 5 USEL = INDIR | UMSC_IN_ENDPOINT; //Select EP IN
1102 5 if (UCON & TOGGLE) //only silicon revision #0
1103 5 {
1104 6 USIZE = 0; //send an empty packet to reach DATA=0
1105 6 }
1106 5 // UCON &= ~TOGGLE; //clear toggle
1107 5 USEL = OUTDIR | UMSC_OUT_ENDPOINT;//Select EP OUT
1108 5 // UCON &= ~TOGGLE; //clear toggle
1109 5 }
C51 COMPILER V7.50 UPSD3400_USB_APP 09/13/2005 18:00:20 PAGE 19
1110 4 }
1111 3 else
1112 3 {
1113 4 }
1114 3 gbBulkPipeStage = BS_CBW_PHASE;
1115 3 }
1116 2
1117 2 /*
1118 2 if (UIF2 & OUT1F) // EP1 OUT
1119 2 {
1120 2 UIF2 &= ~OUT1F; // User code area
1121 2 }
1122 2
1123 2 if (UIF2 & OUT2F) // EP2 OUT
1124 2 {
1125 2 UIF2 &= ~OUT2F; // User code area
1126 2 }
1127 2 */
1128 2
1129 2 if (UIF2 & UMSC_MASK_OUT_ENDPOINT) // EP3 OUT
1130 2 {
1131 3 switch (gbBulkPipeStage)
1132 3 {
1133 4 case BS_CBW_PHASE: // Command received
1134 4 {
1135 5 UIF2 &= ~UMSC_MASK_OUT_ENDPOINT;
1136 5 CheckReceiveCBW();
1137 5 break;
1138 5 }
1139 4 case BS_DATA_PHASE: // Data block received
1140 4 {
1141 5 UIF2 &= ~UMSC_MASK_OUT_ENDPOINT;
1142 5 WriteBufferToFlash();
1143 5 break;
1144 5 }
1145 4 case BS_CSW_PHASE:
1146 4 {
1147 5 break;
1148 5 }
1149 4 case BS_CSW_DONE_PHASE:
1150 4 {
1151 5 break;
1152 5 }
1153 4 }
1154 3
1155 3 }
1156 2 /*
1157 2 if (UIF2 & OUT4F) // EP4 OUT
1158 2 {
1159 2 UIF2 &= ~OUT4F; // User code area
1160 2 }
1161 2 */
1162 2 }
1163 1
1164 1 if (SUSPNDF)
1165 1 {
1166 2 if (RESUMF)
1167 2 {
1168 3 UIE0 |= SUSPENDIE;
1169 3 UIE0 &= ~RESUMEIE;
1170 3 OnUsbResume(); // resume int
1171 3 RESUMF = 0;
C51 COMPILER V7.50 UPSD3400_USB_APP 09/13/2005 18:00:20 PAGE 20
1172 3 SUSPNDF = 0;
1173 3 gbBulkPipeStage = BS_CBW_PHASE;
1174 3 // only for DK3420
1175 3 ET0 = 1; // enable timer 0 interrupt
1176 3 }
1177 2 else
1178 2 {
1179 3 UIE0 |= RESUMEIE;
1180 3 UIE0 &= ~SUSPENDIE;
1181 3 OnUsbSuspend(); // suspend int
1182 3 gbBulkPipeStage = BS_CBW_PHASE;
1183 3 // only for DK3420
1184 3 ET0 = 0; // disable timer 0 interrupt
1185 3 P4_0 = 1; // GREEN LED OFF
1186 3 UPSD_xreg.DATAOUT_D = 255; // RED LED OFF
1187 3 }
1188 2 }
1189 1
1190 1 UCTL &= ~VISIBLE; // Disable USB FIFO mapping in XDATA
1191 1 USB_ISR_Counter++; // USB activity indicator
1192 1
1193 1 }
1194
1195 /* *************************************************************************
1196 *** ***
1197 ** *** End of File *** **
1198 *** ***
1199 ************************************************************************* */
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1675 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 34 10
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -