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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*****************************************************************************/
  2. /*
  3.  * sm_fsk9600.c  --  soundcard radio modem driver, 
  4.  *                        9600 baud G3RUH compatible FSK modem
  5.  *
  6.  * Copyright (C) 1996  Thomas Sailer (sailer@ife.ee.ethz.ch)
  7.  *
  8.  * This program is free software; you can redistribute it and/or modify
  9.  * it under the terms of the GNU General Public License as published by
  10.  * the Free Software Foundation; either version 2 of the License, or
  11.  * (at your option) any later version.
  12.  *
  13.  * This program is distributed in the hope that it will be useful,
  14.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.  * GNU General Public License for more details.
  17.  *
  18.  * You should have received a copy of the GNU General Public License
  19.  * along with this program; if not, write to the Free Software
  20.  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  21.  *
  22.  *  Please note that the GPL allows you to use the driver, NOT the radio.
  23.  *  In order to use the radio, you need a license from the communications
  24.  *  authority of your country.
  25.  *
  26.  */
  27. #include "sm.h"
  28. #include "sm_tbl_fsk9600.h"
  29. /* --------------------------------------------------------------------- */
  30. struct demod_state_fsk96 {
  31. unsigned int shreg;
  32. unsigned long descram;
  33. unsigned int bit_pll;
  34. unsigned char last_sample;
  35. unsigned int dcd_shreg;
  36. int dcd_sum0, dcd_sum1, dcd_sum2;
  37. unsigned int dcd_time;
  38. };
  39. struct mod_state_fsk96 {
  40. unsigned int shreg;
  41. unsigned long scram;
  42. unsigned char tx_bit;
  43. unsigned char *txtbl;
  44. unsigned int txphase;
  45. };
  46. /* --------------------------------------------------------------------- */
  47. #define DESCRAM_TAP1 0x20000
  48. #define DESCRAM_TAP2 0x01000
  49. #define DESCRAM_TAP3 0x00001
  50. #define DESCRAM_TAPSH1 17
  51. #define DESCRAM_TAPSH2 12
  52. #define DESCRAM_TAPSH3 0
  53. #define SCRAM_TAP1 0x20000 /* X^17 */
  54. #define SCRAM_TAPN 0x00021 /* X^0+X^5 */
  55. /* --------------------------------------------------------------------- */
  56. static void modulator_9600_4_u8(struct sm_state *sm, unsigned char *buf, unsigned int buflen)
  57. {
  58. struct mod_state_fsk96 *st = (struct mod_state_fsk96 *)(&sm->m);
  59. for (; buflen > 0; buflen--) {
  60. if (!st->txphase++) {
  61. if (st->shreg <= 1)
  62. st->shreg = hdlcdrv_getbits(&sm->hdrv) | 0x10000;
  63. st->scram = (st->scram << 1) | (st->scram & 1);
  64. st->scram ^= !(st->shreg & 1);
  65. st->shreg >>= 1;
  66. if (st->scram & (SCRAM_TAP1 << 1))
  67. st->scram ^= SCRAM_TAPN << 1;
  68. st->tx_bit = (st->tx_bit << 1) | (!!(st->scram & (SCRAM_TAP1 << 2)));
  69. st->txtbl = fsk96_txfilt_4 + (st->tx_bit & 0xff);
  70. }
  71. if (st->txphase >= 4)
  72. st->txphase = 0;
  73. *buf++ = *st->txtbl;
  74. st->txtbl += 0x100;
  75. }
  76. }
  77. /* --------------------------------------------------------------------- */
  78. static void modulator_9600_4_s16(struct sm_state *sm, short *buf, unsigned int buflen)
  79. {
  80. struct mod_state_fsk96 *st = (struct mod_state_fsk96 *)(&sm->m);
  81. for (; buflen > 0; buflen--) {
  82. if (!st->txphase++) {
  83. if (st->shreg <= 1)
  84. st->shreg = hdlcdrv_getbits(&sm->hdrv) | 0x10000;
  85. st->scram = (st->scram << 1) | (st->scram & 1);
  86. st->scram ^= !(st->shreg & 1);
  87. st->shreg >>= 1;
  88. if (st->scram & (SCRAM_TAP1 << 1))
  89. st->scram ^= SCRAM_TAPN << 1;
  90. st->tx_bit = (st->tx_bit << 1) | (!!(st->scram & (SCRAM_TAP1 << 2)));
  91. st->txtbl = fsk96_txfilt_4 + (st->tx_bit & 0xff);
  92. }
  93. if (st->txphase >= 4)
  94. st->txphase = 0;
  95. *buf++ = ((*st->txtbl)-0x80) << 8;
  96. st->txtbl += 0x100;
  97. }
  98. }
  99. /* --------------------------------------------------------------------- */
  100. static void demodulator_9600_4_u8(struct sm_state *sm, const unsigned char *buf, unsigned int buflen)
  101. {
  102. struct demod_state_fsk96 *st = (struct demod_state_fsk96 *)(&sm->d);
  103. static const int pll_corr[2] = { -0x1000, 0x1000 };
  104. unsigned char curbit;
  105. unsigned int descx;
  106. for (; buflen > 0; buflen--, buf++) {
  107. st->dcd_shreg <<= 1;
  108. st->bit_pll += 0x4000;
  109. curbit = (*buf >= 0x80);
  110. if (st->last_sample ^ curbit) {
  111. st->dcd_shreg |= 1;
  112. st->bit_pll += pll_corr[st->bit_pll < 0xa000];
  113. st->dcd_sum0 += 8 * hweight8(st->dcd_shreg & 0x0c) - 
  114. !!(st->dcd_shreg & 0x10);
  115. }
  116. st->last_sample = curbit;
  117. hdlcdrv_channelbit(&sm->hdrv, st->last_sample);
  118. if ((--st->dcd_time) <= 0) {
  119. hdlcdrv_setdcd(&sm->hdrv, (st->dcd_sum0 + 
  120.    st->dcd_sum1 + 
  121.    st->dcd_sum2) < 0);
  122. st->dcd_sum2 = st->dcd_sum1;
  123. st->dcd_sum1 = st->dcd_sum0;
  124. st->dcd_sum0 = 2; /* slight bias */
  125. st->dcd_time = 240;
  126. }
  127. if (st->bit_pll >= 0x10000) {
  128. st->bit_pll &= 0xffff;
  129. st->descram = (st->descram << 1) | curbit;
  130. descx = st->descram ^ (st->descram >> 1);
  131. descx ^= ((descx >> DESCRAM_TAPSH1) ^
  132.   (descx >> DESCRAM_TAPSH2));
  133. st->shreg >>= 1;
  134. st->shreg |= (!(descx & 1)) << 16;
  135. if (st->shreg & 1) {
  136. hdlcdrv_putbits(&sm->hdrv, st->shreg >> 1);
  137. st->shreg = 0x10000;
  138. }
  139. diag_trigger(sm);
  140. }
  141. diag_add_one(sm, ((short)(*buf - 0x80)) << 8);
  142. }
  143. }
  144. /* --------------------------------------------------------------------- */
  145. static void demodulator_9600_4_s16(struct sm_state *sm, const short *buf, unsigned int buflen)
  146. {
  147. struct demod_state_fsk96 *st = (struct demod_state_fsk96 *)(&sm->d);
  148. static const int pll_corr[2] = { -0x1000, 0x1000 };
  149. unsigned char curbit;
  150. unsigned int descx;
  151. for (; buflen > 0; buflen--, buf++) {
  152. st->dcd_shreg <<= 1;
  153. st->bit_pll += 0x4000;
  154. curbit = (*buf >= 0);
  155. if (st->last_sample ^ curbit) {
  156. st->dcd_shreg |= 1;
  157. st->bit_pll += pll_corr[st->bit_pll < 0xa000];
  158. st->dcd_sum0 += 8 * hweight8(st->dcd_shreg & 0x0c) - 
  159. !!(st->dcd_shreg & 0x10);
  160. }
  161. st->last_sample = curbit;
  162. hdlcdrv_channelbit(&sm->hdrv, st->last_sample);
  163. if ((--st->dcd_time) <= 0) {
  164. hdlcdrv_setdcd(&sm->hdrv, (st->dcd_sum0 + 
  165.    st->dcd_sum1 + 
  166.    st->dcd_sum2) < 0);
  167. st->dcd_sum2 = st->dcd_sum1;
  168. st->dcd_sum1 = st->dcd_sum0;
  169. st->dcd_sum0 = 2; /* slight bias */
  170. st->dcd_time = 240;
  171. }
  172. if (st->bit_pll >= 0x10000) {
  173. st->bit_pll &= 0xffff;
  174. st->descram = (st->descram << 1) | curbit;
  175. descx = st->descram ^ (st->descram >> 1);
  176. descx ^= ((descx >> DESCRAM_TAPSH1) ^
  177.   (descx >> DESCRAM_TAPSH2));
  178. st->shreg >>= 1;
  179. st->shreg |= (!(descx & 1)) << 16;
  180. if (st->shreg & 1) {
  181. hdlcdrv_putbits(&sm->hdrv, st->shreg >> 1);
  182. st->shreg = 0x10000;
  183. }
  184. diag_trigger(sm);
  185. }
  186. diag_add_one(sm, *buf);
  187. }
  188. }
  189. /* --------------------------------------------------------------------- */
  190. static void modulator_9600_5_u8(struct sm_state *sm, unsigned char *buf, unsigned int buflen)
  191. {
  192. struct mod_state_fsk96 *st = (struct mod_state_fsk96 *)(&sm->m);
  193. for (; buflen > 0; buflen--) {
  194. if (!st->txphase++) {
  195. if (st->shreg <= 1)
  196. st->shreg = hdlcdrv_getbits(&sm->hdrv) | 0x10000;
  197. st->scram = (st->scram << 1) | (st->scram & 1);
  198. st->scram ^= !(st->shreg & 1);
  199. st->shreg >>= 1;
  200. if (st->scram & (SCRAM_TAP1 << 1))
  201. st->scram ^= SCRAM_TAPN << 1;
  202. st->tx_bit = (st->tx_bit << 1) | (!!(st->scram & (SCRAM_TAP1 << 2)));
  203. st->txtbl = fsk96_txfilt_5 + (st->tx_bit & 0xff);
  204. }
  205. if (st->txphase >= 5)
  206. st->txphase = 0;
  207. *buf++ = *st->txtbl;
  208. st->txtbl += 0x100;
  209. }
  210. }
  211. /* --------------------------------------------------------------------- */
  212. static void modulator_9600_5_s16(struct sm_state *sm, short *buf, unsigned int buflen)
  213. {
  214. struct mod_state_fsk96 *st = (struct mod_state_fsk96 *)(&sm->m);
  215. for (; buflen > 0; buflen--) {
  216. if (!st->txphase++) {
  217. if (st->shreg <= 1)
  218. st->shreg = hdlcdrv_getbits(&sm->hdrv) | 0x10000;
  219. st->scram = (st->scram << 1) | (st->scram & 1);
  220. st->scram ^= !(st->shreg & 1);
  221. st->shreg >>= 1;
  222. if (st->scram & (SCRAM_TAP1 << 1))
  223. st->scram ^= SCRAM_TAPN << 1;
  224. st->tx_bit = (st->tx_bit << 1) | (!!(st->scram & (SCRAM_TAP1 << 2)));
  225. st->txtbl = fsk96_txfilt_5 + (st->tx_bit & 0xff);
  226. }
  227. if (st->txphase >= 5)
  228. st->txphase = 0;
  229. *buf++ = ((*st->txtbl)-0x80)<<8;
  230. st->txtbl += 0x100;
  231. }
  232. }
  233. /* --------------------------------------------------------------------- */
  234. static void demodulator_9600_5_u8(struct sm_state *sm, const unsigned char *buf, unsigned int buflen)
  235. {
  236. struct demod_state_fsk96 *st = (struct demod_state_fsk96 *)(&sm->d);
  237. static const int pll_corr[2] = { -0x1000, 0x1000 };
  238. unsigned char curbit;
  239. unsigned int descx;
  240. for (; buflen > 0; buflen--, buf++) {
  241. st->dcd_shreg <<= 1;
  242. st->bit_pll += 0x3333;
  243. curbit = (*buf >= 0x80);
  244. if (st->last_sample ^ curbit) {
  245. st->dcd_shreg |= 1;
  246. st->bit_pll += pll_corr[st->bit_pll < 0x9999];
  247. st->dcd_sum0 += 16 * hweight8(st->dcd_shreg & 0x0c) - 
  248. hweight8(st->dcd_shreg & 0x70);
  249. }
  250. st->last_sample = curbit;
  251. hdlcdrv_channelbit(&sm->hdrv, st->last_sample);
  252. if ((--st->dcd_time) <= 0) {
  253. hdlcdrv_setdcd(&sm->hdrv, (st->dcd_sum0 + 
  254.    st->dcd_sum1 + 
  255.    st->dcd_sum2) < 0);
  256. st->dcd_sum2 = st->dcd_sum1;
  257. st->dcd_sum1 = st->dcd_sum0;
  258. st->dcd_sum0 = 2; /* slight bias */
  259. st->dcd_time = 240;
  260. }
  261. if (st->bit_pll >= 0x10000) {
  262. st->bit_pll &= 0xffff;
  263. st->descram = (st->descram << 1) | curbit;
  264. descx = st->descram ^ (st->descram >> 1);
  265. descx ^= ((descx >> DESCRAM_TAPSH1) ^
  266.   (descx >> DESCRAM_TAPSH2));
  267. st->shreg >>= 1;
  268. st->shreg |= (!(descx & 1)) << 16;
  269. if (st->shreg & 1) {
  270. hdlcdrv_putbits(&sm->hdrv, st->shreg >> 1);
  271. st->shreg = 0x10000;
  272. }
  273. diag_trigger(sm);
  274. }
  275. diag_add_one(sm, ((short)(*buf - 0x80)) << 8);
  276. }
  277. }
  278. /* --------------------------------------------------------------------- */
  279. static void demodulator_9600_5_s16(struct sm_state *sm, const short *buf, unsigned int buflen)
  280. {
  281. struct demod_state_fsk96 *st = (struct demod_state_fsk96 *)(&sm->d);
  282. static const int pll_corr[2] = { -0x1000, 0x1000 };
  283. unsigned char curbit;
  284. unsigned int descx;
  285. for (; buflen > 0; buflen--, buf++) {
  286. st->dcd_shreg <<= 1;
  287. st->bit_pll += 0x3333;
  288. curbit = (*buf >= 0);
  289. if (st->last_sample ^ curbit) {
  290. st->dcd_shreg |= 1;
  291. st->bit_pll += pll_corr[st->bit_pll < 0x9999];
  292. st->dcd_sum0 += 16 * hweight8(st->dcd_shreg & 0x0c) - 
  293. hweight8(st->dcd_shreg & 0x70);
  294. }
  295. st->last_sample = curbit;
  296. hdlcdrv_channelbit(&sm->hdrv, st->last_sample);
  297. if ((--st->dcd_time) <= 0) {
  298. hdlcdrv_setdcd(&sm->hdrv, (st->dcd_sum0 + 
  299.    st->dcd_sum1 + 
  300.    st->dcd_sum2) < 0);
  301. st->dcd_sum2 = st->dcd_sum1;
  302. st->dcd_sum1 = st->dcd_sum0;
  303. st->dcd_sum0 = 2; /* slight bias */
  304. st->dcd_time = 240;
  305. }
  306. if (st->bit_pll >= 0x10000) {
  307. st->bit_pll &= 0xffff;
  308. st->descram = (st->descram << 1) | curbit;
  309. descx = st->descram ^ (st->descram >> 1);
  310. descx ^= ((descx >> DESCRAM_TAPSH1) ^
  311.   (descx >> DESCRAM_TAPSH2));
  312. st->shreg >>= 1;
  313. st->shreg |= (!(descx & 1)) << 16;
  314. if (st->shreg & 1) {
  315. hdlcdrv_putbits(&sm->hdrv, st->shreg >> 1);
  316. st->shreg = 0x10000;
  317. }
  318. diag_trigger(sm);
  319. }
  320. diag_add_one(sm, *buf);
  321. }
  322. }
  323. /* --------------------------------------------------------------------- */
  324. static void demod_init_9600(struct sm_state *sm)
  325. {
  326. struct demod_state_fsk96 *st = (struct demod_state_fsk96 *)(&sm->d);
  327. st->dcd_time = 240;
  328. st->dcd_sum0 = 2;
  329. }
  330. /* --------------------------------------------------------------------- */
  331. const struct modem_tx_info sm_fsk9600_4_tx = {
  332. "fsk9600", sizeof(struct mod_state_fsk96), 38400, 9600,
  333. modulator_9600_4_u8, modulator_9600_4_s16, NULL
  334. };
  335. const struct modem_rx_info sm_fsk9600_4_rx = {
  336. "fsk9600", sizeof(struct demod_state_fsk96), 38400, 9600, 1, 4,
  337. demodulator_9600_4_u8, demodulator_9600_4_s16, demod_init_9600
  338. };
  339. /* --------------------------------------------------------------------- */
  340. const struct modem_tx_info sm_fsk9600_5_tx = {
  341. "fsk9600", sizeof(struct mod_state_fsk96), 48000, 9600,
  342. modulator_9600_5_u8, modulator_9600_5_s16, NULL
  343. };
  344. const struct modem_rx_info sm_fsk9600_5_rx = {
  345. "fsk9600", sizeof(struct demod_state_fsk96), 48000, 9600, 1, 5, 
  346. demodulator_9600_5_u8, demodulator_9600_5_s16, demod_init_9600
  347. };
  348. /* --------------------------------------------------------------------- */