patch-2.1.17 linux/drivers/net/sm_fsk9600.h
Next file: linux/drivers/net/sm_sbc.h
Previous file: linux/drivers/net/sm_afsk1200.h
Back to the patch index
Back to the overall index
- Lines: 553
- Date:
Fri Dec 20 13:16:51 1996
- Orig file:
v2.1.16/linux/drivers/net/sm_fsk9600.h
- Orig date:
Thu Jan 1 02:00:00 1970
diff -u --recursive --new-file v2.1.16/linux/drivers/net/sm_fsk9600.h linux/drivers/net/sm_fsk9600.h
@@ -0,0 +1,552 @@
+/*****************************************************************************/
+
+/*
+ * sm_fsk9600.h -- soundcard radio modem driver,
+ * 9600 baud G3RUH compatible FSK modem
+ *
+ * Copyright (C) 1996 Thomas Sailer (sailer@ife.ee.ethz.ch)
+ *
+ * This program 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 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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.
+ *
+ * Please note that the GPL allows you to use the driver, NOT the radio.
+ * In order to use the radio, you need a license from the communications
+ * authority of your country.
+ *
+ */
+
+/* --------------------------------------------------------------------- */
+
+struct demod_state_fsk96 {
+ unsigned int shreg;
+ unsigned long descram;
+ unsigned int bit_pll;
+ unsigned char last_sample;
+ unsigned int dcd_shreg;
+ int dcd_sum0, dcd_sum1, dcd_sum2;
+ unsigned int dcd_time;
+};
+
+struct mod_state_fsk96 {
+ unsigned int shreg;
+ unsigned long scram;
+ unsigned char tx_bit;
+};
+
+#define DEMOD_STATE ((struct demod_state_fsk96 *)(&sm->d))
+#define MOD_STATE ((struct mod_state_fsk96 *)(&sm->m))
+
+/* --------------------------------------------------------------------- */
+
+#define DESCRAM_TAP1 0x20000
+#define DESCRAM_TAP2 0x01000
+#define DESCRAM_TAP3 0x00001
+
+#define DESCRAM_TAPSH1 17
+#define DESCRAM_TAPSH2 12
+#define DESCRAM_TAPSH3 0
+
+#define SCRAM_TAP1 0x20000 /* X^17 */
+#define SCRAM_TAPN 0x00021 /* X^0+X^5 */
+
+/* --------------------------------------------------------------------- */
+
+static unsigned char tx_filter_9k6_4[] = {
+ 65, 66, 63, 63, 76, 76, 73, 73,
+ 54, 54, 51, 51, 64, 65, 61, 62,
+ 214, 214, 211, 211, 224, 225, 221, 222,
+ 202, 202, 199, 200, 213, 213, 210, 210,
+ 38, 38, 35, 35, 48, 49, 45, 46,
+ 26, 27, 23, 24, 37, 37, 34, 34,
+ 186, 187, 183, 184, 197, 197, 194, 194,
+ 175, 175, 172, 172, 185, 185, 182, 182,
+ 73, 74, 70, 71, 84, 84, 81, 81,
+ 62, 62, 59, 59, 72, 72, 69, 69,
+ 221, 222, 218, 219, 232, 232, 229, 229,
+ 210, 210, 207, 207, 220, 221, 217, 218,
+ 46, 46, 43, 43, 56, 56, 53, 53,
+ 34, 34, 31, 31, 44, 45, 41, 42,
+ 194, 194, 191, 191, 204, 205, 201, 202,
+ 182, 183, 179, 180, 193, 193, 190, 190,
+ 65, 65, 62, 62, 75, 76, 72, 73,
+ 53, 54, 50, 51, 64, 64, 61, 61,
+ 213, 214, 210, 211, 224, 224, 221, 221,
+ 202, 202, 199, 199, 212, 212, 209, 209,
+ 37, 38, 34, 35, 48, 48, 45, 45,
+ 26, 26, 23, 23, 36, 37, 33, 34,
+ 186, 186, 183, 183, 196, 196, 193, 193,
+ 174, 174, 171, 171, 184, 185, 181, 182,
+ 73, 73, 70, 70, 83, 83, 80, 80,
+ 61, 61, 58, 58, 71, 72, 68, 69,
+ 221, 221, 218, 218, 231, 232, 228, 229,
+ 209, 210, 206, 207, 220, 220, 217, 217,
+ 45, 45, 42, 42, 55, 56, 53, 53,
+ 33, 34, 30, 31, 44, 44, 41, 41,
+ 193, 194, 190, 191, 204, 204, 201, 201,
+ 182, 182, 179, 179, 192, 192, 189, 190,
+ 65, 66, 62, 63, 67, 68, 64, 64,
+ 103, 104, 100, 101, 105, 106, 101, 102,
+ 168, 169, 164, 165, 169, 170, 166, 167,
+ 205, 206, 202, 203, 207, 208, 204, 205,
+ 49, 50, 46, 46, 51, 51, 47, 48,
+ 87, 88, 83, 84, 88, 89, 85, 86,
+ 151, 152, 148, 149, 153, 154, 149, 150,
+ 189, 190, 186, 187, 191, 192, 187, 188,
+ 66, 67, 63, 64, 68, 69, 64, 65,
+ 104, 105, 100, 101, 105, 106, 102, 103,
+ 168, 169, 165, 166, 170, 171, 167, 167,
+ 206, 207, 203, 204, 208, 209, 204, 205,
+ 50, 51, 46, 47, 51, 52, 48, 49,
+ 87, 88, 84, 85, 89, 90, 85, 86,
+ 152, 153, 149, 149, 154, 154, 150, 151,
+ 190, 191, 186, 187, 191, 192, 188, 189,
+ 66, 67, 63, 64, 68, 69, 64, 65,
+ 104, 105, 101, 101, 106, 106, 102, 103,
+ 169, 170, 165, 166, 170, 171, 167, 168,
+ 206, 207, 203, 204, 208, 209, 204, 205,
+ 50, 51, 46, 47, 51, 52, 48, 49,
+ 88, 88, 84, 85, 89, 90, 86, 87,
+ 152, 153, 149, 150, 154, 155, 150, 151,
+ 190, 191, 186, 187, 191, 192, 188, 189,
+ 67, 68, 63, 64, 68, 69, 65, 66,
+ 105, 106, 101, 102, 106, 107, 103, 104,
+ 169, 170, 166, 167, 171, 172, 167, 168,
+ 207, 208, 204, 204, 209, 209, 205, 206,
+ 50, 51, 47, 48, 52, 53, 49, 50,
+ 88, 89, 85, 86, 90, 91, 86, 87,
+ 153, 154, 149, 150, 154, 155, 151, 152,
+ 191, 191, 187, 188, 192, 193, 189, 190,
+ 65, 66, 66, 67, 49, 50, 50, 50,
+ 168, 169, 168, 169, 151, 152, 152, 153,
+ 103, 104, 104, 105, 87, 88, 87, 88,
+ 205, 206, 206, 207, 189, 190, 190, 191,
+ 67, 68, 68, 68, 51, 51, 51, 52,
+ 169, 170, 170, 171, 153, 154, 154, 154,
+ 105, 106, 105, 106, 88, 89, 89, 90,
+ 207, 208, 208, 209, 191, 191, 191, 192,
+ 62, 63, 63, 63, 46, 46, 46, 47,
+ 164, 165, 165, 166, 148, 149, 149, 149,
+ 100, 101, 100, 101, 83, 84, 84, 85,
+ 202, 203, 203, 204, 186, 186, 186, 187,
+ 64, 64, 64, 65, 47, 48, 48, 49,
+ 166, 167, 167, 167, 149, 150, 150, 151,
+ 101, 102, 102, 103, 85, 86, 85, 86,
+ 204, 204, 204, 205, 187, 188, 188, 189,
+ 66, 67, 67, 68, 50, 51, 51, 51,
+ 169, 170, 169, 170, 152, 153, 153, 154,
+ 104, 105, 105, 106, 88, 88, 88, 89,
+ 206, 207, 207, 208, 190, 191, 191, 191,
+ 68, 69, 69, 69, 51, 52, 52, 53,
+ 170, 171, 171, 172, 154, 155, 154, 155,
+ 106, 106, 106, 107, 89, 90, 90, 91,
+ 208, 209, 209, 209, 192, 192, 192, 193,
+ 63, 64, 64, 64, 46, 47, 47, 48,
+ 165, 166, 166, 167, 149, 150, 149, 150,
+ 101, 101, 101, 102, 84, 85, 85, 86,
+ 203, 204, 204, 204, 187, 187, 187, 188,
+ 64, 65, 65, 66, 48, 49, 49, 50,
+ 167, 168, 167, 168, 150, 151, 151, 152,
+ 102, 103, 103, 104, 86, 87, 86, 87,
+ 205, 205, 205, 206, 188, 189, 189, 190,
+ 65, 65, 73, 73, 38, 37, 46, 45,
+ 214, 213, 221, 221, 186, 186, 194, 193,
+ 54, 53, 62, 61, 26, 26, 34, 33,
+ 202, 202, 210, 209, 175, 174, 182, 182,
+ 76, 75, 84, 83, 48, 48, 56, 55,
+ 224, 224, 232, 231, 197, 196, 204, 204,
+ 64, 64, 72, 71, 37, 36, 44, 44,
+ 213, 212, 220, 220, 185, 184, 193, 192,
+ 63, 62, 70, 70, 35, 34, 43, 42,
+ 211, 210, 218, 218, 183, 183, 191, 190,
+ 51, 50, 59, 58, 23, 23, 31, 30,
+ 199, 199, 207, 206, 172, 171, 179, 179,
+ 73, 72, 81, 80, 45, 45, 53, 53,
+ 221, 221, 229, 228, 194, 193, 201, 201,
+ 61, 61, 69, 68, 34, 33, 41, 41,
+ 210, 209, 217, 217, 182, 181, 190, 189,
+ 66, 65, 74, 73, 38, 38, 46, 45,
+ 214, 214, 222, 221, 187, 186, 194, 194,
+ 54, 54, 62, 61, 27, 26, 34, 34,
+ 202, 202, 210, 210, 175, 174, 183, 182,
+ 76, 76, 84, 83, 49, 48, 56, 56,
+ 225, 224, 232, 232, 197, 196, 205, 204,
+ 65, 64, 72, 72, 37, 37, 45, 44,
+ 213, 212, 221, 220, 185, 185, 193, 192,
+ 63, 62, 71, 70, 35, 35, 43, 42,
+ 211, 211, 219, 218, 184, 183, 191, 191,
+ 51, 51, 59, 58, 24, 23, 31, 31,
+ 200, 199, 207, 207, 172, 171, 180, 179,
+ 73, 73, 81, 80, 46, 45, 53, 53,
+ 222, 221, 229, 229, 194, 193, 202, 201,
+ 62, 61, 69, 69, 34, 34, 42, 41,
+ 210, 209, 218, 217, 182, 182, 190, 190
+};
+
+static unsigned char tx_filter_9k6_5[] = {
+ 78, 78, 75, 76, 85, 85, 82, 83,
+ 71, 72, 69, 69, 78, 78, 76, 76,
+ 193, 193, 190, 191, 199, 200, 197, 198,
+ 186, 187, 184, 184, 193, 193, 190, 191,
+ 58, 59, 56, 57, 65, 66, 63, 63,
+ 52, 52, 49, 50, 58, 59, 56, 57,
+ 173, 174, 171, 171, 180, 180, 177, 178,
+ 166, 167, 164, 165, 173, 174, 171, 171,
+ 85, 86, 83, 83, 92, 92, 89, 90,
+ 79, 79, 76, 77, 85, 86, 83, 83,
+ 200, 200, 198, 198, 207, 207, 204, 205,
+ 193, 194, 191, 191, 200, 201, 198, 198,
+ 66, 66, 63, 64, 72, 73, 70, 70,
+ 59, 60, 57, 57, 66, 66, 63, 64,
+ 180, 181, 178, 179, 187, 188, 185, 185,
+ 174, 174, 171, 172, 180, 181, 178, 179,
+ 76, 77, 74, 75, 83, 84, 81, 81,
+ 70, 70, 67, 68, 76, 77, 74, 75,
+ 191, 192, 189, 189, 198, 198, 195, 196,
+ 185, 185, 182, 183, 191, 192, 189, 189,
+ 57, 57, 54, 55, 64, 64, 61, 62,
+ 50, 51, 48, 48, 57, 57, 55, 55,
+ 172, 172, 169, 170, 178, 179, 176, 177,
+ 165, 166, 163, 163, 172, 172, 169, 170,
+ 84, 84, 81, 82, 90, 91, 88, 89,
+ 77, 78, 75, 75, 84, 84, 81, 82,
+ 198, 199, 196, 197, 205, 206, 203, 203,
+ 192, 192, 189, 190, 198, 199, 196, 197,
+ 64, 65, 62, 62, 71, 71, 68, 69,
+ 57, 58, 55, 56, 64, 65, 62, 62,
+ 179, 179, 177, 177, 186, 186, 183, 184,
+ 172, 173, 170, 170, 179, 180, 177, 177,
+ 78, 79, 76, 77, 79, 79, 77, 77,
+ 99, 100, 97, 98, 100, 100, 98, 98,
+ 171, 172, 169, 170, 172, 173, 170, 171,
+ 192, 193, 190, 191, 193, 194, 191, 192,
+ 59, 60, 57, 58, 60, 61, 58, 59,
+ 81, 81, 79, 79, 81, 82, 79, 80,
+ 153, 153, 151, 151, 153, 154, 151, 152,
+ 174, 175, 172, 173, 175, 175, 173, 173,
+ 82, 83, 80, 81, 83, 83, 81, 81,
+ 103, 104, 101, 102, 104, 105, 102, 103,
+ 175, 176, 173, 174, 176, 177, 174, 175,
+ 197, 197, 195, 195, 197, 198, 195, 196,
+ 64, 64, 62, 62, 64, 65, 62, 63,
+ 85, 85, 83, 83, 85, 86, 83, 84,
+ 157, 158, 155, 156, 158, 158, 156, 156,
+ 178, 179, 176, 177, 179, 179, 177, 177,
+ 78, 78, 76, 76, 78, 79, 76, 77,
+ 99, 99, 97, 97, 99, 100, 97, 98,
+ 171, 172, 169, 170, 172, 172, 170, 170,
+ 192, 193, 190, 191, 193, 193, 191, 191,
+ 59, 60, 57, 58, 60, 60, 58, 58,
+ 80, 81, 78, 79, 81, 82, 79, 80,
+ 152, 153, 150, 151, 153, 154, 151, 152,
+ 174, 174, 172, 172, 174, 175, 172, 173,
+ 82, 82, 80, 80, 82, 83, 80, 81,
+ 103, 104, 101, 102, 104, 104, 102, 102,
+ 175, 176, 173, 174, 176, 176, 174, 174,
+ 196, 197, 194, 195, 197, 198, 195, 196,
+ 63, 64, 61, 62, 64, 65, 62, 63,
+ 84, 85, 82, 83, 85, 86, 83, 84,
+ 157, 157, 155, 155, 157, 158, 155, 156,
+ 178, 178, 176, 176, 178, 179, 176, 177,
+ 78, 78, 78, 79, 69, 69, 69, 69,
+ 136, 136, 136, 137, 127, 127, 127, 128,
+ 136, 136, 136, 137, 127, 127, 127, 128,
+ 194, 195, 195, 195, 185, 185, 185, 186,
+ 69, 69, 69, 69, 59, 60, 60, 60,
+ 127, 127, 127, 128, 117, 118, 118, 118,
+ 127, 127, 127, 128, 117, 118, 118, 118,
+ 185, 185, 185, 186, 175, 176, 176, 176,
+ 78, 79, 79, 79, 69, 69, 69, 70,
+ 136, 137, 137, 137, 127, 128, 127, 128,
+ 136, 137, 137, 137, 127, 128, 127, 128,
+ 195, 195, 195, 195, 185, 186, 186, 186,
+ 69, 69, 69, 70, 60, 60, 60, 60,
+ 127, 128, 127, 128, 118, 118, 118, 119,
+ 127, 128, 127, 128, 118, 118, 118, 119,
+ 185, 186, 186, 186, 176, 176, 176, 177,
+ 78, 79, 79, 79, 69, 69, 69, 70,
+ 136, 137, 137, 137, 127, 128, 128, 128,
+ 136, 137, 137, 137, 127, 128, 128, 128,
+ 195, 195, 195, 195, 185, 186, 186, 186,
+ 69, 69, 69, 70, 60, 60, 60, 60,
+ 127, 128, 128, 128, 118, 118, 118, 119,
+ 127, 128, 128, 128, 118, 118, 118, 119,
+ 185, 186, 186, 186, 176, 176, 176, 177,
+ 79, 79, 79, 80, 69, 70, 70, 70,
+ 137, 137, 137, 138, 128, 128, 128, 128,
+ 137, 137, 137, 138, 128, 128, 128, 128,
+ 195, 195, 195, 196, 186, 186, 186, 186,
+ 69, 70, 70, 70, 60, 60, 60, 61,
+ 128, 128, 128, 128, 118, 119, 119, 119,
+ 128, 128, 128, 128, 118, 119, 119, 119,
+ 186, 186, 186, 186, 176, 177, 177, 177,
+ 78, 78, 82, 82, 59, 59, 64, 63,
+ 171, 171, 175, 175, 153, 152, 157, 157,
+ 99, 99, 103, 103, 81, 80, 85, 84,
+ 192, 192, 197, 196, 174, 174, 178, 178,
+ 79, 78, 83, 82, 60, 60, 64, 64,
+ 172, 172, 176, 176, 153, 153, 158, 157,
+ 100, 99, 104, 104, 81, 81, 85, 85,
+ 193, 193, 197, 197, 175, 174, 179, 178,
+ 76, 76, 80, 80, 57, 57, 62, 61,
+ 169, 169, 173, 173, 151, 150, 155, 155,
+ 97, 97, 101, 101, 79, 78, 83, 82,
+ 190, 190, 195, 194, 172, 172, 176, 176,
+ 77, 76, 81, 80, 58, 58, 62, 62,
+ 170, 170, 174, 174, 151, 151, 156, 155,
+ 98, 97, 102, 102, 79, 79, 83, 83,
+ 191, 191, 195, 195, 173, 172, 177, 176,
+ 79, 78, 83, 82, 60, 60, 64, 64,
+ 172, 172, 176, 176, 153, 153, 158, 157,
+ 100, 99, 104, 104, 81, 81, 85, 85,
+ 193, 193, 197, 197, 175, 174, 179, 178,
+ 79, 79, 83, 83, 61, 60, 65, 65,
+ 173, 172, 177, 176, 154, 154, 158, 158,
+ 100, 100, 105, 104, 82, 82, 86, 86,
+ 194, 193, 198, 198, 175, 175, 179, 179,
+ 77, 76, 81, 80, 58, 58, 62, 62,
+ 170, 170, 174, 174, 151, 151, 156, 155,
+ 98, 97, 102, 102, 79, 79, 83, 83,
+ 191, 191, 195, 195, 173, 172, 177, 176,
+ 77, 77, 81, 81, 59, 58, 63, 63,
+ 171, 170, 175, 174, 152, 152, 156, 156,
+ 98, 98, 103, 102, 80, 80, 84, 84,
+ 192, 191, 196, 196, 173, 173, 177, 177,
+ 78, 76, 85, 84, 58, 57, 66, 64,
+ 193, 191, 200, 198, 173, 172, 180, 179,
+ 71, 70, 79, 77, 52, 50, 59, 57,
+ 186, 185, 193, 192, 166, 165, 174, 172,
+ 85, 83, 92, 90, 65, 64, 72, 71,
+ 199, 198, 207, 205, 180, 178, 187, 186,
+ 78, 76, 85, 84, 58, 57, 66, 64,
+ 193, 191, 200, 198, 173, 172, 180, 179,
+ 75, 74, 83, 81, 56, 54, 63, 62,
+ 190, 189, 198, 196, 171, 169, 178, 177,
+ 69, 67, 76, 75, 49, 48, 57, 55,
+ 184, 182, 191, 189, 164, 163, 171, 170,
+ 82, 81, 89, 88, 63, 61, 70, 68,
+ 197, 195, 204, 203, 177, 176, 185, 183,
+ 76, 74, 83, 81, 56, 55, 63, 62,
+ 190, 189, 198, 196, 171, 169, 178, 177,
+ 78, 77, 86, 84, 59, 57, 66, 65,
+ 193, 192, 200, 199, 174, 172, 181, 179,
+ 72, 70, 79, 78, 52, 51, 60, 58,
+ 187, 185, 194, 192, 167, 166, 174, 173,
+ 85, 84, 92, 91, 66, 64, 73, 71,
+ 200, 198, 207, 206, 180, 179, 188, 186,
+ 78, 77, 86, 84, 59, 57, 66, 65,
+ 193, 192, 201, 199, 174, 172, 181, 180,
+ 76, 75, 83, 82, 57, 55, 64, 62,
+ 191, 189, 198, 197, 171, 170, 179, 177,
+ 69, 68, 77, 75, 50, 48, 57, 56,
+ 184, 183, 191, 190, 165, 163, 172, 170,
+ 83, 81, 90, 89, 63, 62, 70, 69,
+ 198, 196, 205, 203, 178, 177, 185, 184,
+ 76, 75, 83, 82, 57, 55, 64, 62,
+ 191, 189, 198, 197, 171, 170, 179, 177
+};
+
+/* --------------------------------------------------------------------- */
+
+static void modulator_9600_4(struct sm_state *sm, unsigned char *buf, int buflen)
+{
+ int j;
+ const unsigned char *cp;
+
+ for (; buflen >= 4; buflen -= 4) {
+ if (MOD_STATE->shreg <= 1)
+ MOD_STATE->shreg = hdlcdrv_getbits(&sm->hdrv) | 0x10000;
+ MOD_STATE->scram = ((MOD_STATE->scram << 1) |
+ (MOD_STATE->scram & 1));
+ MOD_STATE->scram ^= (!(MOD_STATE->shreg & 1));
+ MOD_STATE->shreg >>= 1;
+ if (MOD_STATE->scram & (SCRAM_TAP1 << 1))
+ MOD_STATE->scram ^= (SCRAM_TAPN << 1);
+ MOD_STATE->tx_bit = (MOD_STATE->tx_bit << 1) |
+ (!!(MOD_STATE->scram & (SCRAM_TAP1 << 2)));
+ cp = tx_filter_9k6_4 + (MOD_STATE->tx_bit & 0xff);
+ for (j = 0; j < 4; j++) {
+ *buf++ = *cp;
+ cp += 0x100;
+ }
+ }
+}
+
+/* --------------------------------------------------------------------- */
+
+static void demodulator_9600_4(struct sm_state *sm, unsigned char *buf, int buflen)
+{
+ static const int pll_corr[2] = { -0x1000, 0x1000 };
+ unsigned char curbit;
+ unsigned int descx;
+
+ for (; buflen > 0; buflen--, buf++) {
+ DEMOD_STATE->dcd_shreg <<= 1;
+ DEMOD_STATE->bit_pll += 0x4000;
+ curbit = (*buf >= 0x80);
+ if (DEMOD_STATE->last_sample ^ curbit) {
+ DEMOD_STATE->dcd_shreg |= 1;
+ DEMOD_STATE->bit_pll += pll_corr
+ [DEMOD_STATE->bit_pll < 0xa000];
+ DEMOD_STATE->dcd_sum0 += 8 *
+ hweight8(DEMOD_STATE->dcd_shreg & 0x0c) -
+ !!(DEMOD_STATE->dcd_shreg & 0x10);
+ }
+ DEMOD_STATE->last_sample = curbit;
+ hdlcdrv_channelbit(&sm->hdrv, DEMOD_STATE->last_sample);
+ if ((--DEMOD_STATE->dcd_time) <= 0) {
+ hdlcdrv_setdcd(&sm->hdrv, (DEMOD_STATE->dcd_sum0 +
+ DEMOD_STATE->dcd_sum1 +
+ DEMOD_STATE->dcd_sum2) < 0);
+ DEMOD_STATE->dcd_sum2 = DEMOD_STATE->dcd_sum1;
+ DEMOD_STATE->dcd_sum1 = DEMOD_STATE->dcd_sum0;
+ DEMOD_STATE->dcd_sum0 = 2; /* slight bias */
+ DEMOD_STATE->dcd_time = 240;
+ }
+ if (DEMOD_STATE->bit_pll >= 0x10000) {
+ DEMOD_STATE->bit_pll &= 0xffff;
+ DEMOD_STATE->descram = (DEMOD_STATE->descram << 1) | curbit;
+ descx = DEMOD_STATE->descram ^ (DEMOD_STATE->descram >> 1);
+ descx ^= ((descx >> DESCRAM_TAPSH1) ^
+ (descx >> DESCRAM_TAPSH2));
+ DEMOD_STATE->shreg >>= 1;
+ DEMOD_STATE->shreg |= (!(descx & 1)) << 16;
+ if (DEMOD_STATE->shreg & 1) {
+ hdlcdrv_putbits(&sm->hdrv, DEMOD_STATE->shreg >> 1);
+ DEMOD_STATE->shreg = 0x10000;
+ }
+ diag_trigger(sm);
+ }
+ diag_add_one(sm, ((short)(*buf - 0x80)) << 8);
+ }
+}
+
+/* --------------------------------------------------------------------- */
+
+static void modulator_9600_5(struct sm_state *sm, unsigned char *buf, int buflen)
+{
+ int j;
+ const unsigned char *cp;
+
+ for (; buflen >= 5; buflen -= 5) {
+ if (MOD_STATE->shreg <= 1)
+ MOD_STATE->shreg = hdlcdrv_getbits(&sm->hdrv) | 0x10000;
+ MOD_STATE->scram = ((MOD_STATE->scram << 1) |
+ (MOD_STATE->scram & 1));
+ MOD_STATE->scram ^= (!(MOD_STATE->shreg & 1));
+ MOD_STATE->shreg >>= 1;
+ if (MOD_STATE->scram & (SCRAM_TAP1 << 1))
+ MOD_STATE->scram ^= (SCRAM_TAPN << 1);
+ MOD_STATE->tx_bit = (MOD_STATE->tx_bit << 1) |
+ (!!(MOD_STATE->scram & (SCRAM_TAP1 << 2)));
+ cp = tx_filter_9k6_5 + (MOD_STATE->tx_bit & 0xff);
+ for (j = 0; j < 5; j++) {
+ *buf++ = *cp;
+ cp += 0x100;
+ }
+ }
+}
+
+/* --------------------------------------------------------------------- */
+
+static void demodulator_9600_5(struct sm_state *sm, unsigned char *buf, int buflen)
+{
+ static const int pll_corr[2] = { -0x1000, 0x1000 };
+ unsigned char curbit;
+ unsigned int descx;
+
+ for (; buflen > 0; buflen--, buf++) {
+ DEMOD_STATE->dcd_shreg <<= 1;
+ DEMOD_STATE->bit_pll += 0x3333;
+ curbit = (*buf >= 0x80);
+ if (DEMOD_STATE->last_sample ^ curbit) {
+ DEMOD_STATE->dcd_shreg |= 1;
+ DEMOD_STATE->bit_pll += pll_corr
+ [DEMOD_STATE->bit_pll < 0x9999];
+ DEMOD_STATE->dcd_sum0 += 16 *
+ hweight8(DEMOD_STATE->dcd_shreg & 0x0c) -
+ hweight8(DEMOD_STATE->dcd_shreg & 0x70);
+ }
+ DEMOD_STATE->last_sample = curbit;
+ hdlcdrv_channelbit(&sm->hdrv, DEMOD_STATE->last_sample);
+ if ((--DEMOD_STATE->dcd_time) <= 0) {
+ hdlcdrv_setdcd(&sm->hdrv, (DEMOD_STATE->dcd_sum0 +
+ DEMOD_STATE->dcd_sum1 +
+ DEMOD_STATE->dcd_sum2) < 0);
+ DEMOD_STATE->dcd_sum2 = DEMOD_STATE->dcd_sum1;
+ DEMOD_STATE->dcd_sum1 = DEMOD_STATE->dcd_sum0;
+ DEMOD_STATE->dcd_sum0 = 2; /* slight bias */
+ DEMOD_STATE->dcd_time = 240;
+ }
+ if (DEMOD_STATE->bit_pll >= 0x10000) {
+ DEMOD_STATE->bit_pll &= 0xffff;
+ DEMOD_STATE->descram = (DEMOD_STATE->descram << 1) | curbit;
+ descx = DEMOD_STATE->descram ^ (DEMOD_STATE->descram >> 1);
+ descx ^= ((descx >> DESCRAM_TAPSH1) ^
+ (descx >> DESCRAM_TAPSH2));
+ DEMOD_STATE->shreg >>= 1;
+ DEMOD_STATE->shreg |= (!(descx & 1)) << 16;
+ if (DEMOD_STATE->shreg & 1) {
+ hdlcdrv_putbits(&sm->hdrv, DEMOD_STATE->shreg >> 1);
+ DEMOD_STATE->shreg = 0x10000;
+ }
+ diag_trigger(sm);
+ }
+ diag_add_one(sm, ((short)(*buf - 0x80)) << 8);
+ }
+}
+
+/* --------------------------------------------------------------------- */
+
+static void demod_init_9600(struct sm_state *sm)
+{
+ DEMOD_STATE->dcd_time = 240;
+ DEMOD_STATE->dcd_sum0 = 2;
+}
+
+/* --------------------------------------------------------------------- */
+
+static const struct modem_tx_info fsk9600_4_tx = {
+ NEXT_TX_INFO, "fsk9600", sizeof(struct mod_state_fsk96), 38400, 9600, 4,
+ modulator_9600_4, NULL
+};
+#undef NEXT_TX_INFO
+#define NEXT_TX_INFO (&fsk9600_4_tx)
+
+static const struct modem_rx_info fsk9600_4_rx = {
+ NEXT_RX_INFO, "fsk9600", sizeof(struct demod_state_fsk96), 38400, 9600, 4, 4,
+ demodulator_9600_4, demod_init_9600
+};
+#undef NEXT_RX_INFO
+#define NEXT_RX_INFO (&fsk9600_4_rx)
+
+/* --------------------------------------------------------------------- */
+
+static const struct modem_tx_info fsk9600_5_tx = {
+ NEXT_TX_INFO, "fsk9600", sizeof(struct mod_state_fsk96), 48000, 9600, 5,
+ modulator_9600_5, NULL
+};
+#undef NEXT_TX_INFO
+#define NEXT_TX_INFO (&fsk9600_5_tx)
+
+static const struct modem_rx_info fsk9600_5_rx = {
+ NEXT_RX_INFO, "fsk9600", sizeof(struct demod_state_fsk96), 48000, 9600, 5, 5,
+ demodulator_9600_5, demod_init_9600
+};
+#undef NEXT_RX_INFO
+#define NEXT_RX_INFO (&fsk9600_5_rx)
+
+/* --------------------------------------------------------------------- */
+
+#undef DEMOD_STATE
+#undef MOD_STATE
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov