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

📄 cdio.cod

📁 PXA270的BSP
💻 COD
📖 第 1 页 / 共 5 页
字号:
; 176  :     Byte 1 - N/A
; 177  :     Byte 2 - Logical Block (MSB)
; 178  :     Byte 2 - Logical Block 
; 179  :     Byte 2 - Logical Block 
; 180  :     Byte 2 - Logical Block (LSB)
; 181  :     Byte 6 - Reserved
; 182  :     Byte 7 - DataLength (MSB)
; 183  :     Byte 8 - DataLength (LSB)
; 184  :     Byte 9 - Control Byte
; 185  :     ****** Atapi Packet ****/
; 186  :     pCmdPkt->Byte_1 = 0x00;
; 187  :     pCmdPkt->Byte_2 = LBA_MSB(&dwLBAAddr);
; 188  :     pCmdPkt->Byte_3 = LBA_3rdLSB(&dwLBAAddr);
; 189  :     pCmdPkt->Byte_4 = LBA_2ndLSB(&dwLBAAddr);

  0002c	e5dde021	 ldrb        lr, [sp, #0x21]
  00030	e5dd2023	 ldrb        r2, [sp, #0x23]
  00034	e5dd0022	 ldrb        r0, [sp, #0x22]

; 190  :     pCmdPkt->Byte_5 = LBA_LSB(&dwLBAAddr);

  00038	e5dd4020	 ldrb        r4, [sp, #0x20]
  0003c	e3a09000	 mov         r9, #0
  00040	e5c6e004	 strb        lr, [r6, #4]
  00044	e5c62002	 strb        r2, [r6, #2]
  00048	e5c60003	 strb        r0, [r6, #3]
  0004c	e5c64005	 strb        r4, [r6, #5]
  00050	e5c69001	 strb        r9, [r6, #1]

; 191  :     if (fIsDVD && !bRawMode) {

  00054	e3150040	 tst         r5, #0x40
  00058	0a00000b	 beq         |$L32872|
  0005c	e3580000	 cmp         r8, #0
  00060	1a00000b	 bne         |$L33590|

; 192  :         pCmdPkt->Opcode = ATAPI_PACKET_CMD_READ_12;

  00064	e3a000a8	 mov         r0, #0xA8

; 193  :         pCmdPkt->Byte_6 = (BYTE)( dwTransferLength >> 24);

  00068	e1a03c27	 mov         r3, r7, lsr #24

; 194  :         pCmdPkt->Byte_7 = (BYTE)( (dwTransferLength & 0x00ff0000) >> 16);

  0006c	e1a02827	 mov         r2, r7, lsr #16

; 195  :         pCmdPkt->Byte_8 = (BYTE)( (dwTransferLength & 0x0000ff00) >> 8);

  00070	e1a01427	 mov         r1, r7, lsr #8
  00074	e5c60000	 strb        r0, [r6]
  00078	e5c63006	 strb        r3, [r6, #6]
  0007c	e5c62007	 strb        r2, [r6, #7]
  00080	e5c61008	 strb        r1, [r6, #8]

; 196  :         pCmdPkt->Byte_9 = (BYTE)( dwTransferLength);

  00084	e5c67009	 strb        r7, [r6, #9]

; 197  :     } else {

  00088	ea00000b	 b           |$L32877|
  0008c		 |$L32872|

; 198  :         pCmdPkt->Opcode = bRawMode ? ATAPI_PACKET_CMD_READ_CD : ATAPI_PACKET_CMD_READ;

  0008c	e3580000	 cmp         r8, #0
  00090	0a000001	 beq         |$L33588|
  00094		 |$L33590|
  00094	e3a020be	 mov         r2, #0xBE
  00098	ea000000	 b           |$L33589|
  0009c		 |$L33588|
  0009c	e3a02028	 mov         r2, #0x28
  000a0		 |$L33589|

; 199  :         pCmdPkt->Byte_6 = 0x00; // Reserved
; 200  :         pCmdPkt->Byte_7 = (BYTE)( (dwTransferLength & 0x0000ff00) >> 8);

  000a0	e1a03427	 mov         r3, r7, lsr #8

; 201  :         pCmdPkt->Byte_8 = (BYTE)( dwTransferLength);
; 202  :         pCmdPkt->Byte_9 = 0x10;

  000a4	e3a01010	 mov         r1, #0x10
  000a8	e5c63007	 strb        r3, [r6, #7]
  000ac	e5c61009	 strb        r1, [r6, #9]
  000b0	e5c62000	 strb        r2, [r6]
  000b4	e5c69006	 strb        r9, [r6, #6]
  000b8	e5c67008	 strb        r7, [r6, #8]
  000bc		 |$L32877|

; 203  :     }
; 204  : 
; 205  :     pCmdPkt->Byte_10 = 0;          

  000bc	e5c6900a	 strb        r9, [r6, #0xA]

; 206  :     return ERROR_SUCCESS;

  000c0	e3a00000	 mov         r0, #0

; 207  : }

  000c4	e89d63f0	 ldmia       sp, {r4 - r9, sp, lr}
  000c8	e12fff1e	 bx          lr
  000cc		 |$M33600|

			 ENDP  ; |?SetupCdRomRead@CDisk@@QAAKHKKPAU_ATAPI_COMMAND_PACKET@@@Z|, CDisk::SetupCdRomRead

	EXPORT	|?AtapiSendCommand@CDisk@@QAAHPAU_ATAPI_COMMAND_PACKET@@GH@Z| ; CDisk::AtapiSendCommand
	IMPORT	|?WaitOnBusy@CDisk@@QAAEH@Z|		; CDisk::WaitOnBusy
	IMPORT	|?WaitForDRQ@CDisk@@QAAHXZ|		; CDisk::WaitForDRQ
	IMPORT	|?WaitForDisc@CDisk@@QAAHEKK@Z|		; CDisk::WaitForDisc
; File d:\wince500\platform\bvdmain\drivers\atapi\diskmain.h

  00000			 AREA	 |.text| { |?AtapiSendCommand@CDisk@@QAAHPAU_ATAPI_COMMAND_PACKET@@GH@Z| }, CODE, ARM, SELECTION=1 ; comdat noduplicate

  00000			 AREA	 |.pdata$$?AtapiSendCommand@CDisk@@QAAHPAU_ATAPI_COMMAND_PACKET@@GH@Z|, PDATA, SELECTION=5, ASSOC=|.text| { |?AtapiSendCommand@CDisk@@QAAHPAU_ATAPI_COMMAND_PACKET@@GH@Z| } ; comdat associative
|$T33687| DCD	|$L33686|
	DCD	0x40007e01
; Function compile flags: /Ogsy
; File d:\wince500\platform\bvdmain\drivers\atapi\cdio.cpp

  00000			 AREA	 |.text| { |?AtapiSendCommand@CDisk@@QAAHPAU_ATAPI_COMMAND_PACKET@@GH@Z| }, CODE, ARM, SELECTION=1 ; comdat noduplicate

  00000		 |?AtapiSendCommand@CDisk@@QAAHPAU_ATAPI_COMMAND_PACKET@@GH@Z| PROC ; CDisk::AtapiSendCommand

; 403  : {

  00000		 |$L33686|
  00000	e92d40f0	 stmdb       sp!, {r4 - r7, lr}
  00004		 |$M33684|
  00004	e1a06003	 mov         r6, r3
  00008	e1a05002	 mov         r5, r2
  0000c	e1a07001	 mov         r7, r1
  00010	e1a04000	 mov         r4, r0

; 404  :     // Set the Drive/Head registers 
; 405  :     SelectDevice();

  00014	e594e64c	 ldr         lr, [r4, #0x64C]
  00018	e59f01c4	 ldr         r0, [pc, #0x1C4]
  0001c	e35e0000	 cmp         lr, #0
  00020	03a0e0a0	 moveq       lr, #0xA0
  00024	13a0e0b0	 movne       lr, #0xB0
  00028	e20e10ff	 and         r1, lr, #0xFF
  0002c	eb000000	 bl          WRITE_PORT_UCHAR

; 406  :     GetBaseStatus();

  00030	e59f01a8	 ldr         r0, [pc, #0x1A8]
  00034	eb000000	 bl          READ_PORT_UCHAR

; 407  : 
; 408  :     SelectDevice();

  00038	e594364c	 ldr         r3, [r4, #0x64C]
  0003c	e59f01a0	 ldr         r0, [pc, #0x1A0]
  00040	e3530000	 cmp         r3, #0
  00044	03a030a0	 moveq       r3, #0xA0
  00048	13a030b0	 movne       r3, #0xB0
  0004c	e20310ff	 and         r1, r3, #0xFF
  00050	eb000000	 bl          WRITE_PORT_UCHAR

; 409  :      if (WaitOnBusy(FALSE))

  00054	e3a01000	 mov         r1, #0
  00058	e1a00004	 mov         r0, r4
  0005c	eb000000	 bl          |?WaitOnBusy@CDisk@@QAAEH@Z|
  00060	e3500000	 cmp         r0, #0
  00064	0a000004	 beq         |$L32963|

; 410  :      {  
; 411  :          if (GetError() & ATA_STATUS_ERROR)

  00068	e3a00183	 mov         r0, #0x83, 2
  0006c	e2400696	 sub         r0, r0, #0x96, 12
  00070	eb000000	 bl          READ_PORT_UCHAR
  00074	e3100001	 tst         r0, #1

; 412  :          {      
; 413  :             return FALSE;

  00078	1a000043	 bne         |$L33683|
  0007c		 |$L32963|

; 414  :          }
; 415  :      }
; 416  : 
; 417  :     WriteSectorCount(0);

  0007c	e59f0170	 ldr         r0, [pc, #0x170]
  00080	e3a01000	 mov         r1, #0
  00084	eb000000	 bl          WRITE_PORT_UCHAR

; 418  :     
; 419  :     WriteSectorNumber(0);

  00088	e59f0160	 ldr         r0, [pc, #0x160]
  0008c	e3a01000	 mov         r1, #0
  00090	eb000000	 bl          WRITE_PORT_UCHAR

; 420  : 
; 421  : 
; 422  :     // Set the byte tranfer count       
; 423  :     if (wCount) {
; 424  :         WriteLowCount((BYTE)(0xff & wCount));

  00094	e59f0150	 ldr         r0, [pc, #0x150]
  00098	e3550000	 cmp         r5, #0
  0009c	0a000004	 beq         |$L32964|
  000a0	e20510ff	 and         r1, r5, #0xFF
  000a4	eb000000	 bl          WRITE_PORT_UCHAR

; 425  :         WriteHighCount((BYTE)(0xff & (wCount >> 8)));    

  000a8	e1a03425	 mov         r3, r5, lsr #8
  000ac	e20310ff	 and         r1, r3, #0xFF

; 426  :     } else {

  000b0	ea000002	 b           |$L33682|
  000b4		 |$L32964|

; 427  :         WriteLowCount(0xFE);

  000b4	e3a010fe	 mov         r1, #0xFE
  000b8	eb000000	 bl          WRITE_PORT_UCHAR

; 428  :         WriteHighCount(0xFF);    

  000bc	e3a010ff	 mov         r1, #0xFF
  000c0		 |$L33682|
  000c0	e59f0120	 ldr         r0, [pc, #0x120]
  000c4	eb000000	 bl          WRITE_PORT_UCHAR

; 429  :     }
; 430  : 
; 431  :     
; 432  :     // 
; 433  :     // Set PIO or DMA Mode as specified in bFlags. 0 = PIO, 1 = DMA
; 434  :     //
; 435  :     WriteFeature(fDMA ? 0x1 : 0x0);

  000c8	e3560000	 cmp         r6, #0
  000cc	13a03001	 movne       r3, #1
  000d0	03a03000	 moveq       r3, #0
  000d4	e3a00183	 mov         r0, #0x83, 2
  000d8	e20310ff	 and         r1, r3, #0xFF
  000dc	e2400696	 sub         r0, r0, #0x96, 12
  000e0	eb000000	 bl          WRITE_PORT_UCHAR

; 436  : 
; 437  :     WaitForDisc( WAIT_TYPE_NOT_BUSY, 20);

  000e4	e3a03000	 mov         r3, #0
  000e8	e3a02014	 mov         r2, #0x14
  000ec	e3a01002	 mov         r1, #2
  000f0	e1a00004	 mov         r0, r4
  000f4	eb000000	 bl          |?WaitForDisc@CDisk@@QAAHEKK@Z|

; 438  : 
; 439  :     // Write ATAPI into  command register
; 440  : 
; 441  :     SelectDevice();

  000f8	e594364c	 ldr         r3, [r4, #0x64C]
  000fc	e59f00e0	 ldr         r0, [pc, #0xE0]
  00100	e3530000	 cmp         r3, #0
  00104	03a030a0	 moveq       r3, #0xA0
  00108	13a030b0	 movne       r3, #0xB0
  0010c	e20310ff	 and         r1, r3, #0xFF
  00110	eb000000	 bl          WRITE_PORT_UCHAR

; 442  :     
; 443  :     WriteCommand(ATAPI_CMD_COMMAND); 

  00114	e59f00c4	 ldr         r0, [pc, #0xC4]
  00118	e3a010a0	 mov         r1, #0xA0
  0011c	eb000000	 bl          WRITE_PORT_UCHAR

; 444  : 
; 445  :     WaitForDisc( WAIT_TYPE_NOT_BUSY, 20);

  00120	e3a03000	 mov         r3, #0
  00124	e3a02014	 mov         r2, #0x14
  00128	e3a01002	 mov         r1, #2
  0012c	e1a00004	 mov         r0, r4
  00130	eb000000	 bl          |?WaitForDisc@CDisk@@QAAHEKK@Z|

; 446  :     //
; 447  :     // Check how device is reporting CPU attention: DRQ or INTRQ?
; 448  :     // INTRQ within 10 ms!!!
; 449  :     //  
; 450  :     if (m_fInterruptSupported && IsDRQTypeIRQ())

  00134	e5943684	 ldr         r3, [r4, #0x684]
  00138	e3530000	 cmp         r3, #0
  0013c	0a00000e	 beq         |$L32969|
  00140	e5d42444	 ldrb        r2, [r4, #0x444]
  00144	e5d43445	 ldrb        r3, [r4, #0x445]
  00148	e1823403	 orr         r3, r2, r3, lsl #8
  0014c	e2033060	 and         r3, r3, #0x60
  00150	e3530020	 cmp         r3, #0x20
  00154	1a000008	 bne         |$L32969|

; 451  :     {   
; 452  :         //  ATA_INTR_CMD is expected
; 453  :         //
; 454  :         if (!WaitForInterrupt(DISK_IO_TIME_OUT))

  00158	e5943000	 ldr         r3, [r4]
  0015c	e3a01c4e	 mov         r1, #0x4E, 24
  00160	e3811020	 orr         r1, r1, #0x20
  00164	e5933014	 ldr         r3, [r3, #0x14]
  00168	e1a00004	 mov         r0, r4
  0016c	e1a0e00f	 mov         lr, pc
  00170	e12fff13	 bx          r3
  00174	e3500000	 cmp         r0, #0

; 455  :         {
; 456  :             DEBUGMSG( ZONE_IO | ZONE_CDROM, (TEXT("ATAPI:AtapiSendCommand - Wait for ATA_INTR_CMD Interrupt (DevId %x) \r\n"), m_dwDeviceId));
; 457  :             return FALSE;  

  00178	0a000003	 beq         |$L33683|
  0017c		 |$L32969|

; 458  :         }   
; 459  :     }
; 460  :     // 
; 461  :     // Device will assert DRQ  within (50us or 3ms) if no interrupt id used
; 462  :     // Wait for not BSY and DRQ
; 463  :             
; 464  : 
; 465  :     if (!WaitForDRQ())

  0017c	e1a00004	 mov         r0, r4
  00180	eb000000	 bl          |?WaitForDRQ@CDisk@@QAAHXZ|
  00184	e3500000	 cmp         r0, #0
  00188	1a000002	 bne         |$L32971|
  0018c		 |$L33683|

; 466  :     {
; 467  :         DEBUGMSG( ZONE_IO | ZONE_CDROM, (TEXT("ATAPIPCI:AtapiSendCommand 1 - ATAWaitForDisc failed with: %x (DevId %x)\r\n"), GetError(), m_dwDeviceId));
; 468  :         return FALSE;

  0018c	e3a00000	 mov         r0, #0

; 477  : }

  00190	e8bd40f0	 ldmia       sp!, {r4 - r7, lr}
  00194	e12fff1e	 bx          lr
  00198		 |$L32971|

; 469  :         
; 470  :     }
; 471  :         
; 472  :     // Write the ATAPI Command Packet.
; 473  : 
; 474  :     WriteWordBuffer( (LPWORD)pCmdPkt,GetPacketSize()/sizeof(WORD));

  00198	e5d42444	 ldrb        r2, [r4, #0x444]
  0019c	e5d43445	 ldrb        r3, [r4, #0x445]
  001a0	e1a01007	 mov         r1, r7
  001a4	e1a00004	 mov         r0, r4
  001a8	e1823403	 orr         r3, r2, r3, lsl #8
  001ac	e3130003	 tst         r3, #3
  001b0	13a02010	 movne       r2, #0x10
  001b4	03a0200c	 moveq       r2, #0xC
  001b8	e5943000	 ldr         r3, [r4]
  001bc	e1a02802	 mov         r2, r2, lsl #16
  001c0	e1a02822	 mov         r2, r2, lsr #16
  001c4	e593303c	 ldr         r3, [r3, #0x3C]
  001c8	e1a020a2	 mov         r2, r2, lsr #1
  001cc	e1a0e00f	 mov         lr, pc
  001d0	e12fff13	 bx          r3

; 475  : 
; 476  :     return TRUE;

  001d4	e3a00001	 mov         r0, #1

; 477  : }

⌨️ 快捷键说明

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