📄 usb_disk.lst
字号:
167 2 }
168 1 UEPSTAX&=~(RXOUTB0|RXOUTB1|RXSETUP);
169 1 return(i);
170 1 }
171
172 void WriteEp(unsigned char EpNum,unsigned char nLength,unsigned char *Data)
173 {
174 1 unsigned char data i=0;
175 1 UEPNUM=EpNum;
176 1 UEPSTAX|=DIR;
177 1 while(nLength--) UEPDATX=Data[i++];
178 1 UEPSTAX|=TXRDY;
C51 COMPILER V8.02 USB_DISK 08/24/2008 00:08:02 PAGE 4
179 1 while(!(UEPSTAX&TXCMP)) ;
180 1 UEPSTAX&=(~(TXCMP));
181 1 }
182
183
184
185 void Set_Address(unsigned char EpNum)
186 {
187 1 WriteEp(0,0,0);
188 1 USBADDR|=EpNum;
189 1 USBADDR|=FEN;
190 1 USBCON|=FADDEN;
191 1 }
192
193
194 void Get_Descriptor(unsigned char DesType,unsigned char nLength)
195 {
196 1 if(DesType==0x01)
197 1 WriteEp(0,18,Device_Descriptor);
198 1
199 1 else if(DesType==0x02)
200 1 {
201 2 if(nLength==0x09)
202 2 {
203 3 WriteEp(0,9,Configuration_Descriptor_All);
204 3 }
205 2 else if(nLength==0xff)
206 2 {
207 3 WriteEp(0,32,Configuration_Descriptor_All);
208 3 WriteEp(0,2,&Device_Descriptor[4]);
209 3 }
210 2 else if(nLength==0x20)
211 2 {
212 3 WriteEp(0,32,Configuration_Descriptor_All);
213 3 }
214 2 }
215 1 }
216
217 void Set_Configuration(unsigned char wValue)
218 {
219 1 if(wValue == 0)
220 1 {
221 2 UEPNUM=0x00; UEPCONX=0x80;
222 2 UEPNUM=0x01; UEPCONX=0x86;
223 2 UEPNUM=0x02; UEPCONX=0x82;
224 2 USBCON&=(~CONFG);
225 2 WriteEp(0,0,0);
226 2 }
227 1 else if(wValue == 1)
228 1 {
229 2 UEPNUM=0x00; UEPCONX=0x80;
230 2 UEPNUM=0x01; UEPCONX=0x86;
231 2 UEPNUM=0x02; UEPCONX=0x82;
232 2 USBCON|=CONFG;
233 2 WriteEp(0,0,0);
234 2 }
235 1 }
236
237 void Ep0()
238 {
239 1 unsigned char data DT[32]={0,};
240 1 unsigned char data i;
C51 COMPILER V8.02 USB_DISK 08/24/2008 00:08:02 PAGE 5
241 1 i = ReadEp(0,DT);
242 1 if (((DT[0] & 0x60)==0) && i)
243 1 {
244 2 switch (DT[1])
245 2 {
246 3 case set_address :Set_Address(DT[2]); break;
247 3 case get_descriptor :Get_Descriptor(DT[3],DT[6]); break;
248 3 case set_configuration :Set_Configuration(DT[2]); break;
249 3 default :; break;
250 3 }
251 2 }
252 1 else if(DT[0]==0xa1)
253 1 {
254 2 WriteEp(0,0,0);
255 2 }
256 1 }
257
258
259 void WriteEpBulk(unsigned char EpNum,unsigned char nLength,unsigned char *Data)
260 {
261 1 unsigned char data i;
262 1 UEPNUM=EpNum;
263 1 UEPSTAX|=DIR;
264 1 for(i=0;i<nLength;i++) UEPDATX=Data[i];
265 1 UEPSTAX|=TXRDY;
266 1 }
267
268 void TransmitCSW()
269 {
270 1 WriteEpBulk(1, sizeof(bulk_CSW), bulk_CSW);
271 1 while(!(UEPSTAX&TXCMP)) ;
272 1 UEPSTAX&=(~(TXCMP));
273 1 }
274
275 void main_txdone()
276 {
277 1 UEPSTAX&=(~(TXCMP));
278 1 TransmitCSW();
279 1 }
280
281 void SCSI_Mode_Sense()
282 {
283 1 if(bulk_CBW.CBWCB[2] == SCSI_MSPGCD_TPP) //Page Code=Timer and Potect Page
284 1 {WriteEpBulk(1, sizeof(B_Mode_Sense_TPP), B_Mode_Sense_TPP);}
285 1 else if(bulk_CBW.CBWCB[2] == SCSI_MSPGCD_RETALL) //Page Code=All
286 1 {WriteEpBulk(1, sizeof(B_Mode_Sense_ALL), B_Mode_Sense_ALL);}
287 1 else {WriteEpBulk(1, sizeof(B_Mode_Sense_ZERO), B_Mode_Sense_ZERO);}
288 1 }
289
290 void SCSI_Read_Format_Capacities()
291 {
292 1 if(bulk_CBW.CBWCB[7]==0 && bulk_CBW.CBWCB[8]==0)return;
293 1 WriteEpBulk(1, sizeof(B_Read_Format_capacities), B_Read_Format_capacities);
294 1 }
295
296 void SCSI_Read10()
297 {
298 1 unsigned char i;
299 1 union
300 1 {
301 1 unsigned long Block;
302 1 unsigned char Addr[4];
C51 COMPILER V8.02 USB_DISK 08/24/2008 00:08:02 PAGE 6
303 1 }BLK;
304 1 unsigned char length;
305 1
306 1 BLK.Addr[2] = bulk_CBW.CBWCB[4];
307 1 BLK.Addr[3] = bulk_CBW.CBWCB[5];
308 1
309 1 length = bulk_CBW.CBWCB[8];
310 1 while(length>0)
311 1 {
312 2 NfWriteCmd(0x00);
313 2 NfWriteAddr(0);
314 2 NfWriteAddr(BLK.Addr[3]);
315 2 NfWriteAddr(BLK.Addr[2]);
316 2
317 2 UEPNUM=0x01;
318 2 UEPSTAX|=DIR;
319 2 NfWaitBusy();
320 2
321 2 for(i=0;i<4;i++)
322 2 {
323 3 ReadFlash();
324 3 UEPSTAX|=TXRDY;
325 3 while(!(UEPSTAX&TXCMP));
326 3 UEPSTAX&=(~(TXCMP));
327 3 }
328 2 NfWriteCmd(0x01);
329 2 NfWriteAddr(0);
330 2 NfWriteAddr(BLK.Addr[3]);
331 2 NfWriteAddr(BLK.Addr[2]);
332 2
333 2 UEPNUM=0x01;
334 2 UEPSTAX|=DIR;
335 2 NfWaitBusy();
336 2
337 2 for(i=0;i<4;i++)
338 2 {
339 3 ReadFlash();
340 3 UEPSTAX|=TXRDY;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -