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

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

?? stallion.c

?? powerpc內核mpc8241linux系統下char驅動程序
?? C
?? 第 1 頁 / 共 5 頁
字號:
/*****************************************************************************//* *	stallion.c  -- stallion multiport serial driver. * *	Copyright (C) 1996-1999  Stallion Technologies (support@stallion.oz.au). *	Copyright (C) 1994-1996  Greg Ungerer (gerg@stallion.oz.au). * *	This code is loosely based on the Linux serial driver, written by *	Linus Torvalds, Theodore T'so and others. * *	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. *//*****************************************************************************/#include <linux/config.h>#include <linux/module.h>#include <linux/malloc.h>#include <linux/interrupt.h>#include <linux/tty_flip.h>#include <linux/serial.h>#include <linux/cd1400.h>#include <linux/sc26198.h>#include <linux/comstats.h>#include <linux/stallion.h>#include <linux/ioport.h>#include <linux/init.h>#include <linux/smp_lock.h>#include <asm/io.h>#include <asm/uaccess.h>#ifdef CONFIG_PCI#include <linux/pci.h>#endif/*****************************************************************************//* *	Define different board types. Use the standard Stallion "assigned" *	board numbers. Boards supported in this driver are abbreviated as *	EIO = EasyIO and ECH = EasyConnection 8/32. */#define	BRD_EASYIO	20#define	BRD_ECH		21#define	BRD_ECHMC	22#define	BRD_ECHPCI	26#define	BRD_ECH64PCI	27#define	BRD_EASYIOPCI	28/* *	Define a configuration structure to hold the board configuration. *	Need to set this up in the code (for now) with the boards that are *	to be configured into the system. This is what needs to be modified *	when adding/removing/modifying boards. Each line entry in the *	stl_brdconf[] array is a board. Each line contains io/irq/memory *	ranges for that board (as well as what type of board it is). *	Some examples: *		{ BRD_EASYIO, 0x2a0, 0, 0, 10, 0 }, *	This line would configure an EasyIO board (4 or 8, no difference), *	at io address 2a0 and irq 10. *	Another example: *		{ BRD_ECH, 0x2a8, 0x280, 0, 12, 0 }, *	This line will configure an EasyConnection 8/32 board at primary io *	address 2a8, secondary io address 280 and irq 12. *	Enter as many lines into this array as you want (only the first 4 *	will actually be used!). Any combination of EasyIO and EasyConnection *	boards can be specified. EasyConnection 8/32 boards can share their *	secondary io addresses between each other. * *	NOTE: there is no need to put any entries in this table for PCI *	boards. They will be found automatically by the driver - provided *	PCI BIOS32 support is compiled into the kernel. */typedef struct {	int		brdtype;	int		ioaddr1;	int		ioaddr2;	unsigned long	memaddr;	int		irq;	int		irqtype;} stlconf_t;static stlconf_t	stl_brdconf[] = {	/*{ BRD_EASYIO, 0x2a0, 0, 0, 10, 0 },*/};static int	stl_nrbrds = sizeof(stl_brdconf) / sizeof(stlconf_t);/*****************************************************************************//* *	Define some important driver characteristics. Device major numbers *	allocated as per Linux Device Registry. */#ifndef	STL_SIOMEMMAJOR#define	STL_SIOMEMMAJOR		28#endif#ifndef	STL_SERIALMAJOR#define	STL_SERIALMAJOR		24#endif#ifndef	STL_CALLOUTMAJOR#define	STL_CALLOUTMAJOR	25#endif#define	STL_DRVTYPSERIAL	1#define	STL_DRVTYPCALLOUT	2/* *	Set the TX buffer size. Bigger is better, but we don't want *	to chew too much memory with buffers! */#define	STL_TXBUFLOW		512#define	STL_TXBUFSIZE		4096/*****************************************************************************//* *	Define our local driver identity first. Set up stuff to deal with *	all the local structures required by a serial tty driver. */static char	*stl_drvtitle = "Stallion Multiport Serial Driver";static char	*stl_drvname = "stallion";static char	*stl_drvversion = "5.5.1";static char	*stl_serialname = "ttyE";static char	*stl_calloutname = "cue";static struct tty_driver	stl_serial;static struct tty_driver	stl_callout;static struct tty_struct	*stl_ttys[STL_MAXDEVS];static struct termios		*stl_termios[STL_MAXDEVS];static struct termios		*stl_termioslocked[STL_MAXDEVS];static int			stl_refcount = 0;/* *	We will need to allocate a temporary write buffer for chars that *	come direct from user space. The problem is that a copy from user *	space might cause a page fault (typically on a system that is *	swapping!). All ports will share one buffer - since if the system *	is already swapping a shared buffer won't make things any worse. */static char			*stl_tmpwritebuf;static struct semaphore		stl_tmpwritesem = MUTEX;/* *	Define a local default termios struct. All ports will be created *	with this termios initially. Basically all it defines is a raw port *	at 9600, 8 data bits, 1 stop bit. */static struct termios		stl_deftermios = {	0,	0,	(B9600 | CS8 | CREAD | HUPCL | CLOCAL),	0,	0,	INIT_C_CC};/* *	Define global stats structures. Not used often, and can be *	re-used for each stats call. */static comstats_t	stl_comstats;static combrd_t		stl_brdstats;static stlbrd_t		stl_dummybrd;static stlport_t	stl_dummyport;/* *	Define global place to put buffer overflow characters. */static char		stl_unwanted[SC26198_RXFIFOSIZE];/* *	Keep track of what interrupts we have requested for us. *	We don't need to request an interrupt twice if it is being *	shared with another Stallion board. */static int	stl_gotintrs[STL_MAXBRDS];static int	stl_numintrs = 0;/*****************************************************************************/static stlbrd_t		*stl_brds[STL_MAXBRDS];/* *	Per board state flags. Used with the state field of the board struct. *	Not really much here! */#define	BRD_FOUND	0x1/* *	Define the port structure istate flags. These set of flags are *	modified at interrupt time - so setting and reseting them needs *	to be atomic. Use the bit clear/setting routines for this. */#define	ASYI_TXBUSY	1#define	ASYI_TXLOW	2#define	ASYI_DCDCHANGE	3#define	ASYI_TXFLOWED	4/* *	Define an array of board names as printable strings. Handy for *	referencing boards when printing trace and stuff. */static char	*stl_brdnames[] = {	(char *) NULL,	(char *) NULL,	(char *) NULL,	(char *) NULL,	(char *) NULL,	(char *) NULL,	(char *) NULL,	(char *) NULL,	(char *) NULL,	(char *) NULL,	(char *) NULL,	(char *) NULL,	(char *) NULL,	(char *) NULL,	(char *) NULL,	(char *) NULL,	(char *) NULL,	(char *) NULL,	(char *) NULL,	(char *) NULL,	"EasyIO",	"EC8/32-AT",	"EC8/32-MC",	(char *) NULL,	(char *) NULL,	(char *) NULL,	"EC8/32-PCI",	"EC8/64-PCI",	"EasyIO-PCI",};/*****************************************************************************/#ifdef MODULE/* *	Define some string labels for arguments passed from the module *	load line. These allow for easy board definitions, and easy *	modification of the io, memory and irq resoucres. */static char	*board0[4];static char	*board1[4];static char	*board2[4];static char	*board3[4];static char	**stl_brdsp[] = {	(char **) &board0,	(char **) &board1,	(char **) &board2,	(char **) &board3};/* *	Define a set of common board names, and types. This is used to *	parse any module arguments. */typedef struct stlbrdtype {	char	*name;	int	type;} stlbrdtype_t;static stlbrdtype_t	stl_brdstr[] = {	{ "easyio", BRD_EASYIO },	{ "eio", BRD_EASYIO },	{ "20", BRD_EASYIO },	{ "ec8/32", BRD_ECH },	{ "ec8/32-at", BRD_ECH },	{ "ec8/32-isa", BRD_ECH },	{ "ech", BRD_ECH },	{ "echat", BRD_ECH },	{ "21", BRD_ECH },	{ "ec8/32-mc", BRD_ECHMC },	{ "ec8/32-mca", BRD_ECHMC },	{ "echmc", BRD_ECHMC },	{ "echmca", BRD_ECHMC },	{ "22", BRD_ECHMC },	{ "ec8/32-pc", BRD_ECHPCI },	{ "ec8/32-pci", BRD_ECHPCI },	{ "26", BRD_ECHPCI },	{ "ec8/64-pc", BRD_ECH64PCI },	{ "ec8/64-pci", BRD_ECH64PCI },	{ "ech-pci", BRD_ECH64PCI },	{ "echpci", BRD_ECH64PCI },	{ "echpc", BRD_ECH64PCI },	{ "27", BRD_ECH64PCI },	{ "easyio-pc", BRD_EASYIOPCI },	{ "easyio-pci", BRD_EASYIOPCI },	{ "eio-pci", BRD_EASYIOPCI },	{ "eiopci", BRD_EASYIOPCI },	{ "28", BRD_EASYIOPCI },};/* *	Define the module agruments. */MODULE_AUTHOR("Greg Ungerer");MODULE_DESCRIPTION("Stallion Multiport Serial Driver");MODULE_PARM(board0, "1-4s");MODULE_PARM_DESC(board0, "Board 0 config -> name[,ioaddr[,ioaddr2][,irq]]");MODULE_PARM(board1, "1-4s");MODULE_PARM_DESC(board1, "Board 1 config -> name[,ioaddr[,ioaddr2][,irq]]");MODULE_PARM(board2, "1-4s");MODULE_PARM_DESC(board2, "Board 2 config -> name[,ioaddr[,ioaddr2][,irq]]");MODULE_PARM(board3, "1-4s");MODULE_PARM_DESC(board3, "Board 3 config -> name[,ioaddr[,ioaddr2][,irq]]");#endif/*****************************************************************************//* *	Hardware ID bits for the EasyIO and ECH boards. These defines apply *	to the directly accessible io ports of these boards (not the uarts - *	they are in cd1400.h and sc26198.h). */#define	EIO_8PORTRS	0x04#define	EIO_4PORTRS	0x05#define	EIO_8PORTDI	0x00#define	EIO_8PORTM	0x06#define	EIO_MK3		0x03#define	EIO_IDBITMASK	0x07#define	EIO_BRDMASK	0xf0#define	ID_BRD4		0x10#define	ID_BRD8		0x20#define	ID_BRD16	0x30#define	EIO_INTRPEND	0x08#define	EIO_INTEDGE	0x00#define	EIO_INTLEVEL	0x08#define	EIO_0WS		0x10#define	ECH_ID		0xa0#define	ECH_IDBITMASK	0xe0#define	ECH_BRDENABLE	0x08#define	ECH_BRDDISABLE	0x00#define	ECH_INTENABLE	0x01#define	ECH_INTDISABLE	0x00#define	ECH_INTLEVEL	0x02#define	ECH_INTEDGE	0x00#define	ECH_INTRPEND	0x01#define	ECH_BRDRESET	0x01#define	ECHMC_INTENABLE	0x01#define	ECHMC_BRDRESET	0x02#define	ECH_PNLSTATUS	2#define	ECH_PNL16PORT	0x20#define	ECH_PNLIDMASK	0x07#define	ECH_PNLXPID	0x40#define	ECH_PNLINTRPEND	0x80#define	ECH_ADDR2MASK	0x1e0/* *	Define the vector mapping bits for the programmable interrupt board *	hardware. These bits encode the interrupt for the board to use - it *	is software selectable (except the EIO-8M). */static unsigned char	stl_vecmap[] = {	0xff, 0xff, 0xff, 0x04, 0x06, 0x05, 0xff, 0x07,	0xff, 0xff, 0x00, 0x02, 0x01, 0xff, 0xff, 0x03};/* *	Set up enable and disable macros for the ECH boards. They require *	the secondary io address space to be activated and deactivated. *	This way all ECH boards can share their secondary io region. *	If this is an ECH-PCI board then also need to set the page pointer *	to point to the correct page. */#define	BRDENABLE(brdnr,pagenr)						\	if (stl_brds[(brdnr)]->brdtype == BRD_ECH)			\		outb((stl_brds[(brdnr)]->ioctrlval | ECH_BRDENABLE),	\			stl_brds[(brdnr)]->ioctrl);			\	else if (stl_brds[(brdnr)]->brdtype == BRD_ECHPCI)		\		outb((pagenr), stl_brds[(brdnr)]->ioctrl);#define	BRDDISABLE(brdnr)						\	if (stl_brds[(brdnr)]->brdtype == BRD_ECH)			\		outb((stl_brds[(brdnr)]->ioctrlval | ECH_BRDDISABLE),	\			stl_brds[(brdnr)]->ioctrl);#define	STL_CD1400MAXBAUD	230400#define	STL_SC26198MAXBAUD	460800#define	STL_BAUDBASE		115200#define	STL_CLOSEDELAY		(5 * HZ / 10)/*****************************************************************************/#ifdef CONFIG_PCI/* *	Define the Stallion PCI vendor and device IDs. */#ifndef	PCI_VENDOR_ID_STALLION#define	PCI_VENDOR_ID_STALLION		0x124d#endif#ifndef PCI_DEVICE_ID_ECHPCI832#define	PCI_DEVICE_ID_ECHPCI832		0x0000#endif#ifndef PCI_DEVICE_ID_ECHPCI864#define	PCI_DEVICE_ID_ECHPCI864		0x0002#endif#ifndef PCI_DEVICE_ID_EIOPCI#define	PCI_DEVICE_ID_EIOPCI		0x0003#endif/* *	Define structure to hold all Stallion PCI boards. */typedef struct stlpcibrd {	unsigned short		vendid;	unsigned short		devid;	int			brdtype;} stlpcibrd_t;static stlpcibrd_t	stl_pcibrds[] = {	{ PCI_VENDOR_ID_STALLION, PCI_DEVICE_ID_ECHPCI864, BRD_ECH64PCI },	{ PCI_VENDOR_ID_STALLION, PCI_DEVICE_ID_EIOPCI, BRD_EASYIOPCI },	{ PCI_VENDOR_ID_STALLION, PCI_DEVICE_ID_ECHPCI832, BRD_ECHPCI },	{ PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_87410, BRD_ECHPCI },};static int	stl_nrpcibrds = sizeof(stl_pcibrds) / sizeof(stlpcibrd_t);#endif/*****************************************************************************//* *	Define macros to extract a brd/port number from a minor number. */#define	MINOR2BRD(min)		(((min) & 0xc0) >> 6)#define	MINOR2PORT(min)		((min) & 0x3f)/* *	Define a baud rate table that converts termios baud rate selector *	into the actual baud rate value. All baud rate calculations are *	based on the actual baud rate required. */static unsigned int	stl_baudrates[] = {	0, 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800,	9600, 19200, 38400, 57600, 115200, 230400, 460800, 921600};/* *	Define some handy local macros... */#undef	MIN#define	MIN(a,b)	(((a) <= (b)) ? (a) : (b))#undef	TOLOWER#define	TOLOWER(x)	((((x) >= 'A') && ((x) <= 'Z')) ? ((x) + 0x20) : (x))/*****************************************************************************//* *	Declare all those functions in this driver! */#ifdef MODULEint		init_module(void);void		cleanup_module(void);static void	stl_argbrds(void);static int	stl_parsebrd(stlconf_t *confp, char **argp);static unsigned long stl_atol(char *str);#endifint		stl_init(void);static int	stl_open(struct tty_struct *tty, struct file *filp);static void	stl_close(struct tty_struct *tty, struct file *filp);static int	stl_write(struct tty_struct *tty, int from_user, const unsigned char *buf, int count);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产午夜精品一区二区| 欧美日韩国产高清一区二区| 国产亚洲欧美激情| 国产福利一区二区三区视频 | 91视频国产资源| 亚洲欧美日韩久久精品| 色婷婷久久久综合中文字幕| 亚洲已满18点击进入久久| 欧美系列日韩一区| 理论电影国产精品| 国产亚洲欧美一级| 日本乱码高清不卡字幕| 懂色av一区二区三区免费看| 欧美国产一区二区| 欧美性猛交一区二区三区精品| 亚洲国产成人av| 亚洲精品一区在线观看| av一区二区三区| 午夜亚洲国产au精品一区二区| 在线91免费看| 成人精品视频网站| 亚洲成av人影院| 欧美xxx久久| 99国产精品久| 日韩主播视频在线| 日本一区二区综合亚洲| 欧美日韩在线免费视频| 国产在线精品一区在线观看麻豆| 中文字幕一区二区三中文字幕| 欧美日韩一二三区| 国产精品1区2区3区在线观看| 一区二区免费在线| 2023国产精品自拍| 欧美日韩一区二区在线观看| 久久国产三级精品| 亚洲精品免费一二三区| 欧美v国产在线一区二区三区| 91在线无精精品入口| 经典三级一区二区| 亚洲成av人影院| 中文字幕一区二区三区蜜月 | 中文字幕在线不卡视频| 一区二区国产盗摄色噜噜| 日韩欧美一级片| 欧美午夜影院一区| 99麻豆久久久国产精品免费 | 久久久精品国产免大香伊 | 日韩精品一区二区三区四区| 91片黄在线观看| 成人精品在线视频观看| 免费看欧美美女黄的网站| 亚洲最新视频在线观看| 中文字幕欧美日韩一区| 精品国产一区二区三区久久久蜜月 | 成熟亚洲日本毛茸茸凸凹| 免费视频最近日韩| 亚洲成人777| 亚洲乱码国产乱码精品精98午夜| 国产午夜久久久久| 26uuu亚洲综合色| 日韩欧美一级片| 欧美一区二区三区四区五区| 色狠狠av一区二区三区| av在线不卡电影| 国产91丝袜在线播放0| 久久99久久99小草精品免视看| 亚洲bt欧美bt精品| 天天色综合天天| 天堂一区二区在线| 视频一区中文字幕| 日韩电影在线观看电影| 香蕉乱码成人久久天堂爱免费| 亚洲免费在线播放| 曰韩精品一区二区| 亚洲综合一区在线| 亚洲自拍偷拍图区| 亚洲图片欧美视频| 亚洲成a人片综合在线| 五月激情综合婷婷| 三级精品在线观看| 麻豆91在线看| 狠狠色综合色综合网络| 久久9热精品视频| 国产在线不卡一卡二卡三卡四卡| 精品夜夜嗨av一区二区三区| 国产综合一区二区| 丁香天五香天堂综合| www.视频一区| 91最新地址在线播放| 欧美色图12p| 91精品欧美一区二区三区综合在 | 一区二区三区不卡视频| 亚洲成人中文在线| 久久国产欧美日韩精品| 国产一区二区免费看| 国产成a人亚洲| 91麻豆产精品久久久久久| 欧美亚洲综合一区| 日韩美一区二区三区| 久久久久久久久久电影| 综合电影一区二区三区| 午夜一区二区三区视频| 精品一区二区免费| 99国产精品久久| 欧美一区二区免费观在线| 久久精品无码一区二区三区| 国产精品传媒在线| 日韩高清不卡在线| 国产九色精品成人porny| 色综合久久中文字幕| 日韩欧美一区二区在线视频| 久久久久久免费毛片精品| 亚洲婷婷综合久久一本伊一区| 日韩高清不卡一区二区三区| 国产乱国产乱300精品| 日本久久一区二区| 久久精品一区蜜桃臀影院| 一区二区在线观看视频| 久久99久久久欧美国产| 一本大道久久a久久精品综合| 欧美一区二区视频在线观看2022| 日本一区二区动态图| 日韩精品乱码av一区二区| www.久久精品| 日韩三级视频中文字幕| 亚洲永久精品大片| 国产成人精品三级麻豆| 88在线观看91蜜桃国自产| 国产精品白丝在线| 国产一区二区三区av电影| 欧美日韩亚洲综合一区二区三区 | 夜夜嗨av一区二区三区网页| 韩国v欧美v亚洲v日本v| 精品视频在线免费看| 亚洲欧洲精品成人久久奇米网| 奇米色一区二区三区四区| 色婷婷av久久久久久久| 国产亚洲污的网站| 美女一区二区视频| 欧美视频一区二| 亚洲欧美电影院| 成人美女视频在线观看| 久久亚洲欧美国产精品乐播 | 99视频一区二区三区| 精品美女一区二区| 视频一区二区国产| 在线日韩av片| 亚洲理论在线观看| 99久久精品国产观看| 337p日本欧洲亚洲大胆精品| 秋霞成人午夜伦在线观看| 欧美亚洲国产怡红院影院| 亚洲精品免费视频| 色婷婷精品大在线视频| 国产精品久久久久久户外露出 | 7777女厕盗摄久久久| 亚洲自拍与偷拍| 欧美亚洲综合一区| 亚洲国产va精品久久久不卡综合 | 欧美视频一区在线| 亚洲一区二区三区国产| 在线日韩av片| 亚洲在线中文字幕| 欧美日韩在线亚洲一区蜜芽| 亚洲伊人色欲综合网| 欧美午夜电影网| 婷婷久久综合九色综合伊人色| 91电影在线观看| 亚洲一区二区美女| 在线成人小视频| 日本亚洲欧美天堂免费| 欧美一区二区大片| 精一区二区三区| 国产日韩欧美不卡在线| 成人h精品动漫一区二区三区| 亚洲欧洲国产日本综合| 91官网在线观看| 亚洲成人av一区| 日韩欧美一二三区| 国产精品一区二区黑丝| 国产精品视频在线看| 99vv1com这只有精品| 一区二区三区电影在线播| 欧美三级午夜理伦三级中视频| 午夜免费久久看| 欧美变态凌虐bdsm| 成人av免费网站| 亚洲小说春色综合另类电影| 678五月天丁香亚洲综合网| 九九精品一区二区| 成人欧美一区二区三区黑人麻豆| 日本久久一区二区| 毛片不卡一区二区| 国产精品狼人久久影院观看方式| 91美女视频网站| 麻豆视频观看网址久久| 中文字幕第一区二区| 欧美网站大全在线观看| 极品少妇一区二区三区精品视频 | 国产亚洲精品aa午夜观看|