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

📄 realtimeclock.cod

📁 EP9315的BSP包(WINCE下的BSP,内有各种驱动的详细的代码)
💻 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 + -