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

📄 ide.cod

📁 EP9315的BSP包(WINCE下的BSP,内有各种驱动的详细的代码)
💻 COD
📖 第 1 页 / 共 4 页
字号:

; 160  :     }
; 161  : 
; 162  :     // Save away P-CHS conversion information for the drive.
; 163  :     g_drvparms.phy_cyls        = hdr.lcyls;

  00114	e59f4084	 ldr       r4, [pc, #0x84]
  00118	e1dd00b6	 ldrh      r0, [sp, #6]

; 164  :     g_drvparms.phy_heads       = hdr.lheads;

  0011c	e1dd10ba	 ldrh      r1, [sp, #0xA]
  00120	e1c400b0	 strh      r0, [r4]

; 165  :     g_drvparms.phy_sectspertrk = hdr.lsctptrk;

  00124	e1dd01b0	 ldrh      r0, [sp, #0x10]
  00128	e1c410b2	 strh      r1, [r4, #2]
  0012c	e1c400b4	 strh      r0, [r4, #4]

; 166  : 
; 167  :     DEBUGMSG(ZONE_BOOTPROG, (TEXT("B11\r\n")));

  00130	e59f0064	 ldr       r0, [pc, #0x64]
  00134	eb000000	 bl        EdbgOutputDebugString

; 168  : 
; 169  :     // In theory, only LBA drives should set the total number of 
; 170  :     // user-addressable sectors in the IDE ID packet.  If we find a non-zero
; 171  :     // value, assume we have a drive that wants to talk LBA else use CHS.
; 172  :     //
; 173  :     //if (hdr.ttladdrscts)
; 174  :     if (1)	// Assume LBA mode...
; 175  :     {
; 176  :         g_bLBAMode = TRUE;

  00138	e59f3058	 ldr       r3, [pc, #0x58]
  0013c	e3a00001	 mov       r0, #1

; 177  :         DEBUGMSG(ZONE_INFO, (TEXT("LBA Mode (C:H:S = %d:%d:%d  addressable sectors = %d).\r\n"), g_drvparms.phy_cyls, g_drvparms.phy_heads, g_drvparms.phy_sectspertrk, hdr.ttladdrscts));

  00140	e1d410b4	 ldrh      r1, [r4, #4]
  00144	e5830000	 str       r0, [r3]
  00148	e59d0080	 ldr       r0, [sp, #0x80]
  0014c	e58d0000	 str       r0, [sp]
  00150	e1a00801	 mov       r0, r1, lsl #16
  00154	e1d410b2	 ldrh      r1, [r4, #2]
  00158	e1a03820	 mov       r3, r0, lsr #16
  0015c	e1a00801	 mov       r0, r1, lsl #16
  00160	e1d410b0	 ldrh      r1, [r4]
  00164	e1a02820	 mov       r2, r0, lsr #16
  00168	e1a00801	 mov       r0, r1, lsl #16
  0016c	e1a01820	 mov       r1, r0, lsr #16
  00170	e59f001c	 ldr       r0, [pc, #0x1C]
  00174	eb000000	 bl        EdbgOutputDebugString

; 178  :     }
; 179  :     else
; 180  :     {
; 181  :         g_bLBAMode = FALSE;
; 182  :         DEBUGMSG(ZONE_INFO, (TEXT("CHS Mode (C:H:S = %d:%d:%d).\r\n"), g_drvparms.phy_cyls, g_drvparms.phy_heads, g_drvparms.phy_sectspertrk));
; 183  :     }
; 184  : 
; 185  :     RETAILMSG(1, (TEXT("Loading image from hard drive...\r\n")));

  00178	e59f0010	 ldr       r0, [pc, #0x10]
  0017c	eb000000	 bl        EdbgOutputDebugString
  00180		 |$L37041|

; 119  :         return(-1);

  00180	e1a00005	 mov       r0, r5

; 186  : 
; 187  :     return(0);
; 188  : }

  00184	e28dd084	 add       sp, sp, #0x84
  00188	e8bd4070	 ldmia     sp!, {r4 - r6, lr}
  0018c	e12fff1e	 bx        lr
  00190		 |$L37396|
  00190	00000000	 DCD       |??_C@_0CD@HPCF@Loading?5image?5from?5hard?5drive?4?4?4@|
  00194	00000000	 DCD       |??_C@_0DJ@BJBM@LBA?5Mode?5?$CIC?3H?3S?5?$DN?5?$CFd?3?$CFd?3?$CFd?5?5addr@|
  00198	00000000	 DCD       |g_bLBAMode|
  0019c	00000000	 DCD       |??_C@_05FKEE@B11?$AN?6?$AA@|
  001a0	00000000	 DCD       |g_drvparms|
  001a4	00000000	 DCD       |??_C@_05IFC@B10?$AN?6?$AA@|
  001a8	00000000	 DCD       |??_C@_0BK@FHIB@ERROR?3?5Drive?5ID?5failed?4?$AN?6?$AA@|
  001ac	00000000	 DCD       |??_C@_04EHPP@B9?$AN?6?$AA@|
  001b0	00000000	 DCD       |??_C@_04BFOJ@B8?$AN?6?$AA@|
  001b4	00000000	 DCD       |??_C@_04DLDN@B7?$AN?6?$AA@|
  001b8	00000000	 DCD       |??_C@_04GJCL@B6?$AN?6?$AA@|
  001bc		 |$M37393|

			 ENDP  ; |id_drive|

	EXPORT	|lba_to_pchs|
	IMPORT	|__rt_udiv|
	IMPORT	|__rt_sdiv|

  00000			 AREA	 |.text| { |lba_to_pchs| }, CODE, ARM, SELECTION=1 ; comdat noduplicate

  00000			 AREA	 |.pdata$$lba_to_pchs|, PDATA, SELECTION=5, ASSOC=|.text| { |lba_to_pchs| } ; comdat associative
|$T37409| DCD	|lba_to_pchs|
	DCD	0x40003f01
; Function compile flags: /Ogsy

  00000			 AREA	 |.text| { |lba_to_pchs| }, CODE, ARM, SELECTION=1 ; comdat noduplicate

  00000		 |lba_to_pchs| PROC

; 195  : {

  00000	e92d43f0	 stmdb     sp!, {r4 - r9, lr}
  00004		 |$M37407|
  00004	e1a06000	 mov       r6, r0
  00008	e1a04001	 mov       r4, r1
  0000c	e1a08002	 mov       r8, r2
  00010	e1a09003	 mov       r9, r3

; 196  :     USHORT temp = 0;
; 197  : 
; 198  :     // Make sure we know the drive geometry
; 199  :     if (g_drvparms.phy_cyls  == 0 ||
; 200  :         g_drvparms.phy_heads == 0 ||
; 201  :         g_drvparms.phy_sectspertrk == 0)

  00014	e59f70dc	 ldr       r7, [pc, #0xDC]
  00018	e1d700b0	 ldrh      r0, [r7]
  0001c	e1a01800	 mov       r1, r0, lsl #16
  00020	e1b02821	 movs      r2, r1, lsr #16
  00024	0a000030	 beq       |$L37109|
  00028	e1d700b2	 ldrh      r0, [r7, #2]
  0002c	e1a01800	 mov       r1, r0, lsl #16
  00030	e1b03821	 movs      r3, r1, lsr #16
  00034	0a00002c	 beq       |$L37109|
  00038	e1d700b4	 ldrh      r0, [r7, #4]
  0003c	e1a01800	 mov       r1, r0, lsl #16
  00040	e1b02821	 movs      r2, r1, lsr #16
  00044	0a000028	 beq       |$L37109|

; 203  : 
; 204  :     if (pc == NULL || ph == NULL || ps == NULL)

  00048	e3540000	 cmp       r4, #0
  0004c	0a000026	 beq       |$L37109|
  00050	e3580000	 cmp       r8, #0
  00054	0a000024	 beq       |$L37109|
  00058	e3590000	 cmp       r9, #0
  0005c	0a000022	 beq       |$L37109|

; 205  :         return(-1);
; 206  : 
; 207  :     // Do the math...
; 208  :     *pc = (USHORT)(lba / (g_drvparms.phy_heads * g_drvparms.phy_sectspertrk));

  00060	e0000392	 mul       r0, r2, r3
  00064	e1a01006	 mov       r1, r6
  00068	eb000000	 bl        __rt_udiv
  0006c	e1a03800	 mov       r3, r0, lsl #16
  00070	e1a00823	 mov       r0, r3, lsr #16
  00074	e1c400b0	 strh      r0, [r4]

; 209  :     temp = (USHORT)(lba % (g_drvparms.phy_heads * g_drvparms.phy_sectspertrk));

  00078	e1d710b4	 ldrh      r1, [r7, #4]
  0007c	e1a00801	 mov       r0, r1, lsl #16
  00080	e1d710b2	 ldrh      r1, [r7, #2]
  00084	e1a05820	 mov       r5, r0, lsr #16
  00088	e1a00801	 mov       r0, r1, lsl #16
  0008c	e1a02820	 mov       r2, r0, lsr #16
  00090	e0000592	 mul       r0, r2, r5
  00094	e1a01006	 mov       r1, r6
  00098	eb000000	 bl        __rt_udiv
  0009c	e1a00801	 mov       r0, r1, lsl #16
  000a0	e1a02820	 mov       r2, r0, lsr #16

; 210  :     *ph = (UCHAR)(temp / g_drvparms.phy_sectspertrk);

  000a4	e1a01802	 mov       r1, r2, lsl #16
  000a8	e1a04821	 mov       r4, r1, lsr #16
  000ac	e1a00005	 mov       r0, r5
  000b0	e1a01004	 mov       r1, r4
  000b4	eb000000	 bl        __rt_sdiv
  000b8	e20030ff	 and       r3, r0, #0xFF
  000bc	e5c80000	 strb      r0, [r8]

; 211  :     *ps = (UCHAR)(temp % g_drvparms.phy_sectspertrk) + 1;

  000c0	e1d700b4	 ldrh      r0, [r7, #4]
  000c4	e1a01800	 mov       r1, r0, lsl #16
  000c8	e1a00821	 mov       r0, r1, lsr #16
  000cc	e1a01004	 mov       r1, r4
  000d0	eb000000	 bl        __rt_sdiv
  000d4	e2810001	 add       r0, r1, #1
  000d8	e20020ff	 and       r2, r0, #0xFF
  000dc	e5c90000	 strb      r0, [r9]

; 212  :    
; 213  :     return(0); 

  000e0	e3a00000	 mov       r0, #0

; 214  : }

  000e4	e8bd43f0	 ldmia     sp!, {r4 - r9, lr}
  000e8	e12fff1e	 bx        lr
  000ec		 |$L37109|

; 202  :         return(-1);

  000ec	e3e00000	 mvn       r0, #0

; 214  : }

  000f0	e8bd43f0	 ldmia     sp!, {r4 - r9, lr}
  000f4	e12fff1e	 bx        lr
  000f8		 |$L37411|
  000f8	00000000	 DCD       |g_drvparms|
  000fc		 |$M37408|

			 ENDP  ; |lba_to_pchs|

	EXPORT	|read_sector|
	EXPORT	|??_C@_0CL@PJOM@INFO?3?5Reading?5sector?5?$CIP?9CHS?5?$DN?5?$CFd@| [ DATA ] ; `string'
	EXPORT	|??_C@_0CF@FANO@INFO?3?5Reading?5sector?5?$CILBA?5?$DN?50x?$CFx@| [ DATA ] ; `string'
	EXPORT	|??_C@_0BN@HJM@ERROR?3?5Sector?5read?5failed?4?$AN?6?$AA@| [ DATA ] ; `string'

  00000			 AREA	 |.text| { |read_sector| }, CODE, ARM, SELECTION=1 ; comdat noduplicate

  00000			 AREA	 |.pdata$$read_sector|, PDATA, SELECTION=5, ASSOC=|.text| { |read_sector| } ; comdat associative
|$T37444| DCD	|read_sector|
	DCD	0x40007d02

  00000			 AREA	 |.rdata| { |??_C@_0CL@PJOM@INFO?3?5Reading?5sector?5?$CIP?9CHS?5?$DN?5?$CFd@| }, DATA, READONLY, SELECTION=2 ; comdat any
|??_C@_0CL@PJOM@INFO?3?5Reading?5sector?5?$CIP?9CHS?5?$DN?5?$CFd@| DCB "I"
	DCB	"NFO: Reading sector (P-CHS = %d:%d:%d).", 0xd, 0xa, 0x0 ; `string'

  00000			 AREA	 |.rdata| { |??_C@_0CF@FANO@INFO?3?5Reading?5sector?5?$CILBA?5?$DN?50x?$CFx@| }, DATA, READONLY, SELECTION=2 ; comdat any
|??_C@_0CF@FANO@INFO?3?5Reading?5sector?5?$CILBA?5?$DN?50x?$CFx@| DCB "IN"
	DCB	"FO: Reading sector (LBA = 0x%x).", 0xd, 0xa, 0x0 ; `string'

  00000			 AREA	 |.rdata| { |??_C@_0BN@HJM@ERROR?3?5Sector?5read?5failed?4?$AN?6?$AA@| }, DATA, READONLY, SELECTION=2 ; comdat any
|??_C@_0BN@HJM@ERROR?3?5Sector?5read?5failed?4?$AN?6?$AA@| DCB "ERROR: Se"
	DCB	"ctor read failed.", 0xd, 0xa, 0x0	; `string'
; Function compile flags: /Ogsy

  00000			 AREA	 |.text| { |read_sector| }, CODE, ARM, SELECTION=1 ; comdat noduplicate

  00000		 |read_sector| PROC

; 218  : {

  00000	e92d41f0	 stmdb     sp!, {r4 - r8, lr}
  00004	e24dd004	 sub       sp, sp, #4
  00008		 |$M37442|
  00008	e1a05000	 mov       r5, r0
  0000c	e1a06001	 mov       r6, r1

; 219  :     USHORT c = 0;

  00010	e3a07000	 mov       r7, #0
  00014	e1cd70b2	 strh      r7, [sp, #2]

; 220  :     UCHAR  h = 0;
; 221  :     UCHAR  s = 0;
; 222  :     USHORT i = 0;
; 223  :     UCHAR *a = NULL;
; 224  : 
; 225  :     if (!pbuf)

  00018	e3560000	 cmp       r6, #0
  0001c	e5cd7000	 strb      r7, [sp]
  00020	e5cd7001	 strb      r7, [sp, #1]

; 226  :         return(-1);

  00024	0a000050	 beq       |$L37441|

; 227  : 
; 228  :     // Convert LBA address to P-CHS for IDE controller
; 229  :     if (!g_bLBAMode)

  00028	e59f41c0	 ldr       r4, [pc, #0x1C0]
  0002c	e5940000	 ldr       r0, [r4]
  00030	e3500000	 cmp       r0, #0
  00034	1a00000e	 bne       |$L37132|

; 230  :     {
; 231  :         if (lba_to_pchs(lba, &c, &h, &s))

  00038	e28d3001	 add       r3, sp, #1
  0003c	e28d2000	 add       r2, sp, #0
  00040	e28d1002	 add       r1, sp, #2
  00044	e1a00005	 mov       r0, r5
  00048	eb000000	 bl        lba_to_pchs
  0004c	e3500000	 cmp       r0, #0

; 232  :             return(-1);

  00050	1a000045	 bne       |$L37441|

; 233  : 
; 234  :         DEBUGMSG(ZONE_INFO, (TEXT("INFO: Reading sector (P-CHS = %d:%d:%d).\r\n"), c, h, s));

  00054	e1dd00b2	 ldrh      r0, [sp, #2]
  00058	e5dd3001	 ldrb      r3, [sp, #1]
  0005c	e1a01800	 mov       r1, r0, lsl #16
  00060	e5dd2000	 ldrb      r2, [sp]
  00064	e59f0180	 ldr       r0, [pc, #0x180]
  00068	e1a01821	 mov       r1, r1, lsr #16
  0006c	eb000000	 bl        EdbgOutputDebugString

; 235  :     }
; 236  :     else

  00070	ea000002	 b         |$L37431|
  00074		 |$L37132|

; 237  :         DEBUGMSG(ZONE_INFO, (TEXT("INFO: Reading sector (LBA = 0x%x).\r\n"), lba));

  00074	e59f016c	 ldr       r0, [pc, #0x16C]
  00078	e1a01005	 mov       r1, r5
  0007c	eb000000	 bl        EdbgOutputDebugString
  00080		 |$L37431|
  00080	e3a0811d	 mov       r8, #0x1D, 2
  00084		 |$L37139|

; 238  : 
; 239  : 
; 240  :     // Program the IDE controller
; 241  :     WAIT_IDE_BUSY;

  00084	e5d80000	 ldrb      r0, [r8]
  00088	e3100080	 tst       r0, #0x80
  0008c	1afffffc	 bne       |$L37139|

; 242  :     WRITE_IDE_UCHAR(IDE_SECTCNT_REG, 1);

  00090	e3a00001	 mov       r0, #1
  00094	e3a01109	 mov       r1, #9, 2
  00098	e5c10000	 strb      r0, [r1]

; 243  : 
; 244  :     if (!g_bLBAMode)
; 245  :     {
; 246  :         // CHS access...
; 247  :         //
; 248  :         WRITE_IDE_UCHAR(IDE_CYLL_REG, (UCHAR)(c & 0x00ff));

  0009c	e3a02111	 mov       r2, #0x11, 2
  000a0	e5940000	 ldr       r0, [r4]
  000a4	e3500000	 cmp       r0, #0
  000a8	1a000011	 bne       |$L37142|
  000ac	e1dd00b2	 ldrh      r0, [sp, #2]

; 249  :         WRITE_IDE_UCHAR(IDE_CYLH_REG, (UCHAR)((c & 0xff00) >> 8));
; 250  :         // TODO - future drive num compensate.
; 251  :         WRITE_IDE_UCHAR(IDE_DRVHD_REG, (UCHAR)(h | IDE_HEAD_DRIVE_1));
; 252  :         WRITE_IDE_UCHAR(IDE_SECTNUM_REG, (UCHAR)s);

  000b0	e3a0310d	 mov       r3, #0xD, 2
  000b4	e20010ff	 and       r1, r0, #0xFF
  000b8	e5c21000	 strb      r1, [r2]
  000bc	e1dd00b2	 ldrh      r0, [sp, #2]
  000c0	e1a01800	 mov       r1, r0, lsl #16
  000c4	e1a02821	 mov       r2, r1, lsr #16
  000c8	e1a00422	 mov       r0, r2, lsr #8
  000cc	e20010ff	 and       r1, r0, #0xFF
  000d0	e3a02115	 mov       r2, #0x15, 2
  000d4	e5c21000	 strb      r1, [r2]
  000d8	e3a02119	 mov       r2, #0x19, 2
  000dc	e5dd0000	 ldrb      r0, [sp]
  000e0	e38010a0	 orr       r1, r0, #0xA0
  000e4	e5c21000	 strb      r1, [r2]
  000e8	e5dd0001	 ldrb      r0, [sp, #1]
  000ec	e5c30000	 strb      r0, [r3]

; 253  :     }
; 254  :     else

  000f0	ea00000d	 b         |$L37151|
  000f4		 |$L37142|

; 255  :     {
; 256  :         // LBA access...
; 257  :         //
; 258  :         WRITE_IDE_UCHAR(IDE_SECTNUM_REG, (UCHAR)(lba & 0xff));

  000f4	e20500ff	 and       r0, r5, #0xFF
  000f8	e3a0110d	 mov       r1, #0xD, 2
  000fc	e5c10000	 strb      r0, [r1]

; 259  :         WRITE_IDE_UCHAR(IDE_CYLL_REG, (UCHAR)((lba >> 8) & 0xff));

  00100	e1a00425	 mov       r0, r5, lsr #8
  00104	e20010ff	 and       r1, r0, #0xFF

; 260  :         WRITE_IDE_UCHAR(IDE_CYLH_REG, (UCHAR)((lba >> 16) & 0xff));

  00108	e1a00825	 mov       r0, r5, lsr #16
  0010c	e5c21000	 strb      r1, [r2]
  00110	e20010ff	 and       r1, r0, #0xFF
  00114	e3a02115	 mov       r2, #0x15, 2

; 261  :         // TODO - future drive num compensate.
; 262  :         WRITE_IDE_UCHAR(IDE_DRVHD_REG, (UCHAR)(((lba >> 24) & 0xff) | IDE_HEAD_DRIVE_1 | IDE_HEAD_LBA_MODE));

  00118	e1a00c25	 mov       r0, r5, lsr #24
  0011c	e5c21000	 strb      r1, [r2]
  00120	e38010e0	 orr       r1, r0, #0xE0
  00124	e3a02119	 mov       r2, #0x19, 2
  00128	e5c21000	 strb      r1, [r2]
  0012c		 |$L37151|

; 263  :     }
; 264  : 
; 265  :     //
; 266  :     // Make sure interrupt enable bit is off (we'll poll)
; 267  :     //
; 268  :     //_outp(0x3f6, 0x0a);
; 269  :     WRITE_IDE_UCHAR(IDE_ALT_CTRL_REG, 0xA0);    

  0012c	e3a01139	 mov       r1, #0x39, 2
  00130	e3a000a0	 mov       r0, #0xA0
  00134	e5c10000	 strb      r0, [r1]
  00138		 |$L37163|

; 270  :     
; 271  :     WAIT_IDE_NOT_DRDY;

  00138	e5d80000	 ldrb      r0, [r8]
  0013c	e3100040	 tst       r0, #0x40
  00140	0afffffc	 beq       |$L37163|

; 272  : 
; 273  :     WRITE_IDE_UCHAR(IDE_CMD_REG, IDE_RDSECT_CMD);

  00144	e3a00021	 mov       r0, #0x21
  00148	e5c80000	 strb      r0, [r8]
  0014c		 |$L37168|

⌨️ 快捷键说明

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