📄 realtimeclock.cod
字号:
; Listing generated by Microsoft (R) Optimizing Compiler Version 12.20.9615
TTL d:\wince420\platform\ep931x\kernel\hal\.\realtimeclock.c
CODE32
00000 AREA |.drectve|, DRECTVE
DCB "-defaultlib:coredll.lib "
DCB "-defaultlib:corelibc.lib "
EXPORT |RealTimeBias| [ DATA ]
00000 AREA |.data|, DATA
COMMON |dwReschedIncrement|, 0x4
00000 AREA |.bss|, NOINIT
|RealTimeBias| % 0x8
EXPORT |OEMGetRealTime|
IMPORT |KFileTimeToSystemTime|
; File d:\wince420\platform\ep931x\kernel\hal\realtimeclock.c
00000 AREA |.text| { |OEMGetRealTime| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 AREA |.pdata$$OEMGetRealTime|, PDATA, SELECTION=5, ASSOC=|.text| { |OEMGetRealTime| } ; comdat associative
|$T13048| DCD |OEMGetRealTime|
DCD 0x40001e02
; Function compile flags: /Ogsy
00000 AREA |.text| { |OEMGetRealTime| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 |OEMGetRealTime| PROC
; 45 : {
00000 e92d4030 stmdb sp!, {r4, r5, lr}
00004 e24dd008 sub sp, sp, #8
00008 |$M13046|
00008 e1a05000 mov r5, r0
; 46 : unsigned __int64 realTime;
; 47 : FILETIME ft;
; 48 :
; 49 : //
; 50 : // Implement the realtime clock.
; 51 : //
; 52 : PRTCIF pRTC = (PRTCIF) RTC_BASE;
0000c e3a0020b mov r0, #0xB, 4
00010 e3800892 orr r0, r0, #0x92, 16
; 53 : DWORD dwRTCDR = pRTC->dr;
00014 e5900000 ldr r0, [r0]
; 54 :
; 55 : //
; 56 : // read the clock registers
; 57 : //
; 58 : realTime = (unsigned __int64) dwRTCDR; // data in seconds
; 59 : realTime *= 1000; // convert to ms
; 60 : realTime *= 10000; // convert to 100ns
00018 e3a01c27 mov r1, #0x27, 24
0001c e3811010 orr r1, r1, #0x10
00020 e0841190 umull r1, r4, r0, r1
00024 e3a03ffa mov r3, #0xFA, 30
00028 e0802391 umull r2, r0, r1, r3
; 61 : realTime += RealTimeBias; // convert to "real" time
0002c e59f1040 ldr r1, [pc, #0x40]
00030 e0230394 mla r3, r4, r3, r0
00034 e5910000 ldr r0, [r1]
00038 e5911004 ldr r1, [r1, #4]
0003c e0922000 adds r2, r2, r0
; 62 :
; 63 : //
; 64 : // load time/data structure
; 65 : //
; 66 : ft.dwLowDateTime = (DWORD)realTime;
00040 e58d2000 str r2, [sp]
; 67 : ft.dwHighDateTime = (DWORD)(realTime >> 32);
; 68 :
; 69 : return KFileTimeToSystemTime( &ft, lpst );
00044 e59f2024 ldr r2, [pc, #0x24]
00048 e0a30001 adc r0, r3, r1
0004c e58d0004 str r0, [sp, #4]
00050 e1a01005 mov r1, r5
00054 e5923000 ldr r3, [r2]
00058 e28d0000 add r0, sp, #0
0005c e1a0e00f mov lr, pc
00060 e12fff13 bx r3
; 70 : }
00064 e28dd008 add sp, sp, #8
00068 e8bd4030 ldmia sp!, {r4, r5, lr}
0006c e12fff1e bx lr
00070 |$L13050|
00070 00000000 DCD |KFileTimeToSystemTime|
00074 00000000 DCD |RealTimeBias|
00078 |$M13047|
ENDP ; |OEMGetRealTime|
EXPORT |OEMSetRealTime|
IMPORT |KSystemTimeToFileTime|
00000 AREA |.text| { |OEMSetRealTime| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 AREA |.pdata$$OEMSetRealTime|, PDATA, SELECTION=5, ASSOC=|.text| { |OEMSetRealTime| } ; comdat associative
|$T13060| DCD |OEMSetRealTime|
DCD 0x40002102
; Function compile flags: /Ogsy
00000 AREA |.text| { |OEMSetRealTime| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 |OEMSetRealTime| PROC
; 73 : {
00000 e92d4070 stmdb sp!, {r4 - r6, lr}
00004 e24dd008 sub sp, sp, #8
00008 |$M13058|
; 74 : unsigned __int64 realTime;
; 75 : FILETIME ft;
; 76 : BOOL bRet;
; 77 : //
; 78 : // Impliment battery backed real time clock.
; 79 : //
; 80 : //
; 81 : PRTCIF pRTC = (PRTCIF) RTC_BASE;
; 82 : DWORD dwRTCDR = pRTC->dr;
; 83 :
; 84 : if (bRet = KSystemTimeToFileTime(lpst, &ft))
00008 e59f2070 ldr r2, [pc, #0x70]
0000c e3a0120b mov r1, #0xB, 4
00010 e3811892 orr r1, r1, #0x92, 16
00014 e5923000 ldr r3, [r2]
00018 e5915000 ldr r5, [r1]
0001c e28d1000 add r1, sp, #0
00020 e1a0e00f mov lr, pc
00024 e12fff13 bx r3
00028 e1b06000 movs r6, r0
0002c 0a00000e beq |$L13003|
; 85 : {
; 86 : // read the clock registers
; 87 : realTime = (unsigned __int64) dwRTCDR; // data in seconds
; 88 : realTime *= 1000; // convert to ms
; 89 : realTime *= 10000; // convert to 100ns
00030 e3a00c27 mov r0, #0x27, 24
00034 e3800010 orr r0, r0, #0x10
00038 e0841095 umull r1, r4, r5, r0
0003c e3a02ffa mov r2, #0xFA, 30
00040 e0803291 umull r3, r0, r1, r2
00044 e0220294 mla r2, r4, r2, r0
; 90 :
; 91 : // get the desired "real" time
; 92 : RealTimeBias = (unsigned __int64) ft.dwHighDateTime << 32;
00048 e59d0004 ldr r0, [sp, #4]
; 93 : RealTimeBias += ft.dwLowDateTime;
; 94 :
; 95 : // compensate for the clock time
; 96 : RealTimeBias -= realTime;
0004c e2731000 rsbs r1, r3, #0
00050 e59d4000 ldr r4, [sp]
00054 e59f3020 ldr r3, [pc, #0x20]
00058 e0c02002 sbc r2, r0, r2
0005c e0910004 adds r0, r1, r4
00060 e2a21000 adc r1, r2, #0
00064 e5830000 str r0, [r3]
00068 e5831004 str r1, [r3, #4]
0006c |$L13003|
; 97 : }
; 98 :
; 99 : return bRet;
0006c e1a00006 mov r0, r6
; 100 : }
00070 e28dd008 add sp, sp, #8
00074 e8bd4070 ldmia sp!, {r4 - r6, lr}
00078 e12fff1e bx lr
0007c |$L13062|
0007c 00000000 DCD |RealTimeBias|
00080 00000000 DCD |KSystemTimeToFileTime|
00084 |$M13059|
ENDP ; |OEMSetRealTime|
EXPORT |OEMSetAlarmTime|
IMPORT |OEMInterruptEnable|
IMPORT |__rt_udiv64by64|
00000 AREA |.text| { |OEMSetAlarmTime| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 AREA |.pdata$$OEMSetAlarmTime|, PDATA, SELECTION=5, ASSOC=|.text| { |OEMSetAlarmTime| } ; comdat associative
|$T13082| DCD |OEMSetAlarmTime|
DCD 0x40004002
; Function compile flags: /Ogsy
00000 AREA |.text| { |OEMSetAlarmTime| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 |OEMSetAlarmTime| PROC
; 103 : {
00000 e92d41f0 stmdb sp!, {r4 - r8, lr}
00004 e24dd008 sub sp, sp, #8
00008 |$M13080|
; 104 : FILETIME ft;
; 105 : BOOL bRet = FALSE;
; 106 : ULARGE_INTEGER alarmTime, currentTime, deltaTime;
; 107 : PRTCIF pRTC = (PRTCIF) RTC_BASE;
; 108 : DWORD dwRTCDR = pRTC->dr;
; 109 :
; 110 : // get the desired alarm time
; 111 : if (bRet = KSystemTimeToFileTime(lpst, &ft)) {
00008 e59f20ec ldr r2, [pc, #0xEC]
0000c e3a0120b mov r1, #0xB, 4
00010 e3811892 orr r1, r1, #0x92, 16
00014 e5923000 ldr r3, [r2]
00018 e5917000 ldr r7, [r1]
0001c e28d1000 add r1, sp, #0
00020 e1a0e00f mov lr, pc
00024 e12fff13 bx r3
00028 e1b08000 movs r8, r0
0002c 0a000028 beq |$L13024|
; 112 : alarmTime.LowPart = ft.dwLowDateTime;
; 113 : alarmTime.HighPart = ft.dwHighDateTime;
; 114 : alarmTime.QuadPart -= RealTimeBias;
00030 e59f00c0 ldr r0, [pc, #0xC0]
00034 e59d3000 ldr r3, [sp]
00038 e5901000 ldr r1, [r0]
0003c e5902004 ldr r2, [r0, #4]
; 115 :
; 116 : // get the current time
; 117 : currentTime.QuadPart = (unsigned __int64) dwRTCDR; // data in seconds
; 118 : currentTime.QuadPart *= 1000; // convert to ms
; 119 : currentTime.QuadPart *= 10000; // convert to 100ns
00040 e3a00c27 mov r0, #0x27, 24
00044 e59d4004 ldr r4, [sp, #4]
00048 e0535001 subs r5, r3, r1
0004c e3800010 orr r0, r0, #0x10
00050 e0c46002 sbc r6, r4, r2
00054 e0821097 umull r1, r2, r7, r0
00058 e3a03ffa mov r3, #0xFA, 30
0005c e0804391 umull r4, r0, r1, r3
00060 e0230392 mla r3, r2, r3, r0
; 120 :
; 121 : // make sure the alarm occurs in the future
; 122 : if(alarmTime.QuadPart < currentTime.QuadPart) {
00064 e1560003 cmp r6, r3
00068 3a000019 bcc |$L13024|
0006c 8a000001 bhi |$L13065|
00070 e1550004 cmp r5, r4
00074 3a000016 bcc |$L13024|
00078 |$L13065|
; 123 : DEBUGMSG(FALSE, (_T("OEMSetAlarmTime: alarm 0x%08x:%08x occurs before 0x%08x:%08x\r\n"),
; 124 : alarmTime.HighPart, alarmTime.LowPart, currentTime.HighPart, currentTime.LowPart));
; 125 : } else {
; 126 : // round up to the nearest number of seconds
; 127 : deltaTime.QuadPart = alarmTime.QuadPart - currentTime.QuadPart;
; 128 : deltaTime.QuadPart += 9999999; // msecs, usecs, 100ns
; 129 : deltaTime.QuadPart /= 10000000; // convert to seconds
00078 e0550004 subs r0, r5, r4
0007c e59f2070 ldr r2, [pc, #0x70]
00080 e0c61003 sbc r1, r6, r3
00084 e0900002 adds r0, r0, r2
00088 e59f2060 ldr r2, [pc, #0x60]
0008c e2a11000 adc r1, r1, #0
00090 e3a03000 mov r3, #0
00094 eb000000 bl __rt_udiv64by64
00098 e3510000 cmp r1, #0
; 130 :
; 131 : // do we have enough resolution in our timer to handle the request?
; 132 : if(deltaTime.HighPart != 0) {
0009c 1a00000c bne |$L13024|
; 133 : DEBUGMSG(FALSE, (_T("OEMSetAlarmTime: alarm 0x%08x:%08x delta with 0x%08x:%08x (0x%08x:%08x) is too large\r\n"),
; 134 : alarmTime.HighPart, alarmTime.LowPart, currentTime.HighPart, currentTime.LowPart, deltaTime.HighPart, deltaTime.LowPart));
; 135 : } else {
; 136 : // clear interrupts, write the comparator, and enable interrupts
; 137 : pRTC->eoi = 0; // any value clears pending interrupts
000a0 e59f2044 ldr r2, [pc, #0x44]
000a4 e3a01000 mov r1, #0
; 138 : pRTC->mr = dwRTCDR + deltaTime.LowPart;
000a8 e0800007 add r0, r0, r7
000ac e5821000 str r1, [r2]
; 139 : pRTC->cr = 1; // enable match interrupt
000b0 e3a08001 mov r8, #1
000b4 e59f102c ldr r1, [pc, #0x2C]
000b8 e59f2024 ldr r2, [pc, #0x24]
000bc e5810000 str r0, [r1]
; 140 : OEMInterruptEnable(SYSINTR_RTC_ALARM, NULL, 0);
000c0 e3a01000 mov r1, #0
000c4 e5828000 str r8, [r2]
000c8 e3a0000d mov r0, #0xD
000cc e3a02000 mov r2, #0
000d0 eb000000 bl OEMInterruptEnable
000d4 |$L13024|
; 141 : bRet = TRUE;
; 142 : }
; 143 : }
; 144 : }
; 145 :
; 146 : // return TRUE if alarm set, FALSE otherwise
; 147 : return bRet;
000d4 e1a00008 mov r0, r8
; 148 : }
000d8 e28dd008 add sp, sp, #8
000dc e8bd41f0 ldmia sp!, {r4 - r8, lr}
000e0 e12fff1e bx lr
000e4 |$L13084|
000e4 b0920010 DCD 0xb0920010
000e8 b0920004 DCD 0xb0920004
000ec b0920008 DCD 0xb0920008
000f0 00989680 DCD 0x989680
000f4 0098967f DCD 0x98967f
000f8 00000000 DCD |RealTimeBias|
000fc 00000000 DCD |KSystemTimeToFileTime|
00100 |$M13081|
ENDP ; |OEMSetAlarmTime|
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -