Lines Matching refs:modem
5 * baycom_ser_hdx.c -- baycom ser12 halfduplex radio modem driver.
15 * ser12: This is a very simple 1200 baud AFSK modem. The modem consists only
18 * for handling the HDLC protocol. The modem connects to a serial port,
28 * mutes audio input to the modem
117 } modem;
164 * 0 must be used to power the modem; the modem draws its
193 outb(0x0e | (!!bc->modem.ser12.tx_bit), MCR(dev->base_addr));
194 if (bc->modem.shreg <= 1)
195 bc->modem.shreg = 0x10000 | hdlcdrv_getbits(&bc->hdrv);
196 bc->modem.ser12.tx_bit = !(bc->modem.ser12.tx_bit ^
197 (bc->modem.shreg & 1));
198 bc->modem.shreg >>= 1;
211 bc->modem.ser12.dcd_shreg = (bc->modem.ser12.dcd_shreg << 1) |
212 (cur_s != bc->modem.ser12.last_sample);
213 bc->modem.ser12.last_sample = cur_s;
214 if(bc->modem.ser12.dcd_shreg & 1) {
219 dcdspos += ((bc->modem.ser12.dcd_shreg >> 1) & 1);
220 if (!(bc->modem.ser12.dcd_shreg & 0x7ffffffe))
222 dcdsneg += ((bc->modem.ser12.dcd_shreg >> 2) & 1);
223 dcdsneg += ((bc->modem.ser12.dcd_shreg >> 3) & 1);
224 dcdsneg += ((bc->modem.ser12.dcd_shreg >> 4) & 1);
226 bc->modem.ser12.dcd_sum0 += 16*dcdspos - dcdsneg;
228 bc->modem.ser12.dcd_sum0--;
230 if(!bc->modem.ser12.dcd_time) {
231 hdlcdrv_setdcd(&bc->hdrv, (bc->modem.ser12.dcd_sum0 +
232 bc->modem.ser12.dcd_sum1 +
233 bc->modem.ser12.dcd_sum2) < 0);
234 bc->modem.ser12.dcd_sum2 = bc->modem.ser12.dcd_sum1;
235 bc->modem.ser12.dcd_sum1 = bc->modem.ser12.dcd_sum0;
237 bc->modem.ser12.dcd_sum0 = 2;
238 bc->modem.ser12.dcd_time = SER12_DCD_INTERVAL(bc);
240 bc->modem.ser12.dcd_time--;
245 if (bc->modem.ser12.interm_sample) {
254 switch (bc->modem.ser12.dcd_shreg & 7) {
271 bc->modem.shreg >>= 1;
272 if (bc->modem.ser12.last_sample ==
273 bc->modem.ser12.last_rxbit)
274 bc->modem.shreg |= 0x10000;
275 bc->modem.ser12.last_rxbit =
276 bc->modem.ser12.last_sample;
278 if (++bc->modem.ser12.interm_sample >= 3)
279 bc->modem.ser12.interm_sample = 0;
283 if (bc->modem.ser12.dcd_shreg & 1) {
287 dcdspos += ((bc->modem.ser12.dcd_shreg >> 1) & 1);
288 dcdspos += (!(bc->modem.ser12.dcd_shreg & 0x7ffffffe))
290 dcdsneg += ((bc->modem.ser12.dcd_shreg >> 2) & 1);
291 dcdsneg += ((bc->modem.ser12.dcd_shreg >> 3) & 1);
292 dcdsneg += ((bc->modem.ser12.dcd_shreg >> 4) & 1);
294 bc->modem.ser12.dcd_sum0 += 16*dcdspos - dcdsneg;
300 if (bc->modem.ser12.interm_sample) {
309 switch (bc->modem.ser12.dcd_shreg & 3) {
326 bc->modem.shreg >>= 1;
327 if (bc->modem.ser12.last_sample ==
328 bc->modem.ser12.last_rxbit)
329 bc->modem.shreg |= 0x10000;
330 bc->modem.ser12.last_rxbit =
331 bc->modem.ser12.last_sample;
333 bc->modem.ser12.interm_sample = !bc->modem.ser12.interm_sample;
337 bc->modem.ser12.dcd_sum0 -= (bc->modem.ser12.dcd_shreg & 1);
340 if (bc->modem.shreg & 1) {
341 hdlcdrv_putbits(&bc->hdrv, bc->modem.shreg >> 1);
342 bc->modem.shreg = 0x10000;
344 if(!bc->modem.ser12.dcd_time) {
348 hdlcdrv_setdcd(&bc->hdrv, (bc->modem.ser12.dcd_sum0 +
349 bc->modem.ser12.dcd_sum1 +
350 bc->modem.ser12.dcd_sum2) < 0);
351 bc->modem.ser12.dcd_sum2 = bc->modem.ser12.dcd_sum1;
352 bc->modem.ser12.dcd_sum1 = bc->modem.ser12.dcd_sum0;
354 bc->modem.ser12.dcd_sum0 = 2;
355 bc->modem.ser12.dcd_time = SER12_DCD_INTERVAL(bc);
357 bc->modem.ser12.dcd_time--;
392 bc->modem.arb_divider--;
403 if (bc->modem.arb_divider <= 0) {
404 bc->modem.arb_divider = SER12_ARB_DIVIDER(bc);
468 memset(&bc->modem, 0, sizeof(bc->modem));
635 MODULE_DESCRIPTION("Baycom ser12 half duplex amateur radio modem driver");
703 * mutes audio input to the modem