📄 read_reg.lst
字号:
952 2 case USB_SETUP_SET_CFG:
953 2 buf[1]=0x09,buf[2]=arg;
954 2 break;
955 2 case USB_SETUP_SET_PORT_PWR:
956 2 case USB_SETUP_PORT_RST:
957 2 buf[0]=0x23,buf[1]=0x03,buf[4]=0x01;
958 2 buf[2]=(type==USB_SETUP_SET_PORT_PWR)?0x08:0x04;
959 2 break;
960 2 case USB_SETUP_CLR_PORT_RST:
961 2 buf[0]=0x23,buf[1]=0x01,buf[2]=0x14,buf[4]=0x01;
962 2 break;
963 2 case USB_SETUP_GET_PORT_STS:
964 2 buf[0]=0xA3,buf[4]=0x01,buf[6]=0x04;
965 2 break;
966 2 case USB_SETUP_GET_MAX_LUN:
967 2 buf[0]=0xA1,buf[1]=0xFE,buf[6]=0x01;
968 2 break;
969 2 default: return RES_ERR;
970 2 }
971 1
972 1
973 1 UH_SET_FIFO_SZ_EACH(0,8);
974 1 UH_FIFO_ROLLBACK_OUT();
975 1 DEV_WriteRegMulti(RH_USB_HOST_BASE_ADDR,8,buf);
976 1 UH_IRQ_EN(UH_IRQ_USB_PKT_DONE);
977 1 UH_Trigger(0xd0); ///PID=SETUP(OUT)
978 1 if(DEV_WaitForIrq(UH_IRQ_USB_PKT_DONE)==0) {return RES_ERR;}
979 1 DEV_WaitMS(50);
980 1
981 1
982 1 UH_FIFO_ROLLBACK_IN();
983 1 dataByteCnt = (USB_SETUP_GET_DEV_DESC_INIT==type)?8:buf[6];
984 1 if(dataByteCnt==0)
985 1 {
C51 COMPILER V6.12 READ_REG 03/13/2007 09:54:33 PAGE 17
986 2 DEV_WriteReg(RH_USB_HOST_BASE_LEN,0);
987 2 UH_SET_FIFO_SZ_EACH(0,0);
988 2 UH_IRQ_EN(UH_IRQ_USB_PKT_DONE);
989 2 UH_Trigger(0x90); ///PID=DATA1(IN)
990 2 res = DEV_WaitForIrq(UH_IRQ_USB_PKT_DONE);
991 2 if((0==res)||(UH_IRQ_FAKE_STALL==res)) {return RES_ERR;}
992 2 }
993 1 else//DATA-IN
994 1 {
995 2 U8 volatile subCnt = gMxPkSzCtr;
996 2 DEV_WriteReg(RH_USB_HOST_BASE_LEN,gMxPkSzCtr);
997 2 DEV_WriteReg(RH_FIFO_SZ_HI,0);
998 2
999 2 while(dataByteCnt>0)
1000 2 {
1001 3 if(dataByteCnt<gMxPkSzCtr) subCnt = dataByteCnt;
1002 3
1003 3 res = DEV_SafeTriggerAndWaitForInPacket(0x90,subCnt,2000);
1004 3 if(res==0) {return RES_ERR;}
1005 3 if(res==UH_IRQ_FAKE_STALL) {return RES_ERR;}
1006 3 DEV_ReadRegMulti(RH_USB_HOST_BASE_ADDR,subCnt,buf);
1007 3 if(0xEC==buf[8]&&0x0A==buf[9]&&USB_SETUP_GET_DEV_DESC==type) break; //Active memory-stick reader
1008 3 dataByteCnt -= subCnt;
1009 3 buf += subCnt;
1010 3 }
1011 2 //UH_FIFO_ROLLBACK();
1012 2
1013 2 //printf("hand shake###########################\n");
1014 2 // Hand Shake transaction
1015 2 DEV_WaitMS(1);
1016 2
1017 2 UH_FIFO_ROLLBACK_OUT();
1018 2 UH_SET_FIFO_SZ_EACH(0,0);
1019 2 UH_IRQ_EN(UH_IRQ_USB_PKT_DONE); //WALTZ俊辑 UH_IRQ_SOF尔 UH_IRQ_WRITE_READY绰 哆绰单
1020 2 //UH_IRQ_USB_PKT_DONE捞 救 哆绰 版快啊 乐菌澜.
1021 2 UH_Trigger(0x10); ///PID=OUT
1022 2 res = DEV_WaitForIrq(UH_IRQ_USB_PKT_DONE|UH_IRQ_WRITE_READY);
1023 2 if((0==res)||(UH_IRQ_FAKE_STALL==res)) {return RES_ERR;}
1024 2 }
1025 1
1026 1 DEV_WriteReg(RH_USB_HOST_BASE_LEN,gMxPkSz);//not "gMxPkSzCtr"
1027 1 enable_debug=0;
1028 1 return RES_OK;
1029 1
1030 1 }
1031
1032
1033
1034
1035 /******************************************************************************
1036 * Chip reset + Mass Storage Device Enumeration + Identify LUNs
1037 * Only Support "BulkOnly Mass Storage"
1038 *
1039 * RETURN:
1040 * RES_OK
1041 * RES_ERR : unknown error
1042 * RES_ERR+1: Device Type Error: Unknown Device
1043 * RES_ERR+2: Device Type Error: CBI type mass storage
1044 * RES_ERR+3: Device Type Error: PTP
1045 ******************************************************************************/
1046
1047 U8 UM_InitMassStorDevice(OUT U8* buf)
C51 COMPILER V6.12 READ_REG 03/13/2007 09:54:33 PAGE 18
1048 {
1049 1 U8 res,i;
1050 1 gEPOUT = 0x10;
1051 1 gDevAddr = 0;
1052 1 gEP = 0xFF;
1053 1
1054 1 //EPRINTF(("\nUM_InitMassStorDevice\n"));
1055 1 if(ISERR(DEV_ResetChip(RST9021_FULL_RESET))) return RES_ERR;
1056 1 for(i=0;i<2;i++) RISC_sleep_cycles(100000); //total 162msec
1057 1
1058 1 if(ISERR(DEV_ResetUsbDevice(200))) return RES_ERR; //reset flash key (12msec) + idle(60msec:PC=30)
1059 1 UH_FIFO_DIR_OUT();
1060 1 DEV_WriteReg(RH_DEV_ADDR,gDevAddr=0);
1061 1 DEV_WriteReg(RH_MASS_ADDR2,0x5A); //mark for validity of the device address
1062 1 gMxPkSz=gMxPkSzCtr=64;
1063 1 DEV_WriteReg(RH_USB_HOST_BASE_LEN,gMxPkSzCtr);
1064 1 UH_SET_FIFO_SZ_EACH(0,8);
1065 1 if(ISERR(USB_ControlTransfer(USB_SETUP_GET_DEV_DESC_INIT,0x40,buf))) {return RES_ERR;}
1066 1 if(ISERR(DEV_ResetUsbDevice(100))) return RES_ERR; //reset flash key (12msec) + idle(30msec:PC=20)
1067 1
1068 1 gMxPkSzCtr = buf[7]; //maximum packet size for control pipe
1069 1 DEV_WriteReg(RH_USB_HOST_BASE_LEN,gMxPkSzCtr);
1070 1
1071 1
1072 1 if(buf[4]==0x09)//if HUB device exists..
1073 1 {
1074 2 ////////////////////////////////////
1075 2 ///HUB CONFIGURATION : Address=4
1076 2 ////////////////////////////////////
1077 2
1078 2 DEV_WriteReg(RH_DEV_ADDR,gDevAddr=0);
1079 2 if(ISERR(USB_ControlTransfer(USB_SETUP_SET_ADDR,UMO_DEFAULT_HUB_ADDRESS,buf))) return RES_ERR;
1080 2 DEV_WriteReg(RH_DEV_ADDR,gDevAddr=UMO_DEFAULT_HUB_ADDRESS);
1081 2
1082 2 if(ISERR(USB_ControlTransfer(USB_SETUP_GET_DEV_DESC,0x12,buf))) return RES_ERR;
1083 2
1084 2 //GET CONFIG-DESCRIPTOR:0xffbyte
1085 2 if(ISERR(USB_ControlTransfer(USB_SETUP_GET_CFG_DESC,0x09,buf))) return RES_ERR;
1086 2 if(buf[2]>0x09){
1087 3 if(ISERR(USB_ControlTransfer(USB_SETUP_GET_CFG_DESC,buf[2],buf))) return RES_ERR;
1088 3 }
1089 2
1090 2 //GET HUB-DESCRIPTOR:9byte
1091 2 /*BUILD_USB_REQUEST(gCBW,0xA0,0x06,0x00,0x00,0x00,0x00,0x47,0x00);//0x47???
1092 2 if(ISERR(USB_ControlTransfer((U8*)gCBW,9,buf))) return RES_ERR;
1093 2 */
1094 2
1095 2 if(ISERR(USB_ControlTransfer(USB_SETUP_SET_CFG,buf[5],buf))) return RES_ERR;
1096 2
1097 2
1098 2 ///////////////////////////
1099 2 /// PORT-1 CONFIGURATOIN
1100 2 ///////////////////////////
1101 2
1102 2 if(ISERR(USB_ControlTransfer(USB_SETUP_SET_PORT_PWR,0,buf))) return RES_ERR;
1103 2
1104 2 //CLEAR-PORT1-CONNECTION:
1105 2 //BUILD_USB_REQUEST(gCBW,0x23,0x01,0x10,0x00,0x01,0x00,0x00,0x00);
1106 2 //if(ISERR(USB_ControlTransfer((U8*)gCBW,0,buf))) return RES_ERR;
1107 2
1108 2 if(ISERR(USB_ControlTransfer(USB_SETUP_PORT_RST,0,buf))) return RES_ERR;
1109 2 DEV_WaitMS(5);//TODO:盔贰绰 牢磐反飘IN阑 扁促妨具...
C51 COMPILER V6.12 READ_REG 03/13/2007 09:54:33 PAGE 19
1110 2
1111 2 if(ISERR(USB_ControlTransfer(USB_SETUP_GET_PORT_STS,0,buf))) return RES_ERR;
1112 2
1113 2 if(ISERR(USB_ControlTransfer(USB_SETUP_CLR_PORT_RST,0,buf))) return RES_ERR; //咯扁辑 粱 坷贰吧覆.
1114 2 DEV_WaitMS(55); //SOF 55俺 沥档..
1115 2 }
1116 1
1117 1 /////////////////////////////////////////////////////
1118 1 // M A N U A L E N U M E R A T I O N
1119 1 /////////////////////////////////////////////////////
1120 1
1121 1 DEV_WriteReg(RH_DEV_ADDR,gDevAddr=0);
1122 1 if(ISERR(USB_ControlTransfer(USB_SETUP_SET_ADDR,UMO_DEFAULT_DEV_ADDRESS,buf))) return RES_ERR;
1123 1 //printf("control5 control5 control5 control5 control5.\n");
1124 1 DEV_WriteReg(RH_DEV_ADDR,gDevAddr=UMO_DEFAULT_DEV_ADDRESS);
1125 1
1126 1 if(ISERR(USB_ControlTransfer(USB_SETUP_GET_DEV_DESC,0x12,buf))) return RES_ERR;
1127 1 //printf("control4 control4 control4 control4 control4.\n");
1128 1 //{
1129 1 // int i;
1130 1 // printf("get12\n");
1131 1 // for(i=0;i<buf[0];i++)
1132 1 // {
1133 1 // printf("%02x ",buf[i]);
1134 1 // }
1135 1 // printf(" \n");
1136 1 //}
1137 1
1138 1
1139 1 gUsbVer = (buf[3]==1)?USB_VER_1X:((buf[3]==2)?USB_VER_2X:USB_VER_UNKNOWN);
1140 1 gVID=(U16)buf[9],gVID=(gVID<<8)+(U16)buf[8];
1141 1 gPID=(U16)buf[11],gPID=(gPID<<8)+(U16)buf[10];
1142 1 if(buf[4]!=0) return RES_ERR;//check if CLASS is defined in Interface-Descriptor
1143 1
1144 1 //GET CONFIG-DESCRIPTOR:0xffbyte
1145 1 if(ISERR(USB_ControlTransfer(USB_SETUP_GET_CFG_DESC,0x09,buf))) return RES_ERR;
1146 1 //printf("control3 control3 control3 control3 control3.\n");
1147 1 //{
1148 1 // int i;
1149 1 // printf("get9\n");
1150 1 // for(i=0;i<buf[0];i++)
1151 1 // {
1152 1 // printf("%02x ",buf[i]);
1153 1 // }
1154 1 // printf(" \n");
1155 1 //}
1156 1 if(buf[2]>0x09){
1157 2 if(ISERR(USB_ControlTransfer(USB_SETUP_GET_CFG_DESC,buf[2],buf))) return RES_ERR;
1158 2 //printf("control2 control2 control2 control2 control2.\n");
1159 2 //{
1160 2 //int i;
1161 2 //printf("get buf[2]\n");
1162 2 //for(i=0;i<buf[0];i++)
1163 2 //{
1164 2 // printf("%02x ",buf[i]);
1165 2 //}
1166 2 //printf(" \n");
1167 2 //}
1168 2 }
1169 1 res = ParseConfigDesc((U8)buf[2],buf);
1170 1 if(ISERR(res)) return res;
1171 1
C51 COMPILER V6.12 READ_REG 03/13/2007 09:54:33 PAGE 20
1172 1 DEV_WaitMS(5);
1173 1 if(ISERR(USB_ControlTransfer(USB_SETUP_SET_CFG,gUsbCfg,buf))) return RES_ERR;
1174 1 //printf("control1 control1 control1 control1 control1.\n");
1175 1
1176 1 /// Enumeration OK!
1177 1
1178 1 gLun = 0;
1179 1 gMaxLun = 0;
1180 1
1181 1 ///initialize SCSI-CBW tag
1182 1 gCBW[0]=0x55,gCBW[1]=0x53,gCBW[2]=0x42,gCBW[3]=0x43;
1183 1 gCBW[4]=0x39,gCBW[5]=0x30,gCBW[6]=0x32,gCBW[7]=0x31;
1184 1
1185 1
1186 1 gInitState = IS_ENUM_OK;
1187 1 //printf("********************************************\n");
1188 1 // printf("********************************************\n");
1189 1 return RES_OK;
1190 1 }
1191
1192
1193
1194 int USB_identify_device()
1195 {
1196 1 //U8 devAddr,res;
1197 1 int i;
1198 1 int ret_code = -1;
1199 1 unsigned char buf[64];
1200 1 ubi9021_hardreset();
1201 1 DEV_WaitMS(6000);
1202 1 gWaitUsbPktMsec = 4000; //4sec
1203 1 gSecAddr=-1;
1204 1 gSecCnt=0;
1205 1
1206 1
1207 1 if(DEV_ReadReg(RH_DEV_ADDR)==UMO_INIT_FAIL_DEV_ADDRESS && DEV_ReadReg(RH_MASS_ADDR2)==UMO_DEVICE_INIT_
-OK) return 0;
1208 1
1209 1 for(i=0;i<100;i++)
1210 1 {
1211 2 DEV_ResetChip(RST9021_FULL_RESET);
1212 2 ret_code = UM_InitMassStorDevice((U8*)buf);
1213 2 if(ISERR(ret_code)){
1214 3 if(DEV_ReadReg(RH_LAST_PKT_STS)==0){ //no response from device
1215 4 DEV_WaitMS(1000); //100msec
1216 4 }
1217 3 continue;
1218 3 }
1219 2
1220 2 ret_code = UM_InitMultiLun((U8*)buf);
1221 2 if(ISERR(ret_code)) continue;
1222 2 break;
1223 2 }
1224 1
1225 1 if (ISERR(ret_code))
1226 1 {
1227 2 DEV_WriteReg(RH_DEV_ADDR,UMO_INIT_FAIL_DEV_ADDRESS);
1228 2 DEV_WriteReg(RH_MASS_ADDR2,UMO_DEVICE_INIT_OK);
1229 2 DEV_WriteReg(RH_CHIP_CTR2,0); //kill SOF
1230 2 return 0 ;
1231 2 }
1232 1
C51 COMPILER V6.12 READ_REG 03/13/2007 09:54:33 PAGE 21
1233 1
1234 1 gWaitUsbPktMsec = 1000; //1msec
1235 1 return 1;
1236 1 }
1237
1238
1239
1240
1241
1242
1243 void main()
1244 {
1245 1 IO_IRQ_READY;
1246 1 IO_PLUGIN_READY;
1247 1 USB_identify_device();
1248 1 USB_boot_setup();
1249 1 //USB_read_sector_lba();
1250 1 while(1);
1251 1
1252 1 }
1253
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 4441 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 15 ----
PDATA SIZE = 16 127
DATA SIZE = ---- ----
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 + -