Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
8327 maxcodehac 1
#include "pxa255_TIMR.h"
2
#include "mem.h"
3
 
4
 
5
static void pxa255timrPrvRaiseLowerInts(Pxa255timr* timr){
6
 
7
	pxa255icInt(timr->ic, PXA255_I_TIMR0, (timr->OSSR & 1) != 0);
8
	pxa255icInt(timr->ic, PXA255_I_TIMR1, (timr->OSSR & 2) != 0);
9
	pxa255icInt(timr->ic, PXA255_I_TIMR2, (timr->OSSR & 4) != 0);
10
	pxa255icInt(timr->ic, PXA255_I_TIMR3, (timr->OSSR & 8) != 0);
11
}
12
 
13
static void pxa255timrPrvCheckMatch(Pxa255timr* timr, UInt8 idx){
14
 
15
	UInt8 v = 1UL << idx;
16
 
17
	if((timr->OSCR == timr->OSMR[idx]) && (timr->OIER & v)){
18
		timr->OSSR |= v;
19
	}
20
}
21
 
22
static void pxa255timrPrvUpdate(Pxa255timr* timr){
23
 
24
	pxa255timrPrvCheckMatch(timr, 0);
25
	pxa255timrPrvCheckMatch(timr, 1);
26
	pxa255timrPrvCheckMatch(timr, 2);
27
	pxa255timrPrvCheckMatch(timr, 3);
28
}
29
 
30
static Boolean pxa255timrPrvMemAccessF(void* userData, UInt32 pa, UInt8 size, Boolean write, void* buf){
31
 
32
	Pxa255timr* timr = userData;
33
	UInt32 val = 0;
34
 
35
	if(size != 4) {
36
		err_str(__FILE__ ": Unexpected ");
37
	//	err_str(write ? "write" : "read");
38
	//	err_str(" of ");
39
	//	err_dec(size);
40
	//	err_str(" bytes to 0x");
41
	//	err_hex(pa);
42
	//	err_str("\r\n");
43
		return true;		//we do not support non-word accesses
44
	}
45
 
46
	pa = (pa - PXA255_TIMR_BASE) >> 2;
47
 
48
	if(write){
49
		val = *(UInt32*)buf;
50
 
51
		switch(pa){
52
			case 0:
53
			case 1:
54
			case 2:
55
			case 3:
56
				timr->OSMR[pa] = val;
57
				break;
58
 
59
			case 4:
60
				timr->OSCR = val;
61
				break;
62
 
63
			case 5:
64
				timr->OSSR = timr->OSSR &~ val;
65
				pxa255timrPrvRaiseLowerInts(timr);
66
				break;
67
 
68
			case 6:
69
				timr->OWER = val;
70
				break;
71
 
72
			case 7:
73
				timr->OIER = val;
74
				pxa255timrPrvUpdate(timr);
75
				pxa255timrPrvRaiseLowerInts(timr);
76
				break;
77
		}
78
	}
79
	else{
80
		switch(pa){
81
			case 0:
82
			case 1:
83
			case 2:
84
			case 3:
85
				val = timr->OSMR[pa];
86
				break;
87
 
88
			case 4:
89
				val = timr->OSCR;
90
				break;
91
 
92
			case 5:
93
				val = timr->OSSR;
94
				break;
95
 
96
			case 6:
97
				val = timr->OWER;
98
				break;
99
 
100
			case 7:
101
				val = timr->OIER;
102
				break;
103
		}
104
		*(UInt32*)buf = val;
105
	}
106
 
107
	return true;
108
}
109
 
110
 
111
Boolean pxa255timrInit(Pxa255timr* timr, ArmMem* physMem, Pxa255ic* ic){
112
 
113
	__mem_zero(timr, sizeof(Pxa255timr));
114
	timr->ic = ic;
115
	return memRegionAdd(physMem, PXA255_TIMR_BASE, PXA255_TIMR_SIZE, pxa255timrPrvMemAccessF, timr);
116
}
117
 
118
void pxa255timrTick(Pxa255timr* timr){
119
 
120
	timr->OSCR++;
121
	pxa255timrPrvUpdate(timr);
122
	pxa255timrPrvRaiseLowerInts(timr);
123
}