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

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

?? wafer5823wdt.c

?? 底層驅動開發
?? C
字號:
/* *	ICP Wafer 5823 Single Board Computer WDT driver *      http://www.icpamerica.com/wafer_5823.php *      May also work on other similar models * *	(c) Copyright 2002 Justin Cormack <justin@street-vision.com> * *      Release 0.02 * *	Based on advantechwdt.c which is based on wdt.c. *	Original copyright messages: * *	(c) Copyright 1996-1997 Alan Cox <alan@redhat.com>, All Rights Reserved. *				http://www.redhat.com * *	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. * *	Neither Alan Cox nor CymruNet Ltd. admit liability nor provide *	warranty for any of this software. This material is provided *	"AS-IS" and at no charge. * *	(c) Copyright 1995    Alan Cox <alan@lxorguk.ukuu.org.uk> * */#include <linux/module.h>#include <linux/moduleparam.h>#include <linux/miscdevice.h>#include <linux/watchdog.h>#include <linux/fs.h>#include <linux/ioport.h>#include <linux/notifier.h>#include <linux/reboot.h>#include <linux/init.h>#include <linux/spinlock.h>#include <asm/io.h>#include <asm/uaccess.h>#define WATCHDOG_NAME "Wafer 5823 WDT"#define PFX WATCHDOG_NAME ": "#define WD_TIMO 60			/* 60 sec default timeout */static unsigned long wafwdt_is_open;static char expect_close;static spinlock_t wafwdt_lock;/* *	You must set these - there is no sane way to probe for this board. * *      To enable, write the timeout value in seconds (1 to 255) to I/O *      port WDT_START, then read the port to start the watchdog. To pat *      the dog, read port WDT_STOP to stop the timer, then read WDT_START *      to restart it again. */static int wdt_stop = 0x843;static int wdt_start = 0x443;static int timeout = WD_TIMO;  /* in seconds */module_param(timeout, int, 0);MODULE_PARM_DESC(timeout, "Watchdog timeout in seconds. 1<= timeout <=255, default=" __MODULE_STRING(WD_TIMO) ".");static int nowayout = WATCHDOG_NOWAYOUT;module_param(nowayout, int, 0);MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)");static void wafwdt_ping(void){	/* pat watchdog */	spin_lock(&wafwdt_lock);	inb_p(wdt_stop);	inb_p(wdt_start);	spin_unlock(&wafwdt_lock);}static void wafwdt_start(void){	/* start up watchdog */	outb_p(timeout, wdt_start);	inb_p(wdt_start);}static voidwafwdt_stop(void){	/* stop watchdog */	inb_p(wdt_stop);}static ssize_t wafwdt_write(struct file *file, const char __user *buf, size_t count, loff_t * ppos){	/* See if we got the magic character 'V' and reload the timer */	if (count) {		if (!nowayout) {			size_t i;			/* In case it was set long ago */			expect_close = 0;			/* scan to see whether or not we got the magic character */			for (i = 0; i != count; i++) {				char c;				if (get_user(c, buf + i))					return -EFAULT;				if (c == 'V')					expect_close = 42;			}		}		/* Well, anyhow someone wrote to us, we should return that favour */		wafwdt_ping();	}	return count;}static int wafwdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd,	     unsigned long arg){	int new_timeout;	void __user *argp = (void __user *)arg;	int __user *p = argp;	static struct watchdog_info ident = {		.options = WDIOF_KEEPALIVEPING | WDIOF_SETTIMEOUT | WDIOF_MAGICCLOSE,		.firmware_version = 1,		.identity = "Wafer 5823 WDT",	};	switch (cmd) {	case WDIOC_GETSUPPORT:		if (copy_to_user(argp, &ident, sizeof (ident)))			return -EFAULT;		break;	case WDIOC_GETSTATUS:	case WDIOC_GETBOOTSTATUS:		return put_user(0, p);	case WDIOC_KEEPALIVE:		wafwdt_ping();		break;	case WDIOC_SETTIMEOUT:		if (get_user(new_timeout, p))			return -EFAULT;		if ((new_timeout < 1) || (new_timeout > 255))			return -EINVAL;		timeout = new_timeout;		wafwdt_stop();		wafwdt_start();		/* Fall */	case WDIOC_GETTIMEOUT:		return put_user(timeout, p);	case WDIOC_SETOPTIONS:	{		int options, retval = -EINVAL;		if (get_user(options, p))			return -EFAULT;		if (options & WDIOS_DISABLECARD) {			wafwdt_start();			retval = 0;		}		if (options & WDIOS_ENABLECARD) {			wafwdt_stop();			retval = 0;		}		return retval;	}	default:		return -ENOIOCTLCMD;	}	return 0;}static int wafwdt_open(struct inode *inode, struct file *file){	if (test_and_set_bit(0, &wafwdt_is_open))		return -EBUSY;	/*	 *      Activate	 */	wafwdt_start();	return nonseekable_open(inode, file);}static intwafwdt_close(struct inode *inode, struct file *file){	if (expect_close == 42) {		wafwdt_stop();	} else {		printk(KERN_CRIT PFX "WDT device closed unexpectedly.  WDT will not stop!\n");		wafwdt_ping();	}	clear_bit(0, &wafwdt_is_open);	expect_close = 0;	return 0;}/* *	Notifier for system down */static int wafwdt_notify_sys(struct notifier_block *this, unsigned long code, void *unused){	if (code == SYS_DOWN || code == SYS_HALT) {		/* Turn the WDT off */		wafwdt_stop();	}	return NOTIFY_DONE;}/* *	Kernel Interfaces */static struct file_operations wafwdt_fops = {	.owner		= THIS_MODULE,	.llseek		= no_llseek,	.write		= wafwdt_write,	.ioctl		= wafwdt_ioctl,	.open		= wafwdt_open,	.release	= wafwdt_close,};static struct miscdevice wafwdt_miscdev = {	.minor	= WATCHDOG_MINOR,	.name	= "watchdog",	.fops	= &wafwdt_fops,};/* *	The WDT needs to learn about soft shutdowns in order to *	turn the timebomb registers off. */static struct notifier_block wafwdt_notifier = {	.notifier_call = wafwdt_notify_sys,};static int __init wafwdt_init(void){	int ret;	printk(KERN_INFO "WDT driver for Wafer 5823 single board computer initialising.\n");	spin_lock_init(&wafwdt_lock);	if (timeout < 1 || timeout > 255) {		timeout = WD_TIMO;		printk (KERN_INFO PFX "timeout value must be 1<=x<=255, using %d\n",			timeout);	}	if (wdt_stop != wdt_start) {		if(!request_region(wdt_stop, 1, "Wafer 5823 WDT")) {			printk (KERN_ERR PFX "I/O address 0x%04x already in use\n",			wdt_stop);			ret = -EIO;			goto error;		}	}	if(!request_region(wdt_start, 1, "Wafer 5823 WDT")) {		printk (KERN_ERR PFX "I/O address 0x%04x already in use\n",			wdt_start);		ret = -EIO;		goto error2;	}	ret = register_reboot_notifier(&wafwdt_notifier);	if (ret != 0) {		printk (KERN_ERR PFX "cannot register reboot notifier (err=%d)\n",			ret);		goto error3;	}	ret = misc_register(&wafwdt_miscdev);	if (ret != 0) {		printk (KERN_ERR PFX "cannot register miscdev on minor=%d (err=%d)\n",			WATCHDOG_MINOR, ret);		goto error4;	}	printk (KERN_INFO PFX "initialized. timeout=%d sec (nowayout=%d)\n",		timeout, nowayout);	return ret;error4:	unregister_reboot_notifier(&wafwdt_notifier);error3:	release_region(wdt_start, 1);error2:	if (wdt_stop != wdt_start)		release_region(wdt_stop, 1);error:	return ret;}static void __exit wafwdt_exit(void){	misc_deregister(&wafwdt_miscdev);	unregister_reboot_notifier(&wafwdt_notifier);	if(wdt_stop != wdt_start)		release_region(wdt_stop, 1);	release_region(wdt_start, 1);}module_init(wafwdt_init);module_exit(wafwdt_exit);MODULE_AUTHOR("Justin Cormack");MODULE_DESCRIPTION("ICP Wafer 5823 Single Board Computer WDT driver");MODULE_LICENSE("GPL");MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR);/* end of wafer5823wdt.c */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩一区三区四区| 成人夜色视频网站在线观看| 欧美亚洲国产怡红院影院| 亚洲欧美日韩系列| 日本韩国欧美一区二区三区| 亚洲黄色性网站| 欧美高清性hdvideosex| 日韩一区精品视频| www激情久久| eeuss鲁片一区二区三区在线观看| 日韩美女精品在线| 在线观看91精品国产入口| 天堂成人免费av电影一区| 日韩午夜在线播放| 成人夜色视频网站在线观看| 亚洲综合免费观看高清在线观看| 91麻豆精品国产91久久久久| 精品一区二区三区在线观看| 国产精品丝袜在线| 欧美日韩成人综合天天影院| 国产一区二区三区久久悠悠色av | 亚洲女人的天堂| 91成人免费网站| 精品一区二区免费在线观看| 国产精品区一区二区三| 欧美日韩视频第一区| 国产在线日韩欧美| 亚洲欧美国产77777| 日韩精品综合一本久道在线视频| 精品欧美一区二区久久 | 国产欧美一区在线| 91极品美女在线| 国产一区二区三区免费观看| 亚洲欧美日韩在线不卡| xf在线a精品一区二区视频网站| 99re热视频精品| 乱中年女人伦av一区二区| 亚洲天堂久久久久久久| 日韩色视频在线观看| 色网综合在线观看| 国产一区二区三区| 午夜精品视频一区| 亚洲图片另类小说| 久久久久久综合| 欧美一区二区三区四区久久| av在线不卡网| 国产精品2024| 免费成人美女在线观看| 亚洲另类中文字| 欧美国产精品久久| 欧美tickling网站挠脚心| 在线免费观看日本欧美| 成人激情免费网站| 国精产品一区一区三区mba桃花| 亚洲一卡二卡三卡四卡无卡久久 | 欧美高清视频在线高清观看mv色露露十八 | 亚洲mv在线观看| 国产精品免费人成网站| 日韩欧美第一区| 欧美色视频在线| 色婷婷综合久久久中文一区二区| 国产成人免费视频网站| 精品一区二区三区免费观看| 天堂午夜影视日韩欧美一区二区| 亚洲精品国产第一综合99久久 | 国产人伦精品一区二区| 欧美日韩一级黄| 91久久人澡人人添人人爽欧美| 国产成人av在线影院| 精品伊人久久久久7777人| 亚洲一区二区三区免费视频| 国产精品色呦呦| 中文字幕一区二区三中文字幕| 久久人人爽爽爽人久久久| 欧美日韩一区不卡| 欧美综合一区二区| 日本精品免费观看高清观看| 色婷婷综合激情| 在线中文字幕不卡| 精品视频在线视频| 欧美日韩高清在线播放| 制服丝袜中文字幕亚洲| 91精品国产综合久久香蕉麻豆| 欧美日韩国产美| 欧美久久一区二区| 日韩欧美中文一区| 久久久久久久综合日本| 久久久久久久久岛国免费| 久久婷婷综合激情| 久久精品人人爽人人爽| 国产午夜三级一区二区三| 国产目拍亚洲精品99久久精品| 日本一区二区三区在线观看| 国产精品天美传媒| 一区二区三区四区在线播放| 丝袜诱惑制服诱惑色一区在线观看 | 精品成人佐山爱一区二区| 久久日韩精品一区二区五区| 久久精品人人做人人综合| 亚洲人成人一区二区在线观看| 亚洲自拍偷拍欧美| 久久精品国产网站| 99久久婷婷国产综合精品电影| 91高清在线观看| 亚洲精品成人悠悠色影视| 婷婷丁香激情综合| 国产一区二区三区免费播放| 99re这里只有精品6| 欧美日韩国产综合一区二区| 欧美大尺度电影在线| 国产精品久久久久久久久久久免费看| 亚洲美女免费视频| 久久国产视频网| 色哟哟一区二区| 久久综合成人精品亚洲另类欧美 | 亚洲免费高清视频在线| 日韩成人一区二区三区在线观看| 激情五月激情综合网| 一本大道av伊人久久综合| 欧美va在线播放| 一区二区三区加勒比av| 国内成人免费视频| 在线区一区二视频| 国产丝袜美腿一区二区三区| 亚洲mv大片欧洲mv大片精品| 成人性生交大合| 日韩欧美一区二区在线视频| 中文字幕亚洲电影| 国产美女精品人人做人人爽| 欧美精品在线视频| 日韩美女视频19| 国产盗摄精品一区二区三区在线| 69堂亚洲精品首页| 亚洲男同性恋视频| 国产精品亚洲第一 | 久久亚区不卡日本| 蜜臀久久99精品久久久久久9| 97精品国产露脸对白| 久久先锋影音av鲁色资源网| 日本不卡一区二区| 在线观看视频一区二区欧美日韩| 久久久国产精品午夜一区ai换脸| 日本中文字幕不卡| 在线观看三级视频欧美| 国产精品乱人伦| 国产激情一区二区三区四区| 日韩一区二区在线免费观看| 亚洲.国产.中文慕字在线| 91在线观看污| 国产精品美女一区二区三区 | 日韩高清一级片| 在线一区二区三区四区五区| 最新国产の精品合集bt伙计| 成人午夜又粗又硬又大| 中文字幕乱码日本亚洲一区二区 | 精品亚洲成av人在线观看| 欧美一区二区三区四区久久| 亚洲成人你懂的| 欧美精品一二三区| 五月婷婷欧美视频| 欧美亚洲动漫制服丝袜| 亚洲激情第一区| 欧美做爰猛烈大尺度电影无法无天| 亚洲天堂成人在线观看| av激情成人网| 亚洲另类在线制服丝袜| 欧美综合一区二区| 午夜成人在线视频| 日韩欧美一区电影| 美国毛片一区二区三区| 精品久久久久久久久久久久久久久 | 亚洲小说春色综合另类电影| 91免费视频观看| 亚洲欧美视频在线观看视频| 91免费看`日韩一区二区| 亚洲综合成人在线视频| 欧美日本国产一区| 青青草国产成人av片免费| 日韩欧美在线网站| 国产成人精品www牛牛影视| 国产精品国产三级国产有无不卡| 99久久精品免费看| 一区二区三区蜜桃网| 欧美片网站yy| 久久激情五月激情| 中文字幕va一区二区三区| 91麻豆福利精品推荐| 亚洲6080在线| 精品成a人在线观看| 成人黄色在线网站| 亚洲一区二区三区在线| 日韩一区二区三| 成人污视频在线观看| 一卡二卡欧美日韩| 日韩精品一区二| 99国产欧美另类久久久精品| 亚洲午夜国产一区99re久久| 欧美成人a视频| 97久久精品人人澡人人爽| 亚洲精品欧美激情|