1 /* *****************************************************
2 *作 者:温子祺
3 *联系方式:[email protected]
4 *创建时间:2010-09-06
5 *说 明:定时器闪烁LED
6 -----------------------------------------------------
7 *修改时间:2010-09-13
8 *说 明:添加临界区和FCLK、HCLK、PCLK的说明
9 ***************************************************** */
10 #include < windows.h >
11 #include < nkintr.h >
12
13 #include < winreg.h >
14 #include < winioctl.h >
15 #include < ceddk.h >
16 #include < devload.h >
17 #include < S3C2440A.h > // S3C2440包含了自身硬件资源的所有头文件
18 // 包括寄存器、逻辑中断号
19 #include " pmplatform.h "
20 #include " Pkfuncs.h "
21 #include " TIMER.h "
22
23
24 // 这些值可以从startup.s中的MPLLCON、CLKDIVN的配置中知道
25 #define FCLK 400000000
26 #define HCLK FCLK/4
27 #define PCLK FCLK/8
28 /*
29 ===================================================================
30
31 普通宏定义
32
33 ===================================================================
34 */
35
36 #define LED1_POS 5
37 #define LED2_POS 6
38 #define LED3_POS 7
39 #define LED4_POS 8
40
41 #define IOCTL_START_TIMER 1
42 #define IOCTL_STOP_TIMER 2
43
44
45 /*
46 ===================================================================
47
48 基本函数接口
49
50 ===================================================================
51 */
52
53 static BOOL LEDInit (PTMR_CONTEXT pTMR);
54 static BOOL LEDCtrlOn (PTMR_CONTEXT pTMR,UINT32 unCtrlCode);
55 static BOOL LEDCtrlOff (PTMR_CONTEXT pTMR,UINT32 unCtrlCode);
56
57 static PVOID HalRegisterAlloc (PVOID pvRegisterAddress,
58 INT32 nSizeOfReg);
59
60 static BOOL TIMERInitAll (PTMR_CONTEXT pTMR);
61 static BOOL TIMERDeinitAll (PTMR_CONTEXT pTMR);
62
63 static void Led1Flash (PTMR_CONTEXT pTMR);
64 static void Led2Flash (PTMR_CONTEXT pTMR);
65 static void Led3Flash (PTMR_CONTEXT pTMR);
66 static void Led4Flash (PTMR_CONTEXT pTMR);
67
68 static void TIMEREnable (PTMR_CONTEXT pTMR);
69 static void TIMERDisable (PTMR_CONTEXT pTMR);
70
71 static DWORD TIMERIST (LPVOID lpContext);
72
73 /* *****************************************************
74 *文件名称:TIMEREnable
75 *输 入:pTMR TIMER设备上下文
76 *输 出:无
77 *功能说明:TIMER 使能
78 ****************************************************** */
79 static void TIMEREnable(PTMR_CONTEXT pTMR)
80 {
81 pTMR -> pPWMReg -> TCFG1 &= ~ 0x0F ; // 使用定时器0
82 pTMR -> pPWMReg -> TCFG1 |= 2 ;
83 pTMR -> pPWMReg -> TCNTB0 = (PCLK) / 8 / 1000 ; // 1MS
84 pTMR -> pPWMReg -> TCON &= ~ 0x0F ;
85 pTMR -> pPWMReg -> TCON |= ( 1 << 3 ) | ( 1 << 1 ) | ( 1 << 0 );
86
87 UINT32 i = 100 ;
88 while (i -- );
89
90 pTMR -> pPWMReg -> TCON &= ~ ( 1 << 1 );
91
92 }
93 /* *****************************************************
94 *文件名称:TIMERDisable
95 *输 入:pTMR TIMER设备上下文
96 *输 出:无
97 *功能说明:TIMER 禁止
98 ****************************************************** */
99 static void TIMERDisable(PTMR_CONTEXT pTMR)
100 {
101 pTMR -> pPWMReg -> TCON &= ~ ( 1 << 0 );
102 }
103 /* *****************************************************
104 *文件名称:LEDInit
105 *输 入:pTMR TIMER设备上下文
106 *输 出:TRUE/FALSE
107 *功能说明:LED 初始化
108 ****************************************************** */
109 static BOOL LEDInit(PTMR_CONTEXT pTMR)
110 {
111 if (pTMR == NULL)
112 {
113 return FALSE;
114 }
115
116 pTMR -> pIOPortReg -> GPBCON |= 1 << (LED1_POS * 2 ) | 1 << (LED2_POS * 2 ) | \
117 1 << (LED3_POS * 2 ) | 1 << (LED4_POS * 2 );
118
119 pTMR -> pIOPortReg -> GPBUP |= 1 << LED1_POS | 1 << LED2_POS | \
120 1 << LED3_POS | 1 << LED4_POS ;
121
122 pTMR -> pIOPortReg -> GPBDAT |= 1 << LED1_POS | 1 << LED2_POS | \
123 1 << LED3_POS | 1 << LED4_POS ;
124
125 return TRUE;
126 }
127
128 /* *****************************************************
129 *文件名称:LEDCtrlOn
130 *输 入:unCtrlCode 控制码
131 *输 出:TRUE/FALSE
132 *功能说明:LED亮
133 ****************************************************** */
134 static BOOL LEDCtrlOn(PTMR_CONTEXT pTMR,UINT32 unCtrlCode)
135 {
136 if (pTMR == NULL)
137 {
138 return FALSE;
139 }
140
141 pTMR -> pIOPortReg -> GPBDAT &=~ (unCtrlCode);
142
143 return TRUE;
144 }
145 /* *****************************************************
146 *文件名称:LEDCtrlOff
147 *输 入:pTMR 设备上下文
148 unCtrlCode 控制码
149 *输 出:TRUE/FALSE
150 *功能说明:LED灭
151 ****************************************************** */
152 static BOOL LEDCtrlOff(PTMR_CONTEXT pTMR,UINT32 unCtrlCode)
153 {
154 if (pTMR == NULL)
155 {
156 return FALSE;
157 }
158
159 pTMR -> pIOPortReg -> GPBDAT |= unCtrlCode;
160
161 return TRUE;
162 }
163 /* *****************************************************
164 *文件名称:Led1Flash
165 *输 入:pTMR 设备上下文
166 *输 出:无
167 *功能说明:LED1 闪烁
168 ****************************************************** */
169 static void Led1Flash(PTMR_CONTEXT pTMR)
170 {
171 static UINT32 b = 0 ;
172
173 b ^= 0x01 ;
174
175 if (b)
176 {
177 LEDCtrlOn(pTMR, 1 << LED1_POS);
178 }
179 else
180 {
181 LEDCtrlOff(pTMR, 1 << LED1_POS);
182 }
183
184
185 }
186 /* *****************************************************
187 *文件名称:Led2Flash
188 *输 入:pTMR 设备上下文
189 *输 出:无
190 *功能说明:LED2 闪烁
191 ****************************************************** */
192 static void Led2Flash(PTMR_CONTEXT pTMR)
193 {
194 static UINT32 b = 0 ;
195
196 b ^= 0x01 ;
197
198 if (b)
199 {
200 LEDCtrlOn(pTMR, 1 << LED2_POS);
201 }
202 else
203 {
204 LEDCtrlOff(pTMR, 1 << LED2_POS);
205 }
206
207 }
208 /* *****************************************************
209 *文件名称:Led3Flash
210 *输 入:pTMR 设备上下文
211 *输 出:无
212 *功能说明:LED3 闪烁
213 ****************************************************** */
214 static void Led3Flash(PTMR_CONTEXT pTMR)
215 {
216 static UINT32 b = 0 ;
217
218 b ^= 0x01 ;
219
220 if (b)
221 {
222 LEDCtrlOn(pTMR, 1 << LED3_POS);
223 }
224 else
225 {
226 LEDCtrlOff(pTMR, 1 << LED3_POS);
227 }
228 }
229 /* *****************************************************
230 *文件名称:Led4Flash
231 *输 入:pTMR 设备上下文
232 *输 出:无
233 *功能说明:LED4 闪烁
234 ****************************************************** */
235 static void Led4Flash(PTMR_CONTEXT pTMR)
236 {
237 static UINT32 b = 0 ;
238
239 b ^= 0x01 ;
240
241 if (b)
242 {
243 LEDCtrlOn(pTMR, 1 << LED4_POS);
244 }
245 else
246 {
247 LEDCtrlOff(pTMR, 1 << LED4_POS);
248 }
249
250 }
251 /* *****************************************************
252 *文件名称:HalRegisterAlloc
253 *输 入:pvRegisterAddress 寄存器地址
254 nSizeOfReg 寄存器占用空闲大小
255 *输 出:分配好的内存指针
256 *功能说明:分配内存
257 ****************************************************** */
258 static PVOID HalRegisterAlloc(PVOID pvRegisterAddress,
259 INT32 nSizeOfReg)
260 {
261 PVOID pReg;
262
263 pReg = (PVOID)VirtualAlloc( 0 ,nSizeOfReg,MEM_RESERVE,PAGE_NOACCESS);
264
265 if (pReg)
266 {
267 if ( ! (VirtualCopy(pReg,
268 (PVOID)((UINT32)pvRegisterAddress >> 8 ),
269 nSizeOfReg,
270 PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE
271 )))
272 {
273 VirtualFree(pReg, 0 ,MEM_RELEASE);
274
275 pReg = NULL;
276 }
277
278 }
279
280 return pReg;
281 }
282 /* *****************************************************
283 *文件名称:TIMERInitAll
284 *输 入:pTMR TIMER设备上下文
285 *输 出:TRUE/FALSE
286 *功能说明:TIMER 初始化所有
287 如事件、线程、中断初始化
288 ****************************************************** */
289 static BOOL TIMERInitAll(PTMR_CONTEXT pTMR)
290 {
291
292 if (pTMR == NULL)
293 {
294 return FALSE;
295 }
296
297 if ((pTMR -> hISTEvent = CreateEvent(NULL,FALSE,FALSE,NULL)) == NULL)
298 {
299 TMRMSG(TMRDBG,(TEXT( " TIMERInitAll[ERROR]:CreateEvent for ist fail\n " )));
300
301 goto init_error;
302 }
303
304 UINT32 unIRQ = IRQ_TIMER0;
305
306 if ( ! KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR,
307 & unIRQ,
308 sizeof (UINT32),
309 & pTMR -> unTIMERLogicNum,
310 sizeof (UINT32),
311 NULL))
312 {
313 TMRMSG(TMRDBG,(TEXT( " TIMERInitAll[ERROR]:get logic number fail\n " )));
314
315 goto init_error;
316 }
317
318 if ( ! InterruptInitialize(pTMR -> unTIMERLogicNum,pTMR -> hISTEvent,NULL, 0 ))
319 {
320 TMRMSG(TMRDBG,(TEXT( " TIMERInitAll[ERROR]:init logic number and event fail\n " )));
321
322 goto init_error;
323 }
324
325 pTMR -> bIsI2CThreadValid = TRUE;
326
327 if ((pTMR -> hISTThread = CreateThread(NULL,
328 0 ,
329 TIMERIST,
330 (LPVOID)pTMR,
331 0 ,
332 NULL
333 )) == NULL)
334 {
335 TMRMSG(TMRDBG,(TEXT( " TIMERInitAll[ERROR]:CreateThread for timer fail\n " )));
336
337 goto init_error;
338 }
339
340 InterruptDone(pTMR -> unTIMERLogicNum);
341
342 if ( ! CeSetThreadPriority(pTMR -> hISTThread, 88 ))
343 {
344 TMRMSG(TMRDBG,(TEXT( " TIMERInitAll[ERROR]:CeSetThreadPriority for timer fail\n " )));
345
346 return FALSE;
347 }
348
349
350 InitializeCriticalSection( & pTMR -> RegCS);
351
352
353 TMRMSG(TMRDBG,(TEXT( " TIMERInitAll[MSG]:TIMERInitAll Success\n " )));
354
355 return TRUE;
356
357 init_error:
358
359 TIMERDeinitAll(pTMR);
360
361 return FALSE;
362
363
364 }
365 /* *****************************************************
366 *文件名称:TIMERDeinitAll
367 *输 入:pTMR TIMER设备上下文
368 *输 出:TRUE/FALSE
369 *功能说明:TIMER 初始化所有
370 如事件、线程、中断初始化
371 ****************************************************** */
372 static BOOL TIMERDeinitAll(PTMR_CONTEXT pTMR)
373 {
374 if (NULL == pTMR)
375 {
376 TMRMSG(TMRDBG,(TEXT( " TIMERDeinitAll[ERROR]:TIMERDeinitAll fail because of pTMR\n " )));
377
378 return FALSE;
379 }
380
381 DeleteCriticalSection( & pTMR -> RegCS);
382
383 InterruptDisable(pTMR -> unTIMERLogicNum);
384
385 CloseHandle(pTMR -> hISTEvent);
386 CloseHandle(pTMR -> hISTThread);
387
388 TIMERDisable(pTMR);
389
390 Sleep( 1 );
391
392
393
394 VirtualFree((LPVOID)pTMR -> pPWMReg, sizeof (S3C2440A_PWM_REG),MEM_RELEASE);
395 VirtualFree((LPVOID)pTMR -> pIOPortReg, sizeof (S3C2440A_IOPORT_REG),MEM_RELEASE);
396 VirtualFree((LPVOID)pTMR -> pIntrReg, sizeof (S3C2440A_INTR_REG),MEM_RELEASE);
397 VirtualFree((LPVOID)pTMR -> pCLKPWRReg, sizeof (S3C2440A_CLKPWR_REG),MEM_RELEASE);
398
399 Sleep( 10 );
400
401 LocalFree(pTMR);
402
403
404 return TRUE;
405 }
406 /* *****************************************************
407 *文件名称:TIMERIST
408 *输 入:lpContext 设备上下文
409 *输 出:0/1
410 *功能说明:TIMER 中断服务线程
411 ****************************************************** */
412 static DWORD TIMERIST(LPVOID lpContext)
413 {
414 static UINT32 unCnt = 0 ;
415
416
417 PTMR_CONTEXT pTMR = (PTMR_CONTEXT)lpContext;
418
419 Sleep( 10 );
420
421 TMRMSG( 7 ,(TEXT( " [DLL]TIMERIST[MSG]:TIMERIST Running...\n " )));
422 TMRMSG( 7 ,(TEXT( " [DLL]TIMERIST[MSG]:pTMR->bIsI2CThreadValid is %d\n " ),pTMR -> bIsI2CThreadValid));
423
424 while (pTMR -> bIsI2CThreadValid)
425 {
426 WaitForSingleObject(pTMR -> hISTEvent,INFINITE);
427 ResetEvent(pTMR -> hISTEvent);
428 // TMRMSG(7,(TEXT("[DLL]TIMERIST[MSG]:TIMERIST event...\n")));
429
430 EnterCriticalSection( & pTMR -> RegCS);
431
432 unCnt ++ ;
433
434 if (unCnt == 1000 )Led1Flash(pTMR);
435 if (unCnt == 2000 )Led2Flash(pTMR);
436 if (unCnt == 3000 )Led3Flash(pTMR);
437 if (unCnt == 4000 )Led4Flash(pTMR);
438
439 if (unCnt >= 4000 )unCnt = 0 ;
440
441 InterruptDone(pTMR -> unTIMERLogicNum);
442
443 LeaveCriticalSection( & pTMR -> RegCS);
444 }
445
446 TMRMSG( 7 ,(TEXT( " [DLL]TIMERIST[MSG]:TIMERIST Exit...\n " )));
447
448 return 1 ;
449 }
450 /*
451 ===================================================================
452
453 DLL 流接口函数
454
455 ===================================================================
456 */
457
458 /* *****************************************************
459 *文件名称:TMR_Init
460 *输 入:Context 注册枚举路径
461 *输 出:0/1
462 *功能说明:TIMER 初始化
463 ****************************************************** */
464 PTMR_CONTEXT TMR_Init (PVOID Context)
465 {
466 LPTSTR ActivePath = (LPTSTR)Context; // HKLM\Drivers\Active\xx
467
468 TMRMSG(TMRDBG,(TEXT( " [DLL]TMR_INIT[MSG]:(%s)\n " ),ActivePath)); // 打印注册路径
469
470 PTMR_CONTEXT pTMR;
471
472 pTMR = (PTMR_CONTEXT)LocalAlloc(LPTR, sizeof (TMR_CONTEXT));
473
474 if (NULL == pTMR)
475 {
476 return NULL;
477 }
478
479 pTMR -> pIOPortReg = ( volatile S3C2440A_IOPORT_REG * )HalRegisterAlloc((PVOID)S3C2440A_BASE_REG_PA_IOPORT,
480 sizeof (S3C2440A_IOPORT_REG));
481 if (pTMR -> pIOPortReg == NULL)
482 {
483 TMRMSG(TMRDBG,(TEXT( " [DLL]TMR_Init[ERROR]:Unable to alloc for ioport reg\n " )));
484
485 goto init_error;
486 }
487
488 pTMR -> pIntrReg = ( volatile S3C2440A_INTR_REG * )HalRegisterAlloc((PVOID)S3C2440A_BASE_REG_PA_INTR,
489 sizeof (S3C2440A_INTR_REG));
490
491 if (pTMR -> pIntrReg == NULL)
492 {
493 TMRMSG(TMRDBG,(TEXT( " [DLL]TMR_Init[ERROR]Unable to alloc for intrrrupt reg\n " )));
494
495 goto init_error;
496 }
497
498 pTMR -> pPWMReg = ( volatile S3C2440A_PWM_REG * )HalRegisterAlloc((PVOID)S3C2440A_BASE_REG_PA_PWM,
499 sizeof (S3C2440A_PWM_REG));
500
501 if (pTMR -> pPWMReg == NULL)
502 {
503 TMRMSG(TMRDBG,(TEXT( " [DLL]TMR_Init[ERROR]Unable to alloc for pwm reg\n " )));
504
505 goto init_error;
506 }
507
508 pTMR -> pCLKPWRReg = ( volatile S3C2440A_CLKPWR_REG * )HalRegisterAlloc((PVOID)S3C2440A_BASE_REG_PA_CLOCK_POWER,
509 sizeof (S3C2440A_CLKPWR_REG));
510
511 if (pTMR -> pCLKPWRReg == NULL)
512 {
513 TMRMSG(TMRDBG,(TEXT( " [DLL]TMR_Init[ERROR]Unable to alloc for clkpwr reg\n " )));
514
515 goto init_error;
516 }
517
518
519 LEDInit(pTMR);
520 LEDCtrlOn(pTMR, 1 << LED2_POS | 1 << LED4_POS);
521
522 TIMERInitAll(pTMR);
523
524 TMRMSG(TMRDBG,(TEXT( " [DLL]TMR_INIT[MSG]:TMR_INIT Success\n " )));
525
526 return pTMR; // 正确返回pTMR
527
528 init_error:
529
530 LocalFree(pTMR);
531
532 pTMR = NULL;
533
534 return NULL; // 错误返回NULL
535 }
536 /* *****************************************************
537 *文件名称:TMR_Deinit
538 *输 入:pTMR TIMER设备上下文
539 *输 出:TRUE/FALSE
540 *功能说明:TIMER 卸载
541 ****************************************************** */
542 BOOL TMR_Deinit (PTMR_CONTEXT pTMR)
543 {
544
545
546 TIMERDeinitAll(pTMR);
547
548 TMRMSG(TMRDBG,(TEXT( " [DLL]TMR_Deinit[MSG]:TMR_Deinit Success\n " )));
549
550 return TRUE;
551 }
552 /* *****************************************************
553 *文件名称:TMR_Open
554 *输 入:pTMR TIMER 设备上下文
555 AccessCode 访问代码
556 ShareMode 共享模式
557 *输 出:设备上下文指针
558 *功能说明:TIMER 打开
559 ****************************************************** */
560 PTMR_CONTEXT TMR_Open (PTMR_CONTEXT pTMR,DWORD AccessCode,DWORD ShareMode)
561 {
562 if (NULL == pTMR)
563 {
564 TMRMSG(TMRDBG,(TEXT( " [DLL]TMR_Open[ERROR]:Context is invalid\n " )));
565
566 return NULL;
567 }
568
569 UNREFERENCED_PARAMETER(ShareMode);
570 UNREFERENCED_PARAMETER(AccessCode);
571
572 TMRMSG(TMRDBG,(TEXT( " [DLL]TMR_Open[MSG]:TMR_Open Success\n " )));
573
574 return pTMR;
575 }
576 /* *****************************************************
577 *文件名称:TMR_Close
578 *输 入:pTMR TIMER 设备上下文
579 *输 出:TRUE/FALSE
580 *功能说明:TIMER 关闭
581 ****************************************************** */
582 BOOL TMR_Close (PTMR_CONTEXT pTMR)
583 {
584
585 TMRMSG(TMRDBG,(TEXT( " [DLL]TMR_Close[MSG]:TMR_Close Success\n " )));
586
587 return TRUE;
588 }
589 /* *****************************************************
590 *文件名称:TMR_Read
591 *输 入:pTMR TIMER 设备上下文
592 lpOutputBuf 数据输出缓冲区
593 dwNumOfBytes 数据输出字节数
594 *输 出:-1
595 *功能说明:TIMER 读取
596 ****************************************************** */
597 DWORD TMR_Read (PTMR_CONTEXT pTMR,LPVOID lpOutputBuf,DWORD dwNumOfBytes)
598 {
599 TMRMSG(TMRDBG,(TEXT( " [DLL]TMR_Read[ERROR]:Unable support read\n " )));
600
601 return (DWORD) - 1 ;
602 }
603 /* *****************************************************
604 *文件名称:TMR_Seek
605 *输 入:pTMR TIMER 设备上下文
606 lpOutputBuf 数据输出缓冲区
607 dwNumOfBytes 数据输出字节数
608 *输 出:-1
609 *功能说明:TIMER 对设备指针进行操作时调用
610 ****************************************************** */
611 DWORD TMR_Seek (PTMR_CONTEXT pTMR, long lAmount,DWORD dwType)
612 {
613 TMRMSG(TMRDBG,(TEXT( " [DLL]TMR_Seek[ERROR]:Unable support seek\n " )));
614
615 return (DWORD) - 1 ;
616 }
617 /* *****************************************************
618 *文件名称:TMR_Write
619 *输 入:pTMR TIMER 设备上下文
620 lpInPutBuf 数据输入缓冲区
621 dwNumOfBytes 数据输入字节数
622 *输 出:-1
623 *功能说明:TIMER 写入
624 ****************************************************** */
625 DWORD TMR_Write (PTMR_CONTEXT pTMR,LPVOID lpInPutBuf,DWORD dwNumOfBytes)
626 {
627 TMRMSG(TMRDBG,(TEXT( " [DLL]TMR_Write[ERROR]:Unable support write\n " )));
628
629 return (DWORD) - 1 ;
630 }
631 /* *****************************************************
632 *文件名称:TMR_IOControl
633 *输 入:pTMR TIMER 设备上下文
634 dwCode 控制码
635 pBufIn 数据输入缓冲区
636 dwLenIn 数据输入字节数
637 pBufOut 数据输出缓冲区
638 dwLenOut 数据输处字节数
639 pdwActualOut 实际数据输出字节数
640 *输 出:TRUE/FALSE
641 *功能说明:TIMER 输入输出口控制
642 ****************************************************** */
643 BOOL TMR_IOControl (PTMR_CONTEXT pTMR,
644 DWORD dwCode,
645 PBYTE pBufIn,
646 DWORD dwLenIn,
647 PBYTE pBufOut,
648 DWORD dwLenOut,
649 PDWORD pdwActualOut)
650 {
651
652 if (pTMR == NULL)
653 {
654 return FALSE;
655 }
656
657 switch (dwCode)
658 {
659 case IOCTL_START_TIMER:
660 {
661 TIMEREnable(pTMR);
662 } break ;
663
664 case IOCTL_STOP_TIMER:
665 {
666 TIMERDisable(pTMR);
667
668 } break ;
669 }
670
671 return TRUE;
672 }
673 /* *****************************************************
674 *文件名称:TMR_PowerUp
675 *输 入:Context 设备上下文
676 *输 出:TRUE
677 *功能说明:TIMER 上电电操作
678 ****************************************************** */
679 BOOL TMR_PowerUp (PVOID Context)
680 {
681 TMRMSG(TMRDBG,(TEXT( " [DLL]TMR_PowerUp[ERROR]:TMR_PowerUp Success\n " )));
682
683 return TRUE;
684 }
685 /* *****************************************************
686 *文件名称:TMR_PowerDown
687 *输 入:Context 设备上下文
688 *输 出:TRUE
689 *功能说明:TIMER 掉电操作
690 ****************************************************** */
691 BOOL TMR_PowerDown (PVOID Context)
692 {
693 TMRMSG(TMRDBG,(TEXT( " [DLL]TMR_PowerDown[ERROR]:TMR_PowerDown Success\n " )));
694
695 return TRUE;
696 }
697 /*
698 =======================================================
699
700 加载DLL
701
702 =======================================================
703
704 */
705 BOOL WINAPI DllEntry(HANDLE hinstDLL,
706 DWORD dwReason,
707 LPVOID /* lpvReserved */ )
708 {
709 switch (dwReason)
710 {
711 case DLL_PROCESS_ATTACH:
712 DEBUGREGISTER((HINSTANCE)hinstDLL);
713 return TRUE;
714 case DLL_THREAD_ATTACH:
715 break ;
716 case DLL_THREAD_DETACH:
717 break ;
718 case DLL_PROCESS_DETACH:
719 break ;
720 #ifdef UNDER_CE
721 case DLL_PROCESS_EXITING:
722 break ;
723 case DLL_SYSTEM_STARTED:
724 break ;
725 #endif
726 }
727
728 return TRUE;
729 }
转载请注明出处,谢谢!