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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? short.c

?? linux device driver源碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* * short.c -- Simple Hardware Operations and Raw Tests * short.c -- also a brief example of interrupt handling ("short int") * * Copyright (C) 2001 Alessandro Rubini and Jonathan Corbet * Copyright (C) 2001 O'Reilly & Associates * * The source code in this file can be freely used, adapted, * and redistributed in source or binary form, so long as an * acknowledgment appears in derived source files.  The citation * should list that the code comes from the book "Linux Device * Drivers" by Alessandro Rubini and Jonathan Corbet, published * by O'Reilly & Associates.   No warranty is attached; * we cannot take responsibility for errors or fitness for use. * * $Id: short.c,v 1.22 2001/07/18 22:28:18 rubini Exp $ */#ifndef __KERNEL__#  define __KERNEL__#endif#ifndef MODULE#  define MODULE#endif#include <linux/config.h>#include <linux/module.h>#include <linux/sched.h>#include <linux/kernel.h> /* printk() */#include <linux/fs.h>     /* everything... */#include <linux/errno.h>  /* error codes */#include <linux/delay.h>  /* udelay */#include <linux/malloc.h>#include <linux/mm.h>#include <linux/ioport.h>#include <linux/interrupt.h>#include <linux/tqueue.h>#include <asm/io.h>#include "sysdep.h"#define SHORT_NR_PORTS 8 /* use 8 ports by default *//* * all of the parameters have no "short_" prefix, to save typing when * specifying them at load time */static int major = 0; /* dynamic by default */MODULE_PARM(major, "i");static int use_mem = 0; /* default is I/O-mapped */MODULE_PARM(use_mem, "i");/* default is the first printer port on PC's. "short_base" is there too   because it's what we want to use in the code */static unsigned long base = 0x378;unsigned long short_base = 0;MODULE_PARM(base, "l");/* Since short_base is vremapped in case use_mem==1, remember the phys addr. */unsigned long short_phys;/* The interrupt line is undefined by default. "short_irq" is as above */static int irq = -1;volatile int short_irq = -1;MODULE_PARM(irq, "i");static int probe = 0; /* select at load time how to probe irq line */MODULE_PARM(probe, "i");static int bh = 0; /* select at load time whether a bottom-half is used */MODULE_PARM(bh, "i");static int tasklet = 0; /* select whether a tasklet is used */MODULE_PARM(tasklet, "i");static int share = 0; /* select at load time whether install a shared irq */MODULE_PARM(share, "i");MODULE_AUTHOR ("Alessandro Rubini");unsigned long short_buffer = 0;unsigned long volatile short_head;volatile unsigned long short_tail;DECLARE_WAIT_QUEUE_HEAD(short_queue);/* Set up our tasklet if we're doing that. */#ifdef HAVE_TASKLETSvoid short_do_tasklet (unsigned long);DECLARE_TASKLET (short_tasklet, short_do_tasklet, 0);#endif/* * Atomicly increment an index into short_buffer */static inline void short_incr_bp(volatile unsigned long *index, int delta){    unsigned long new = *index + delta;    barrier ();  /* Don't optimize these two together */    *index = (new >= (short_buffer + PAGE_SIZE)) ? short_buffer : new;}/* * The devices with low minor numbers write/read burst of data to/from * specific I/O ports (by default the parallel ones). *  * The device with 128 as minor number returns ascii strings telling * when interrupts have been received. Writing to the device toggles * 00/FF on the parallel data lines. If there is a loopback wire, this * generates interrupts.   */int short_open (struct inode *inode, struct file *filp){    extern struct file_operations short_i_fops;    MOD_INC_USE_COUNT;    if (MINOR(inode->i_rdev) & 0x80) {        filp->f_op = &short_i_fops; /* the interrupt-driven node */    }    return 0;}#ifdef LINUX_20void short_release (struct inode *inode, struct file *filp){    MOD_DEC_USE_COUNT;}#elseint short_release (struct inode *inode, struct file *filp){    MOD_DEC_USE_COUNT;    return 0;}#endif/* first, the port-oriented device */enum short_modes {SHORT_DEFAULT=0, SHORT_PAUSE, SHORT_STRING, SHORT_MEMORY};ssize_t do_short_read (struct inode *inode, struct file *filp, char *buf,                size_t count, loff_t *f_pos){    int retval = count;    unsigned long address = short_base + (MINOR(inode->i_rdev)&0x0f);    int mode = (MINOR(inode->i_rdev)&0x70) >> 4;    unsigned char *kbuf=kmalloc(count, GFP_KERNEL), *ptr;        if (!kbuf) return -ENOMEM;    ptr=kbuf;    if (use_mem)	mode = SHORT_MEMORY;	    switch(mode) {      case SHORT_STRING:        insb(address, ptr, count);	rmb();        break;      case SHORT_DEFAULT:        while (count--) {            *(ptr++) = inb(address);	    rmb();	}        break;      case SHORT_MEMORY:        while (count--) {            *(ptr++) = readb(address);	    rmb();	}        break;      case SHORT_PAUSE:        while (count--) {            *(ptr++) = inb_p(address);	    rmb();	}        break;      default: /* no more modes defined by now */        retval = -EINVAL;        break;    }    if ( (retval > 0) && copy_to_user(buf, kbuf, retval))	retval = -EFAULT;    kfree(kbuf);    return retval;}/* * Version-specific methods for the fops structure. */#ifdef LINUX_20int short_read(struct inode *inode, struct file *filp, char *buf, int count){    return do_short_read(inode, filp, buf, count, &filp->f_pos);}#elsessize_t short_read(struct file *filp, char *buf, size_t count, loff_t *f_pos){    return do_short_read(filp->f_dentry->d_inode, filp, buf, count, f_pos);}#endifssize_t do_short_write (struct inode *inode, struct file *filp, const char *buf,                size_t count, loff_t *f_pos){    int retval = count;    unsigned long address = short_base + (MINOR(inode->i_rdev)&0x0f);    int mode = (MINOR(inode->i_rdev)&0x70) >> 4;    unsigned char *kbuf=kmalloc(count, GFP_KERNEL), *ptr;    if (!kbuf) return -ENOMEM;    if (copy_from_user(kbuf, buf, count))	return -EFAULT;    ptr=kbuf;    if (use_mem)	mode = SHORT_MEMORY;    switch(mode) {      case SHORT_PAUSE:        while (count--) {            outb_p(*(ptr++), address);	    wmb();	}        break;      case SHORT_STRING:        outsb(address, ptr, count);	wmb();        break;      case SHORT_DEFAULT:        while (count--) {            outb(*(ptr++), address);	    wmb();	}        break;      case SHORT_MEMORY:        while (count--) {            writeb(*(ptr++), address);	    wmb();	}        break;      default: /* no more modes defined by now */        retval = -EINVAL;        break;    }    kfree(kbuf);    return retval;}#ifdef LINUX_20int short_write(struct inode *inode, struct file *filp, const char *buf,                int count){    return do_short_write(inode, filp, buf, count, &filp->f_pos);}#elsessize_t short_write(struct file *filp, const char *buf, size_t count,                loff_t *f_pos){    return do_short_write(filp->f_dentry->d_inode, filp, buf, count, f_pos);}#endif#ifdef __USE_OLD_SELECT__int short_poll (struct inode *inode, struct file *filp,                  int mode, select_table *table){    return mode==SEL_EX ? 0 : 1; /* readable, writable, not-exceptionable */}#define poll select#else /* Use poll */unsigned int short_poll(struct file *filp, poll_table *wait){    return POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM;}#endif /* __USE_OLD_SELECT__ */struct file_operations short_fops = {    read: short_read,    write: short_write,    poll: short_poll,    open: short_open,    release: short_release,};/* then,  the interrupt-related device */ssize_t short_i_read (struct file *filp, char *buf, size_t count, loff_t *f_pos){    int count0;    while (short_head == short_tail) {        interruptible_sleep_on(&short_queue);        if (signal_pending (current))  /* a signal arrived */          return -ERESTARTSYS; /* tell the fs layer to handle it */        /* else, loop */    }    /* count0 is the number of readable data bytes */    count0 = short_head - short_tail;    if (count0 < 0) /* wrapped */        count0 = short_buffer + PAGE_SIZE - short_tail;    if (count0 < count) count = count0;    if (copy_to_user(buf, (char *)short_tail, count))	return -EFAULT;    short_incr_bp (&short_tail, count);    return count;}ssize_t short_i_write (struct file *filp, const char *buf, size_t count,                loff_t *f_pos){    int written = 0, odd = *f_pos & 1;    unsigned long address = short_base; /* output to the parallel data latch */    if (use_mem) {	while (written < count)	    writeb(0xff * ((++written + odd) & 1), address);    } else {	while (written < count)	    outb(0xff * ((++written + odd) & 1), address);    }    *f_pos += count;    return written;}/* * 2.0 wrappers. */#ifdef LINUX_20int short_i_read_20 (struct inode *inode, struct file *filp, char *buf,                int count){    return short_i_read (filp, buf, count, &filp->f_pos);}int short_i_write_20 (struct inode *inode, struct file *filp, const char *buf,                int count){    return short_i_write (filp, buf, count, &filp->f_pos);}#define short_i_read  short_i_read_20#define short_i_write short_i_write_20#endif /* LINUX_20 */struct file_operations short_i_fops = {    read: short_i_read,    write: short_i_write,    open: short_open,    release: short_release,

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久国产精品色| 国产日韩欧美不卡| 色av成人天堂桃色av| 波多野洁衣一区| 成人精品国产一区二区4080| 国产一区三区三区| 久久激情五月婷婷| 麻豆一区二区三| 美女性感视频久久| 国产在线播放一区| 99在线精品免费| 欧美中文字幕亚洲一区二区va在线| 丁香天五香天堂综合| 国产一区激情在线| 91色在线porny| 欧美伦理影视网| 国产亚洲精品bt天堂精选| 国产精品天干天干在线综合| 日本一区二区三区电影| 亚洲欧美电影院| 国产福利一区在线| 欧美二区三区91| 亚洲人午夜精品天堂一二香蕉| 久久疯狂做爰流白浆xx| 国产传媒欧美日韩成人| 色中色一区二区| 欧美精品一区二区三区久久久| 国产欧美日韩综合精品一区二区| 一区二区三区不卡在线观看| 日本亚洲三级在线| 91在线视频播放地址| 日韩精品最新网址| 亚洲网友自拍偷拍| 91麻豆精品一区二区三区| 久久久久久9999| 久久精品国产澳门| 欧美老肥妇做.爰bbww视频| 一区在线中文字幕| 国产高清一区日本| 久久精品视频一区二区三区| 五月婷婷久久综合| 欧美亚洲综合在线| 日韩一区欧美二区| 欧美美女bb生活片| 日韩高清在线不卡| 精品视频在线免费看| 亚洲午夜精品一区二区三区他趣| 粉嫩aⅴ一区二区三区四区| 综合欧美一区二区三区| 国产主播一区二区| 亚洲精品欧美在线| 91久久一区二区| 石原莉奈在线亚洲三区| www日韩大片| 成人国产精品免费网站| 国产视频亚洲色图| 91精品办公室少妇高潮对白| 亚洲欧美另类小说| 欧美日韩激情一区二区| 激情综合网av| 午夜精彩视频在线观看不卡| 欧美美女bb生活片| 国产米奇在线777精品观看| 91麻豆精品国产自产在线观看一区 | 日韩精品一区二区三区老鸭窝| 精品日韩99亚洲| 粉嫩欧美一区二区三区高清影视| 中文字幕日韩一区| 日韩一级片在线观看| 国产凹凸在线观看一区二区| 一区二区三区四区不卡在线| 精品国产青草久久久久福利| 欧美美女视频在线观看| 国产精品91xxx| 奇米影视在线99精品| 成人免费在线播放视频| 在线电影院国产精品| av午夜精品一区二区三区| 激情五月婷婷综合网| 亚洲一区二区不卡免费| 欧美国产欧美亚州国产日韩mv天天看完整| 视频一区二区三区入口| 一区在线播放视频| 久久精品亚洲乱码伦伦中文| 色哟哟一区二区在线观看| 国产乱码精品1区2区3区| 久久er99精品| 国产一区二区久久| 国产福利精品一区二区| 狠狠色狠狠色综合日日91app| 男人操女人的视频在线观看欧美 | 欧美一级二级在线观看| 欧美亚洲图片小说| 欧美色爱综合网| 日韩一级在线观看| 日本一区二区三级电影在线观看 | 亚洲欧美一区二区不卡| 综合激情成人伊人| 香蕉加勒比综合久久| 日韩 欧美一区二区三区| 日本少妇一区二区| 成人午夜视频在线观看| 日本大香伊一区二区三区| 在线亚洲+欧美+日本专区| 欧美日韩美少妇| 国产视频一区二区在线观看| 亚洲乱码国产乱码精品精98午夜| 亚洲成人av一区二区三区| 麻豆高清免费国产一区| 成人黄色小视频| 欧美精品第一页| 日本一区二区三区视频视频| 午夜婷婷国产麻豆精品| 久久国产尿小便嘘嘘尿| 在线免费不卡电影| 一色屋精品亚洲香蕉网站| 国产一区二区三区在线观看精品| 99re热这里只有精品视频| 91精品国产色综合久久ai换脸 | av高清不卡在线| 欧美精品一区二区三区蜜桃| 中文字幕视频一区二区三区久| 一区二区三区四区激情| 成人手机电影网| 中文字幕精品一区| 国产麻豆成人精品| 久久亚洲精品国产精品紫薇| 亚洲综合在线第一页| 在线免费亚洲电影| 亚洲乱码国产乱码精品精98午夜| 秋霞影院一区二区| 精品国产欧美一区二区| 国产v日产∨综合v精品视频| 日韩一区二区不卡| 国产不卡一区视频| 亚洲欧洲日本在线| 色婷婷av一区二区三区之一色屋| 欧美v国产在线一区二区三区| 日本aⅴ免费视频一区二区三区| 日韩手机在线导航| 国产成人午夜高潮毛片| 亚洲激情图片一区| 日韩一级片在线播放| 国产麻豆精品在线| 一区二区三区影院| 日韩欧美一级二级三级| 成人性生交大片免费看中文| 亚洲欧洲另类国产综合| 91精品久久久久久蜜臀| 麻豆高清免费国产一区| 欧美极品美女视频| 欧美剧情电影在线观看完整版免费励志电影| 青青草成人在线观看| 91小宝寻花一区二区三区| 一本大道av伊人久久综合| 一本到不卡精品视频在线观看| 欧美日韩中文字幕精品| 性做久久久久久| 自拍av一区二区三区| 51午夜精品国产| 99精品国产99久久久久久白柏| 国内精品在线播放| 亚洲精品中文字幕乱码三区| 久久先锋影音av鲁色资源| 日韩一卡二卡三卡四卡| 欧美精品 日韩| 99精品视频在线播放观看| 精品中文字幕一区二区| 日本午夜精品视频在线观看| 一区二区三区免费在线观看| 综合电影一区二区三区| 国产欧美日韩不卡| 欧美一区二区三区四区久久 | 日日噜噜夜夜狠狠视频欧美人 | 色综合久久六月婷婷中文字幕| 日韩av一级片| 亚洲国产毛片aaaaa无费看| 欧美高清在线视频| 国产精品亲子伦对白| 亚洲男同1069视频| 亚洲三级电影网站| 一区二区三区久久久| 一区二区三区四区精品在线视频 | 久久亚洲综合色一区二区三区| 精品日韩欧美在线| 中文字幕人成不卡一区| 亚洲香蕉伊在人在线观| 久久精品国产一区二区| 国产精品69毛片高清亚洲| 成人a免费在线看| 欧美一级一区二区| 成人免费视频在线观看| 捆绑变态av一区二区三区| 成人免费看黄yyy456| 欧美一级午夜免费电影| 亚洲另类春色校园小说| 久久精品国产亚洲aⅴ | 欧美私模裸体表演在线观看| 久久综合色之久久综合| 日韩精品亚洲一区二区三区免费|