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

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

?? serport.c

?? QQ2440板子
?? C
字號:
/* * Input device TTY line discipline * * Copyright (c) 1999-2002 Vojtech Pavlik * * This is a module that converts a tty line into a much simpler * 'serial io port' abstraction that the input device drivers use. *//* * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 as published by * the Free Software Foundation. */#include <asm/uaccess.h>#include <linux/kernel.h>#include <linux/slab.h>#include <linux/module.h>#include <linux/init.h>#include <linux/serio.h>#include <linux/tty.h>MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");MODULE_DESCRIPTION("Input device TTY line discipline");MODULE_LICENSE("GPL");MODULE_ALIAS_LDISC(N_MOUSE);#define SERPORT_BUSY	1#define SERPORT_ACTIVE	2#define SERPORT_DEAD	3struct serport {	struct tty_struct *tty;	wait_queue_head_t wait;	struct serio *serio;	struct serio_device_id id;	spinlock_t lock;	unsigned long flags;};/* * Callback functions from the serio code. */static int serport_serio_write(struct serio *serio, unsigned char data){	struct serport *serport = serio->port_data;	return -(serport->tty->driver->write(serport->tty, &data, 1) != 1);}static int serport_serio_open(struct serio *serio){	struct serport *serport = serio->port_data;	unsigned long flags;	spin_lock_irqsave(&serport->lock, flags);	set_bit(SERPORT_ACTIVE, &serport->flags);	spin_unlock_irqrestore(&serport->lock, flags);	return 0;}static void serport_serio_close(struct serio *serio){	struct serport *serport = serio->port_data;	unsigned long flags;	spin_lock_irqsave(&serport->lock, flags);	clear_bit(SERPORT_ACTIVE, &serport->flags);	set_bit(SERPORT_DEAD, &serport->flags);	spin_unlock_irqrestore(&serport->lock, flags);	wake_up_interruptible(&serport->wait);}/* * serport_ldisc_open() is the routine that is called upon setting our line * discipline on a tty. It prepares the serio struct. */static int serport_ldisc_open(struct tty_struct *tty){	struct serport *serport;	if (!capable(CAP_SYS_ADMIN))		return -EPERM;	serport = kcalloc(1, sizeof(struct serport), GFP_KERNEL);	if (!serport)		return -ENOMEM;	serport->tty = tty;	spin_lock_init(&serport->lock);	init_waitqueue_head(&serport->wait);	tty->disc_data = serport;	set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);	return 0;}/* * serport_ldisc_close() is the opposite of serport_ldisc_open() */static void serport_ldisc_close(struct tty_struct *tty){	struct serport *serport = (struct serport *) tty->disc_data;	kfree(serport);}/* * serport_ldisc_receive() is called by the low level tty driver when characters * are ready for us. We forward the characters, one by one to the 'interrupt' * routine. * * FIXME: We should get pt_regs from the tty layer and forward them to *	  serio_interrupt here. */static void serport_ldisc_receive(struct tty_struct *tty, const unsigned char *cp, char *fp, int count){	struct serport *serport = (struct serport*) tty->disc_data;	unsigned long flags;	int i;	spin_lock_irqsave(&serport->lock, flags);	if (!test_bit(SERPORT_ACTIVE, &serport->flags))		goto out;	for (i = 0; i < count; i++)		serio_interrupt(serport->serio, cp[i], 0, NULL);out:	spin_unlock_irqrestore(&serport->lock, flags);}/* * serport_ldisc_room() reports how much room we do have for receiving data. * Although we in fact have infinite room, we need to specify some value * here, and 256 seems to be reasonable. */static int serport_ldisc_room(struct tty_struct *tty){	return 256;}/* * serport_ldisc_read() just waits indefinitely if everything goes well. * However, when the serio driver closes the serio port, it finishes, * returning 0 characters. */static ssize_t serport_ldisc_read(struct tty_struct * tty, struct file * file, unsigned char __user * buf, size_t nr){	struct serport *serport = (struct serport*) tty->disc_data;	struct serio *serio;	char name[64];	if (test_and_set_bit(SERPORT_BUSY, &serport->flags))		return -EBUSY;	serport->serio = serio = kcalloc(1, sizeof(struct serio), GFP_KERNEL);	if (!serio)		return -ENOMEM;	strlcpy(serio->name, "Serial port", sizeof(serio->name));	snprintf(serio->phys, sizeof(serio->phys), "%s/serio0", tty_name(tty, name));	serio->id = serport->id;	serio->id.type = SERIO_RS232;	serio->write = serport_serio_write;	serio->open = serport_serio_open;	serio->close = serport_serio_close;	serio->port_data = serport;	serio_register_port(serport->serio);	printk(KERN_INFO "serio: Serial port %s\n", tty_name(tty, name));	wait_event_interruptible(serport->wait, test_bit(SERPORT_DEAD, &serport->flags));	serio_unregister_port(serport->serio);	serport->serio = NULL;	clear_bit(SERPORT_DEAD, &serport->flags);	clear_bit(SERPORT_BUSY, &serport->flags);	return 0;}/* * serport_ldisc_ioctl() allows to set the port protocol, and device ID */static int serport_ldisc_ioctl(struct tty_struct * tty, struct file * file, unsigned int cmd, unsigned long arg){	struct serport *serport = (struct serport*) tty->disc_data;	unsigned long type;	if (cmd == SPIOCSTYPE) {		if (get_user(type, (unsigned long __user *) arg))			return -EFAULT;		serport->id.proto = type & 0x000000ff;		serport->id.id	  = (type & 0x0000ff00) >> 8;		serport->id.extra = (type & 0x00ff0000) >> 16;		return 0;	}	return -EINVAL;}static void serport_ldisc_write_wakeup(struct tty_struct * tty){	struct serport *serport = (struct serport *) tty->disc_data;	unsigned long flags;	spin_lock_irqsave(&serport->lock, flags);	if (test_bit(SERPORT_ACTIVE, &serport->flags))		serio_drv_write_wakeup(serport->serio);	spin_unlock_irqrestore(&serport->lock, flags);}/* * The line discipline structure. */static struct tty_ldisc serport_ldisc = {	.owner =	THIS_MODULE,	.name =		"input",	.open =		serport_ldisc_open,	.close =	serport_ldisc_close,	.read =		serport_ldisc_read,	.ioctl =	serport_ldisc_ioctl,	.receive_buf =	serport_ldisc_receive,	.receive_room =	serport_ldisc_room,	.write_wakeup =	serport_ldisc_write_wakeup};/* * The functions for insering/removing us as a module. */static int __init serport_init(void){	int retval;	retval = tty_register_ldisc(N_MOUSE, &serport_ldisc);	if (retval)		printk(KERN_ERR "serport.c: Error registering line discipline.\n");	return  retval;}static void __exit serport_exit(void){	tty_unregister_ldisc(N_MOUSE);}module_init(serport_init);module_exit(serport_exit);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩免费在线观看| 国产精品美女久久久久aⅴ| 亚洲最大成人网4388xx| 欧美一区午夜视频在线观看| 久久精品国产一区二区三区免费看| 国产精品超碰97尤物18| 欧美色图免费看| 成人av高清在线| 午夜国产不卡在线观看视频| 欧美精品一区二区高清在线观看| 99国产一区二区三精品乱码| 日本三级韩国三级欧美三级| 亚洲品质自拍视频| 日韩欧美中文字幕一区| 色老汉一区二区三区| 看电视剧不卡顿的网站| 久久久国产一区二区三区四区小说| 91黄视频在线| 国产乱人伦精品一区二区在线观看 | 欧美日韩大陆一区二区| 成人av动漫网站| 日本欧美一区二区三区乱码 | 日本一区二区不卡视频| 777奇米四色成人影色区| 欧美这里有精品| 国产aⅴ精品一区二区三区色成熟| 亚洲精品乱码久久久久久久久| 国产拍揄自揄精品视频麻豆| 欧美顶级少妇做爰| 欧美日韩精品久久久| 粗大黑人巨茎大战欧美成人| 国产麻豆精品视频| 日韩激情av在线| 欧美激情资源网| 中文在线免费一区三区高中清不卡| 9191久久久久久久久久久| 在线免费不卡电影| 成人av网址在线观看| 成人h动漫精品| 国产在线麻豆精品观看| 美腿丝袜在线亚洲一区| 日韩精品一卡二卡三卡四卡无卡| 亚洲欧美在线aaa| 亚洲视频网在线直播| 中文字幕中文字幕中文字幕亚洲无线| 久久精品一区蜜桃臀影院| 日韩欧美一区电影| www一区二区| 91精品国产综合久久香蕉的特点 | 国产一区二区主播在线| 精品亚洲成av人在线观看| 日韩av电影免费观看高清完整版 | 99v久久综合狠狠综合久久| 国内精品写真在线观看| 国产精品99久久久久久似苏梦涵| 美女网站在线免费欧美精品| 韩国一区二区在线观看| 九九视频精品免费| 成人综合在线网站| 丁香激情综合国产| 成人黄色国产精品网站大全在线免费观看| 成人综合在线观看| caoporm超碰国产精品| 在线观看视频一区二区欧美日韩| 色婷婷精品久久二区二区蜜臀av| 成人深夜视频在线观看| 国产成人高清视频| 国产福利一区在线| 成人精品国产福利| 欧美影院一区二区| 欧美日韩一区二区在线观看| 91精品国产欧美一区二区成人 | 国产日韩亚洲欧美综合| 国产日本欧美一区二区| 国产精品久久久久久久久果冻传媒 | 日韩精品一区二区三区蜜臀| 欧美日本国产一区| 久久久久久久综合| 亚洲欧洲日韩综合一区二区| 亚洲国产一区二区在线播放| 免费观看30秒视频久久| 99re视频精品| 欧美日韩国产系列| 国产欧美一区二区三区在线看蜜臀 | 在线观看成人小视频| 欧美日韩免费视频| 91在线云播放| 91亚洲男人天堂| 99久久99久久精品国产片果冻| 92国产精品观看| 亚洲黄色录像片| xfplay精品久久| 成人免费看视频| 亚洲国产一区视频| 91麻豆精品久久久久蜜臀| 日韩欧美中文一区二区| 中文字幕国产一区| 国模冰冰炮一区二区| 国产精品欧美一区喷水| 成人h版在线观看| 精品少妇一区二区| 亚洲欧洲一区二区三区| 亚洲成av人片观看| 99视频精品全部免费在线| 99精品国产一区二区三区不卡| 91色婷婷久久久久合中文| 91国产免费观看| 欧美亚洲日本国产| 欧美成人精精品一区二区频| 午夜电影久久久| 97aⅴ精品视频一二三区| 欧美中文字幕一二三区视频| 中文字幕久久午夜不卡| 奇米影视在线99精品| 色婷婷av一区二区三区软件| 中文字幕成人网| 日韩一区二区在线看片| 日日夜夜一区二区| 色综合久久久久| 国产日本欧美一区二区| 精品一区二区三区蜜桃| 欧美在线看片a免费观看| 日韩精品一区二区在线观看| 一级做a爱片久久| 北条麻妃一区二区三区| 中文字幕免费观看一区| 91天堂素人约啪| 精品国产百合女同互慰| 久久精品国产一区二区| 日韩欧美国产三级电影视频| 亚洲激情av在线| 色综合中文字幕| 久久久精品免费网站| 日韩电影在线免费| 欧美一二三在线| 亚洲免费视频中文字幕| 99re热这里只有精品免费视频| 亚洲欧美日本韩国| 欧美日本一区二区三区四区 | 亚洲激情图片qvod| 亚洲最大色网站| 欧美日韩夫妻久久| 国产成人自拍在线| 一区二区三区四区在线播放| 欧美日韩一区三区四区| 在线观看日韩高清av| 国产精品卡一卡二| 久久99国内精品| 久久久亚洲午夜电影| 久久99精品国产麻豆婷婷洗澡| 欧美一级在线视频| 奇米综合一区二区三区精品视频| 欧美一卡在线观看| 蜜桃久久久久久| 在线免费观看日本欧美| 日本亚洲免费观看| 日韩视频一区二区三区在线播放| 另类调教123区| 中文字幕日韩欧美一区二区三区| 欧美激情一区二区在线| 国产成人免费9x9x人网站视频| 欧美一区二区三区公司| 国内不卡的二区三区中文字幕| 欧美成人一区二区三区在线观看| 国产真实乱对白精彩久久| 久久老女人爱爱| 国产盗摄视频一区二区三区| 久久婷婷国产综合精品青草 | 欧美日韩精品是欧美日韩精品| 国产精品77777| 国产精品美女久久久久久久 | 国产99久久久国产精品免费看| 精品国内二区三区| 另类综合日韩欧美亚洲| 欧美成人在线直播| 黄网站免费久久| 国产精品久久毛片av大全日韩| 99久久精品久久久久久清纯| 日韩美女啊v在线免费观看| 91美女在线看| 亚洲国产精品精华液网站| 91麻豆精品国产| 国产在线观看免费一区| 国产精品成人免费在线| 成人av电影在线网| 亚洲第一搞黄网站| 日韩一级片在线播放| 国产精品一线二线三线精华| 91精品国产高清一区二区三区| 国产高清精品久久久久| 亚洲摸摸操操av| 久久品道一品道久久精品| www.亚洲色图| 久久精品国产精品亚洲红杏| 国产精品久久久久久久午夜片| 日韩三级视频中文字幕| av成人老司机| 国产乱子轮精品视频| 一区二区三区蜜桃| 国产精品福利在线播放|