WINCE 定时器0控制LED驱动源码

1 /******************************************************
2 *作 者:温子祺
3 *联系方式:wenziqi@hotmail.com
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 }

转载请注明出处,谢谢!

原文地址:https://www.cnblogs.com/wenziqi/p/1823403.html