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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * hdlcdrv.h  -- HDLC packet radio network driver.
  3.  * The Linux soundcard driver for 1200 baud and 9600 baud packet radio
  4.  * (C) 1996-1998 by Thomas Sailer, HB9JNX/AE4WA
  5.  */
  6. #ifndef _HDLCDRV_H
  7. #define _HDLCDRV_H
  8. /* -------------------------------------------------------------------- */
  9. /*
  10.  * structs for the IOCTL commands
  11.  */
  12. struct hdlcdrv_params {
  13. int iobase;
  14. int irq;
  15. int dma;
  16. int dma2;
  17. int seriobase;
  18. int pariobase;
  19. int midiiobase;
  20. };
  21. struct hdlcdrv_channel_params {
  22. int tx_delay;  /* the transmitter keyup delay in 10ms units */
  23. int tx_tail;   /* the transmitter keyoff delay in 10ms units */
  24. int slottime;  /* the slottime in 10ms; usually 10 = 100ms */
  25. int ppersist;  /* the p-persistence 0..255 */
  26. int fulldup;   /* some driver do not support full duplex, setting */
  27.                /* this just makes them send even if DCD is on */
  28. };
  29. struct hdlcdrv_old_channel_state {
  30.    int ptt;
  31.    int dcd;
  32.    int ptt_keyed;
  33. };
  34. struct hdlcdrv_channel_state {
  35.   int ptt;
  36.   int dcd;
  37.   int ptt_keyed;
  38.   unsigned long tx_packets;
  39.   unsigned long tx_errors;
  40.   unsigned long rx_packets;
  41.   unsigned long rx_errors;
  42. };
  43. struct hdlcdrv_ioctl {
  44. int cmd;
  45. union {
  46. struct hdlcdrv_params mp;
  47. struct hdlcdrv_channel_params cp;
  48. struct hdlcdrv_channel_state cs;
  49. struct hdlcdrv_old_channel_state ocs;
  50. unsigned int calibrate;
  51. unsigned char bits;
  52. char modename[128];
  53. char drivername[32];
  54. } data;
  55. };
  56. /* -------------------------------------------------------------------- */
  57. /*
  58.  * ioctl values
  59.  */
  60. #define HDLCDRVCTL_GETMODEMPAR       0
  61. #define HDLCDRVCTL_SETMODEMPAR       1
  62. #define HDLCDRVCTL_MODEMPARMASK      2  /* not handled by hdlcdrv */
  63. #define HDLCDRVCTL_GETCHANNELPAR    10
  64. #define HDLCDRVCTL_SETCHANNELPAR    11
  65. #define HDLCDRVCTL_OLDGETSTAT       20
  66. #define HDLCDRVCTL_CALIBRATE        21
  67. #define HDLCDRVCTL_GETSTAT          22
  68. /*
  69.  * these are mainly for debugging purposes
  70.  */
  71. #define HDLCDRVCTL_GETSAMPLES       30
  72. #define HDLCDRVCTL_GETBITS          31
  73. /*
  74.  * not handled by hdlcdrv, but by its depending drivers
  75.  */
  76. #define HDLCDRVCTL_GETMODE          40
  77. #define HDLCDRVCTL_SETMODE          41
  78. #define HDLCDRVCTL_MODELIST         42
  79. #define HDLCDRVCTL_DRIVERNAME       43
  80. /*
  81.  * mask of needed modem parameters, returned by HDLCDRVCTL_MODEMPARMASK
  82.  */
  83. #define HDLCDRV_PARMASK_IOBASE      (1<<0)
  84. #define HDLCDRV_PARMASK_IRQ         (1<<1)
  85. #define HDLCDRV_PARMASK_DMA         (1<<2)
  86. #define HDLCDRV_PARMASK_DMA2        (1<<3)
  87. #define HDLCDRV_PARMASK_SERIOBASE   (1<<4)
  88. #define HDLCDRV_PARMASK_PARIOBASE   (1<<5)
  89. #define HDLCDRV_PARMASK_MIDIIOBASE  (1<<6)
  90. /* -------------------------------------------------------------------- */
  91. #ifdef __KERNEL__
  92. #include <linux/netdevice.h>
  93. #include <linux/if.h>
  94. #include <linux/spinlock.h>
  95. #define HDLCDRV_MAGIC      0x5ac6e778
  96. #define HDLCDRV_HDLCBUFFER  32 /* should be a power of 2 for speed reasons */
  97. #define HDLCDRV_BITBUFFER  256 /* should be a power of 2 for speed reasons */
  98. #undef HDLCDRV_LOOPBACK  /* define for HDLC debugging purposes */
  99. #define HDLCDRV_DEBUG
  100. /* maximum packet length, excluding CRC */
  101. #define HDLCDRV_MAXFLEN             400
  102. struct hdlcdrv_hdlcbuffer {
  103. spinlock_t lock;
  104. unsigned rd, wr;
  105. unsigned short buf[HDLCDRV_HDLCBUFFER];
  106. };
  107. #ifdef HDLCDRV_DEBUG
  108. struct hdlcdrv_bitbuffer {
  109. unsigned int rd;
  110. unsigned int wr;
  111. unsigned int shreg;
  112. unsigned char buffer[HDLCDRV_BITBUFFER];
  113. };
  114. static inline void hdlcdrv_add_bitbuffer(struct hdlcdrv_bitbuffer *buf, 
  115.  unsigned int bit)
  116. {
  117. unsigned char new;
  118. new = buf->shreg & 1;
  119. buf->shreg >>= 1;
  120. buf->shreg |= (!!bit) << 7;
  121. if (new) {
  122. buf->buffer[buf->wr] = buf->shreg;
  123. buf->wr = (buf->wr+1) % sizeof(buf->buffer);
  124. buf->shreg = 0x80;
  125. }
  126. }
  127. static inline void hdlcdrv_add_bitbuffer_word(struct hdlcdrv_bitbuffer *buf, 
  128.       unsigned int bits)
  129. {
  130. buf->buffer[buf->wr] = bits & 0xff;
  131. buf->wr = (buf->wr+1) % sizeof(buf->buffer);
  132. buf->buffer[buf->wr] = (bits >> 8) & 0xff;
  133. buf->wr = (buf->wr+1) % sizeof(buf->buffer);
  134. }
  135. #endif /* HDLCDRV_DEBUG */
  136. /* -------------------------------------------------------------------- */
  137. /*
  138.  * Information that need to be kept for each driver. 
  139.  */
  140. struct hdlcdrv_ops {
  141. /*
  142.  * first some informations needed by the hdlcdrv routines
  143.  */
  144. const char *drvname;
  145. const char *drvinfo;
  146. /*
  147.  * the routines called by the hdlcdrv routines
  148.  */
  149. int (*open)(struct net_device *);
  150. int (*close)(struct net_device *);
  151. int (*ioctl)(struct net_device *, struct ifreq *, 
  152.      struct hdlcdrv_ioctl *, int);
  153. };
  154. struct hdlcdrv_state {
  155. int magic;
  156. const struct hdlcdrv_ops *ops;
  157. struct {
  158. int bitrate;
  159. } par;
  160. struct hdlcdrv_pttoutput {
  161. int dma2;
  162. int seriobase;
  163. int pariobase;
  164. int midiiobase;
  165. unsigned int flags;
  166. } ptt_out;
  167. struct hdlcdrv_channel_params ch_params;
  168. struct hdlcdrv_hdlcrx {
  169. struct hdlcdrv_hdlcbuffer hbuf;
  170. long in_hdlc_rx;
  171. /* 0 = sync hunt, != 0 receiving */
  172. int rx_state;
  173. unsigned int bitstream;
  174. unsigned int bitbuf;
  175. int numbits;
  176. unsigned char dcd;
  177. int len;
  178. unsigned char *bp;
  179. unsigned char buffer[HDLCDRV_MAXFLEN+2];
  180. } hdlcrx;
  181. struct hdlcdrv_hdlctx {
  182. struct hdlcdrv_hdlcbuffer hbuf;
  183. int in_hdlc_tx;
  184. /*
  185.  * 0 = send flags
  186.  * 1 = send txtail (flags)
  187.  * 2 = send packet
  188.  */
  189. int tx_state;
  190. int numflags;
  191. unsigned int bitstream;
  192. unsigned char ptt;
  193. int calibrate;
  194. int slotcnt;
  195. unsigned int bitbuf;
  196. int numbits;
  197. int len;
  198. unsigned char *bp;
  199. unsigned char buffer[HDLCDRV_MAXFLEN+2];
  200. } hdlctx;
  201. #ifdef HDLCDRV_DEBUG
  202. struct hdlcdrv_bitbuffer bitbuf_channel;
  203. struct hdlcdrv_bitbuffer bitbuf_hdlc;
  204. #endif /* HDLCDRV_DEBUG */
  205. struct net_device_stats stats;
  206. int ptt_keyed;
  207. /* queued skb for transmission */
  208. struct sk_buff *skb;
  209. };
  210. /* -------------------------------------------------------------------- */
  211. static inline int hdlcdrv_hbuf_full(struct hdlcdrv_hdlcbuffer *hb) 
  212. {
  213. unsigned long flags;
  214. int ret;
  215. spin_lock_irqsave(&hb->lock, flags);
  216. ret = !((HDLCDRV_HDLCBUFFER - 1 + hb->rd - hb->wr) % HDLCDRV_HDLCBUFFER);
  217. spin_unlock_irqrestore(&hb->lock, flags);
  218. return ret;
  219. }
  220. /* -------------------------------------------------------------------- */
  221. static inline int hdlcdrv_hbuf_empty(struct hdlcdrv_hdlcbuffer *hb)
  222. {
  223. unsigned long flags;
  224. int ret;
  225. spin_lock_irqsave(&hb->lock, flags);
  226. ret = (hb->rd == hb->wr);
  227. spin_unlock_irqrestore(&hb->lock, flags);
  228. return ret;
  229. }
  230. /* -------------------------------------------------------------------- */
  231. static inline unsigned short hdlcdrv_hbuf_get(struct hdlcdrv_hdlcbuffer *hb)
  232. {
  233. unsigned long flags;
  234. unsigned short val;
  235. unsigned newr;
  236. spin_lock_irqsave(&hb->lock, flags);
  237. if (hb->rd == hb->wr)
  238. val = 0;
  239. else {
  240. newr = (hb->rd+1) % HDLCDRV_HDLCBUFFER;
  241. val = hb->buf[hb->rd];
  242. hb->rd = newr;
  243. }
  244. spin_unlock_irqrestore(&hb->lock, flags);
  245. return val;
  246. }
  247. /* -------------------------------------------------------------------- */
  248. static inline void hdlcdrv_hbuf_put(struct hdlcdrv_hdlcbuffer *hb, 
  249.     unsigned short val)
  250. {
  251. unsigned newp;
  252. unsigned long flags;
  253. spin_lock_irqsave(&hb->lock, flags);
  254. newp = (hb->wr+1) % HDLCDRV_HDLCBUFFER;
  255. if (newp != hb->rd) { 
  256. hb->buf[hb->wr] = val & 0xffff;
  257. hb->wr = newp;
  258. }
  259. spin_unlock_irqrestore(&hb->lock, flags);
  260. }
  261. /* -------------------------------------------------------------------- */
  262. static inline void hdlcdrv_putbits(struct hdlcdrv_state *s, unsigned int bits)
  263. {
  264. hdlcdrv_hbuf_put(&s->hdlcrx.hbuf, bits);
  265. }
  266. static inline unsigned int hdlcdrv_getbits(struct hdlcdrv_state *s)
  267. {
  268. unsigned int ret;
  269. if (hdlcdrv_hbuf_empty(&s->hdlctx.hbuf)) {
  270. if (s->hdlctx.calibrate > 0)
  271. s->hdlctx.calibrate--;
  272. else
  273. s->hdlctx.ptt = 0;
  274. ret = 0;
  275. } else 
  276. ret = hdlcdrv_hbuf_get(&s->hdlctx.hbuf);
  277. #ifdef HDLCDRV_LOOPBACK
  278. hdlcdrv_hbuf_put(&s->hdlcrx.hbuf, ret);
  279. #endif /* HDLCDRV_LOOPBACK */
  280. return ret;
  281. }
  282. static inline void hdlcdrv_channelbit(struct hdlcdrv_state *s, unsigned int bit)
  283. {
  284. #ifdef HDLCDRV_DEBUG
  285. hdlcdrv_add_bitbuffer(&s->bitbuf_channel, bit);
  286. #endif /* HDLCDRV_DEBUG */
  287. }
  288. static inline void hdlcdrv_setdcd(struct hdlcdrv_state *s, int dcd)
  289. {
  290. s->hdlcrx.dcd = !!dcd;
  291. }
  292. static inline int hdlcdrv_ptt(struct hdlcdrv_state *s)
  293. {
  294. return s->hdlctx.ptt || (s->hdlctx.calibrate > 0);
  295. }
  296. /* -------------------------------------------------------------------- */
  297. void hdlcdrv_receiver(struct net_device *, struct hdlcdrv_state *);
  298. void hdlcdrv_transmitter(struct net_device *, struct hdlcdrv_state *);
  299. void hdlcdrv_arbitrate(struct net_device *, struct hdlcdrv_state *);
  300. int hdlcdrv_register_hdlcdrv(struct net_device *dev, const struct hdlcdrv_ops *ops,
  301.      unsigned int privsize, char *ifname,
  302.      unsigned int baseaddr, unsigned int irq, 
  303.      unsigned int dma);
  304. int hdlcdrv_unregister_hdlcdrv(struct net_device *dev);
  305. /* -------------------------------------------------------------------- */
  306. #endif /* __KERNEL__ */
  307. /* -------------------------------------------------------------------- */
  308. #endif /* _HDLCDRV_H */
  309. /* -------------------------------------------------------------------- */