sm_hapn4800.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:17k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*****************************************************************************/
  2. /*
  3.  * sm_hapn4800.c  -- soundcard radio modem driver, 4800 baud HAPN modem
  4.  *
  5.  * Copyright (C) 1996  Thomas Sailer (sailer@ife.ee.ethz.ch)
  6.  *
  7.  * This program is free software; you can redistribute it and/or modify
  8.  * it under the terms of the GNU General Public License as published by
  9.  * the Free Software Foundation; either version 2 of the License, or
  10.  * (at your option) any later version.
  11.  *
  12.  * This program is distributed in the hope that it will be useful,
  13.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.  * GNU General Public License for more details.
  16.  *
  17.  * You should have received a copy of the GNU General Public License
  18.  * along with this program; if not, write to the Free Software
  19.  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20.  *
  21.  *  Please note that the GPL allows you to use the driver, NOT the radio.
  22.  *  In order to use the radio, you need a license from the communications
  23.  *  authority of your country.
  24.  *
  25.  *
  26.  *  This module implements a (hopefully) HAPN (Hamilton Area Packet
  27.  *  Network) compatible 4800 baud modem.
  28.  *  The HAPN modem uses kind of "duobinary signalling" (not really,
  29.  *  duobinary signalling gives ... 0 0 -1 0 1 0 0 ... at the sampling
  30.  *  instants, whereas HAPN signalling gives ... 0 0 -1 1 0 0 ..., see
  31.  *  Proakis, Digital Communications).
  32.  *  The code is untested. It is compatible with itself (i.e. it can decode
  33.  *  the packets it sent), but I could not test if it is compatible with
  34.  *  any "real" HAPN modem, since noone uses it in my region of the world.
  35.  *  Feedback therefore welcome.
  36.  */
  37. #include "sm.h"
  38. #include "sm_tbl_hapn4800.h"
  39. /* --------------------------------------------------------------------- */
  40. struct demod_state_hapn48 {
  41. unsigned int shreg;
  42. unsigned int bit_pll;
  43. unsigned char last_bit;
  44. unsigned char last_bit2;
  45. unsigned int dcd_shreg;
  46. int dcd_sum0, dcd_sum1, dcd_sum2;
  47. unsigned int dcd_time;
  48. int lvlhi, lvllo;
  49. };
  50. struct mod_state_hapn48 {
  51. unsigned int shreg;
  52. unsigned char tx_bit;
  53. unsigned int tx_seq;
  54. const unsigned char *tbl;
  55. };
  56. /* --------------------------------------------------------------------- */
  57. static void modulator_hapn4800_10_u8(struct sm_state *sm, unsigned char *buf, unsigned int buflen)
  58. {
  59. struct mod_state_hapn48 *st = (struct mod_state_hapn48 *)(&sm->m);
  60. for (; buflen > 0; buflen--, buf++) {
  61. if (!st->tx_seq++) { 
  62. if (st->shreg <= 1)
  63. st->shreg = hdlcdrv_getbits(&sm->hdrv) | 0x10000;
  64. st->tx_bit = ((st->tx_bit << 1) |
  65.       (st->tx_bit & 1));
  66. st->tx_bit ^= (!(st->shreg & 1));
  67. st->shreg >>= 1;
  68. st->tbl = hapn48_txfilt_10 + (st->tx_bit & 0xf);
  69. }
  70. if (st->tx_seq >= 10)
  71. st->tx_seq = 0;
  72. *buf = *st->tbl;
  73. st->tbl += 0x10;
  74. }
  75. }
  76. /* --------------------------------------------------------------------- */
  77. static void modulator_hapn4800_10_s16(struct sm_state *sm, short *buf, unsigned int buflen)
  78. {
  79. struct mod_state_hapn48 *st = (struct mod_state_hapn48 *)(&sm->m);
  80. for (; buflen > 0; buflen--, buf++) {
  81. if (!st->tx_seq++) { 
  82. if (st->shreg <= 1)
  83. st->shreg = hdlcdrv_getbits(&sm->hdrv) | 0x10000;
  84. st->tx_bit = ((st->tx_bit << 1) |
  85.       (st->tx_bit & 1));
  86. st->tx_bit ^= (!(st->shreg & 1));
  87. st->shreg >>= 1;
  88. st->tbl = hapn48_txfilt_10 + (st->tx_bit & 0xf);
  89. }
  90. if (st->tx_seq >= 10)
  91. st->tx_seq = 0;
  92. *buf = ((*st->tbl)-0x80)<<8;
  93. st->tbl += 0x10;
  94. }
  95. }
  96. /* --------------------------------------------------------------------- */
  97. static void modulator_hapn4800_8_u8(struct sm_state *sm, unsigned char *buf, unsigned int buflen)
  98. {
  99. struct mod_state_hapn48 *st = (struct mod_state_hapn48 *)(&sm->m);
  100. for (; buflen > 0; buflen--, buf++) {
  101. if (!st->tx_seq++) {
  102. if (st->shreg <= 1)
  103. st->shreg = hdlcdrv_getbits(&sm->hdrv) | 0x10000;
  104. st->tx_bit = (st->tx_bit << 1) | (st->tx_bit & 1);
  105. st->tx_bit ^= !(st->shreg & 1);
  106. st->shreg >>= 1;
  107. st->tbl = hapn48_txfilt_8 + (st->tx_bit & 0xf);
  108. }
  109. if (st->tx_seq >= 8)
  110. st->tx_seq = 0;
  111. *buf = *st->tbl;
  112. st->tbl += 0x10;
  113. }
  114. }
  115. /* --------------------------------------------------------------------- */
  116. static void modulator_hapn4800_8_s16(struct sm_state *sm, short *buf, unsigned int buflen)
  117. {
  118. struct mod_state_hapn48 *st = (struct mod_state_hapn48 *)(&sm->m);
  119. for (; buflen > 0; buflen--, buf++) {
  120. if (!st->tx_seq++) {
  121. if (st->shreg <= 1)
  122. st->shreg = hdlcdrv_getbits(&sm->hdrv) | 0x10000;
  123. st->tx_bit = (st->tx_bit << 1) | (st->tx_bit & 1);
  124. st->tx_bit ^= !(st->shreg & 1);
  125. st->shreg >>= 1;
  126. st->tbl = hapn48_txfilt_8 + (st->tx_bit & 0xf);
  127. }
  128. if (st->tx_seq >= 8)
  129. st->tx_seq = 0;
  130. *buf = ((*st->tbl)-0x80)<<8;
  131. st->tbl += 0x10;
  132. }
  133. }
  134. /* --------------------------------------------------------------------- */
  135. static void modulator_hapn4800_pm10_u8(struct sm_state *sm, unsigned char *buf, unsigned int buflen)
  136. {
  137. struct mod_state_hapn48 *st = (struct mod_state_hapn48 *)(&sm->m);
  138. for (; buflen > 0; buflen--, buf++) {
  139. if (!st->tx_seq++) { 
  140. if (st->shreg <= 1)
  141. st->shreg = hdlcdrv_getbits(&sm->hdrv) | 0x10000;
  142. st->tx_bit = ((st->tx_bit << 1) |
  143.       (st->tx_bit & 1));
  144. st->tx_bit ^= (!(st->shreg & 1));
  145. st->shreg >>= 1;
  146. st->tbl = hapn48_txfilt_pm10 + (st->tx_bit & 0xf);
  147. }
  148. if (st->tx_seq >= 10)
  149. st->tx_seq = 0;
  150. *buf = *st->tbl;
  151. st->tbl += 0x10;
  152. }
  153. }
  154. /* --------------------------------------------------------------------- */
  155. static void modulator_hapn4800_pm10_s16(struct sm_state *sm, short *buf, unsigned int buflen)
  156. {
  157. struct mod_state_hapn48 *st = (struct mod_state_hapn48 *)(&sm->m);
  158. for (; buflen > 0; buflen--, buf++) {
  159. if (!st->tx_seq++) { 
  160. if (st->shreg <= 1)
  161. st->shreg = hdlcdrv_getbits(&sm->hdrv) | 0x10000;
  162. st->tx_bit = ((st->tx_bit << 1) |
  163.       (st->tx_bit & 1));
  164. st->tx_bit ^= (!(st->shreg & 1));
  165. st->shreg >>= 1;
  166. st->tbl = hapn48_txfilt_pm10 + (st->tx_bit & 0xf);
  167. }
  168. if (st->tx_seq >= 10)
  169. st->tx_seq = 0;
  170. *buf = ((*st->tbl)-0x80)<<8;
  171. st->tbl += 0x10;
  172. }
  173. }
  174. /* --------------------------------------------------------------------- */
  175. static void modulator_hapn4800_pm8_u8(struct sm_state *sm, unsigned char *buf, unsigned int buflen)
  176. {
  177. struct mod_state_hapn48 *st = (struct mod_state_hapn48 *)(&sm->m);
  178. for (; buflen > 0; buflen--, buf++) {
  179. if (!st->tx_seq++) {
  180. if (st->shreg <= 1)
  181. st->shreg = hdlcdrv_getbits(&sm->hdrv) | 0x10000;
  182. st->tx_bit = (st->tx_bit << 1) | (st->tx_bit & 1);
  183. st->tx_bit ^= !(st->shreg & 1);
  184. st->shreg >>= 1;
  185. st->tbl = hapn48_txfilt_pm8 + (st->tx_bit & 0xf);
  186. }
  187. if (st->tx_seq >= 8)
  188. st->tx_seq = 0;
  189. *buf = *st->tbl;
  190. st->tbl += 0x10;
  191. }
  192. }
  193. /* --------------------------------------------------------------------- */
  194. static void modulator_hapn4800_pm8_s16(struct sm_state *sm, short *buf, unsigned int buflen)
  195. {
  196. struct mod_state_hapn48 *st = (struct mod_state_hapn48 *)(&sm->m);
  197. for (; buflen > 0; buflen--, buf++) {
  198. if (!st->tx_seq++) {
  199. if (st->shreg <= 1)
  200. st->shreg = hdlcdrv_getbits(&sm->hdrv) | 0x10000;
  201. st->tx_bit = (st->tx_bit << 1) | (st->tx_bit & 1);
  202. st->tx_bit ^= !(st->shreg & 1);
  203. st->shreg >>= 1;
  204. st->tbl = hapn48_txfilt_pm8 + (st->tx_bit & 0xf);
  205. }
  206. if (st->tx_seq >= 8)
  207. st->tx_seq = 0;
  208. *buf = ((*st->tbl)-0x80)<<8;
  209. st->tbl += 0x10;
  210. }
  211. }
  212. /* --------------------------------------------------------------------- */
  213. static void demodulator_hapn4800_10_u8(struct sm_state *sm, const unsigned char *buf, unsigned int buflen)
  214. {
  215. struct demod_state_hapn48 *st = (struct demod_state_hapn48 *)(&sm->d);
  216. static const int pll_corr[2] = { -0x800, 0x800 };
  217. int curst, cursync;
  218. int inv;
  219. for (; buflen > 0; buflen--, buf++) {
  220. inv = ((int)(buf[-2])-0x80) << 8;
  221. st->lvlhi = (st->lvlhi * 65309) >> 16; /* decay */
  222. st->lvllo = (st->lvllo * 65309) >> 16; /* decay */
  223. if (inv > st->lvlhi)
  224. st->lvlhi = inv;
  225. if (inv < st->lvllo)
  226. st->lvllo = inv;
  227. if (buflen & 1)
  228. st->dcd_shreg <<= 1;
  229. st->bit_pll += 0x199a;
  230. curst = cursync = 0;
  231. if (inv > st->lvlhi >> 1) {
  232. curst = 1;
  233. cursync = (buf[-2] > buf[-1] && buf[-2] > buf[-3] &&
  234.    buf[-2] > buf[-0] && buf[-2] > buf[-4]);
  235. } else if (inv < st->lvllo >> 1) {
  236. curst = -1;
  237. cursync = (buf[-2] < buf[-1] && buf[-2] < buf[-3] &&
  238.    buf[-2] < buf[-0] && buf[-2] < buf[-4]);
  239. }
  240. if (cursync) {
  241. st->dcd_shreg |= cursync;
  242. st->bit_pll += pll_corr[((st->bit_pll - 0x8000u) & 0xffffu) < 0x8ccdu];
  243. st->dcd_sum0 += 16 * hweight32(st->dcd_shreg & 0x18c6318c) - 
  244. hweight32(st->dcd_shreg & 0xe739ce70);
  245. }
  246. hdlcdrv_channelbit(&sm->hdrv, cursync);
  247. if ((--st->dcd_time) <= 0) {
  248. hdlcdrv_setdcd(&sm->hdrv, (st->dcd_sum0 + 
  249.    st->dcd_sum1 + 
  250.    st->dcd_sum2) < 0);
  251. st->dcd_sum2 = st->dcd_sum1;
  252. st->dcd_sum1 = st->dcd_sum0;
  253. st->dcd_sum0 = 2; /* slight bias */
  254. st->dcd_time = 240;
  255. }
  256. if (st->bit_pll >= 0x10000) {
  257. st->bit_pll &= 0xffff;
  258. st->last_bit2 = st->last_bit;
  259. if (curst < 0)
  260. st->last_bit = 0;
  261. else if (curst > 0)
  262. st->last_bit = 1;
  263. st->shreg >>= 1;
  264. st->shreg |= ((st->last_bit ^ st->last_bit2 ^ 1) & 1) << 16;
  265. if (st->shreg & 1) {
  266. hdlcdrv_putbits(&sm->hdrv, st->shreg >> 1);
  267. st->shreg = 0x10000;
  268. }
  269. diag_trigger(sm);
  270. }
  271. diag_add_one(sm, inv);
  272. }
  273. }
  274. /* --------------------------------------------------------------------- */
  275. static void demodulator_hapn4800_10_s16(struct sm_state *sm, const short *buf, unsigned int buflen)
  276. {
  277. struct demod_state_hapn48 *st = (struct demod_state_hapn48 *)(&sm->d);
  278. static const int pll_corr[2] = { -0x800, 0x800 };
  279. int curst, cursync;
  280. int inv;
  281. for (; buflen > 0; buflen--, buf++) {
  282. inv = buf[-2];
  283. st->lvlhi = (st->lvlhi * 65309) >> 16; /* decay */
  284. st->lvllo = (st->lvllo * 65309) >> 16; /* decay */
  285. if (inv > st->lvlhi)
  286. st->lvlhi = inv;
  287. if (inv < st->lvllo)
  288. st->lvllo = inv;
  289. if (buflen & 1)
  290. st->dcd_shreg <<= 1;
  291. st->bit_pll += 0x199a;
  292. curst = cursync = 0;
  293. if (inv > st->lvlhi >> 1) {
  294. curst = 1;
  295. cursync = (buf[-2] > buf[-1] && buf[-2] > buf[-3] &&
  296.    buf[-2] > buf[-0] && buf[-2] > buf[-4]);
  297. } else if (inv < st->lvllo >> 1) {
  298. curst = -1;
  299. cursync = (buf[-2] < buf[-1] && buf[-2] < buf[-3] &&
  300.    buf[-2] < buf[-0] && buf[-2] < buf[-4]);
  301. }
  302. if (cursync) {
  303. st->dcd_shreg |= cursync;
  304. st->bit_pll += pll_corr[((st->bit_pll - 0x8000u) & 0xffffu) < 0x8ccdu];
  305. st->dcd_sum0 += 16 * hweight32(st->dcd_shreg & 0x18c6318c) - 
  306. hweight32(st->dcd_shreg & 0xe739ce70);
  307. }
  308. hdlcdrv_channelbit(&sm->hdrv, cursync);
  309. if ((--st->dcd_time) <= 0) {
  310. hdlcdrv_setdcd(&sm->hdrv, (st->dcd_sum0 + 
  311.    st->dcd_sum1 + 
  312.    st->dcd_sum2) < 0);
  313. st->dcd_sum2 = st->dcd_sum1;
  314. st->dcd_sum1 = st->dcd_sum0;
  315. st->dcd_sum0 = 2; /* slight bias */
  316. st->dcd_time = 240;
  317. }
  318. if (st->bit_pll >= 0x10000) {
  319. st->bit_pll &= 0xffff;
  320. st->last_bit2 = st->last_bit;
  321. if (curst < 0)
  322. st->last_bit = 0;
  323. else if (curst > 0)
  324. st->last_bit = 1;
  325. st->shreg >>= 1;
  326. st->shreg |= ((st->last_bit ^ st->last_bit2 ^ 1) & 1) << 16;
  327. if (st->shreg & 1) {
  328. hdlcdrv_putbits(&sm->hdrv, st->shreg >> 1);
  329. st->shreg = 0x10000;
  330. }
  331. diag_trigger(sm);
  332. }
  333. diag_add_one(sm, inv);
  334. }
  335. }
  336. /* --------------------------------------------------------------------- */
  337. static void demodulator_hapn4800_8_u8(struct sm_state *sm, const unsigned char *buf, unsigned int buflen)
  338. {
  339. struct demod_state_hapn48 *st = (struct demod_state_hapn48 *)(&sm->d);
  340. static const int pll_corr[2] = { -0x800, 0x800 };
  341. int curst, cursync;
  342. int inv;
  343. for (; buflen > 0; buflen--, buf++) {
  344. inv = ((int)(buf[-2])-0x80) << 8;
  345. st->lvlhi = (st->lvlhi * 65309) >> 16; /* decay */
  346. st->lvllo = (st->lvllo * 65309) >> 16; /* decay */
  347. if (inv > st->lvlhi)
  348. st->lvlhi = inv;
  349. if (inv < st->lvllo)
  350. st->lvllo = inv;
  351. if (buflen & 1)
  352. st->dcd_shreg <<= 1;
  353. st->bit_pll += 0x2000;
  354. curst = cursync = 0;
  355. if (inv > st->lvlhi >> 1) {
  356. curst = 1;
  357. cursync = (buf[-2] > buf[-1] && buf[-2] > buf[-3] &&
  358.    buf[-2] > buf[-0] && buf[-2] > buf[-4]);
  359. } else if (inv < st->lvllo >> 1) {
  360. curst = -1;
  361. cursync = (buf[-2] < buf[-1] && buf[-2] < buf[-3] &&
  362.    buf[-2] < buf[-0] && buf[-2] < buf[-4]);
  363. }
  364. if (cursync) {
  365. st->dcd_shreg |= cursync;
  366. st->bit_pll += pll_corr[((st->bit_pll - 0x8000u) & 0xffffu) < 0x9000u];
  367. st->dcd_sum0 += 16 * hweight32(st->dcd_shreg & 0x44444444) - 
  368. hweight32(st->dcd_shreg & 0xbbbbbbbb);
  369. }
  370. hdlcdrv_channelbit(&sm->hdrv, cursync);
  371. if ((--st->dcd_time) <= 0) {
  372. hdlcdrv_setdcd(&sm->hdrv, (st->dcd_sum0 + 
  373.    st->dcd_sum1 + 
  374.    st->dcd_sum2) < 0);
  375. st->dcd_sum2 = st->dcd_sum1;
  376. st->dcd_sum1 = st->dcd_sum0;
  377. st->dcd_sum0 = 2; /* slight bias */
  378. st->dcd_time = 240;
  379. }
  380. if (st->bit_pll >= 0x10000) {
  381. st->bit_pll &= 0xffff;
  382. st->last_bit2 = st->last_bit;
  383. if (curst < 0)
  384. st->last_bit = 0;
  385. else if (curst > 0)
  386. st->last_bit = 1;
  387. st->shreg >>= 1;
  388. st->shreg |= ((st->last_bit ^ st->last_bit2 ^ 1) & 1) << 16;
  389. if (st->shreg & 1) {
  390. hdlcdrv_putbits(&sm->hdrv, st->shreg >> 1);
  391. st->shreg = 0x10000;
  392. }
  393. diag_trigger(sm);
  394. }
  395. diag_add_one(sm, inv);
  396. }
  397. }
  398. /* --------------------------------------------------------------------- */
  399. static void demodulator_hapn4800_8_s16(struct sm_state *sm, const short *buf, unsigned int buflen)
  400. {
  401. struct demod_state_hapn48 *st = (struct demod_state_hapn48 *)(&sm->d);
  402. static const int pll_corr[2] = { -0x800, 0x800 };
  403. int curst, cursync;
  404. int inv;
  405. for (; buflen > 0; buflen--, buf++) {
  406. inv = buf[-2];
  407. st->lvlhi = (st->lvlhi * 65309) >> 16; /* decay */
  408. st->lvllo = (st->lvllo * 65309) >> 16; /* decay */
  409. if (inv > st->lvlhi)
  410. st->lvlhi = inv;
  411. if (inv < st->lvllo)
  412. st->lvllo = inv;
  413. if (buflen & 1)
  414. st->dcd_shreg <<= 1;
  415. st->bit_pll += 0x2000;
  416. curst = cursync = 0;
  417. if (inv > st->lvlhi >> 1) {
  418. curst = 1;
  419. cursync = (buf[-2] > buf[-1] && buf[-2] > buf[-3] &&
  420.    buf[-2] > buf[-0] && buf[-2] > buf[-4]);
  421. } else if (inv < st->lvllo >> 1) {
  422. curst = -1;
  423. cursync = (buf[-2] < buf[-1] && buf[-2] < buf[-3] &&
  424.    buf[-2] < buf[-0] && buf[-2] < buf[-4]);
  425. }
  426. if (cursync) {
  427. st->dcd_shreg |= cursync;
  428. st->bit_pll += pll_corr[((st->bit_pll - 0x8000u) & 0xffffu) < 0x9000u];
  429. st->dcd_sum0 += 16 * hweight32(st->dcd_shreg & 0x44444444) - 
  430. hweight32(st->dcd_shreg & 0xbbbbbbbb);
  431. }
  432. hdlcdrv_channelbit(&sm->hdrv, cursync);
  433. if ((--st->dcd_time) <= 0) {
  434. hdlcdrv_setdcd(&sm->hdrv, (st->dcd_sum0 + 
  435.    st->dcd_sum1 + 
  436.    st->dcd_sum2) < 0);
  437. st->dcd_sum2 = st->dcd_sum1;
  438. st->dcd_sum1 = st->dcd_sum0;
  439. st->dcd_sum0 = 2; /* slight bias */
  440. st->dcd_time = 240;
  441. }
  442. if (st->bit_pll >= 0x10000) {
  443. st->bit_pll &= 0xffff;
  444. st->last_bit2 = st->last_bit;
  445. if (curst < 0)
  446. st->last_bit = 0;
  447. else if (curst > 0)
  448. st->last_bit = 1;
  449. st->shreg >>= 1;
  450. st->shreg |= ((st->last_bit ^ st->last_bit2 ^ 1) & 1) << 16;
  451. if (st->shreg & 1) {
  452. hdlcdrv_putbits(&sm->hdrv, st->shreg >> 1);
  453. st->shreg = 0x10000;
  454. }
  455. diag_trigger(sm);
  456. }
  457. diag_add_one(sm, inv);
  458. }
  459. }
  460. /* --------------------------------------------------------------------- */
  461. static void demod_init_hapn4800(struct sm_state *sm)
  462. {
  463. struct demod_state_hapn48 *st = (struct demod_state_hapn48 *)(&sm->d);
  464. st->dcd_time = 120;
  465. st->dcd_sum0 = 2;
  466. }
  467. /* --------------------------------------------------------------------- */
  468. const struct modem_tx_info sm_hapn4800_8_tx = {
  469. "hapn4800", sizeof(struct mod_state_hapn48), 38400, 4800, 
  470. modulator_hapn4800_8_u8, modulator_hapn4800_8_s16, NULL
  471. };
  472. const struct modem_rx_info sm_hapn4800_8_rx = {
  473. "hapn4800", sizeof(struct demod_state_hapn48), 38400, 4800, 5, 8, 
  474. demodulator_hapn4800_8_u8, demodulator_hapn4800_8_s16, demod_init_hapn4800
  475. };
  476. /* --------------------------------------------------------------------- */
  477. const struct modem_tx_info sm_hapn4800_10_tx = {
  478. "hapn4800", sizeof(struct mod_state_hapn48), 48000, 4800,
  479. modulator_hapn4800_10_u8, modulator_hapn4800_10_s16, NULL
  480. };
  481. const struct modem_rx_info sm_hapn4800_10_rx = {
  482. "hapn4800", sizeof(struct demod_state_hapn48), 48000, 4800, 5, 10, 
  483. demodulator_hapn4800_10_u8, demodulator_hapn4800_10_s16, demod_init_hapn4800
  484. };
  485. /* --------------------------------------------------------------------- */
  486. const struct modem_tx_info sm_hapn4800_pm8_tx = {
  487. "hapn4800pm", sizeof(struct mod_state_hapn48), 38400, 4800, 
  488. modulator_hapn4800_pm8_u8, modulator_hapn4800_pm8_s16, NULL
  489. };
  490. const struct modem_rx_info sm_hapn4800_pm8_rx = {
  491. "hapn4800pm", sizeof(struct demod_state_hapn48), 38400, 4800, 5, 8, 
  492. demodulator_hapn4800_8_u8, demodulator_hapn4800_8_s16, demod_init_hapn4800
  493. };
  494. /* --------------------------------------------------------------------- */
  495. const struct modem_tx_info sm_hapn4800_pm10_tx = {
  496. "hapn4800pm", sizeof(struct mod_state_hapn48), 48000, 4800,
  497. modulator_hapn4800_pm10_u8, modulator_hapn4800_pm10_s16, NULL
  498. };
  499. const struct modem_rx_info sm_hapn4800_pm10_rx = {
  500. "hapn4800pm", sizeof(struct demod_state_hapn48), 48000, 4800, 5, 10,
  501. demodulator_hapn4800_10_u8, demodulator_hapn4800_10_s16, demod_init_hapn4800
  502. };
  503. /* --------------------------------------------------------------------- */