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

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

?? imm.c

?? linux和2410結合開發 用他可以生成2410所需的zImage文件
?? C
?? 第 1 頁 / 共 3 頁
字號:
/* imm.c   --  low level driver for the IOMEGA MatchMaker * parallel port SCSI host adapter. *  * (The IMM is the embedded controller in the ZIP Plus drive.) *  * Current Maintainer: David Campbell (Perth, Western Australia) *                     campbell@torque.net * * My unoffical company acronym list is 21 pages long: *      FLA:    Four letter acronym with built in facility for *              future expansion to five letters. */#include <linux/config.h>/* The following #define is to avoid a clash with hosts.c */#define IMM_CODE 1#define IMM_PROBE_SPP   0x0001#define IMM_PROBE_PS2   0x0002#define IMM_PROBE_ECR   0x0010#define IMM_PROBE_EPP17 0x0100#define IMM_PROBE_EPP19 0x0200void imm_reset_pulse(unsigned int base);static int device_check(int host_no);#include <linux/blk.h>#include <asm/io.h>#include <linux/parport.h>#include "sd.h"#include "hosts.h"typedef struct {    struct pardevice *dev;	/* Parport device entry         */    int base;			/* Actual port address          */    int base_hi;		/* Hi Base address for ECP-ISA chipset */    int mode;			/* Transfer mode                */    int host;			/* Host number (for proc)       */    Scsi_Cmnd *cur_cmd;		/* Current queued command       */    struct tq_struct imm_tq;	/* Polling interrupt stuff       */    unsigned long jstart;	/* Jiffies at start             */    unsigned failed:1;		/* Failure flag                 */    unsigned dp:1;		/* Data phase present           */    unsigned rd:1;		/* Read data in data phase      */    unsigned p_busy:1;		/* Parport sharing busy flag    */} imm_struct;#define IMM_EMPTY \{	dev:		NULL,		\	base:		-1,		\	base_hi:	0,		\	mode:		IMM_AUTODETECT,	\	host:		-1,		\	cur_cmd:	NULL,		\	imm_tq:		{ routine: imm_interrupt },    \	jstart:		0,		\	failed:		0,		\	dp:		0,		\	rd:		0,		\	p_busy:		0		\}#include "imm.h"#define NO_HOSTS 4static imm_struct imm_hosts[NO_HOSTS] ={IMM_EMPTY, IMM_EMPTY, IMM_EMPTY, IMM_EMPTY};#define IMM_BASE(x)	imm_hosts[(x)].base#define IMM_BASE_HI(x)     imm_hosts[(x)].base_hiint parbus_base[NO_HOSTS] ={0x03bc, 0x0378, 0x0278, 0x0000};void imm_wakeup(void *ref){    imm_struct *imm_dev = (imm_struct *) ref;    if (!imm_dev->p_busy)	return;    if (parport_claim(imm_dev->dev)) {	printk("imm: bug in imm_wakeup\n");	return;    }    imm_dev->p_busy = 0;    imm_dev->base = imm_dev->dev->port->base;    if (imm_dev->cur_cmd)	imm_dev->cur_cmd->SCp.phase++;    return;}int imm_release(struct Scsi_Host *host){    int host_no = host->unique_id;    printk("Releasing imm%i\n", host_no);    parport_unregister_device(imm_hosts[host_no].dev);    return 0;}static int imm_pb_claim(int host_no){    if (parport_claim(imm_hosts[host_no].dev)) {	imm_hosts[host_no].p_busy = 1;	return 1;    }    if (imm_hosts[host_no].cur_cmd)	imm_hosts[host_no].cur_cmd->SCp.phase++;    return 0;}#define imm_pb_release(x) parport_release(imm_hosts[(x)].dev)/*************************************************************************** *                   Parallel port probing routines                        * ***************************************************************************/static Scsi_Host_Template driver_template = IMM;#include  "scsi_module.c"int imm_detect(Scsi_Host_Template * host){    struct Scsi_Host *hreg;    int ports;    int i, nhosts, try_again;    struct parport *pb;    /*     * unlock to allow the lowlevel parport driver to probe     * the irqs     */    spin_unlock_irq(&io_request_lock);    pb = parport_enumerate();    printk("imm: Version %s\n", IMM_VERSION);    nhosts = 0;    try_again = 0;    if (!pb) {	printk("imm: parport reports no devices.\n");	spin_lock_irq(&io_request_lock);	return 0;    }  retry_entry:    for (i = 0; pb; i++, pb = pb->next) {	int modes, ppb;	imm_hosts[i].dev =	    parport_register_device(pb, "imm", NULL, imm_wakeup,				    NULL, 0, (void *) &imm_hosts[i]);	if (!imm_hosts[i].dev)	    continue;	/* Claim the bus so it remembers what we do to the control	 * registers. [ CTR and ECP ]	 */	if (imm_pb_claim(i)) {	    unsigned long now = jiffies;	    while (imm_hosts[i].p_busy) {		schedule();	/* We are safe to schedule here */		if (time_after(jiffies, now + 3 * HZ)) {		    printk(KERN_ERR "imm%d: failed to claim parport because a "		      "pardevice is owning the port for too longtime!\n",			   i);		    parport_unregister_device (imm_hosts[i].dev);		    spin_lock_irq(&io_request_lock);		    return 0;		}	    }	}	ppb = IMM_BASE(i) = imm_hosts[i].dev->port->base;	IMM_BASE_HI(i) = imm_hosts[i].dev->port->base_hi;	w_ctr(ppb, 0x0c);	modes = imm_hosts[i].dev->port->modes;	/* Mode detection works up the chain of speed	 * This avoids a nasty if-then-else-if-... tree	 */	imm_hosts[i].mode = IMM_NIBBLE;	if (modes & PARPORT_MODE_TRISTATE)	    imm_hosts[i].mode = IMM_PS2;	/* Done configuration */	imm_pb_release(i);	if (imm_init(i)) {	    parport_unregister_device(imm_hosts[i].dev);	    continue;	}	/* now the glue ... */	switch (imm_hosts[i].mode) {	case IMM_NIBBLE:	    ports = 3;	    break;	case IMM_PS2:	    ports = 3;	    break;	case IMM_EPP_8:	case IMM_EPP_16:	case IMM_EPP_32:	    ports = 8;	    break;	default:		/* Never gets here */	    continue;	}	host->can_queue = IMM_CAN_QUEUE;	host->sg_tablesize = imm_sg;	hreg = scsi_register(host, 0);	if(hreg == NULL)		continue;	hreg->io_port = pb->base;	hreg->n_io_port = ports;	hreg->dma_channel = -1;	hreg->unique_id = i;	imm_hosts[i].host = hreg->host_no;	nhosts++;    }    if (nhosts == 0) {	if (try_again == 1) {	    spin_lock_irq(&io_request_lock);	    return 0;	}	try_again = 1;	goto retry_entry;    } else {	spin_lock_irq (&io_request_lock);	return 1;		/* return number of hosts detected */    }}/* This is to give the imm driver a way to modify the timings (and other * parameters) by writing to the /proc/scsi/imm/0 file. * Very simple method really... (To simple, no error checking :( ) * Reason: Kernel hackers HATE having to unload and reload modules for * testing... * Also gives a method to use a script to obtain optimum timings (TODO) */static inline int imm_proc_write(int hostno, char *buffer, int length){    unsigned long x;    if ((length > 5) && (strncmp(buffer, "mode=", 5) == 0)) {	x = simple_strtoul(buffer + 5, NULL, 0);	imm_hosts[hostno].mode = x;	return length;    }    printk("imm /proc: invalid variable\n");    return (-EINVAL);}int imm_proc_info(char *buffer, char **start, off_t offset,		  int length, int hostno, int inout){    int i;    int len = 0;    for (i = 0; i < 4; i++)	if (imm_hosts[i].host == hostno)	    break;    if (inout)	return imm_proc_write(i, buffer, length);    len += sprintf(buffer + len, "Version : %s\n", IMM_VERSION);    len += sprintf(buffer + len, "Parport : %s\n", imm_hosts[i].dev->port->name);    len += sprintf(buffer + len, "Mode    : %s\n", IMM_MODE_STRING[imm_hosts[i].mode]);    /* Request for beyond end of buffer */    if (offset > len)	return 0;    *start = buffer + offset;    len -= offset;    if (len > length)	len = length;    return len;}#if IMM_DEBUG > 0#define imm_fail(x,y) printk("imm: imm_fail(%i) from %s at line %d\n",\	   y, __FUNCTION__, __LINE__); imm_fail_func(x,y);static inline void imm_fail_func(int host_no, int error_code)#elsestatic inline void imm_fail(int host_no, int error_code)#endif{    /* If we fail a device then we trash status / message bytes */    if (imm_hosts[host_no].cur_cmd) {	imm_hosts[host_no].cur_cmd->result = error_code << 16;	imm_hosts[host_no].failed = 1;    }}/* * Wait for the high bit to be set. *  * In principle, this could be tied to an interrupt, but the adapter * doesn't appear to be designed to support interrupts.  We spin on * the 0x80 ready bit.  */static unsigned char imm_wait(int host_no){    int k;    unsigned short ppb = IMM_BASE(host_no);    unsigned char r;    w_ctr(ppb, 0x0c);    k = IMM_SPIN_TMO;    do {	r = r_str(ppb);	k--;	udelay(1);    }    while (!(r & 0x80) && (k));    /*     * STR register (LPT base+1) to SCSI mapping:     *     * STR      imm     imm     * ===================================     * 0x80     S_REQ   S_REQ     * 0x40     !S_BSY  (????)     * 0x20     !S_CD   !S_CD     * 0x10     !S_IO   !S_IO     * 0x08     (????)  !S_BSY     *     * imm      imm     meaning     * ==================================     * 0xf0     0xb8    Bit mask     * 0xc0     0x88    ZIP wants more data     * 0xd0     0x98    ZIP wants to send more data     * 0xe0     0xa8    ZIP is expecting SCSI command data     * 0xf0     0xb8    end of transfer, ZIP is sending status     */    w_ctr(ppb, 0x04);    if (k)	return (r & 0xb8);    /* Counter expired - Time out occurred */    imm_fail(host_no, DID_TIME_OUT);    printk("imm timeout in imm_wait\n");    return 0;			/* command timed out */}static int imm_negotiate(imm_struct * tmp){    /*     * The following is supposedly the IEEE 1284-1994 negotiate     * sequence. I have yet to obtain a copy of the above standard     * so this is a bit of a guess...     *     * A fair chunk of this is based on the Linux parport implementation     * of IEEE 1284.     *     * Return 0 if data available     *        1 if no data available     */    unsigned short base = tmp->base;    unsigned char a, mode;    switch (tmp->mode) {    case IMM_NIBBLE:	mode = 0x00;	break;    case IMM_PS2:	mode = 0x01;	break;    default:	return 0;    }    w_ctr(base, 0x04);    udelay(5);    w_dtr(base, mode);    udelay(100);    w_ctr(base, 0x06);    udelay(5);    a = (r_str(base) & 0x20) ? 0 : 1;    udelay(5);    w_ctr(base, 0x07);    udelay(5);    w_ctr(base, 0x06);    if (a) {	printk("IMM: IEEE1284 negotiate indicates no data available.\n");	imm_fail(tmp->host, DID_ERROR);    }    return a;}/*  * Clear EPP timeout bit.  */static inline void epp_reset(unsigned short ppb){    int i;    i = r_str(ppb);    w_str(ppb, i);    w_str(ppb, i & 0xfe);}/*  * Wait for empty ECP fifo (if we are in ECP fifo mode only) */static inline void ecp_sync(unsigned short hostno){    int i, ppb_hi=IMM_BASE_HI(hostno);    if (ppb_hi == 0) return;    if ((r_ecr(ppb_hi) & 0xe0) == 0x60) { /* mode 011 == ECP fifo mode */        for (i = 0; i < 100; i++) {	    if (r_ecr(ppb_hi) & 0x01)	        return;	    udelay(5);	}        printk("imm: ECP sync failed as data still present in FIFO.\n");    }}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品免费99久久| 久久精品欧美日韩精品| 激情五月激情综合网| 亚洲日穴在线视频| 精品国偷自产国产一区| 91行情网站电视在线观看高清版| 欧美aaa在线| 一区二区在线观看视频| 久久久青草青青国产亚洲免观| 欧美午夜理伦三级在线观看| 国产盗摄视频一区二区三区| 青草av.久久免费一区| 一区二区三区色| 国产精品久久影院| 久久综合久久鬼色| 日韩视频永久免费| 欧美日韩电影一区| 欧美色电影在线| 91社区在线播放| 成人国产精品免费观看视频| 国产在线不卡一区| 蜜臀av性久久久久蜜臀aⅴ流畅| 亚洲一区二区三区四区中文字幕 | 久久精品视频一区二区| 欧美日韩视频不卡| 91黄色在线观看| 91一区二区在线| www.视频一区| 成人教育av在线| 大尺度一区二区| 国产成人午夜精品影院观看视频| 紧缚奴在线一区二区三区| 亚洲电影视频在线| 亚洲国产精品人人做人人爽| 亚洲精品伦理在线| 亚洲精品一二三| 亚洲欧美另类久久久精品2019| 一区在线观看视频| 亚洲人123区| 亚洲黄色av一区| 亚洲精品乱码久久久久久黑人| 亚洲视频在线一区二区| 国产精品九色蝌蚪自拍| 国产精品初高中害羞小美女文 | 午夜电影一区二区| 国产精品免费久久| 亚洲第一狼人社区| 亚洲国产精品影院| 亚洲免费观看在线视频| 激情综合色综合久久| 91香蕉国产在线观看软件| 欧美三级韩国三级日本三斤| 欧美视频自拍偷拍| 7777精品伊人久久久大香线蕉完整版 | 国产在线一区观看| 豆国产96在线|亚洲| 成人h动漫精品一区二区| 色婷婷综合视频在线观看| 在线亚洲欧美专区二区| 欧美理论电影在线| 精品入口麻豆88视频| 国产视频一区在线观看| 亚洲视频每日更新| 亚洲一二三专区| 欧美aaa在线| 成人深夜在线观看| 欧美在线免费视屏| 欧美xxxx在线观看| 中文字幕在线一区| 亚洲第一电影网| 国产电影一区在线| 色噜噜久久综合| 欧美mv日韩mv国产| 综合欧美亚洲日本| 日本成人超碰在线观看| 粉嫩av一区二区三区在线播放| 色噜噜久久综合| 精品国产乱码久久久久久牛牛| 国产精品久久久久久久久免费樱桃| 一区二区三区四区国产精品| 美女www一区二区| 成人av集中营| 欧美一区二区三区四区高清| 国产欧美精品一区二区色综合 | 国产成人亚洲综合a∨婷婷图片| 色综合久久久网| 日韩欧美一二三四区| 国产精品久久久爽爽爽麻豆色哟哟| 天天影视涩香欲综合网| 国产毛片精品一区| 欧美三级中文字幕在线观看| 久久精品水蜜桃av综合天堂| 亚洲成a天堂v人片| 处破女av一区二区| 日韩一区二区三区在线| 亚洲免费观看高清在线观看| 精品亚洲porn| 欧美日韩和欧美的一区二区| 欧美激情一区二区三区不卡| 日本最新不卡在线| 色8久久精品久久久久久蜜| 国产欧美一区二区精品婷婷| 日日嗨av一区二区三区四区| 99久久久免费精品国产一区二区| 欧美成人精品3d动漫h| 亚洲国产欧美一区二区三区丁香婷| 国产成人精品www牛牛影视| 正在播放亚洲一区| 亚洲精品久久久蜜桃| 高清日韩电视剧大全免费| 日韩欧美国产成人一区二区| 一区二区三区av电影| 成人av第一页| 久久久美女毛片| 免费一级片91| 欧美日韩国产高清一区二区三区 | 欧美一区日韩一区| 亚洲综合在线电影| eeuss鲁一区二区三区| 久久综合九色综合97_久久久| 日本欧美韩国一区三区| 欧洲av在线精品| 一区二区三区在线不卡| 91在线云播放| 国产精品美女视频| 成人av电影在线播放| 国产精品日日摸夜夜摸av| 国内欧美视频一区二区| 2020国产精品| 国产在线视频一区二区| 精品国产乱码久久| 精品一区二区三区在线观看国产| 日韩一级免费一区| 另类欧美日韩国产在线| 欧美本精品男人aⅴ天堂| 久久精品国产精品青草| 日韩欧美国产电影| 国内精品国产成人国产三级粉色| 日韩免费观看高清完整版 | 一本一道综合狠狠老| 中文字幕在线一区二区三区| 91免费版pro下载短视频| 亚洲色图视频网站| 91福利在线播放| 亚洲第一二三四区| 日韩一级完整毛片| 国产一区二区伦理片| 国产清纯美女被跳蛋高潮一区二区久久w| 国产精品影视在线观看| 日本一区二区成人| 91久久国产综合久久| 午夜精品久久久久| 日韩欧美国产午夜精品| 国产风韵犹存在线视精品| 中文字幕亚洲一区二区va在线| 色综合久久综合网欧美综合网| 亚洲一区免费视频| 日韩一级片网站| 成人影视亚洲图片在线| 亚洲麻豆国产自偷在线| 欧美三级资源在线| 狠狠狠色丁香婷婷综合激情| 国产蜜臀97一区二区三区| 色哟哟国产精品免费观看| 偷拍日韩校园综合在线| 2023国产精品| av不卡免费在线观看| 午夜一区二区三区视频| 亚洲精品在线观看视频| 99久久精品免费| 偷拍日韩校园综合在线| 国产日韩欧美麻豆| 在线免费观看日韩欧美| 奇米四色…亚洲| 国产精品素人一区二区| 欧美日韩精品是欧美日韩精品| 韩国av一区二区三区在线观看| 亚洲人被黑人高潮完整版| 精品欧美黑人一区二区三区| 97se亚洲国产综合自在线不卡| 日韩精品久久理论片| 中日韩av电影| 欧美一区二区不卡视频| av电影在线观看完整版一区二区| 婷婷成人激情在线网| 国产日韩欧美不卡在线| 欧美在线观看禁18| 福利视频网站一区二区三区| 午夜久久久久久久久久一区二区| 久久久久久久国产精品影院| 欧美日韩午夜在线视频| 成人a区在线观看| 麻豆成人久久精品二区三区红| 中文字幕一区在线| 久久午夜色播影院免费高清| 在线观看欧美精品| 成人精品视频一区| 狠狠久久亚洲欧美| 日韩精品高清不卡| 亚洲永久免费视频|