This source file includes following definitions.
- tea5757_encode_freq
- tea5757_decode_freq
- tea5757_search
- tea5757_hardware_write
- tea5757_set_freq
- tea5757_encode_lock
- tea5757_decode_lock
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 #include <sys/param.h>
55 #include <sys/radioio.h>
56
57 #include <dev/ic/tea5757.h>
58
59
60
61
62 u_int32_t
63 tea5757_encode_freq(u_int32_t freq, int tea5759)
64 {
65 if (tea5759)
66 freq -= IF_FREQ;
67 else
68 freq += IF_FREQ;
69
70
71
72
73 freq *= 10;
74 freq /= 125;
75
76 return freq & TEA5757_FREQ;
77 }
78
79
80
81
82 u_int32_t
83 tea5757_decode_freq(u_int32_t freq, int tea5759)
84 {
85 freq &= TEA5757_FREQ;
86 freq *= 125;
87 freq /= 10;
88
89 if (tea5759)
90 freq += IF_FREQ;
91 else
92 freq -= IF_FREQ;
93
94 return freq;
95 }
96
97
98
99
100 void
101 tea5757_search(struct tea5757_t *tea, u_int32_t stereo, u_int32_t lock, int dir)
102 {
103 u_int32_t reg;
104 u_int co = 0;
105
106 reg = stereo | lock | TEA5757_SEARCH_START;
107 reg |= dir ? TEA5757_SEARCH_UP : TEA5757_SEARCH_DOWN;
108 tea5757_hardware_write(tea, reg);
109
110 DELAY(TEA5757_ACQUISITION_DELAY);
111
112 do {
113 DELAY(TEA5757_WAIT_DELAY);
114 reg = tea->read(tea->iot, tea->ioh, tea->offset);
115 } while ((reg & TEA5757_FREQ) == 0 && ++co < 200);
116 }
117
118 void
119 tea5757_hardware_write(struct tea5757_t *tea, u_int32_t data)
120 {
121 int i = TEA5757_REGISTER_LENGTH;
122
123 tea->init(tea->iot, tea->ioh, tea->offset, 0);
124
125 while (i--)
126 if (data & (1 << i))
127 tea->write_bit(tea->iot, tea->ioh, tea->offset, 1);
128 else
129 tea->write_bit(tea->iot, tea->ioh, tea->offset, 0);
130
131 tea->rset(tea->iot, tea->ioh, tea->offset, 0);
132 }
133
134 u_int32_t
135 tea5757_set_freq(struct tea5757_t *tea, u_int32_t stereo, u_int32_t lock, u_int32_t freq)
136 {
137 u_int32_t data = 0ul;
138
139 if (freq < MIN_FM_FREQ)
140 freq = MIN_FM_FREQ;
141 if (freq > MAX_FM_FREQ)
142 freq = MAX_FM_FREQ;
143
144 data |= tea5757_encode_freq(freq, tea->flags & TEA5757_TEA5759);
145 data |= stereo | lock | TEA5757_SEARCH_END;
146 tea5757_hardware_write(tea, data);
147
148 return freq;
149 }
150
151 u_int32_t
152 tea5757_encode_lock(u_int8_t lock)
153 {
154 u_int32_t ret;
155
156 if (lock < 8)
157 ret = TEA5757_S005;
158 else if (lock > 7 && lock < 15)
159 ret = TEA5757_S010;
160 else if (lock > 14 && lock < 51)
161 ret = TEA5757_S030;
162 else if (lock > 50)
163 ret = TEA5757_S150;
164
165 return ret;
166 }
167
168 u_int8_t
169 tea5757_decode_lock(u_int32_t lock)
170 {
171 u_int8_t ret = 150;
172
173 switch (lock) {
174 case TEA5757_S005:
175 ret = 5;
176 break;
177 case TEA5757_S010:
178 ret = 10;
179 break;
180 case TEA5757_S030:
181 ret = 30;
182 break;
183 case TEA5757_S150:
184 ret = 150;
185 break;
186 }
187
188 return ret;
189 }