⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ide.lst

📁 linux下数据下载器的设计与实现
💻 LST
📖 第 1 页 / 共 2 页
字号:
 238   2            {
 239   3               // relinquish control of the bulk buffer occupied by the CBW
 240   3               OUTPKTEND = 0x82;
 241   3         
 242   3               waitForInBuffer();
 243   3               AUTOPTRL2 = LSB(EP4FIFOBUF);
 244   3      
 245   3               // First two bytes are 0x70 and 0x00
 246   3               P_XAUTODAT2 = 0x70;
 247   3               P_XAUTODAT2 = 0x00;
 248   3      
 249   3               // Clear the rest of the buffer
 250   3               memset16(EP4FIFOBUF+2, 0, 1);
 251   3               P_XAUTODAT2 = senseArray[sensePtr][0];
 252   3      
 253   3               AUTOPTRL2 = 7;
 254   3               P_XAUTODAT2 = 18-8;    // Length of data following this byte
 255   3      
 256   3               AUTOPTRL2 = 12;
 257   3               P_XAUTODAT2 = senseArray[sensePtr][1];
 258   3               P_XAUTODAT2 = senseArray[sensePtr][2];
 259   3      
 260   3               loadEP4BC(18);
 261   3               sensePtr = senseOk;
 262   3               return(USBS_PASSED);
 263   3            }
 264   2      
 265   2            case STOP_START_UNIT:
 266   2               cmd = EP2FIFOBUF[CBW_DATA_START+4];
 267   2               if ((cmd&3)==2) { bEject = 1; }
 268   2      
 269   2            case PREVENT_ALLOW_MEDIUM_REMOVAL:
 270   2               OUTPKTEND = 0x82;
 271   2               
 272   2               return(USBS_PASSED);
 273   2      
 274   2            case MODE_SENSE_06:
 275   2            case MODE_SENSE_10:
 276   2            {               
 277   3               BYTE pagenum;
 278   3               
 279   3               pagenum = EP2FIFOBUF[CBW_DATA_START+2] & 0x3F; // identify page (see p.141 SCSI 2ed.)
 280   3         
 281   3               OUTPKTEND = 0x82;
 282   3               
 283   3               waitForInBuffer();
 284   3               
 285   3               if((pagenum != 0x05) && (pagenum != 0x3F)
 286   3                   && (pagenum != 0x01) && (pagenum != 0x08) && (pagenum != 0x1B))
 287   3               { // only respond to requests for certain pages (the mandatory ones plus page 5)
 288   4                  sensePtr = senseInvalidFieldInCDB;
 289   4                  failedIn();
 290   4                  return(USBS_FAILED);
 291   4               }
 292   3         
 293   3               memset16(EP4FIFOBUF, 0, 128/16);
 294   3               AUTOPTRL2 = LSB(EP4FIFOBUF);
 295   3               if (cmd == MODE_SENSE_10)
 296   3                  {
 297   4                  P_XAUTODAT2 = MSB(0);                  // Byte 0
C51 COMPILER V7.50   IDE                                                                   10/12/2007 17:05:44 PAGE 6   

 298   4                  if (pagenum == 0x3f)
 299   4                     P_XAUTODAT2 = LSB(8-2 + 12*4);      // return 12 bytes for each page (byte 1)
 300   4                  else
 301   4                     P_XAUTODAT2 = LSB(8-2 + 12*1);      // return 12 bytes for each page (byte 1)
 302   4                  P_XAUTODAT2 = 0;                        // Media type (return 0.  Seems to be ignored by the h
             -ost)
 303   4      #ifndef NO_WP
 304   4                  P_XAUTODAT2 = (bWriteProtectEnable && !NAND_WP_SWITCH) ? 0x80 : 0;        // Copy WP bit to th
             -e header (byte 3)
 305   4      #else
                          P_XAUTODAT2 = 0;     
              #endif
 308   4                  AUTOPTRL2 = LSB(EP4FIFOBUF) + 8;     // The rest of the header is zeroes.  Start the pages at 
             -byte 8.     
 309   4                  }
 310   3               else
 311   3                  {
 312   4                  if (pagenum == 0x3f)
 313   4                     P_XAUTODAT2 = LSB(4-1 + 12*4);      // Header is 4 bytes long, data from each page is 12 by
             -tes.
 314   4                  else
 315   4                     P_XAUTODAT2 = LSB(4-1 + 12*1);      
 316   4                  P_XAUTODAT2 = 0;                        // Next byte is 00
 317   4      #ifndef NO_WP
 318   4                  P_XAUTODAT2 = (bWriteProtectEnable && !NAND_WP_SWITCH) ? 0x80 : 0;        // Copy WP bit to th
             -e header (byte 2)
 319   4      #else
                          P_XAUTODAT2 = 0;     
              #endif
 322   4                  AUTOPTRL2 = LSB(EP4FIFOBUF) + 4;          
 323   4                  }
 324   3      
 325   3               if((pagenum == 0x05) || (pagenum == 0x3F))
 326   3                  {  
 327   4                  P_XAUTODAT2 = 5;               // fill out the page num - fields are all 0x0
 328   4                  P_XAUTODAT2 = 12-2;            // set individual Page Length -- return 12 for all commands
 329   4      
 330   4                  if(EZUSB_HIGHSPEED())
 331   4                     {
 332   5                     P_XAUTODAT2 = 0xFF;         // HS Transfer Rate (MSB) (field limited to 65Mb/Sec)
 333   5                     P_XAUTODAT2 = 0xFF;         // HS Transfer Rate (LSB)
 334   5                     }
 335   4                  else
 336   4                     {
 337   5                     P_XAUTODAT2 = 0x2E;         // FS Transfer Rate (MSB) (12Mb/Sec) 
 338   5                     P_XAUTODAT2 = 0xE0;         // FS Transfer Rate (LSB)
 339   5                     }
 340   4                  P_XAUTODAT2 = 0x20;             // #Heads
 341   4                  P_XAUTODAT2 = 0x10;             // #SectorsPerTrack
 342   4                  P_XAUTODAT2 = (NAND_ATA_SECTOR_SIZE >>  8) & 0xff; // Data Bytes per sector (truncated)
 343   4                  P_XAUTODAT2 = (NAND_ATA_SECTOR_SIZE >>  0) & 0xff; // Data Bytes per sector
 344   4                  P_XAUTODAT2 = 0xff;
 345   4                  P_XAUTODAT2 = 0xff;
 346   4                  P_XAUTODAT2 = 0;
 347   4                  P_XAUTODAT2 = 0;
 348   4                  }
 349   3               if(pagenum == 0x1B || pagenum == 0x3f)
 350   3                  {
 351   4                  P_XAUTODAT2 = 0x1b;            // fill out the page num
 352   4                  P_XAUTODAT2 = 12-2;            // set individual Page Length -- return 12 for all commands
 353   4                  P_XAUTODAT2 = 0;
 354   4                  P_XAUTODAT2 = 0x01;            // set TLUN = 1 for page 0x1B
C51 COMPILER V7.50   IDE                                                                   10/12/2007 17:05:44 PAGE 7   

 355   4                  AUTOPTRL2 += 8;              // 8 zeroes too.
 356   4                  }
 357   3               if(pagenum == 0x1 || pagenum == 0x3f)
 358   3                  {
 359   4                  P_XAUTODAT2 = 0x1;             // fill out the page num
 360   4                  P_XAUTODAT2 = 12-2;            // set individual Page Length -- return 12 for all commands
 361   4                  AUTOPTRL2 += 10;              // 10 zeroes too.
 362   4                  }
 363   3      
 364   3               if(pagenum == 0x8 || pagenum == 0x3f)
 365   3                  {
 366   4                  P_XAUTODAT2 = 0x8;             // fill out the page num
 367   4                  P_XAUTODAT2 = 12-2;            // set individual Page Length -- return 12 for all commands
 368   4                  AUTOPTRL2 += 10;              // 10 zeroes too.
 369   4                  }
 370   3      
 371   3               loadEP4BC(AUTOPTRL2);
 372   3               sensePtr = senseOk;
 373   3               return(USBS_PASSED);
 374   3            } // end case
 375   2      
 376   2            ///// OUT commmand
 377   2            ///////////////////////////////////////////////////////////
 378   2            // Spoofed commands
 379   2            case MODE_SELECT_06:    // Note that these are in BOTH the read and write areas in case they are sen
             -t with no data
 380   2            case MODE_SELECT_10:
 381   2            {
 382   3            // relinquish control of the bulk buffer occupied by the CBW
 383   3               OUTPKTEND = 0x82;
 384   3               loadEP2BC();
 385   3               dataTransferLen=0;
 386   3               checkForMedia(1);
 387   3               
 388   3               if (sensePtr == senseOk)
 389   3                  return(USBS_PASSED);
 390   3               else
 391   3                  return(USBS_FAILED);
 392   3            }                
 393   2      
 394   2            default:
 395   2            {
 396   3               // relinquish control of the bulk buffer occupied by the CBW
 397   3               OUTPKTEND = 0x82;        
 398   3               sensePtr = senseInvalidOpcode;
 399   3               if (directionIn)
 400   3                  failedIn();
 401   3               else
 402   3                 stallEP2OUT();
 403   3               return(USBS_FAILED);
 404   3            }
 405   2         }
 406   1      }   
 407          
 408          /////////////////////////////////////////////////////////////////////////////////
 409          //  Wait for IN buffer available from the Host
 410          //////////////////////////////////////////////////////////////////////////////////
 411          void waitForInBuffer()
 412          {
 413   1         while((P_EP4CS & bmEPFULL));   // Wait for an available buffer from the host
 414   1      }   
 415          
C51 COMPILER V7.50   IDE                                                                   10/12/2007 17:05:44 PAGE 8   

 416          
 417          /////////////////////////////////////////////////////////////////////////////////
 418          //
 419          // Called to manually send IN data to the host once the data has already been
 420          // placed in EP4FIFOBUF.  This routine is only called on the last packet sent to 
 421          // the host.  If dataTransferLen is not 0, failedIN() will STALL the IN endpoint.
 422          //
 423          // Input:
 424          //    EP2FIFOBUF -- Contains LBA (Logical block address)
 425          //   
 426          // Output:
 427          //    dataTransferLen -- Reduced by the amount of data sent
 428          //    bShortPacketSent -- Set if a short packet has been sent
 429          //
 430          //////////////////////////////////////////////////////////////////////////////////
 431          void loadEP4BC(WORD dataLen)
 432          {
 433   1         WORD packetLen;
 434   1         bit   bPaddedPacket = 0;
 435   1      
 436   1         packetLen = min((WORD)dataTransferLen, dataLen);
 437   1      
 438   1         // July-12-05: Add support for USBCV
 439   1         // When dataTransferLen==0 just return and ready to send CSW
 440   1         if (packetLen==0) return;
 441   1      
 442   1         if (packetLen || (SHORT_PACKET_BEFORE_STALL))
 443   1         {
 444   2            // pad the really short responses
 445   2            if (dataTransferLen <= wPacketSize)
 446   2            {
 447   3               bPaddedPacket = 1;
 448   3               EP4BCH = MSB(dataTransferLenLSW);
 449   3               EP4BCL = LSB(dataTransferLenLSW);
 450   3            }
 451   2            else         
 452   2            {
 453   3               EP4BCH = MSB(packetLen);
 454   3               EP4BCL = LSB(packetLen);
 455   3            }
 456   2            dataTransferLen -= packetLen;
 457   2         }
 458   1         if (packetLen & (wPacketSize - 1))
 459   1            bShortPacketSent = 1;
 460   1      
 461   1         if (!bPaddedPacket)
 462   1            failedIn();    // This doesn't set status, just STALLs the IN endpoint if needed.      
 463   1      }
 464          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1109    ----
   CONSTANT SIZE    =     42    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      1       4
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       1
   EDATA SIZE       =   ----    ----
   HDATA SIZE       =   ----    ----
   XDATA CONST SIZE =   ----    ----
C51 COMPILER V7.50   IDE                                                                   10/12/2007 17:05:44 PAGE 9   

   FAR CONST SIZE   =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -