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

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

?? 21285.c

?? IXP425 平臺下嵌入式LINUX的串口的驅動程序
?? C
字號:
/* * linux/drivers/char/serial_21285.c * * Driver for the serial port on the 21285 StrongArm-110 core logic chip. * * Based on drivers/char/serial.c * *  $Id: 21285.c,v 1.4.2.1 2002/10/24 09:53:23 rmk Exp $ */#include <linux/config.h>#include <linux/module.h>#include <linux/errno.h>#include <linux/signal.h>#include <linux/sched.h>#include <linux/interrupt.h>#include <linux/tty.h>#include <linux/tty_flip.h>#include <linux/serial.h>#include <linux/major.h>#include <linux/ptrace.h>#include <linux/ioport.h>#include <linux/mm.h>#include <linux/slab.h>#include <linux/init.h>#include <linux/console.h>#include <asm/io.h>#include <asm/irq.h>#include <asm/uaccess.h>#include <asm/hardware/dec21285.h>#include <asm/hardware.h>#define BAUD_BASE		(mem_fclk_21285/64)#define SERIAL_21285_NAME	"ttyFB"#define SERIAL_21285_MAJOR	204#define SERIAL_21285_MINOR	4#define SERIAL_21285_AUXNAME	"cuafb"#define SERIAL_21285_AUXMAJOR	205#define SERIAL_21285_AUXMINOR	4#ifdef CONFIG_SERIAL_21285_OLD#include <asm/mach-types.h>/* * Compatability with a mistake made a long time ago. * Note - the use of "ttyI", "/dev/ttyS0" and major/minor 5,64 * is HIGHLY DEPRECIATED, and will be removed in the 2.5 * kernel series. *					-- rmk 15/04/2000  */#define SERIAL_21285_OLD_NAME	"ttyI"#define SERIAL_21285_OLD_MAJOR	TTY_MAJOR#define SERIAL_21285_OLD_MINOR	64static struct tty_driver rs285_old_driver;#endifstatic struct tty_driver rs285_driver, callout_driver;static int rs285_refcount;static struct tty_struct *rs285_table[1];static struct termios *rs285_termios[1];static struct termios *rs285_termios_locked[1];static char wbuf[1000], *putp = wbuf, *getp = wbuf, x_char;static struct tty_struct *rs285_tty;static int rs285_use_count;static int rs285_write_room(struct tty_struct *tty){	return putp >= getp ? (sizeof(wbuf) - (long) putp + (long) getp) : ((long) getp - (long) putp - 1);}static void rs285_rx_int(int irq, void *dev_id, struct pt_regs *regs){	if (!rs285_tty) {		disable_irq(IRQ_CONRX);		return;	}	while (!(*CSR_UARTFLG & 0x10)) {		int ch, flag;		ch = *CSR_UARTDR;		flag = *CSR_RXSTAT;		if (flag & 4)			tty_insert_flip_char(rs285_tty, 0, TTY_OVERRUN);		if (flag & 2)			flag = TTY_PARITY;		else if (flag & 1)			flag = TTY_FRAME;		tty_insert_flip_char(rs285_tty, ch, flag);	}	tty_flip_buffer_push(rs285_tty);}static void rs285_send_xchar(struct tty_struct *tty, char ch){	x_char = ch;	enable_irq(IRQ_CONTX);}static void rs285_throttle(struct tty_struct *tty){	if (I_IXOFF(tty))		rs285_send_xchar(tty, STOP_CHAR(tty));}static void rs285_unthrottle(struct tty_struct *tty){	if (I_IXOFF(tty)) {		if (x_char)			x_char = 0;		else			rs285_send_xchar(tty, START_CHAR(tty));	}}static void rs285_tx_int(int irq, void *dev_id, struct pt_regs *regs){	while (!(*CSR_UARTFLG & 0x20)) {		if (x_char) {			*CSR_UARTDR = x_char;			x_char = 0;			continue;		}		if (putp == getp) {			disable_irq(IRQ_CONTX);			break;		}		*CSR_UARTDR = *getp;		if (++getp >= wbuf + sizeof(wbuf))			getp = wbuf;	}	if (rs285_tty)		wake_up_interruptible(&rs285_tty->write_wait);}static inline int rs285_xmit(int ch){	if (putp + 1 == getp || (putp + 1 == wbuf + sizeof(wbuf) && getp == wbuf))		return 0;	*putp = ch;	if (++putp >= wbuf + sizeof(wbuf))		putp = wbuf;	enable_irq(IRQ_CONTX);	return 1;}static int rs285_write(struct tty_struct *tty, int from_user,		       const u_char * buf, int count){	int i;	if (from_user && verify_area(VERIFY_READ, buf, count))		return -EINVAL;	for (i = 0; i < count; i++) {		char ch;		if (from_user)			__get_user(ch, buf + i);		else			ch = buf[i];		if (!rs285_xmit(ch))			break;	}	return i;}static void rs285_put_char(struct tty_struct *tty, u_char ch){	rs285_xmit(ch);}static int rs285_chars_in_buffer(struct tty_struct *tty){	return sizeof(wbuf) - rs285_write_room(tty);}static void rs285_flush_buffer(struct tty_struct *tty){	disable_irq(IRQ_CONTX);	putp = getp = wbuf;	if (x_char)		enable_irq(IRQ_CONTX);}static inline void rs285_set_cflag(int cflag){	int h_lcr, baud, quot;	switch (cflag & CSIZE) {	case CS5:		h_lcr = 0x10;		break;	case CS6:		h_lcr = 0x30;		break;	case CS7:		h_lcr = 0x50;		break;	default: /* CS8 */		h_lcr = 0x70;		break;	}	if (cflag & CSTOPB)		h_lcr |= 0x08;	if (cflag & PARENB)		h_lcr |= 0x02;	if (!(cflag & PARODD))		h_lcr |= 0x04;	switch (cflag & CBAUD) {	case B200:	baud = 200;		break;	case B300:	baud = 300;		break;	case B1200:	baud = 1200;		break;	case B1800:	baud = 1800;		break;	case B2400:	baud = 2400;		break;	case B4800:	baud = 4800;		break;	default:	case B9600:	baud = 9600;		break;	case B19200:	baud = 19200;		break;	case B38400:	baud = 38400;		break;	case B57600:	baud = 57600;		break;	case B115200:	baud = 115200;		break;	}	/*	 * The documented expression for selecting the divisor is:	 *  BAUD_BASE / baud - 1	 * However, typically BAUD_BASE is not divisible by baud, so	 * we want to select the divisor that gives us the minimum	 * error.  Therefore, we want:	 *  int(BAUD_BASE / baud - 0.5) ->	 *  int(BAUD_BASE / baud - (baud >> 1) / baud) ->	 *  int((BAUD_BASE - (baud >> 1)) / baud)	 */	quot = (BAUD_BASE - (baud >> 1)) / baud;	*CSR_UARTCON = 0;	*CSR_L_UBRLCR = quot & 0xff;	*CSR_M_UBRLCR = (quot >> 8) & 0x0f;	*CSR_H_UBRLCR = h_lcr;	*CSR_UARTCON = 1;}static void rs285_set_termios(struct tty_struct *tty, struct termios *old){	if (old && tty->termios->c_cflag == old->c_cflag)		return;	rs285_set_cflag(tty->termios->c_cflag);}static void rs285_stop(struct tty_struct *tty){	disable_irq(IRQ_CONTX);}static void rs285_start(struct tty_struct *tty){	enable_irq(IRQ_CONTX);}static void rs285_wait_until_sent(struct tty_struct *tty, int timeout){	int orig_jiffies = jiffies;	while (*CSR_UARTFLG & 8) {		set_current_state(TASK_INTERRUPTIBLE);		schedule_timeout(1);		if (signal_pending(current))			break;		if (timeout && time_after(jiffies, orig_jiffies + timeout))			break;	}	set_current_state(TASK_RUNNING);}static int rs285_open(struct tty_struct *tty, struct file *filp){	int line;	MOD_INC_USE_COUNT;	line = MINOR(tty->device) - tty->driver.minor_start;	if (line) {		MOD_DEC_USE_COUNT;		return -ENODEV;	}	tty->driver_data = NULL;	if (!rs285_tty)		rs285_tty = tty;	enable_irq(IRQ_CONRX);	rs285_use_count++;	return 0;}static void rs285_close(struct tty_struct *tty, struct file *filp){	if (!--rs285_use_count) {		rs285_wait_until_sent(tty, 0);		disable_irq(IRQ_CONRX);		disable_irq(IRQ_CONTX);		rs285_tty = NULL;	}	MOD_DEC_USE_COUNT;}static int __init rs285_init(void){	int baud = B9600;	if (machine_is_personal_server())		baud = B57600;	rs285_driver.magic = TTY_DRIVER_MAGIC;	rs285_driver.driver_name = "serial_21285";	rs285_driver.name = SERIAL_21285_NAME;	rs285_driver.major = SERIAL_21285_MAJOR;	rs285_driver.minor_start = SERIAL_21285_MINOR;	rs285_driver.num = 1;	rs285_driver.type = TTY_DRIVER_TYPE_SERIAL;	rs285_driver.subtype = SERIAL_TYPE_NORMAL;	rs285_driver.init_termios = tty_std_termios;	rs285_driver.init_termios.c_cflag = baud | CS8 | CREAD | HUPCL | CLOCAL;	rs285_driver.flags = TTY_DRIVER_REAL_RAW;	rs285_driver.refcount = &rs285_refcount;	rs285_driver.table = rs285_table;	rs285_driver.termios = rs285_termios;	rs285_driver.termios_locked = rs285_termios_locked;	rs285_driver.open = rs285_open;	rs285_driver.close = rs285_close;	rs285_driver.write = rs285_write;	rs285_driver.put_char = rs285_put_char;	rs285_driver.write_room = rs285_write_room;	rs285_driver.chars_in_buffer = rs285_chars_in_buffer;	rs285_driver.flush_buffer = rs285_flush_buffer;	rs285_driver.throttle = rs285_throttle;	rs285_driver.unthrottle = rs285_unthrottle;	rs285_driver.send_xchar = rs285_send_xchar;	rs285_driver.set_termios = rs285_set_termios;	rs285_driver.stop = rs285_stop;	rs285_driver.start = rs285_start;	rs285_driver.wait_until_sent = rs285_wait_until_sent;	callout_driver = rs285_driver;	callout_driver.name = SERIAL_21285_AUXNAME;	callout_driver.major = SERIAL_21285_AUXMAJOR;	callout_driver.subtype = SERIAL_TYPE_CALLOUT;	if (request_irq(IRQ_CONRX, rs285_rx_int, 0, "rs285", NULL))		panic("Couldn't get rx irq for rs285");	if (request_irq(IRQ_CONTX, rs285_tx_int, 0, "rs285", NULL))		panic("Couldn't get tx irq for rs285");#ifdef CONFIG_SERIAL_21285_OLD	if (!machine_is_ebsa285() && !machine_is_netwinder()) {		rs285_old_driver = rs285_driver;		rs285_old_driver.name = SERIAL_21285_OLD_NAME;		rs285_old_driver.major = SERIAL_21285_OLD_MAJOR;		rs285_old_driver.minor_start = SERIAL_21285_OLD_MINOR;		if (tty_register_driver(&rs285_old_driver))			printk(KERN_ERR "Couldn't register old 21285 serial driver\n");	}#endif	if (tty_register_driver(&rs285_driver))		printk(KERN_ERR "Couldn't register 21285 serial driver\n");	if (tty_register_driver(&callout_driver))		printk(KERN_ERR "Couldn't register 21285 callout driver\n");	return 0;}static void __exit rs285_fini(void){	unsigned long flags;	int ret;	save_flags(flags);	cli();	ret = tty_unregister_driver(&callout_driver);	if (ret)		printk(KERN_ERR "Unable to unregister 21285 callout driver "			"(%d)\n", ret);	ret = tty_unregister_driver(&rs285_driver);	if (ret)		printk(KERN_ERR "Unable to unregister 21285 driver (%d)\n",			ret);#ifdef CONFIG_SERIAL_21285_OLD	if (!machine_is_ebsa285() && !machine_is_netwinder()) {		ret = tty_unregister_driver(&rs285_old_driver);		if (ret)			printk(KERN_ERR "Unable to unregister old 21285 "				"driver (%d)\n", ret);	}#endif	free_irq(IRQ_CONTX, NULL);	free_irq(IRQ_CONRX, NULL);	restore_flags(flags);}module_init(rs285_init);module_exit(rs285_fini);#ifdef CONFIG_SERIAL_21285_CONSOLE/************** console driver *****************/static void rs285_console_write(struct console *co, const char *s, u_int count){	int i;	disable_irq(IRQ_CONTX);	for (i = 0; i < count; i++) {		while (*CSR_UARTFLG & 0x20);		*CSR_UARTDR = s[i];		if (s[i] == '\n') {			while (*CSR_UARTFLG & 0x20);			*CSR_UARTDR = '\r';		}	}	enable_irq(IRQ_CONTX);}static kdev_t rs285_console_device(struct console *c){	return MKDEV(SERIAL_21285_MAJOR, SERIAL_21285_MINOR);}static int __init rs285_console_setup(struct console *co, char *options){	int baud = 9600;	int bits = 8;	int parity = 'n';	int cflag = CREAD | HUPCL | CLOCAL;	if (machine_is_personal_server())		baud = 57600;	if (options) {		char *s = options;		baud = simple_strtoul(options, NULL, 10);		while (*s >= '0' && *s <= '9')			s++;		if (*s)			parity = *s++;		if (*s)			bits = *s - '0';	}	/*	 *    Now construct a cflag setting.	 */	switch (baud) {	case 1200:		cflag |= B1200;		break;	case 2400:		cflag |= B2400;		break;	case 4800:		cflag |= B4800;		break;	case 9600:		cflag |= B9600;		break;	case 19200:		cflag |= B19200;		break;	case 38400:		cflag |= B38400;		break;	case 57600:		cflag |= B57600;		break;	case 115200:		cflag |= B115200;		break;	default:		cflag |= B9600;		break;	}	switch (bits) {	case 7:		cflag |= CS7;		break;	default:		cflag |= CS8;		break;	}	switch (parity) {	case 'o':	case 'O':		cflag |= PARODD;		break;	case 'e':	case 'E':		cflag |= PARENB;		break;	}	co->cflag = cflag;	rs285_set_cflag(cflag);	rs285_console_write(NULL, "\e[2J\e[Hboot ", 12);	if (options)		rs285_console_write(NULL, options, strlen(options));	else		rs285_console_write(NULL, "no options", 10);	rs285_console_write(NULL, "\n", 1);	return 0;}#ifdef CONFIG_SERIAL_21285_OLDstatic struct console rs285_old_cons ={	SERIAL_21285_OLD_NAME,	rs285_console_write,	NULL,	rs285_console_device,	NULL,	rs285_console_setup,	CON_PRINTBUFFER,	-1,	0,	NULL};#endifstatic struct console rs285_cons ={	name:		SERIAL_21285_NAME,	write:		rs285_console_write,	device:		rs285_console_device,	setup:		rs285_console_setup,	flags:		CON_PRINTBUFFER,	index:		-1,};void __init rs285_console_init(void){#ifdef CONFIG_SERIAL_21285_OLD	if (!machine_is_ebsa285() && !machine_is_netwinder())		register_console(&rs285_old_cons);#endif	register_console(&rs285_cons);}#endif /* CONFIG_SERIAL_21285_CONSOLE */EXPORT_NO_SYMBOLS;MODULE_LICENSE("GPL");MODULE_DESCRIPTION("Intel Footbridge (21285) serial driver");

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
韩国女主播一区二区三区| 欧美剧情片在线观看| 欧美三级乱人伦电影| 国产日产欧美一区| 韩国视频一区二区| 色婷婷激情久久| 国产亚洲一区二区三区四区 | 97久久超碰精品国产| 91精品国产全国免费观看| 成人欧美一区二区三区小说| 久久91精品国产91久久小草| 欧美视频一区二区三区在线观看| 国产性色一区二区| 麻豆精品一区二区| 欧美日韩国产综合草草| 亚洲另类色综合网站| 成人做爰69片免费看网站| 精品国产三级电影在线观看| 婷婷激情综合网| 欧美日韩国产一级| 亚洲一区二区影院| 日本韩国欧美一区| 一区二区在线观看av| aaa亚洲精品一二三区| 亚洲国产精品激情在线观看| 国产一区二区三区四| www国产精品av| 国内精品视频666| 久久嫩草精品久久久久| 国产综合久久久久影院| 日韩欧美的一区| 韩国精品主播一区二区在线观看| 日韩女同互慰一区二区| 蜜乳av一区二区三区| 欧美大片在线观看一区| 久久精品久久综合| 亚洲精品一区二区三区四区高清| 久久精品国产亚洲5555| 精品成人一区二区三区四区| 国模无码大尺度一区二区三区| 欧美不卡在线视频| 九一九一国产精品| 久久精品视频在线免费观看| 国产91丝袜在线18| 亚洲欧洲成人av每日更新| 色就色 综合激情| 亚洲成人777| 久久亚洲精华国产精华液 | 久久精品国产网站| 久久久久成人黄色影片| 欧美巨大另类极品videosbest| 一区二区三区四区中文字幕| 欧美日韩不卡一区二区| 久久国产精品一区二区| 国产精品水嫩水嫩| 欧美性猛交一区二区三区精品| 亚洲成国产人片在线观看| 日韩女优视频免费观看| 成人深夜在线观看| 亚洲国产一二三| 欧美mv和日韩mv的网站| youjizz久久| 婷婷中文字幕综合| 日本一区二区三区国色天香| 色av综合在线| 久久av资源网| 亚洲另类春色校园小说| 日韩一二三区视频| av网站免费线看精品| 日韩综合小视频| 中文字幕av免费专区久久| 欧美日韩午夜在线视频| 国产丶欧美丶日本不卡视频| 亚洲一区影音先锋| 国产情人综合久久777777| 欧美亚洲丝袜传媒另类| 懂色av一区二区三区免费看| 亚洲午夜久久久久久久久久久| 久久综合999| 欧美日产国产精品| 99国产精品久久| 黑人巨大精品欧美黑白配亚洲| 一区二区三区欧美日韩| 久久久综合视频| 欧美精品久久一区二区三区| 成人h精品动漫一区二区三区| 日韩国产欧美三级| 玉足女爽爽91| 国产精品丝袜久久久久久app| 91麻豆精品国产91久久久资源速度| 成人蜜臀av电影| 国产一区二区三区美女| 视频精品一区二区| 亚洲无人区一区| 18成人在线观看| 久久久久免费观看| 精品欧美乱码久久久久久1区2区 | 欧美高清你懂得| 色狠狠av一区二区三区| av一区二区三区在线| 国产成人精品www牛牛影视| 久久激情五月激情| 日本不卡123| 亚洲午夜影视影院在线观看| 亚洲精品你懂的| 亚洲色欲色欲www| 国产精品久久久久永久免费观看| 久久综合九色综合97婷婷| 日韩欧美一二区| 日韩欧美一区二区视频| 欧美一区日本一区韩国一区| 欧美三级中文字| 欧美在线观看18| 欧美在线观看视频一区二区三区| 91麻豆精品在线观看| 不卡av在线免费观看| 99视频在线精品| 91蜜桃免费观看视频| 97精品久久久午夜一区二区三区| av日韩在线网站| 色乱码一区二区三区88| 欧日韩精品视频| 欧美亚洲丝袜传媒另类| 91.成人天堂一区| 日韩亚洲国产中文字幕欧美| 欧美sm美女调教| 欧美激情综合五月色丁香| 中文字幕+乱码+中文字幕一区| 国产精品麻豆久久久| 亚洲美女免费视频| 香蕉乱码成人久久天堂爱免费| 日韩中文字幕亚洲一区二区va在线 | 91精品国产综合久久精品性色| 7777精品伊人久久久大香线蕉的| 91精品国产综合久久香蕉的特点| 91精品国产免费| 久久精品综合网| 亚洲伦理在线免费看| 天天做天天摸天天爽国产一区| 捆绑调教一区二区三区| 在线观看日韩国产| 这里只有精品99re| 久久久国产一区二区三区四区小说| 国产精品无遮挡| 亚洲国产色一区| 久久99久久久久久久久久久| 国产福利一区二区三区| 在线免费视频一区二区| 日韩欧美自拍偷拍| 欧美国产日本韩| 午夜精品123| 岛国av在线一区| 欧美色网一区二区| 久久久久久毛片| 亚洲成人一区二区| 国产一区二区免费视频| 欧美性感一类影片在线播放| 欧美成人一级视频| 亚洲精品乱码久久久久| 精品一区中文字幕| 欧美视频你懂的| 中文字幕av不卡| 日本大胆欧美人术艺术动态 | 日韩成人一区二区| 99热精品一区二区| 精品国内片67194| 亚洲靠逼com| 国产精品一区二区久久不卡 | 亚洲一区二区在线视频| 国产最新精品免费| 欧美丰满美乳xxx高潮www| 国产精品久久久久天堂| 久久疯狂做爰流白浆xx| 欧美写真视频网站| 国产精品女主播在线观看| 久久精品噜噜噜成人av农村| 欧美三级电影一区| 亚洲精品乱码久久久久久| 国产99久久久久久免费看农村| 欧美一区二区日韩| 午夜影院在线观看欧美| av不卡免费电影| 国产清纯美女被跳蛋高潮一区二区久久w | 成人黄页在线观看| 亚洲精品在线三区| 蜜桃av一区二区三区| 欧美精品久久99久久在免费线| 国产精品日日摸夜夜摸av| 激情五月婷婷综合| 欧美大片在线观看一区二区| 日韩av中文在线观看| 欧美日韩国产a| 午夜精品久久久久久久蜜桃app | 国内精品在线播放| 日韩欧美成人午夜| 麻豆久久久久久久| 精品国产百合女同互慰| 久久 天天综合| 国产亚洲综合在线| av中文一区二区三区|