| /* | 
 |  * (C) Copyright 2016 ZXIC Inc. | 
 |  * | 
 |  */ | 
 |  | 
 | #include <common.h> | 
 | #include "../../drivers/config.h" | 
 |  | 
 |  | 
 | // ϵͳʱÖÓ | 
 | typedef struct | 
 | { | 
 | 	u32		ctrl;					// ϵͳʱÖÓ¿ØÖÆ | 
 | 	u32		reload;					// ÖØÔØÖµ | 
 | 	u32		count;					// µ±Ç°Öµ | 
 | 	u32		calibration;			// У׼ֵ | 
 |  | 
 | } t_tick; | 
 |  | 
 |  | 
 | volatile t_tick	 g_tick;  | 
 |  | 
 |  | 
 | // ʱÖÓ³õʼ»¯ | 
 | void timer_init(void) | 
 | { | 
 | 	volatile t_tick	*tick 	= (t_tick*)(&g_tick); | 
 | 	tick->ctrl				= 0; | 
 | 	tick->count		        = 0; | 
 | 	tick->reload			= (u32)-1; | 
 | 	tick->ctrl				= 0x05; | 
 | } | 
 |  | 
 | // ×¢Òâ×î´ó¼ÆÊ± 24λ | 
 | void usdelay(u32 us) | 
 | { | 
 | 	int t0, t1, t2, t3; | 
 |  | 
 | 	volatile t_tick	*tick 	= (t_tick*)(&g_tick); | 
 |  | 
 | 	t0  	= tick->count; | 
 | 	t1		= us * (SYS_CPU_FREQ / 1000000); | 
 |  | 
 | 	if(t1 <= t0) | 
 | 	{ | 
 | 		t2	= t0 - t1; | 
 | 		while((t3 = tick->count) > t2) | 
 | 		{ | 
 | 			if(t3 > 0xFFFF00) break; | 
 | 		} | 
 | 	} | 
 | 	else | 
 | 	{ | 
 | 		t2	= 0x00FFFFFF + t0 - t1; | 
 | 		while(1) | 
 | 		{ | 
 | 			t1 = tick->count; | 
 | 			if((t1 >= t0) && (t1 <= t2)) break; | 
 | 		} | 
 | 	} | 
 | } | 
 |  |