patch-2.1.49 linux/include/linux/hfmodem.h

Next file: linux/include/linux/nfsd/syscall.h
Previous file: linux/include/linux/hdlcdrv.h
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.1.48/linux/include/linux/hfmodem.h linux/include/linux/hfmodem.h
@@ -0,0 +1,254 @@
+/*****************************************************************************/
+
+/*
+ *      hfmodem.h  --  Linux soundcard HF FSK driver.
+ *
+ *      Copyright (C) 1997  Thomas Sailer (sailer@ife.ee.ethz.ch)
+ *        Swiss Federal Institute of Technology (ETH), Electronics Lab
+ *
+ *      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.
+ *
+ *
+ *  This is the Linux realtime sound output driver
+ */
+
+/*****************************************************************************/
+
+#ifndef _HFMODEM_H
+#define _HFMODEM_H
+/* --------------------------------------------------------------------- */
+
+#include <linux/version.h>
+
+#include <linux/ioctl.h>
+#include <linux/types.h>
+#include <linux/fs.h>
+#if LINUX_VERSION_CODE >= 0x20100
+#include <linux/poll.h>
+#endif
+
+/* --------------------------------------------------------------------- */
+
+#define HFMODEM_MINOR         145
+
+#define HFMODEM_SRATE        8000
+#define HFMODEM_MAXBITS      4800   /* required for GTOR 300 baud mode */
+#define HFMODEM_MINBAUD        40
+#define HFMODEM_MAXBAUD       400
+#define HFMODEM_MAXCORRLEN   ((HFMODEM_SRATE+HFMODEM_MINBAUD-1)/HFMODEM_MINBAUD)
+
+/* --------------------------------------------------------------------- */
+
+typedef unsigned long hfmodem_time_t;
+typedef int hfmodem_soft_t;
+typedef unsigned long hfmodem_id_t;
+
+/* --------------------------------------------------------------------- */
+
+struct hfmodem_ioctl_fsk_tx_request {
+	hfmodem_time_t tstart;
+	hfmodem_time_t tinc;
+	int inv;
+	hfmodem_id_t id;
+	unsigned int nbits;
+	unsigned char *data;
+	unsigned int freq[2];
+};
+
+struct hfmodem_ioctl_fsk_rx_request {
+	hfmodem_time_t tstart;
+	hfmodem_time_t tinc;
+	unsigned int baud;
+	hfmodem_id_t id;
+	unsigned int nbits;
+	hfmodem_soft_t *data;
+	unsigned int freq[2];
+};
+
+struct hfmodem_ioctl_mixer_params {
+	int src;
+	int igain;
+	int ogain;
+};
+
+struct hfmodem_ioctl_sample_params {
+	__s16 *data;
+	int len;
+};
+
+#define HFMODEM_IOCTL_FSKTXREQUEST    _IOW('H', 0, struct hfmodem_ioctl_fsk_tx_request)
+#define HFMODEM_IOCTL_FSKRXREQUEST    _IOW('H', 1, struct hfmodem_ioctl_fsk_rx_request)
+#define HFMODEM_IOCTL_CLEARRQ         _IO('H',  3)
+#define HFMODEM_IOCTL_GETCURTIME      _IOR('H', 4, hfmodem_time_t)
+#define HFMODEM_IOCTL_WAITRQ          _IOR('H', 5, hfmodem_id_t)
+#define HFMODEM_IOCTL_MIXERPARAMS     _IOW('H', 6, struct hfmodem_ioctl_mixer_params)
+#define HFMODEM_IOCTL_SAMPLESTART     _IOW('H', 7, struct hfmodem_ioctl_sample_params)
+#define HFMODEM_IOCTL_SAMPLEFINISHED  _IO('H',  8)
+
+/* --------------------------------------------------------------------- */
+#ifdef __KERNEL__
+
+
+#define DMA_MODE_AUTOINIT      0x10
+
+#define NR_DEVICE 1
+
+#define HFMODEM_FRAGSAMPLES (HFMODEM_SRATE/100)
+#define HFMODEM_FRAGSIZE    (HFMODEM_FRAGSAMPLES*2)
+#define HFMODEM_NUMFRAGS    8
+#define HFMODEM_EXCESSFRAGS 3
+
+#define HFMODEM_NUMRXSLOTS 20
+#define HFMODEM_NUMTXSLOTS 4
+
+#define HFMODEM_CORRELATOR_CACHE 8
+
+enum slot_st { ss_unused = 0, ss_ready, ss_oper, ss_retired };
+typedef int hfmodem_conv_t;
+
+struct hfmodem_state {
+	const struct hfmodem_scops *scops;
+
+	/* io params */
+	struct {
+		unsigned int base_addr;
+		unsigned int dma;
+		unsigned int irq;
+	} io;
+
+	struct {
+		unsigned int seriobase;
+		unsigned int pariobase;
+		unsigned int midiiobase;
+		unsigned int flags;
+	} ptt_out;
+
+	struct {
+		__s16 *buf;
+		unsigned int lastfrag;
+		unsigned int fragptr;
+		unsigned int last_dmaptr;
+		int ptt_frames;
+	} dma;
+
+	struct {
+		unsigned int last_tvusec;
+		unsigned long long time_cnt;
+		hfmodem_time_t lasttime;
+#ifdef __i386__
+		unsigned int starttime_lo, starttime_hi;
+#endif /* __i386__ */
+	} clk;
+
+	int active;
+	struct wait_queue *wait;
+
+	struct {
+		__s16 *kbuf;
+		__s16 *ubuf;
+		__s16 *kptr;
+		unsigned int size;
+		int rem;
+	} sbuf;
+
+	struct {
+		hfmodem_time_t last_time; 
+		unsigned int tx_phase;
+		
+		struct hfmodem_l1_rxslot {
+			enum slot_st state;
+			hfmodem_time_t tstart, tinc;
+			hfmodem_soft_t *data;
+			hfmodem_soft_t *userdata;
+			unsigned int nbits;
+			unsigned int cntbits;
+			hfmodem_id_t id;
+			unsigned int corrlen;
+			hfmodem_conv_t scale;
+			unsigned int corr_cache;
+		} rxslots[HFMODEM_NUMRXSLOTS];
+		
+		struct hfmodem_l1_txslot {
+			enum slot_st state;
+			hfmodem_time_t tstart, tinc;
+			unsigned char *data;
+			unsigned int nbits;
+			unsigned int cntbits;
+			hfmodem_id_t id;
+			unsigned char inv;
+			unsigned int phinc;
+			unsigned int phase_incs[2];
+		} txslots[HFMODEM_NUMTXSLOTS];
+	} l1;
+};
+
+struct hfmodem_correlator_cache {
+	int refcnt;
+	int lru;
+	unsigned short phase_incs[2];
+	hfmodem_conv_t correlator[2][2][HFMODEM_MAXCORRLEN];
+};
+
+struct hfmodem_scops {
+	unsigned int extent;
+
+	void (*init)(struct hfmodem_state *dev);
+	void (*prepare_input)(struct hfmodem_state *dev);
+	void (*trigger_input)(struct hfmodem_state *dev);
+	void (*prepare_output)(struct hfmodem_state *dev);
+	void (*trigger_output)(struct hfmodem_state *dev);
+	void (*stop)(struct hfmodem_state *dev);
+	unsigned int (*intack)(struct hfmodem_state *dev);
+	void (*mixer)(struct hfmodem_state *dev, int src, int igain, int ogain);
+};
+
+/* --------------------------------------------------------------------- */
+
+extern int hfmodem_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg);
+#if LINUX_VERSION_CODE >= 0x20100
+extern unsigned int hfmodem_poll(struct file *file, poll_table *wait);
+#else
+extern int hfmodem_select(struct inode *inode, struct file *file, int sel_type, select_table *wait);
+#endif
+
+extern void hfmodem_clear_rq(struct hfmodem_state *dev);
+extern void hfmodem_input_samples(struct hfmodem_state *dev, hfmodem_time_t tstart, 
+				hfmodem_time_t tinc, __s16 *samples);
+extern int hfmodem_output_samples(struct hfmodem_state *dev, hfmodem_time_t tstart, 
+				hfmodem_time_t tinc, __s16 *samples);
+extern long hfmodem_next_tx_event(struct hfmodem_state *dev, hfmodem_time_t curr);
+extern void hfmodem_finish_pending_rx_requests(struct hfmodem_state *dev);
+extern void hfmodem_wakeup(struct hfmodem_state *dev);
+
+
+extern int hfmodem_sbcprobe(struct hfmodem_state *dev);
+extern int hfmodem_wssprobe(struct hfmodem_state *dev);
+
+extern void hfmodem_refclock_probe(void);
+extern void hfmodem_refclock_init(struct hfmodem_state *dev);
+extern hfmodem_time_t hfmodem_refclock_current(struct hfmodem_state *dev, hfmodem_time_t expected, int exp_valid);
+
+/* --------------------------------------------------------------------- */
+
+extern const char hfmodem_drvname[];
+extern const char hfmodem_drvinfo[];
+
+extern struct hfmodem_state hfmodem_state[NR_DEVICE];
+extern struct hfmodem_correlator_cache hfmodem_correlator_cache[HFMODEM_CORRELATOR_CACHE];
+
+/* --------------------------------------------------------------------- */
+#endif /* __KERNEL__ */
+/* --------------------------------------------------------------------- */
+#endif /* _HFMODEM_H */

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov