aboutsummaryrefslogtreecommitdiffstats
path: root/hotplug/phidgets.usermap
blob: cf70b595c59fe69561bf9b4fcbc248ea66c51855 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# Very Old Phidgets
phidgets           0x0003 0x0925 0x8201 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x0925 0x8101 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x0925 0x8104 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000

# All current and future Phidgets
phidgets           0x0003 0x06c2 0x0030 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0031 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0032 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0033 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0034 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0035 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0036 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0037 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0038 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0039 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x003a 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x003b 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x003c 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x003d 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x003e 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x003f 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0040 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0041 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0042 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0043 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0044 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0045 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0046 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0047 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0048 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0049 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x004a 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x004b 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x004c 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x004d 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x004e 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x004f 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0050 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0051 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0052 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0053 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0054 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0055 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0056 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0057 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0058 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0059 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x005a 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x005b 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x005c 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x005d 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x005e 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x005f 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0060 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0061 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0062 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0063 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0064 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0065 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0066 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0067 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0068 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0069 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x006a 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x006b 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x006c 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x006d 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x006e 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x006f 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0070 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0071 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0072 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0073 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0074 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0075 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0076 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0077 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0078 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0079 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x007a 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x007b 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x007c 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x007d 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x007e 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x007f 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0080 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0081 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0082 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0083 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0084 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0085 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0086 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0087 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0088 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0089 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x008a 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x008b 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x008c 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x008d 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x008e 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x008f 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0090 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0091 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0092 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0093 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0094 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0095 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0096 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0097 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0098 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x0099 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x009a 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x009b 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x009c 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x009d 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x009e 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x009f 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x00a0 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x00a1 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x00a2 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x00a3 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x00a4 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x00a5 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x00a6 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x00a7 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x00a8 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x00a9 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x00aa 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x00ab 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x00ac 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x00ad 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x00ae 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
phidgets           0x0003 0x06c2 0x00af 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
2 } /* Error */ .highlight .k { color: #008800; font-weight: bold } /* Keyword */ .highlight .ch { color: #888888 } /* Comment.Hashbang */ .highlight .cm { color: #888888 } /* Comment.Multiline */ .highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */ .highlight .cpf { color: #888888 } /* Comment.PreprocFile */ .highlight .c1 { color: #888888 } /* Comment.Single */ .highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */ .highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ .highlight .ge { font-style: italic } /* Generic.Emph */ .highlight .gr { color: #aa0000 } /* Generic.Error */ .highlight .gh { color: #333333 } /* Generic.Heading */ .highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ .highlight .go { color: #888888 } /* Generic.Output */ .highlight .gp { color: #555555 } /* Generic.Prompt */ .highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #666666 } /* Generic.Subheading */ .highlight .gt { color: #aa0000 } /* Generic.Traceback */ .highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */ .highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */ .highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */ .highlight .kp { color: #008800 } /* Keyword.Pseudo */ .highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */ .highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */ .highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */ .highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */ .highlight .na { color: #336699 } /* Name.Attribute */ .highlight .nb { color: #003388 } /* Name.Builtin */ .highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */ .highlight .no { color: #003366; font-weight: bold } /* Name.Constant */ .highlight .nd { color: #555555 } /* Name.Decorator */ .highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */ .highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */ .highlight .nl { color: #336699; font-style: italic } /* Name.Label */ .highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */ .highlight .py { color: #336699; font-weight: bold } /* Name.Property */ .highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #336699 } /* Name.Variable */ .highlight .ow { color: #008800 } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */ .highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */ .highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */ .highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ .highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */ .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */ .highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */ .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
/* $Id: drv_T6963.c,v 1.14 2005/01/18 06:30:23 reinelt Exp $
 *
 * new style driver for T6963-based displays
 *
 * Copyright (C) 2003 Michael Reinelt <reinelt@eunet.at>
 * Copyright (C) 2004 The LCD4Linux Team <lcd4linux-devel@users.sourceforge.net>
 *
 * This file is part of LCD4Linux.
 *
 * LCD4Linux is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2, or (at your option)
 * any later version.
 *
 * LCD4Linux is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 *
 * $Log: drv_T6963.c,v $
 * Revision 1.14  2005/01/18 06:30:23  reinelt
 * added (C) to all copyright statements
 *
 * Revision 1.13  2004/12/22 20:24:02  reinelt
 * T6963 fix for displays > 8 rows
 *
 * Revision 1.12  2004/06/26 12:04:59  reinelt
 *
 * uh-oh... the last CVS log message messed up things a lot...
 *
 * Revision 1.11  2004/06/26 09:27:21  reinelt
 *
 * added '-W' to CFLAGS
 * changed all C++ comments to C ones
 * cleaned up a lot of signed/unsigned mistakes
 *
 * Revision 1.10  2004/06/20 10:09:54  reinelt
 *
 * 'const'ified the whole source
 *
 * Revision 1.9  2004/06/17 06:23:39  reinelt
 *
 * hash handling rewritten to solve performance issues
 *
 * Revision 1.8  2004/06/09 06:40:29  reinelt
 *
 * splash screen for T6963 driver
 *
 * Revision 1.7  2004/06/06 06:51:59  reinelt
 *
 * do not display end splash screen if quiet=1
 *
 * Revision 1.6  2004/06/02 09:41:19  reinelt
 *
 * prepared support for startup splash screen
 *
 * Revision 1.5  2004/06/01 06:45:30  reinelt
 *
 * some Fixme's processed
 * documented some code
 *
 * Revision 1.4  2004/02/24 05:55:04  reinelt
 *
 * X11 driver ported
 *
 * Revision 1.3  2004/02/22 17:35:41  reinelt
 * some fixes for generic graphic driver and T6963
 * removed ^M from plugin_imon (Nico, are you editing under Windows?)
 *
 * Revision 1.2  2004/02/18 06:39:20  reinelt
 * T6963 driver for graphic displays finished
 *
 * Revision 1.1  2004/02/15 21:43:43  reinelt
 * T6963 driver nearly finished
 * framework for graphic displays done
 * i2c_sensors patch from Xavier
 * some more old generation files removed
 *
 */

/* 
 *
 * exported fuctions:
 *
 * struct DRIVER drv_T6963
 *
 */

#include "config.h"

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <termios.h>
#include <fcntl.h>
#include <sys/time.h>

#include "debug.h"
#include "cfg.h"
#include "qprintf.h"
#include "udelay.h"
#include "plugin.h"
#include "widget.h"
#include "widget_text.h"
#include "widget_icon.h"
#include "widget_bar.h"
#include "drv.h"
#include "drv_generic_graphic.h"
#include "drv_generic_parport.h"

#ifdef WITH_DMALLOC
#include <dmalloc.h>
#endif

static char Name[]="T6963";
static int Model;

typedef struct {
  int type;
  char *name;
} MODEL;

static MODEL Models[] = {
  { 0x01, "generic" },
  { 0xff, "Unknown" }
};


static unsigned char SIGNAL_CE;
static unsigned char SIGNAL_CD;
static unsigned char SIGNAL_RD;
static unsigned char SIGNAL_WR;

unsigned char *Buffer1, *Buffer2;

static int bug=0;


/****************************************/
/***  hardware dependant functions    ***/
/****************************************/

/* perform normal status check */
static void drv_T6_status1 (void)
{
  int n;
  
  /* turn off data line drivers */
  drv_generic_parport_direction (1);
  
  /* lower CE and RD */
  drv_generic_parport_control (SIGNAL_CE | SIGNAL_RD, 0);
  
  /* Access Time: 150 ns  */
  ndelay(150);
  
  /* wait for STA0=1 and STA1=1 */
  n=0;
  do {
    rep_nop();
    if (++n>1000) {
      debug("hang in status1");
      bug=1;
      break;
    }
  } while ((drv_generic_parport_read() & 0x03) != 0x03);
  
  /* rise RD and CE */
  drv_generic_parport_control (SIGNAL_RD | SIGNAL_CE, SIGNAL_RD | SIGNAL_CE);
  
  /* Output Hold Time: 50 ns  */
  ndelay(50);
  
  /* turn on data line drivers */
  drv_generic_parport_direction (0);
}


/* perform status check in "auto mode" */
static void drv_T6_status2 (void)
{
  int n;

  /* turn off data line drivers */
  drv_generic_parport_direction (1);
  
  /* lower RD and CE */
  drv_generic_parport_control (SIGNAL_RD | SIGNAL_CE, 0);
  
  /* Access Time: 150 ns  */
  ndelay(150);

  /* wait for STA3=1 */
  n=0;
  do {
    rep_nop();
    if (++n>1000) {
      debug("hang in status2");
      bug=1;
      break;
    }
  } while ((drv_generic_parport_read() & 0x08) != 0x08);

  /* rise RD and CE */
  drv_generic_parport_control (SIGNAL_RD | SIGNAL_CE, SIGNAL_RD | SIGNAL_CE);

  /* Output Hold Time: 50 ns  */
  ndelay(50);

  /* turn on data line drivers */
  drv_generic_parport_direction (0);
}


static void drv_T6_write_cmd (const unsigned char cmd)
{
  /* wait until the T6963 is idle */
  drv_T6_status1();

  /* put data on DB1..DB8 */
  drv_generic_parport_data (cmd);
  
  /* lower WR and CE */
  drv_generic_parport_control (SIGNAL_WR | SIGNAL_CE, 0);
  
  /* Pulse width */
  ndelay(80);

  /* rise WR and CE */
  drv_generic_parport_control (SIGNAL_WR | SIGNAL_CE, SIGNAL_WR | SIGNAL_CE);

  /* Data Hold Time */
  ndelay(40);
}


static void drv_T6_write_data (const unsigned char data)
{
  /* wait until the T6963 is idle */
  drv_T6_status1();

  /* put data on DB1..DB8 */
  drv_generic_parport_data (data);

  /* lower C/D */
  drv_generic_parport_control (SIGNAL_CD, 0);
  
  /* C/D Setup Time */
  ndelay(20);

  /* lower WR and CE */
  drv_generic_parport_control (SIGNAL_WR | SIGNAL_CE, 0);
  
  /* Pulse Width */
  ndelay(80);
  
  /* rise WR and CE */
  drv_generic_parport_control (SIGNAL_WR | SIGNAL_CE, SIGNAL_WR | SIGNAL_CE);
  
  /* Data Hold Time */
  ndelay(40);

  /* rise CD */
  drv_generic_parport_control (SIGNAL_CD, SIGNAL_CD);
}


static void drv_T6_write_auto (const unsigned char data)
{
  /* wait until the T6963 is idle */
  drv_T6_status2();

  /* put data on DB1..DB8 */
  drv_generic_parport_data (data);

  /* lower C/D */
  drv_generic_parport_control (SIGNAL_CD, 0);
  
  /* C/D Setup Time */
  ndelay(20);

  /* lower WR and CE */
  drv_generic_parport_control (SIGNAL_WR | SIGNAL_CE, 0);
  
  /* Pulse Width */
  ndelay(80);
  
  /* rise WR and CE */
  drv_generic_parport_control (SIGNAL_WR | SIGNAL_CE, SIGNAL_WR | SIGNAL_CE);
  
  /* Data Hold Time */
  ndelay(40);

  /* rise CD */
  drv_generic_parport_control (SIGNAL_CD, SIGNAL_CD);
}


#if 0 /* not used */
static void drv_T6_send_byte (const unsigned char cmd, const unsigned char data)
{
  drv_T6_write_data(data);
  drv_T6_write_cmd(cmd);
}
#endif

static void drv_T6_send_word (const unsigned char cmd, const unsigned short data)
{
  drv_T6_write_data(data&0xff);
  drv_T6_write_data(data>>8);
  drv_T6_write_cmd(cmd);
}


static void drv_T6_clear(const unsigned short addr, const int len)
{
  int i;
  
  drv_T6_send_word (0x24, addr);      /* Set Adress Pointer */
  drv_T6_write_cmd(0xb0);             /* Set Data Auto Write */
  for (i=0; i<len; i++) {
    drv_T6_write_auto(0);
    if (bug) {
      bug=0;
      debug("bug occured at byte %d of %d", i, len);
    }
  }
  drv_T6_status2();
  drv_T6_write_cmd(0xb2);             /* Auto Reset */
}


static void drv_T6_copy(const unsigned short addr, const unsigned char *data, const int len)
{
  int i;
  
  drv_T6_send_word (0x24, 0x0200+addr);  /* Set Adress Pointer */
  drv_T6_write_cmd(0xb0);                /* Set Data Auto Write */
  for (i=0; i<len; i++) {
    drv_T6_write_auto(*(data++));
    if (bug) {
      bug=0;
      debug("bug occured at byte %d of %d, addr=%d", i, len, addr);
    }
  }
  drv_T6_status2();
  drv_T6_write_cmd(0xb2);  /* Auto Reset */
}


static void drv_T6_blit(const int row, const int col, const int height, const int width)
{
  int i, j, e, m;
  int r, c;

  for (r = row; r < row + height; r++) {
    for (c = col; c < col + width; c++) {
      unsigned char mask = 1 << (XRES - 1 - c % XRES);
      if (drv_generic_graphic_FB[r * LCOLS + c]) {
	/* set bit */
	Buffer1[(r * DCOLS + c) / XRES] |=  mask;
      } else {
	/* clear bit */
	Buffer1[(r * DCOLS + c) / XRES] &= ~mask;
      }
    }
  }
  
  /* upper half */

  /* max address */
  if (row + height - 1 < 64) {
    m = ((row + height - 1) * DCOLS + col + width) / XRES;
  } else {
    m = (                64 * DCOLS + col + width) / XRES;
  }

  for (i = (row * DCOLS + col) / XRES; i <= m; i++) {
    if (Buffer1[i] == Buffer2[i]) continue;
    for (j = i, e = 0; i <= m; i++) {
      if (Buffer1[i] == Buffer2[i]) {
	if (++e > 4) break;
      } else {
	e = 0;
      }
    }
    memcpy (Buffer2 + j, Buffer1 + j, i - j - e + 1);
    drv_T6_copy (j, Buffer1 + j, i - j - e + 1);
  }
  
  /* lower half */

  /* max address */
  m = ((row + height - 1) * DCOLS + col + width) / XRES;

  for (i = (64 * DCOLS + col) / XRES; i <= m; i++) {
    if (Buffer1[i] == Buffer2[i]) continue;
    for (j = i, e = 0; i <= m; i++) {
      if (Buffer1[i] == Buffer2[i]) {
	if (++e > 4) break;
      } else {
	e = 0;
      }
    }
    memcpy (Buffer2 + j, Buffer1 + j, i - j - e + 1);
    drv_T6_copy (j, Buffer1 + j, i - j - e + 1);
  }
}


static int drv_T6_start (const char *section)
{
  char *model, *s;
  int rows, TROWS, TCOLS;
  
  model=cfg_get(section, "Model", "generic");
  if (model!=NULL && *model!='\0') {
    int i;
    for (i=0; Models[i].type!=0xff; i++) {
      if (strcasecmp(Models[i].name, model)==0) break;
    }
    if (Models[i].type==0xff) {
      error ("%s: %s.Model '%s' is unknown from %s", Name, section, model, cfg_source());
      return -1;
    }
    Model=i;
    info ("%s: using model '%s'", Name, Models[Model].name);
  } else {
    error ("%s: empty '%s.Model' entry from %s", Name, section, cfg_source());
    return -1;
  }

  /* read display size from config */
  s=cfg_get(section, "Size", NULL);
  if (s==NULL || *s=='\0') {
    error ("%s: no '%s.Size' entry from %s", Name, section, cfg_source());
    return -1;
  }

  DROWS = -1;
  DCOLS = -1;
  if (sscanf(s, "%dx%d", &DCOLS, &DROWS)!=2 || DCOLS<1 || DROWS<1) {
    error ("%s: bad Size '%s' from %s", Name, s, cfg_source());
    return -1;
  }
  
  s=cfg_get(section, "Font", "6x8");
  if (s==NULL || *s=='\0') {
    error ("%s: no '%s.Font' entry from %s", Name, section, cfg_source());
    return -1;
  }

  XRES = -1;
  YRES = -1;
  if (sscanf(s, "%dx%d", &XRES, &YRES)!=2 || XRES<1 || YRES<1) {
    error ("%s: bad Font '%s' from %s", Name, s, cfg_source());
    return -1;
  }

  /* Fixme: provider other fonts someday... */
  if (XRES!=6 && YRES!=8) {
    error ("%s: bad Font '%s' from %s (only 6x8 at the moment)", Name, s, cfg_source());
    return -1;
  }
  
  TROWS=DROWS/YRES;  /* text rows */
  TCOLS=DCOLS/XRES;  /* text cols */

  Buffer1=malloc(TCOLS*DROWS);
  if (Buffer1==NULL) {
    error ("%s: framebuffer #1 could not be allocated: malloc() failed", Name);
    return -1;
  }

  debug ("malloc buffer 2 (%d*%d)=%d", TCOLS, DROWS, TCOLS*DROWS);
  Buffer2=malloc(TCOLS*DROWS);
  if (Buffer2==NULL) {
    error ("%s: framebuffer #2 could not be allocated: malloc() failed", Name);
    return -1;
  }

  memset(Buffer1,0,TCOLS*DROWS*sizeof(*Buffer1));
  memset(Buffer2,0,TCOLS*DROWS*sizeof(*Buffer2));

  if (drv_generic_parport_open(section, Name) != 0) {
    error ("%s: could not initialize parallel port!", Name);
    return -1;
  }
  
  if ((SIGNAL_CE=drv_generic_parport_wire_ctrl ("CE", "STROBE"))==0xff) return -1;
  if ((SIGNAL_CD=drv_generic_parport_wire_ctrl ("CD", "SELECT"))==0xff) return -1;
  if ((SIGNAL_RD=drv_generic_parport_wire_ctrl ("RD", "AUTOFD"))==0xff) return -1;
  if ((SIGNAL_WR=drv_generic_parport_wire_ctrl ("WR", "INIT")  )==0xff) return -1;
  
  /* rise CE, CD, RD and WR */
  drv_generic_parport_control (SIGNAL_CE | SIGNAL_CD | SIGNAL_RD | SIGNAL_WR,
			       SIGNAL_CE | SIGNAL_CD | SIGNAL_RD | SIGNAL_WR);
  /* set direction: write */
  drv_generic_parport_direction (0);
  

  /* initialize display */

  drv_T6_send_word (0x40, 0x0000);    /* Set Text Home Address */
  drv_T6_send_word (0x41, TCOLS);     /* Set Text Area */
  
  drv_T6_send_word (0x42, 0x0200);    /* Set Graphic Home Address */
  drv_T6_send_word (0x43, TCOLS);     /* Set Graphic Area */
  
  drv_T6_write_cmd (0x80);            /* Mode Set: OR mode, Internal CG RAM mode */
  drv_T6_send_word (0x22, 0x0002);    /* Set Offset Register */
  drv_T6_write_cmd (0x98);            /* Set Display Mode: Curser off, Text off, Graphics on */
  drv_T6_write_cmd (0xa0);            /* Set Cursor Pattern: 1 line cursor */
  drv_T6_send_word (0x21, 0x0000);    /* Set Cursor Pointer to (0,0) */
  
  
  /* clear display */
  
  /* upper half */
  rows=TROWS>8?8:TROWS;
  drv_T6_clear(0x0000, TCOLS*rows);    /* clear text area  */
  drv_T6_clear(0x0200, TCOLS*rows*8);  /* clear graphic area */
  
  /* lower half */
  if (TROWS>8) {
    rows=TROWS-8;
    drv_T6_clear(0x8000, TCOLS*rows);    /* clear text area #2 */
    drv_T6_clear(0x8200, TCOLS*rows*8);  /* clear graphic area #2 */
  }

  return 0;
}


/****************************************/
/***            plugins               ***/
/****************************************/

/* none at the moment... */


/****************************************/
/***        widget callbacks          ***/
/****************************************/


/* using drv_generic_graphic_draw(W) */
/* using drv_generic_graphic_icon_draw(W) */
/* using drv_generic_graphic_bar_draw(W) */


/****************************************/
/***        exported functions        ***/
/****************************************/


/* list models */
int drv_T6_list (void)
{
  int i;
  
  for (i=0; Models[i].type!=0xff; i++) {
    printf ("%s ", Models[i].name);
  }
  return 0;
}


/* initialize driver & display */
int drv_T6_init (const char *section, const int quiet)
{
  WIDGET_CLASS wc;
  int ret;  
  
  /* real worker functions */
  drv_generic_graphic_real_blit   = drv_T6_blit;
  
  /* start display */
  if ((ret=drv_T6_start (section))!=0)
    return ret;
  
  /* initialize generic graphic driver */
  if ((ret=drv_generic_graphic_init(section, Name))!=0)
    return ret;
  
  if (!quiet) {
    char buffer[40];
    qprintf(buffer, sizeof(buffer), "%s %dx%d", Name, DCOLS, DROWS);
    if (drv_generic_graphic_greet (buffer, NULL)) {
      sleep (3);
      drv_generic_graphic_clear();
    }
  }

  /* register text widget */
  wc=Widget_Text;
  wc.draw=drv_generic_graphic_draw;
  widget_register(&wc);

  /* register icon widget */
  wc=Widget_Icon;
  wc.draw=drv_generic_graphic_icon_draw;
  widget_register(&wc);
  
  /* register bar widget */
  wc=Widget_Bar;
  wc.draw=drv_generic_graphic_bar_draw;
  widget_register(&wc);
  
  /* register plugins */
  /* none at the moment... */


  return 0;
}


/* close driver & display */
int drv_T6_quit (const int quiet) {
  
  info("%s: shutting down.", Name);
  
  drv_generic_graphic_clear();
  
  if (!quiet) {
    drv_generic_graphic_greet ("goodbye!", NULL);
  }
  
  drv_generic_graphic_quit();
  drv_generic_parport_close();
  
  if (Buffer1) {
    free (Buffer1);
    Buffer1=NULL;
  }
  
  if (Buffer2) {
    free (Buffer2);
    Buffer2=NULL;
  }
  
  return (0);
}


DRIVER drv_T6963 = {
  name: Name,
  list: drv_T6_list,
  init: drv_T6_init,
  quit: drv_T6_quit, 
};