/*****************************************************************************/ /* * 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 #include #include #include #if LINUX_VERSION_CODE >= 0x20100 #include #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__ #include #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; struct pardevice *pardev; } 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 */