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

📄 diskmain.cod

📁 PXA270的BSP
💻 COD
📖 第 1 页 / 共 5 页
字号:
  00040	e3a03000	 mov         r3, #0
  00044	e3a02e19	 mov         r2, #0x19, 28
  00048	e3a01003	 mov         r1, #3
  0004c	e1a00005	 mov         r0, r5
  00050	eb000000	 bl          |?WaitForDisc@CDisk@@QAAHEKK@Z|

; 200  :     
; 201  :     if (bSoftReset) {

  00054	e3540000	 cmp         r4, #0
  00058	0a000002	 beq         |$L32818|

; 202  :         DEBUGMSG( ZONE_INIT, (TEXT("ATAPI:ResetController ...performing soft reset !\r\n")));
; 203  :         AtapiSoftReset();

  0005c	e1a00005	 mov         r0, r5
  00060	eb000000	 bl          |?AtapiSoftReset@CDisk@@QAAXXZ|

; 204  :     } else {

  00064	ea000008	 b           |$L33599|
  00068		 |$L32818|

; 205  :         StallExecution(5000);

  00068	e5953004	 ldr         r3, [r5, #4]
  0006c	e3130301	 tst         r3, #1, 6
  00070	0a000002	 beq         |$L33598|
  00074	e3a00032	 mov         r0, #0x32
  00078	eb000000	 bl          Sleep
  0007c	ea000002	 b           |$L33599|
  00080		 |$L33598|
  00080	e3a00cc3	 mov         r0, #0xC3, 24
  00084	e3800050	 orr         r0, r0, #0x50
  00088	eb000000	 bl          StallExecution
  0008c		 |$L33599|

; 206  :     }    
; 207  : 
; 208  :     for (dwAttempts = 0; dwAttempts < MAX_RESET_ATTEMPTS; dwAttempts++)

  0008c	e3a04000	 mov         r4, #0
  00090		 |$L32821|

; 209  :     {
; 210  :         bStatus = GetBaseStatus();

  00090	e59f0094	 ldr         r0, [pc, #0x94]
  00094	eb000000	 bl          READ_PORT_UCHAR

; 211  :         
; 212  :         if ((bStatus != ATA_STATUS_IDLE) && (bStatus != 0x0))

  00098	e3500050	 cmp         r0, #0x50
  0009c	0a00001a	 beq         |$L32827|
  000a0	e3500000	 cmp         r0, #0
  000a4	0a000018	 beq         |$L32827|

; 213  :         {
; 214  :             DEBUGMSG( ZONE_INIT, (TEXT("ATAPI::ResetController: Current drive status = 0x%2.2X\r\n"), bStatus));
; 215  :             
; 216  :             if (bStatus == 0xFF)

  000a8	e35000ff	 cmp         r0, #0xFF
  000ac	1a00000a	 bne         |$L32829|

; 217  :             {
; 218  :                 SetDriveHead( ATA_HEAD_DRIVE_2);

  000b0	e59f0078	 ldr         r0, [pc, #0x78]
  000b4	e3a010b0	 mov         r1, #0xB0
  000b8	eb000000	 bl          WRITE_PORT_UCHAR

; 219  :                 
; 220  :                 bStatus = GetBaseStatus();

  000bc	e59f0068	 ldr         r0, [pc, #0x68]
  000c0	eb000000	 bl          READ_PORT_UCHAR

; 221  :                 
; 222  :                 if ((bStatus != ATA_STATUS_IDLE) && (bStatus != 0x0))

  000c4	e3500050	 cmp         r0, #0x50
  000c8	0a00000f	 beq         |$L32827|
  000cc	e3500000	 cmp         r0, #0
  000d0	0a00000d	 beq         |$L32827|

; 223  :                 {
; 224  :                     DEBUGMSG(ZONE_INIT, (TEXT("ATAPI::ResetController Drive 2 status = 0x%2.2X\r\n"), bStatus));
; 225  :                     
; 226  :                     if (bStatus == 0xFF)

  000d4	e35000ff	 cmp         r0, #0xFF
  000d8	0a00000d	 beq         |$L33618|
  000dc		 |$L32829|

; 227  :                     {
; 228  :                         DEBUGMSG(ZONE_INIT, (TEXT("ATAPI::ResetController no second device\r\n")));
; 229  :                         return FALSE;
; 230  :                     }
; 231  :                 }
; 232  :                 else
; 233  :                 {
; 234  :                     break;
; 235  :                 }
; 236  :             }
; 237  :             StallExecution(5000);

  000dc	e5953004	 ldr         r3, [r5, #4]
  000e0	e3130301	 tst         r3, #1, 6
  000e4	0a000002	 beq         |$L33614|
  000e8	e3a00032	 mov         r0, #0x32
  000ec	eb000000	 bl          Sleep
  000f0	ea000002	 b           |$L32822|
  000f4		 |$L33614|
  000f4	e3a00cc3	 mov         r0, #0xC3, 24
  000f8	e3800050	 orr         r0, r0, #0x50
  000fc	eb000000	 bl          StallExecution
  00100		 |$L32822|
  00100	e2844001	 add         r4, r4, #1
  00104	e354000a	 cmp         r4, #0xA
  00108	3affffe0	 bcc         |$L32821|
  0010c		 |$L32827|

; 238  :         } else {
; 239  :             break;
; 240  :         }
; 241  :     }
; 242  :     if (dwAttempts == MAX_RESET_ATTEMPTS)

  0010c	e354000a	 cmp         r4, #0xA
  00110	1a000002	 bne         |$L32833|
  00114		 |$L33618|

; 243  :     {
; 244  :         DEBUGMSG( ZONE_INIT, (TEXT("ATAPIPCI:AtaResetController no response after %ld reset attempts\r\n"), MAX_RESET_ATTEMPTS));
; 245  :         return FALSE;

  00114	e3a00000	 mov         r0, #0

; 249  : }      

  00118	e8bd4030	 ldmia       sp!, {r4, r5, lr}
  0011c	e12fff1e	 bx          lr
  00120		 |$L32833|

; 246  :     }
; 247  :     DEBUGMSG( ZONE_INIT, (TEXT("ATAPI:ResetController: Controller reset done\r\n")));
; 248  :     return TRUE;

  00120	e3a00001	 mov         r0, #1

; 249  : }      

  00124	e8bd4030	 ldmia       sp!, {r4, r5, lr}
  00128	e12fff1e	 bx          lr
  0012c		 |$L33632|
  0012c	b6a000e0	 DCD         0xb6a000e0
  00130	b6a000c0	 DCD         0xb6a000c0
  00134	b6b000c0	 DCD         0xb6b000c0
  00138		 |$M33628|

			 ENDP  ; |?ResetController@CDisk@@QAAHH@Z|, CDisk::ResetController

	EXPORT	|?AnalyzeDeviceCapabilities@CDisk@@QAAXXZ| ; CDisk::AnalyzeDeviceCapabilities

  00000			 AREA	 |.text| { |?AnalyzeDeviceCapabilities@CDisk@@QAAXXZ| }, CODE, ARM, SELECTION=1 ; comdat noduplicate

  00000			 AREA	 |.pdata$$?AnalyzeDeviceCapabilities@CDisk@@QAAXXZ|, PDATA, SELECTION=5, ASSOC=|.text| { |?AnalyzeDeviceCapabilities@CDisk@@QAAXXZ| } ; comdat associative
|$T33650| DCD	|$L33649|
	DCD	0x4000ae01
; Function compile flags: /Ogsy

  00000			 AREA	 |.text| { |?AnalyzeDeviceCapabilities@CDisk@@QAAXXZ| }, CODE, ARM, SELECTION=1 ; comdat noduplicate

  00000		 |?AnalyzeDeviceCapabilities@CDisk@@QAAXXZ| PROC ; CDisk::AnalyzeDeviceCapabilities

; 447  : {

  00000		 |$L33649|
  00000	e92d41f0	 stmdb       sp!, {r4 - r8, lr}
  00004		 |$M33647|

; 448  : 
; 449  :     DWORD dwCycleTime;
; 450  :     DWORD dwXferMode;
; 451  :     DWORD dwBestXferMode;
; 452  :     DWORD dwCurrentMode;
; 453  :     BOOL   fIoReadyEnabled;
; 454  : 
; 455  :     //
; 456  :     // Figure out who can do DMA and who cannot
; 457  :     //
; 458  :    
; 459  :     if (m_dwDeviceFlags & DFLAGS_DEVICE_PRESENT) {

  00004	e5903004	 ldr         r3, [r0, #4]
  00008	e3130001	 tst         r3, #1
  0000c	0a0000a7	 beq         |$L32904|

; 460  : 
; 461  :         //
; 462  :         // check LBA capabilities
; 463  :         //
; 464  :         //CLRMASK (m_dwDeviceFlags, DFLAGS_LBA);
; 465  : 
; 466  :         dwXferMode  = 0;
; 467  :         dwCycleTime = UNINITIALIZED_CYCLE_TIME;
; 468  :         dwBestXferMode = 0;
; 469  : 
; 470  :         //
; 471  :         // check for IoReady Line
; 472  :         //
; 473  :         if (m_Id.Capabilities & IDENTIFY_CAPABILITIES_IOREADY_SUPPORTED) {

  00010	e5d024a6	 ldrb        r2, [r0, #0x4A6]
  00014	e5d034a7	 ldrb        r3, [r0, #0x4A7]
  00018	e1823403	 orr         r3, r2, r3, lsl #8

; 474  : 
; 475  :             fIoReadyEnabled = TRUE;
; 476  : 
; 477  :         } else {
; 478  : 
; 479  :             fIoReadyEnabled = FALSE;
; 480  :         }
; 481  : 
; 482  :         //
; 483  :         // Check for PIO mode
; 484  :         //
; 485  :         if ((m_Id.MinimumPIOxferTimeWOFlow & 0x00ff) == 2) {

  0001c	e5d024ca	 ldrb        r2, [r0, #0x4CA]
  00020	e3130b02	 tst         r3, #2, 22
  00024	e5d034cb	 ldrb        r3, [r0, #0x4CB]
  00028	13a05001	 movne       r5, #1
  0002c	03a05000	 moveq       r5, #0
  00030	e1826403	 orr         r6, r2, r3, lsl #8
  00034	e1a03806	 mov         r3, r6, lsl #16
  00038	e1a03823	 mov         r3, r3, lsr #16
  0003c	e20330ff	 and         r3, r3, #0xFF
  00040	e3530002	 cmp         r3, #2

; 486  : 
; 487  :             dwCycleTime = PIO_MODE2_CYCLE_TIME;

  00044	03a040f0	 moveq       r4, #0xF0

; 488  :             dwXferMode |= PIO_MODE2 | PIO_MODE1 | PIO_MODE0;

  00048	03a01007	 moveq       r1, #7

; 489  :             dwBestXferMode = 2;

  0004c	03a0e002	 moveq       lr, #2
  00050	0a000007	 beq         |$L32910|

; 490  :             dwCurrentMode = PIO_MODE2;
; 491  : 
; 492  :         } else if ((m_Id.MinimumPIOxferTimeWOFlow & 0x00ff) == 1) {

  00054	e3530001	 cmp         r3, #1

; 493  : 
; 494  :             dwCycleTime = PIO_MODE1_CYCLE_TIME;

  00058	03a04f5f	 moveq       r4, #0x5F, 30

; 495  :             dwXferMode |= PIO_MODE1 | PIO_MODE0;
; 496  :             dwBestXferMode = 1;

  0005c	03a0e001	 moveq       lr, #1
  00060	03844003	 orreq       r4, r4, #3
  00064	03a01003	 moveq       r1, #3

; 497  :             dwCurrentMode = PIO_MODE1;
; 498  : 
; 499  :         } else {
; 500  : 
; 501  :             dwCycleTime = PIO_MODE0_CYCLE_TIME;

  00068	13a04f96	 movne       r4, #0x96, 30

; 502  :             dwXferMode |= PIO_MODE0;

  0006c	13a01001	 movne       r1, #1

; 503  :             dwBestXferMode = 0;

  00070	13a0e000	 movne       lr, #0
  00074		 |$L32910|

; 504  :             dwCurrentMode = PIO_MODE0;
; 505  :         }
; 506  : 
; 507  :         DEBUGMSG( ZONE_INIT, (TEXT("ATAPI:AnalyzeDeviceCapabilities target %d IdentifyData PioCycleTimingMode (highest pio mode) = 0x%x\r\n"),
; 508  :                      m_dwDevice,
; 509  :                      m_Id.MinimumPIOxferTimeWOFlow));
; 510  : 
; 511  :         if (m_Id.TranslationFieldsValid & (1 << 1)) {

  00074	e5d024ae	 ldrb        r2, [r0, #0x4AE]
  00078	e5d034af	 ldrb        r3, [r0, #0x4AF]
  0007c	e1828403	 orr         r8, r2, r3, lsl #8
  00080	e1a03808	 mov         r3, r8, lsl #16
  00084	e1a03823	 mov         r3, r3, lsr #16
  00088	e2137002	 ands        r7, r3, #2
  0008c	0a00000b	 beq         |$L32916|

; 512  : 
; 513  :             if (fIoReadyEnabled) {

  00090	e3550000	 cmp         r5, #0

; 514  :                 dwCycleTime = m_Id.MinimumPIOxferTimeIORDYFlow;

  00094	15d024cc	 ldrneb      r2, [r0, #0x4CC]
  00098	15d034cd	 ldrneb      r3, [r0, #0x4CD]
  0009c	11824403	 orrne       r4, r2, r3, lsl #8

; 515  :             } else {
; 516  :                 dwCycleTime = m_Id.MinimumPIOxferTimeWOFlow;
; 517  :             }
; 518  : 
; 519  :             if (m_Id.AdvancedPIOxferreserved & (1 << 0)) {

  000a0	e5d034c4	 ldrb        r3, [r0, #0x4C4]
  000a4	01a04006	 moveq       r4, r6
  000a8	e3130001	 tst         r3, #1

; 520  :                 dwXferMode |= PIO_MODE3;

  000ac	13811008	 orrne       r1, r1, #8

; 521  :                 dwBestXferMode = 3;

  000b0	13a0e003	 movne       lr, #3

; 522  :                 dwCurrentMode = PIO_MODE3;
; 523  :             }
; 524  : 
; 525  :             if (m_Id.AdvancedPIOxferreserved & (1 << 1)) {

  000b4	e3130002	 tst         r3, #2

; 526  :                 dwXferMode |= PIO_MODE4;

  000b8	13811010	 orrne       r1, r1, #0x10

; 527  :                 dwBestXferMode = 4;

  000bc	13a0e004	 movne       lr, #4
  000c0		 |$L32916|

; 528  :                 dwCurrentMode = PIO_MODE4;
; 529  :             }
; 530  : 
; 531  :             DEBUGMSG( ZONE_INIT, (TEXT("ATAPI:AnalyzeDeviceCapabilities target %d IdentifyData AdvancedPIOModes = 0x%x\r\n"),
; 532  :                          m_dwDevice,
; 533  :                          m_Id.AdvancedPIOxferreserved));
; 534  :         }
; 535  : 
; 536  :         ASSERT (dwCycleTime != UNINITIALIZED_CYCLE_TIME);
; 537  :         ASSERT (dwXferMode);
; 538  :         ASSERT (dwCurrentMode);
; 539  :         
; 540  :         m_dwBestPioCycleTime      = dwCycleTime;
; 541  :         m_dwBestPioMode           = dwBestXferMode;
; 542  : 
; 543  :         //

⌨️ 快捷键说明

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