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

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

?? apm.c

?? ARM 嵌入式 系統 設計與實例開發 實驗教材 二源碼
?? C
?? 第 1 頁 / 共 4 頁
字號:
 */ static int apm_engage_power_management(u_short device, int enable){	u32	eax;	if ((enable == 0) && (device == APM_DEVICE_ALL)	    && (apm_info.bios.flags & APM_BIOS_DISABLED))		return APM_DISABLED;	if (apm_bios_call_simple(APM_FUNC_ENGAGE_PM, device, enable, &eax))		return (eax >> 8) & 0xff;	if (device == APM_DEVICE_ALL) {		if (enable)			apm_info.bios.flags &= ~APM_BIOS_DISENGAGED;		else			apm_info.bios.flags |= APM_BIOS_DISENGAGED;	}	return APM_SUCCESS;}/** *	apm_error	-	display an APM error *	@str: information string *	@err: APM BIOS return code * *	Write a meaningful log entry to the kernel log in the event of *	an APM error. */ static void apm_error(char *str, int err){	int	i;	for (i = 0; i < ERROR_COUNT; i++)		if (error_table[i].key == err) break;	if (i < ERROR_COUNT)		printk(KERN_NOTICE "apm: %s: %s\n", str, error_table[i].msg);	else		printk(KERN_NOTICE "apm: %s: unknown error code %#2.2x\n",			str, err);}#if defined(CONFIG_APM_DISPLAY_BLANK) && defined(CONFIG_VT)/** *	apm_console_blank	-	blank the display *	@blank: on/off * *	Attempt to blank the console, firstly by blanking just video device *	zero, and if that fails (some BIOSes dont support it) then it blanks *	all video devices. Typically the BIOS will do laptop backlight and *	monitor powerdown for us. */ static int apm_console_blank(int blank){	int	error;	u_short	state;	state = blank ? APM_STATE_STANDBY : APM_STATE_READY;	/* Blank the first display device */	error = set_power_state(0x100, state);	if ((error != APM_SUCCESS) && (error != APM_NO_ERROR)) {		/* try to blank them all instead */		error = set_power_state(0x1ff, state);		if ((error != APM_SUCCESS) && (error != APM_NO_ERROR))			/* try to blank device one instead */			error = set_power_state(0x101, state);	}	if ((error == APM_SUCCESS) || (error == APM_NO_ERROR))		return 1;	apm_error("set display", error);	return 0;}#endifstatic int queue_empty(struct apm_user *as){	return as->event_head == as->event_tail;}static apm_event_t get_queued_event(struct apm_user *as){	as->event_tail = (as->event_tail + 1) % APM_MAX_EVENTS;	return as->events[as->event_tail];}static void queue_event(apm_event_t event, struct apm_user *sender){	struct apm_user *	as;	if (user_list == NULL)		return;	for (as = user_list; as != NULL; as = as->next) {		if ((as == sender) || (!as->reader))			continue;		as->event_head = (as->event_head + 1) % APM_MAX_EVENTS;		if (as->event_head == as->event_tail) {			static int notified;			if (notified++ == 0)			    printk(KERN_ERR "apm: an event queue overflowed\n");			as->event_tail = (as->event_tail + 1) % APM_MAX_EVENTS;		}		as->events[as->event_head] = event;		if ((!as->suser) || (!as->writer))			continue;		switch (event) {		case APM_SYS_SUSPEND:		case APM_USER_SUSPEND:			as->suspends_pending++;			suspends_pending++;			break;		case APM_SYS_STANDBY:		case APM_USER_STANDBY:			as->standbys_pending++;			standbys_pending++;			break;		}	}	wake_up_interruptible(&apm_waitqueue);}static void set_time(void){	unsigned long	flags;	if (got_clock_diff) {	/* Must know time zone in order to set clock */		save_flags(flags);		cli();		CURRENT_TIME = get_cmos_time() + clock_cmos_diff;		restore_flags(flags);	}}static void get_time_diff(void){#ifndef CONFIG_APM_RTC_IS_GMT	unsigned long	flags;	/*	 * Estimate time zone so that set_time can update the clock	 */	save_flags(flags);	clock_cmos_diff = -get_cmos_time();	cli();	clock_cmos_diff += CURRENT_TIME;	got_clock_diff = 1;	restore_flags(flags);#endif}static void reinit_timer(void){#ifdef INIT_TIMER_AFTER_SUSPEND	unsigned long	flags;	save_flags(flags);	cli();	/* set the clock to 100 Hz */	outb_p(0x34,0x43);		/* binary, mode 2, LSB/MSB, ch 0 */	udelay(10);	outb_p(LATCH & 0xff , 0x40);	/* LSB */	udelay(10);	outb(LATCH >> 8 , 0x40);	/* MSB */	udelay(10);	restore_flags(flags);#endif}static int suspend(int vetoable){	int		err;	struct apm_user	*as;	if (pm_send_all(PM_SUSPEND, (void *)3)) {		/* Vetoed */		if (vetoable) {			if (apm_info.connection_version > 0x100)				apm_set_power_state(APM_STATE_REJECT);			err = -EBUSY;			waiting_for_resume = 0;			printk(KERN_WARNING "apm: suspend was vetoed.\n");			goto out;		}		printk(KERN_CRIT "apm: suspend was vetoed, but suspending anyway.\n");	}	get_time_diff();	cli();	err = apm_set_power_state(APM_STATE_SUSPEND);	reinit_timer();	set_time();	sti();	if (err == APM_NO_ERROR)		err = APM_SUCCESS;	if (err != APM_SUCCESS)		apm_error("suspend", err);	err = (err == APM_SUCCESS) ? 0 : -EIO;	pm_send_all(PM_RESUME, (void *)0);	queue_event(APM_NORMAL_RESUME, NULL);	ignore_normal_resume = 1; out:	for (as = user_list; as != NULL; as = as->next) {		as->suspend_wait = 0;		as->suspend_result = err;	}	ignore_normal_resume = 1;	wake_up_interruptible(&apm_suspend_waitqueue);	return err;}static void standby(void){	int	err;	/* If needed, notify drivers here */	get_time_diff();	err = apm_set_power_state(APM_STATE_STANDBY);	if ((err != APM_SUCCESS) && (err != APM_NO_ERROR))		apm_error("standby", err);}static apm_event_t get_event(void){	int		error;	apm_event_t	event;	apm_eventinfo_t	info;	static int notified;	/* we don't use the eventinfo */	error = apm_get_event(&event, &info);	if (error == APM_SUCCESS)		return event;	if ((error != APM_NO_EVENTS) && (notified++ == 0))		apm_error("get_event", error);	return 0;}static void check_events(void){	apm_event_t		event;	static unsigned long	last_resume;	static int		ignore_bounce;	while ((event = get_event()) != 0) {		if (debug) {			if (event <= NR_APM_EVENT_NAME)				printk(KERN_DEBUG "apm: received %s notify\n",				       apm_event_name[event - 1]);			else				printk(KERN_DEBUG "apm: received unknown "				       "event 0x%02x\n", event);		}		if (ignore_bounce		    && ((jiffies - last_resume) > bounce_interval))			ignore_bounce = 0;		if (ignore_normal_resume && (event != APM_NORMAL_RESUME))			ignore_normal_resume = 0;		switch (event) {		case APM_SYS_STANDBY:		case APM_USER_STANDBY:			queue_event(event, NULL);			if (standbys_pending <= 0)				standby();			break;		case APM_USER_SUSPEND:#ifdef CONFIG_APM_IGNORE_USER_SUSPEND			if (apm_info.connection_version > 0x100)				apm_set_power_state(APM_STATE_REJECT);			break;#endif		case APM_SYS_SUSPEND:			if (ignore_bounce) {				if (apm_info.connection_version > 0x100)					apm_set_power_state(APM_STATE_REJECT);				break;			}			/*			 * If we are already processing a SUSPEND,			 * then further SUSPEND events from the BIOS			 * will be ignored.  We also return here to			 * cope with the fact that the Thinkpads keep			 * sending a SUSPEND event until something else			 * happens!			 */			if (waiting_for_resume)				return;			waiting_for_resume = 1;			queue_event(event, NULL);			if (suspends_pending <= 0)				(void) suspend(1);			break;		case APM_NORMAL_RESUME:		case APM_CRITICAL_RESUME:		case APM_STANDBY_RESUME:			waiting_for_resume = 0;			last_resume = jiffies;			ignore_bounce = 1;			if ((event != APM_NORMAL_RESUME)			    || (ignore_normal_resume == 0)) {				set_time();				pm_send_all(PM_RESUME, (void *)0);				queue_event(event, NULL);			}			ignore_normal_resume = 0;			break;		case APM_CAPABILITY_CHANGE:		case APM_LOW_BATTERY:		case APM_POWER_STATUS_CHANGE:			queue_event(event, NULL);			/* If needed, notify drivers here */			break;		case APM_UPDATE_TIME:			set_time();			break;		case APM_CRITICAL_SUSPEND:			/*			 * We are not allowed to reject a critical suspend.			 */			(void) suspend(0);			break;		}	}}static void apm_event_handler(void){	static int	pending_count = 4;	int		err;	if ((standbys_pending > 0) || (suspends_pending > 0)) {		if ((apm_info.connection_version > 0x100) &&				(pending_count-- <= 0)) {			pending_count = 4;			if (debug)				printk(KERN_DEBUG "apm: setting state busy\n");			err = apm_set_power_state(APM_STATE_BUSY);			if (err)				apm_error("busy", err);		}	} else		pending_count = 4;	check_events();}/* * This is the APM thread main loop. */static void apm_mainloop(void){	DECLARE_WAITQUEUE(wait, current);	add_wait_queue(&apm_waitqueue, &wait);	set_current_state(TASK_INTERRUPTIBLE);	for (;;) {		schedule_timeout(APM_CHECK_TIMEOUT);		if (exit_kapmd)			break;		/*		 * Ok, check all events, check for idle (and mark us sleeping		 * so as not to count towards the load average)..		 */		set_current_state(TASK_INTERRUPTIBLE);		apm_event_handler();	}	remove_wait_queue(&apm_waitqueue, &wait);}static int check_apm_user(struct apm_user *as, const char *func){	if ((as == NULL) || (as->magic != APM_BIOS_MAGIC)) {		printk(KERN_ERR "apm: %s passed bad filp\n", func);		return 1;	}	return 0;}static ssize_t do_read(struct file *fp, char *buf, size_t count, loff_t *ppos){	struct apm_user *	as;	int			i;	apm_event_t		event;	as = fp->private_data;	if (check_apm_user(as, "read"))		return -EIO;	if (count < sizeof(apm_event_t))		return -EINVAL;	if ((queue_empty(as)) && (fp->f_flags & O_NONBLOCK))		return -EAGAIN;	wait_event_interruptible(apm_waitqueue, !queue_empty(as));	i = count;	while ((i >= sizeof(event)) && !queue_empty(as)) {		event = get_queued_event(as);		if (copy_to_user(buf, &event, sizeof(event))) {			if (i < count)				break;			return -EFAULT;		}		switch (event) {		case APM_SYS_SUSPEND:		case APM_USER_SUSPEND:			as->suspends_read++;			break;		case APM_SYS_STANDBY:		case APM_USER_STANDBY:			as->standbys_read++;			break;		}		buf += sizeof(event);		i -= sizeof(event);	}	if (i < count)		return count - i;	if (signal_pending(current))		return -ERESTARTSYS;	return 0;}static unsigned int do_poll(struct file *fp, poll_table * wait){	struct apm_user * as;	as = fp->private_data;	if (check_apm_user(as, "poll"))		return 0;	poll_wait(fp, &apm_waitqueue, wait);	if (!queue_empty(as))		return POLLIN | POLLRDNORM;	return 0;}static int do_ioctl(struct inode * inode, struct file *filp,		    u_int cmd, u_long arg){	struct apm_user *	as;	as = filp->private_data;	if (check_apm_user(as, "ioctl"))		return -EIO;	if ((!as->suser) || (!as->writer))		return -EPERM;	switch (cmd) {	case APM_IOC_STANDBY:		if (as->standbys_read > 0) {			as->standbys_read--;			as->standbys_pending--;			standbys_pending--;		} else			queue_event(APM_USER_STANDBY, as);		if (standbys_pending <= 0)			standby();		break;	case APM_IOC_SUSPEND:		if (as->suspends_read > 0) {			as->suspends_read--;			as->suspends_pending--;			suspends_pending--;		} else			queue_event(APM_USER_SUSPEND, as);		if (suspends_pending <= 0) {			return suspend(1);		} else {			as->suspend_wait = 1;			wait_event_interruptible(apm_suspend_waitqueue,					as->suspend_wait == 0);			return as->suspend_result;		}		break;	default:		return -EINVAL;	}	return 0;}static int do_release(struct inode * inode, struct file * filp){	struct apm_user *	as;	as = filp->private_data;	if (check_apm_user(as, "release"))		return 0;	filp->private_data = NULL;	lock_kernel();	if (as->standbys_pending > 0) {		standbys_pending -= as->standbys_pending;		if (standbys_pending <= 0)			standby();	}	if (as->suspends_pending > 0) {		suspends_pending -= as->suspends_pending;		if (suspends_pending <= 0)			(void) suspend(1);	}	if (user_list == as)		user_list = as->next;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产人成一区二区三区影院| 亚洲va国产va欧美va观看| 一区二区中文视频| 手机精品视频在线观看| 成人黄色av网站在线| 欧美一级黄色大片| 日韩**一区毛片| 成人动漫精品一区二区| 2020国产精品自拍| 午夜免费久久看| 日本韩国欧美一区| 中文字幕一区二区在线观看| 国产一区在线视频| 欧美一级二级在线观看| 亚洲成人免费电影| 91香蕉视频mp4| 亚洲欧美综合色| 成人的网站免费观看| 久久九九99视频| 激情综合网av| 91精品婷婷国产综合久久| 亚洲综合一二三区| 99精品1区2区| 亚洲人成精品久久久久久| 成人精品视频一区二区三区尤物| 欧美tickling网站挠脚心| 久久99在线观看| 精品国产一区二区在线观看| 麻豆精品在线观看| 精品成人a区在线观看| 国内成+人亚洲+欧美+综合在线| 欧美大片一区二区三区| 蜜臀av性久久久久蜜臀av麻豆| 欧美久久久久久久久中文字幕| 一区二区三区精品在线| 91成人国产精品| 夜夜爽夜夜爽精品视频| 在线成人免费观看| 看片的网站亚洲| 欧美va亚洲va香蕉在线| 国产成人无遮挡在线视频| 国产欧美日韩视频在线观看| av激情成人网| 亚洲国产日韩精品| 91精品国产欧美日韩| 日本中文字幕不卡| 久久美女艺术照精彩视频福利播放| 国产精品自拍一区| 中文字幕一区二区三区蜜月| 91精彩视频在线观看| 五月综合激情网| 欧美一区二区三区视频免费播放| 久久爱www久久做| 中文字幕国产精品一区二区| 欧美在线小视频| 免费在线看成人av| 国产精品短视频| 欧洲国内综合视频| 精品亚洲aⅴ乱码一区二区三区| 久久精品一区二区三区不卡| 91免费国产视频网站| 日韩av中文字幕一区二区| 国产欧美日韩在线看| 欧美少妇一区二区| 国产福利视频一区二区三区| 亚洲精品国产视频| 久久婷婷成人综合色| 欧美主播一区二区三区美女| 蜜桃91丨九色丨蝌蚪91桃色| 1区2区3区精品视频| 欧美zozozo| 欧美色综合天天久久综合精品| 精品一区二区三区在线观看国产 | 黑人精品欧美一区二区蜜桃| 国产精品美女久久久久久久| 欧美丰满嫩嫩电影| 粉嫩av亚洲一区二区图片| 午夜一区二区三区在线观看| 久久久久国产一区二区三区四区| 色综合久久久久久久| 极品少妇xxxx精品少妇| 亚洲免费在线观看视频| 亚洲精品一区二区三区精华液| 91香蕉视频污| 成人自拍视频在线| 久久成人免费网| 亚洲成人精品一区二区| 中文字幕一区二区三区在线不卡| 日韩精品一区二| 欧美日韩二区三区| 在线中文字幕一区| 国产91精品一区二区麻豆网站| 五月婷婷色综合| 亚洲激情综合网| 国产精品色哟哟| 久久精品视频在线看| 日韩一区二区三区在线视频| 欧美偷拍一区二区| 日本韩国欧美国产| av电影一区二区| 国产精品一二三区在线| 精品在线一区二区| 欧美bbbbb| 青青青爽久久午夜综合久久午夜| 亚洲国产综合在线| 亚洲精品国产a| 一区二区三区日本| 亚洲激情男女视频| 亚洲乱码日产精品bd| 亚洲欧美影音先锋| 1000部国产精品成人观看| 国产精品天美传媒沈樵| 国产精品久久久久一区| 亚洲国产成人午夜在线一区| 国产精品美女一区二区| 日韩毛片精品高清免费| 亚洲免费观看高清完整版在线观看熊| 国产精品毛片a∨一区二区三区| 中文字幕欧美激情一区| 亚洲欧洲无码一区二区三区| 亚洲欧美国产毛片在线| 一区二区三区精品视频在线| 一区二区三区在线影院| 亚洲成人一区在线| 日韩不卡免费视频| 国产一区二区三区电影在线观看| 国产精品538一区二区在线| 成人性生交大片免费看在线播放 | 国产精品久久久久一区二区三区共 | 91在线国产观看| 色系网站成人免费| 欧美精品第一页| 精品少妇一区二区三区免费观看| 久久嫩草精品久久久精品| 国产免费久久精品| 亚洲三级在线观看| 婷婷久久综合九色综合伊人色| 日本一道高清亚洲日美韩| 国产在线不卡一区| 色偷偷久久人人79超碰人人澡| 777午夜精品免费视频| 国产日韩亚洲欧美综合| 亚洲综合免费观看高清完整版| 日本大胆欧美人术艺术动态| 国产精品自产自拍| 在线观看91视频| 久久久久国产精品麻豆| 亚洲欧美日韩久久精品| 美腿丝袜一区二区三区| av一区二区三区在线| 欧美精品99久久久**| 欧美经典三级视频一区二区三区| 亚洲伊人伊色伊影伊综合网| 麻豆国产欧美一区二区三区| 99精品视频中文字幕| 日韩一区二区高清| 中文字幕亚洲电影| 毛片一区二区三区| 欧洲精品中文字幕| 国产精品视频一二| 青青草精品视频| 91浏览器在线视频| 亚洲精品在线三区| 午夜视频久久久久久| 91麻豆国产精品久久| 精品播放一区二区| 午夜精品福利一区二区三区蜜桃| 国产精品一级片| 日韩欧美在线一区二区三区| 亚洲激情自拍视频| 丰满岳乱妇一区二区三区| 日韩视频一区在线观看| 亚洲一区av在线| av动漫一区二区| 国产欧美日韩不卡免费| 美日韩黄色大片| 欧美三片在线视频观看| 樱桃国产成人精品视频| 懂色av一区二区在线播放| 日韩小视频在线观看专区| 亚洲第一搞黄网站| 91亚洲精品乱码久久久久久蜜桃| 久久久国产精品午夜一区ai换脸| 蜜桃视频免费观看一区| 91精品福利在线一区二区三区 | 自拍偷拍亚洲激情| 粉嫩欧美一区二区三区高清影视 | 亚洲国产高清在线观看视频| 国产在线精品一区二区不卡了| 欧美日韩国产首页| 亚洲国产视频在线| 欧美视频你懂的| 亚洲韩国一区二区三区| 欧美三级日韩在线| 一区二区三区**美女毛片| 色综合久久综合中文综合网| 一区二区三区四区不卡在线 | 99久久亚洲一区二区三区青草| 久久久久国色av免费看影院| 国内精品写真在线观看|