亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? hdlcdrv.h

?? umon bootloader source code, support mips cpu.
?? H
字號:
/*
 * hdlcdrv.h  -- HDLC packet radio network driver.
 * The Linux soundcard driver for 1200 baud and 9600 baud packet radio
 * (C) 1996-1998 by Thomas Sailer, HB9JNX/AE4WA
 */

#ifndef _HDLCDRV_H
#define _HDLCDRV_H

/* -------------------------------------------------------------------- */
/*
 * structs for the IOCTL commands
 */

struct hdlcdrv_params {
	int iobase;
	int irq;
	int dma;
	int dma2;
	int seriobase;
	int pariobase;
	int midiiobase;
};	

struct hdlcdrv_channel_params {
	int tx_delay;  /* the transmitter keyup delay in 10ms units */
	int tx_tail;   /* the transmitter keyoff delay in 10ms units */
	int slottime;  /* the slottime in 10ms; usually 10 = 100ms */
	int ppersist;  /* the p-persistence 0..255 */
	int fulldup;   /* some driver do not support full duplex, setting */
	               /* this just makes them send even if DCD is on */
};	

struct hdlcdrv_old_channel_state {
  	int ptt;
  	int dcd;
  	int ptt_keyed;
};

struct hdlcdrv_channel_state {
 	int ptt;
 	int dcd;
 	int ptt_keyed;
 	unsigned long tx_packets;
 	unsigned long tx_errors;
 	unsigned long rx_packets;
 	unsigned long rx_errors;
};

struct hdlcdrv_ioctl {
	int cmd;
	union {
		struct hdlcdrv_params mp;
		struct hdlcdrv_channel_params cp;
		struct hdlcdrv_channel_state cs;
		struct hdlcdrv_old_channel_state ocs;
		unsigned int calibrate;
		unsigned char bits;
		char modename[128];
		char drivername[32];
	} data;
};

/* -------------------------------------------------------------------- */

/*
 * ioctl values
 */
#define HDLCDRVCTL_GETMODEMPAR       0
#define HDLCDRVCTL_SETMODEMPAR       1
#define HDLCDRVCTL_MODEMPARMASK      2  /* not handled by hdlcdrv */
#define HDLCDRVCTL_GETCHANNELPAR    10
#define HDLCDRVCTL_SETCHANNELPAR    11
#define HDLCDRVCTL_OLDGETSTAT       20
#define HDLCDRVCTL_CALIBRATE        21
#define HDLCDRVCTL_GETSTAT          22

/*
 * these are mainly for debugging purposes
 */
#define HDLCDRVCTL_GETSAMPLES       30
#define HDLCDRVCTL_GETBITS          31

/*
 * not handled by hdlcdrv, but by its depending drivers
 */
#define HDLCDRVCTL_GETMODE          40
#define HDLCDRVCTL_SETMODE          41
#define HDLCDRVCTL_MODELIST         42
#define HDLCDRVCTL_DRIVERNAME       43

/*
 * mask of needed modem parameters, returned by HDLCDRVCTL_MODEMPARMASK
 */
#define HDLCDRV_PARMASK_IOBASE      (1<<0)
#define HDLCDRV_PARMASK_IRQ         (1<<1)
#define HDLCDRV_PARMASK_DMA         (1<<2)
#define HDLCDRV_PARMASK_DMA2        (1<<3)
#define HDLCDRV_PARMASK_SERIOBASE   (1<<4)
#define HDLCDRV_PARMASK_PARIOBASE   (1<<5)
#define HDLCDRV_PARMASK_MIDIIOBASE  (1<<6)

/* -------------------------------------------------------------------- */

#ifdef __KERNEL__

#include <linux/netdevice.h>
#include <linux/if.h>
#include <linux/spinlock.h>

#define HDLCDRV_MAGIC      0x5ac6e778
#define HDLCDRV_HDLCBUFFER  32 /* should be a power of 2 for speed reasons */
#define HDLCDRV_BITBUFFER  256 /* should be a power of 2 for speed reasons */
#undef HDLCDRV_LOOPBACK  /* define for HDLC debugging purposes */
#define HDLCDRV_DEBUG

/* maximum packet length, excluding CRC */
#define HDLCDRV_MAXFLEN             400	


struct hdlcdrv_hdlcbuffer {
	spinlock_t lock;
	unsigned rd, wr;
	unsigned short buf[HDLCDRV_HDLCBUFFER];
};

#ifdef HDLCDRV_DEBUG
struct hdlcdrv_bitbuffer {
	unsigned int rd;
	unsigned int wr;
	unsigned int shreg;
	unsigned char buffer[HDLCDRV_BITBUFFER];
};

static inline void hdlcdrv_add_bitbuffer(struct hdlcdrv_bitbuffer *buf, 
					 unsigned int bit)
{
	unsigned char new;

	new = buf->shreg & 1;
	buf->shreg >>= 1;
	buf->shreg |= (!!bit) << 7;
	if (new) {
		buf->buffer[buf->wr] = buf->shreg;
		buf->wr = (buf->wr+1) % sizeof(buf->buffer);
		buf->shreg = 0x80;
	}
}

static inline void hdlcdrv_add_bitbuffer_word(struct hdlcdrv_bitbuffer *buf, 
					      unsigned int bits)
{
	buf->buffer[buf->wr] = bits & 0xff;
	buf->wr = (buf->wr+1) % sizeof(buf->buffer);
	buf->buffer[buf->wr] = (bits >> 8) & 0xff;
	buf->wr = (buf->wr+1) % sizeof(buf->buffer);

}
#endif /* HDLCDRV_DEBUG */

/* -------------------------------------------------------------------- */
/*
 * Information that need to be kept for each driver. 
 */

struct hdlcdrv_ops {
	/*
	 * first some informations needed by the hdlcdrv routines
	 */
	const char *drvname;
	const char *drvinfo;
	/*
	 * the routines called by the hdlcdrv routines
	 */
	int (*open)(struct net_device *);
	int (*close)(struct net_device *);
	int (*ioctl)(struct net_device *, struct ifreq *, 
		     struct hdlcdrv_ioctl *, int);
};

struct hdlcdrv_state {
	int magic;
	int opened;

	const struct hdlcdrv_ops *ops;

	struct {
		int bitrate;
	} par;

	struct hdlcdrv_pttoutput {
		int dma2;
		int seriobase;
		int pariobase;
		int midiiobase;
		unsigned int flags;
	} ptt_out;

	struct hdlcdrv_channel_params ch_params;

	struct hdlcdrv_hdlcrx {
		struct hdlcdrv_hdlcbuffer hbuf;
		long in_hdlc_rx;
		/* 0 = sync hunt, != 0 receiving */
		int rx_state;	
		unsigned int bitstream;
		unsigned int bitbuf;
		int numbits;
		unsigned char dcd;
		
		int len;
		unsigned char *bp;
		unsigned char buffer[HDLCDRV_MAXFLEN+2];
	} hdlcrx;

	struct hdlcdrv_hdlctx {
		struct hdlcdrv_hdlcbuffer hbuf;
		long in_hdlc_tx;
		/*
		 * 0 = send flags
		 * 1 = send txtail (flags)
		 * 2 = send packet
		 */
		int tx_state;	
		int numflags;
		unsigned int bitstream;
		unsigned char ptt;
		int calibrate;
		int slotcnt;

		unsigned int bitbuf;
		int numbits;
		
		int len;
		unsigned char *bp;
		unsigned char buffer[HDLCDRV_MAXFLEN+2];
	} hdlctx;

#ifdef HDLCDRV_DEBUG
	struct hdlcdrv_bitbuffer bitbuf_channel;
	struct hdlcdrv_bitbuffer bitbuf_hdlc;
#endif /* HDLCDRV_DEBUG */

	struct net_device_stats stats;
	int ptt_keyed;

	/* queued skb for transmission */
	struct sk_buff *skb;
};


/* -------------------------------------------------------------------- */

static inline int hdlcdrv_hbuf_full(struct hdlcdrv_hdlcbuffer *hb) 
{
	unsigned long flags;
	int ret;
	
	spin_lock_irqsave(&hb->lock, flags);
	ret = !((HDLCDRV_HDLCBUFFER - 1 + hb->rd - hb->wr) % HDLCDRV_HDLCBUFFER);
	spin_unlock_irqrestore(&hb->lock, flags);
	return ret;
}

/* -------------------------------------------------------------------- */

static inline int hdlcdrv_hbuf_empty(struct hdlcdrv_hdlcbuffer *hb)
{
	unsigned long flags;
	int ret;
	
	spin_lock_irqsave(&hb->lock, flags);
	ret = (hb->rd == hb->wr);
	spin_unlock_irqrestore(&hb->lock, flags);
	return ret;
}

/* -------------------------------------------------------------------- */

static inline unsigned short hdlcdrv_hbuf_get(struct hdlcdrv_hdlcbuffer *hb)
{
	unsigned long flags;
	unsigned short val;
	unsigned newr;

	spin_lock_irqsave(&hb->lock, flags);
	if (hb->rd == hb->wr)
		val = 0;
	else {
		newr = (hb->rd+1) % HDLCDRV_HDLCBUFFER;
		val = hb->buf[hb->rd];
		hb->rd = newr;
	}
	spin_unlock_irqrestore(&hb->lock, flags);
	return val;
}

/* -------------------------------------------------------------------- */

static inline void hdlcdrv_hbuf_put(struct hdlcdrv_hdlcbuffer *hb, 
				    unsigned short val)
{
	unsigned newp;
	unsigned long flags;
	
	spin_lock_irqsave(&hb->lock, flags);
	newp = (hb->wr+1) % HDLCDRV_HDLCBUFFER;
	if (newp != hb->rd) { 
		hb->buf[hb->wr] = val & 0xffff;
		hb->wr = newp;
	}
	spin_unlock_irqrestore(&hb->lock, flags);
}

/* -------------------------------------------------------------------- */

static inline void hdlcdrv_putbits(struct hdlcdrv_state *s, unsigned int bits)
{
	hdlcdrv_hbuf_put(&s->hdlcrx.hbuf, bits);
}

static inline unsigned int hdlcdrv_getbits(struct hdlcdrv_state *s)
{
	unsigned int ret;

	if (hdlcdrv_hbuf_empty(&s->hdlctx.hbuf)) {
		if (s->hdlctx.calibrate > 0)
			s->hdlctx.calibrate--;
		else
			s->hdlctx.ptt = 0;
		ret = 0;
	} else 
		ret = hdlcdrv_hbuf_get(&s->hdlctx.hbuf);
#ifdef HDLCDRV_LOOPBACK
	hdlcdrv_hbuf_put(&s->hdlcrx.hbuf, ret);
#endif /* HDLCDRV_LOOPBACK */
	return ret;
}

static inline void hdlcdrv_channelbit(struct hdlcdrv_state *s, unsigned int bit)
{
#ifdef HDLCDRV_DEBUG
	hdlcdrv_add_bitbuffer(&s->bitbuf_channel, bit);
#endif /* HDLCDRV_DEBUG */
}

static inline void hdlcdrv_setdcd(struct hdlcdrv_state *s, int dcd)
{
	s->hdlcrx.dcd = !!dcd;
}

static inline int hdlcdrv_ptt(struct hdlcdrv_state *s)
{
	return s->hdlctx.ptt || (s->hdlctx.calibrate > 0);
}

/* -------------------------------------------------------------------- */

void hdlcdrv_receiver(struct net_device *, struct hdlcdrv_state *);
void hdlcdrv_transmitter(struct net_device *, struct hdlcdrv_state *);
void hdlcdrv_arbitrate(struct net_device *, struct hdlcdrv_state *);
struct net_device *hdlcdrv_register(const struct hdlcdrv_ops *ops,
				    unsigned int privsize, const char *ifname,
				    unsigned int baseaddr, unsigned int irq, 
				    unsigned int dma);
void hdlcdrv_unregister(struct net_device *dev);

/* -------------------------------------------------------------------- */



#endif /* __KERNEL__ */

/* -------------------------------------------------------------------- */

#endif /* _HDLCDRV_H */

/* -------------------------------------------------------------------- */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美精品国产精品| 国产精品乱码一区二三区小蝌蚪| 亚洲制服丝袜av| 91免费观看视频| 樱花影视一区二区| 色久综合一二码| 亚洲精品免费视频| 欧美在线观看视频一区二区| 亚洲成av人片在www色猫咪| 欧美精品少妇一区二区三区| 视频一区国产视频| 精品成人a区在线观看| 成人综合在线网站| 亚洲特黄一级片| 欧美日韩高清一区二区三区| 午夜精品影院在线观看| 日韩欧美一级特黄在线播放| 国产91在线观看| 亚洲精品欧美综合四区| 91精品啪在线观看国产60岁| 精品一区二区三区免费观看 | 欧美性大战xxxxx久久久| 亚洲国产视频直播| 精品国产青草久久久久福利| 懂色av噜噜一区二区三区av| 亚洲精品写真福利| 精品国产不卡一区二区三区| 成人手机电影网| 亚洲成av人片观看| 欧美激情综合五月色丁香| 91国偷自产一区二区三区成为亚洲经典| 午夜欧美2019年伦理| 久久综合精品国产一区二区三区| 丁香亚洲综合激情啪啪综合| 91丨porny丨首页| 一区二区三区四区激情 | 蜜臀av一区二区| 色婷婷亚洲综合| 一区二区三区丝袜| 美女一区二区久久| 欧美怡红院视频| 一色屋精品亚洲香蕉网站| 国产精品99久久久久久有的能看| 免费成人你懂的| 亚洲天堂成人网| 久久久综合网站| 欧美日韩一区二区在线视频| 国产成人午夜精品影院观看视频 | 色网综合在线观看| 国产乱淫av一区二区三区| 亚洲国产日韩a在线播放性色| 国产亚洲综合在线| 91麻豆精品国产自产在线观看一区 | 91色综合久久久久婷婷| 久久爱www久久做| 五月天亚洲婷婷| 亚洲精品第1页| 亚洲欧洲色图综合| 久久久久久久综合狠狠综合| 91精品久久久久久久99蜜桃| 一道本成人在线| 粉嫩一区二区三区在线看 | 国产一区二区三区久久悠悠色av| 午夜视黄欧洲亚洲| 亚洲美女视频一区| 国产精品久久久久精k8| 国产丝袜欧美中文另类| 欧美mv日韩mv亚洲| 日韩精品自拍偷拍| 91精品久久久久久久91蜜桃| 欧美性videosxxxxx| 一本色道a无线码一区v| 99久久精品国产导航| 成人精品国产福利| 国产成人在线电影| 国产a久久麻豆| 大陆成人av片| 美女被吸乳得到大胸91| 亚洲精品中文在线观看| 亚洲男人天堂av| 精品久久久久久久久久久久久久久| 成人精品视频一区二区三区| 精品一区二区在线视频| 亚洲综合男人的天堂| 久久精品视频免费| 欧美精选一区二区| 日本久久一区二区三区| 91亚洲午夜精品久久久久久| 欧美日韩国产首页| 一本一道久久a久久精品| 91日韩在线专区| 欧美日韩在线观看一区二区 | 精品一区二区三区在线播放| 韩国欧美国产1区| 国产福利91精品一区二区三区| 国产成人av电影在线观看| 成人18视频在线播放| 日本精品免费观看高清观看| 欧美日韩高清一区二区三区| 日韩欧美在线综合网| 2020国产精品久久精品美国| 久久综合久久综合久久| 国产精品久久久久久妇女6080| 亚洲欧美日韩电影| 日韩精品电影在线| 韩国v欧美v日本v亚洲v| 国产成a人亚洲精| 97精品久久久午夜一区二区三区| 99久免费精品视频在线观看| 欧美高清一级片在线| 欧美性三三影院| 精品国产百合女同互慰| 国产日韩欧美a| 午夜一区二区三区在线观看| 亚洲欧美日韩电影| 国产在线播精品第三| 亚洲图片欧美一区| 亚洲成人激情综合网| 久久狠狠亚洲综合| 日本丰满少妇一区二区三区| 在线免费观看日本一区| 欧美一区二区三区小说| 日本一区二区三区四区| 一区二区三区精品视频在线| 麻豆精品蜜桃视频网站| 91碰在线视频| 欧美高清视频不卡网| 国产精品麻豆久久久| 不卡av在线免费观看| 欧美精品乱码久久久久久按摩| 精品国产一区二区三区久久久蜜月| 亚洲欧洲日韩av| 免费观看30秒视频久久| 成a人片亚洲日本久久| 91麻豆精品久久久久蜜臀| 国产精品久久久久一区二区三区 | 亚洲欧洲日韩在线| 亚洲va中文字幕| 成人自拍视频在线观看| 在线观看91精品国产麻豆| 国产精品色在线观看| 日日欢夜夜爽一区| 91视频在线看| 久久久久国产精品麻豆| 亚洲成人一区在线| 91在线porny国产在线看| 久久婷婷久久一区二区三区| 亚洲一区二区在线免费看| 国产成人在线免费观看| 欧美sm美女调教| 日本欧美久久久久免费播放网| 色综合天天视频在线观看| 国产日产精品1区| 狠狠v欧美v日韩v亚洲ⅴ| 欧美日本视频在线| 亚洲国产精品自拍| 日本高清无吗v一区| 综合激情网...| jizz一区二区| 中文字幕不卡在线| 高清视频一区二区| 久久久.com| 国产一区二区在线电影| 日韩美女在线视频| 欧美aaaaa成人免费观看视频| 欧美无砖专区一中文字| 依依成人综合视频| 91成人在线观看喷潮| 亚洲色图在线看| 91美女在线观看| 亚洲三级在线免费观看| 不卡av免费在线观看| 国产精品传媒入口麻豆| av日韩在线网站| 亚洲日本在线观看| 欧美视频一二三区| 欧美aⅴ一区二区三区视频| 欧美一区二区三区小说| 精品综合久久久久久8888| 精品国产成人在线影院| 国产成人精品一区二| 国产精品天干天干在观线| 91影视在线播放| 午夜伊人狠狠久久| 欧美mv日韩mv亚洲| 高清不卡一二三区| 亚洲男女毛片无遮挡| 欧美日韩高清在线| 韩国成人福利片在线播放| 国产精品久久久久久久久快鸭 | 美女久久久精品| 久久久久国产精品人| 91亚洲国产成人精品一区二三| 一区二区三区在线视频播放| 91麻豆精品91久久久久同性| 韩国毛片一区二区三区| 中文字幕一区免费在线观看| 欧美日韩亚洲综合一区| 激情久久久久久久久久久久久久久久| 久久久久久久久久久久电影|