⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ieee1284.c

📁 linux和2410结合开发 用他可以生成2410所需的zImage文件
💻 C
📖 第 1 页 / 共 2 页
字号:
				     | PARPORT_STATUS_PAPEROUT				     | PARPORT_STATUS_ACK,				     PARPORT_STATUS_ERROR				     | PARPORT_STATUS_SELECT				     | PARPORT_STATUS_PAPEROUT)) {		/* Timeout */		parport_frob_control (port,				      PARPORT_CONTROL_SELECT				      | PARPORT_CONTROL_AUTOFD,				      PARPORT_CONTROL_SELECT);		DPRINTK (KERN_DEBUG			 "%s: Peripheral not IEEE1284 compliant (0x%02X)\n",			 port->name, parport_read_status (port));		port->ieee1284.phase = IEEE1284_PH_FWD_IDLE;		return -1; /* Not IEEE1284 compliant */	}	/* Event 3: Set nStrobe low */	parport_frob_control (port,			      PARPORT_CONTROL_STROBE,			      PARPORT_CONTROL_STROBE);	/* Event 4: Set nStrobe and nAutoFd high */	udelay (5);	parport_frob_control (port,			      PARPORT_CONTROL_STROBE			      | PARPORT_CONTROL_AUTOFD,			      0);	/* Event 6: nAck goes high */	if (parport_wait_peripheral (port,				     PARPORT_STATUS_ACK,				     PARPORT_STATUS_ACK)) {		/* This shouldn't really happen with a compliant device. */		DPRINTK (KERN_DEBUG			 "%s: Mode 0x%02x not supported? (0x%02x)\n",			 port->name, mode, port->ops->read_status (port));		parport_ieee1284_terminate (port);		return 1;	}	xflag = parport_read_status (port) & PARPORT_STATUS_SELECT;	/* xflag should be high for all modes other than nibble (0). */	if (mode && !xflag) {		/* Mode not supported. */		DPRINTK (KERN_DEBUG "%s: Mode 0x%02x rejected by peripheral\n",			 port->name, mode);		parport_ieee1284_terminate (port);		return 1;	}	/* More to do if we've requested extensibility link. */	if (mode & IEEE1284_EXT_LINK) {		m = mode & 0x7f;		udelay (1);		parport_write_data (port, m);		udelay (1);		/* Event 51: Set nStrobe low */		parport_frob_control (port,				      PARPORT_CONTROL_STROBE,				      PARPORT_CONTROL_STROBE);		/* Event 52: nAck goes low */		if (parport_wait_peripheral (port, PARPORT_STATUS_ACK, 0)) {			/* This peripheral is _very_ slow. */			DPRINTK (KERN_DEBUG				 "%s: Event 52 didn't happen\n",				 port->name);			parport_ieee1284_terminate (port);			return 1;		}		/* Event 53: Set nStrobe high */		parport_frob_control (port,				      PARPORT_CONTROL_STROBE,				      0);		/* Event 55: nAck goes high */		if (parport_wait_peripheral (port,					     PARPORT_STATUS_ACK,					     PARPORT_STATUS_ACK)) {			/* This shouldn't really happen with a compliant			 * device. */			DPRINTK (KERN_DEBUG				 "%s: Mode 0x%02x not supported? (0x%02x)\n",				 port->name, mode,				 port->ops->read_status (port));			parport_ieee1284_terminate (port);			return 1;		}		/* Event 54: Peripheral sets XFlag to reflect support */		xflag = parport_read_status (port) & PARPORT_STATUS_SELECT;		/* xflag should be high. */		if (!xflag) {			/* Extended mode not supported. */			DPRINTK (KERN_DEBUG "%s: Extended mode 0x%02x not "				 "supported\n", port->name, mode);			parport_ieee1284_terminate (port);			return 1;		}		/* Any further setup is left to the caller. */	}	/* Mode is supported */	DPRINTK (KERN_DEBUG "%s: In mode 0x%02x\n", port->name, mode);	port->ieee1284.mode = mode;	/* But ECP is special */	if (!(mode & IEEE1284_EXT_LINK) && (m & IEEE1284_MODE_ECP)) {		port->ieee1284.phase = IEEE1284_PH_ECP_SETUP;		/* Event 30: Set nAutoFd low */		parport_frob_control (port,				      PARPORT_CONTROL_AUTOFD,				      PARPORT_CONTROL_AUTOFD);		/* Event 31: PError goes high. */		r = parport_wait_peripheral (port,					     PARPORT_STATUS_PAPEROUT,					     PARPORT_STATUS_PAPEROUT);		if (r) {			DPRINTK (KERN_INFO "%s: Timeout at event 31\n",				port->name);		}		port->ieee1284.phase = IEEE1284_PH_FWD_IDLE;		DPRINTK (KERN_DEBUG "%s: ECP direction: forward\n",			 port->name);	} else switch (mode) {	case IEEE1284_MODE_NIBBLE:	case IEEE1284_MODE_BYTE:		port->ieee1284.phase = IEEE1284_PH_REV_IDLE;		break;	default:		port->ieee1284.phase = IEEE1284_PH_FWD_IDLE;	}	return 0;#endif /* IEEE1284 support */}/* Acknowledge that the peripheral has data available. * Events 18-20, in order to get from Reverse Idle phase * to Host Busy Data Available. * This will most likely be called from an interrupt. * Returns zero if data was available. */#ifdef CONFIG_PARPORT_1284static int parport_ieee1284_ack_data_avail (struct parport *port){	if (parport_read_status (port) & PARPORT_STATUS_ERROR)		/* Event 18 didn't happen. */		return -1;	/* Event 20: nAutoFd goes high. */	port->ops->frob_control (port, PARPORT_CONTROL_AUTOFD, 0);	port->ieee1284.phase = IEEE1284_PH_HBUSY_DAVAIL;	return 0;}#endif /* IEEE1284 support *//* Handle an interrupt. */void parport_ieee1284_interrupt (int which, void *handle, struct pt_regs *regs){	struct parport *port = handle;	parport_ieee1284_wakeup (port);#ifdef CONFIG_PARPORT_1284	if (port->ieee1284.phase == IEEE1284_PH_REV_IDLE) {		/* An interrupt in this phase means that data		 * is now available. */		DPRINTK (KERN_DEBUG "%s: Data available\n", port->name);		parport_ieee1284_ack_data_avail (port);	}#endif /* IEEE1284 support */}/** *	parport_write - write a block of data to a parallel port *	@port: port to write to *	@buffer: data buffer (in kernel space) *	@len: number of bytes of data to transfer * *	This will write up to @len bytes of @buffer to the port *	specified, using the IEEE 1284 transfer mode most recently *	negotiated to (using parport_negotiate()), as long as that *	mode supports forward transfers (host to peripheral). * *	It is the caller's responsibility to ensure that the first *	@len bytes of @buffer are valid. * *	This function returns the number of bytes transferred (if zero *	or positive), or else an error code. */ssize_t parport_write (struct parport *port, const void *buffer, size_t len){#ifndef CONFIG_PARPORT_1284	return port->ops->compat_write_data (port, buffer, len, 0);#else	ssize_t retval;	int mode = port->ieee1284.mode;	int addr = mode & IEEE1284_ADDR;	size_t (*fn) (struct parport *, const void *, size_t, int);	/* Ignore the device-ID-request bit and the address bit. */	mode &= ~(IEEE1284_DEVICEID | IEEE1284_ADDR);	/* Use the mode we're in. */	switch (mode) {	case IEEE1284_MODE_NIBBLE:	case IEEE1284_MODE_BYTE:		parport_negotiate (port, IEEE1284_MODE_COMPAT);	case IEEE1284_MODE_COMPAT:		DPRINTK (KERN_DEBUG "%s: Using compatibility mode\n",			 port->name);		fn = port->ops->compat_write_data;		break;	case IEEE1284_MODE_EPP:		DPRINTK (KERN_DEBUG "%s: Using EPP mode\n", port->name);		if (addr) {			fn = port->ops->epp_write_addr;		} else {			fn = port->ops->epp_write_data;		}		break;	case IEEE1284_MODE_EPPSWE:		DPRINTK (KERN_DEBUG "%s: Using software-emulated EPP mode\n",			port->name);		if (addr) {			fn = parport_ieee1284_epp_write_addr;		} else {			fn = parport_ieee1284_epp_write_data;		}		break;	case IEEE1284_MODE_ECP:	case IEEE1284_MODE_ECPRLE:		DPRINTK (KERN_DEBUG "%s: Using ECP mode\n", port->name);		if (addr) {			fn = port->ops->ecp_write_addr;		} else {			fn = port->ops->ecp_write_data;		}		break;	case IEEE1284_MODE_ECPSWE:		DPRINTK (KERN_DEBUG "%s: Using software-emulated ECP mode\n",			 port->name);		/* The caller has specified that it must be emulated,		 * even if we have ECP hardware! */		if (addr) {			fn = parport_ieee1284_ecp_write_addr;		} else {			fn = parport_ieee1284_ecp_write_data;		}		break;	default:		DPRINTK (KERN_DEBUG "%s: Unknown mode 0x%02x\n", port->name,			port->ieee1284.mode);		return -ENOSYS;	}	retval = (*fn) (port, buffer, len, 0);	DPRINTK (KERN_DEBUG "%s: wrote %d/%d bytes\n", port->name, retval, len);	return retval;#endif /* IEEE1284 support */}/** *	parport_read - read a block of data from a parallel port *	@port: port to read from *	@buffer: data buffer (in kernel space) *	@len: number of bytes of data to transfer * *	This will read up to @len bytes of @buffer to the port *	specified, using the IEEE 1284 transfer mode most recently *	negotiated to (using parport_negotiate()), as long as that *	mode supports reverse transfers (peripheral to host). * *	It is the caller's responsibility to ensure that the first *	@len bytes of @buffer are available to write to. * *	This function returns the number of bytes transferred (if zero *	or positive), or else an error code. */ssize_t parport_read (struct parport *port, void *buffer, size_t len){#ifndef CONFIG_PARPORT_1284	printk (KERN_ERR "parport: IEEE1284 not supported in this kernel\n");	return -ENODEV;#else	int mode = port->physport->ieee1284.mode;	int addr = mode & IEEE1284_ADDR;	size_t (*fn) (struct parport *, void *, size_t, int);	/* Ignore the device-ID-request bit and the address bit. */	mode &= ~(IEEE1284_DEVICEID | IEEE1284_ADDR);	/* Use the mode we're in. */	switch (mode) {	case IEEE1284_MODE_COMPAT:		/* if we can tri-state use BYTE mode instead of NIBBLE mode,		 * if that fails, revert to NIBBLE mode -- ought to store somewhere		 * the device's ability to do BYTE mode reverse transfers, so we don't		 * end up needlessly calling negotiate(BYTE) repeately..  (fb)		 */		if ((port->physport->modes & PARPORT_MODE_TRISTATE) &&		    !parport_negotiate (port, IEEE1284_MODE_BYTE)) {			/* got into BYTE mode OK */			DPRINTK (KERN_DEBUG "%s: Using byte mode\n", port->name);			fn = port->ops->byte_read_data;			break;		}		if (parport_negotiate (port, IEEE1284_MODE_NIBBLE)) {			return -EIO;		}		/* fall through to NIBBLE */	case IEEE1284_MODE_NIBBLE:		DPRINTK (KERN_DEBUG "%s: Using nibble mode\n", port->name);		fn = port->ops->nibble_read_data;		break;	case IEEE1284_MODE_BYTE:		DPRINTK (KERN_DEBUG "%s: Using byte mode\n", port->name);		fn = port->ops->byte_read_data;		break;	case IEEE1284_MODE_EPP:		DPRINTK (KERN_DEBUG "%s: Using EPP mode\n", port->name);		if (addr) {			fn = port->ops->epp_read_addr;		} else {			fn = port->ops->epp_read_data;		}		break;	case IEEE1284_MODE_EPPSWE:		DPRINTK (KERN_DEBUG "%s: Using software-emulated EPP mode\n",			port->name);		if (addr) {			fn = parport_ieee1284_epp_read_addr;		} else {			fn = parport_ieee1284_epp_read_data;		}		break;	case IEEE1284_MODE_ECP:	case IEEE1284_MODE_ECPRLE:		DPRINTK (KERN_DEBUG "%s: Using ECP mode\n", port->name);		fn = port->ops->ecp_read_data;		break;	case IEEE1284_MODE_ECPSWE:		DPRINTK (KERN_DEBUG "%s: Using software-emulated ECP mode\n",			 port->name);		fn = parport_ieee1284_ecp_read_data;		break;	default:		DPRINTK (KERN_DEBUG "%s: Unknown mode 0x%02x\n", port->name,			 port->physport->ieee1284.mode);		return -ENOSYS;	}	return (*fn) (port, buffer, len, 0);#endif /* IEEE1284 support */}/** *	parport_set_timeout - set the inactivity timeout for a device *	@dev: device on a port *	@inactivity: inactivity timeout (in jiffies) * *	This sets the inactivity timeout for a particular device on a *	port.  This affects functions like parport_wait_peripheral(). *	The special value 0 means not to call schedule() while dealing *	with this device. * *	The return value is the previous inactivity timeout. * *	Any callers of parport_wait_event() for this device are woken *	up. */long parport_set_timeout (struct pardevice *dev, long inactivity){	long int old = dev->timeout;	dev->timeout = inactivity;	if (dev->port->physport->cad == dev)		parport_ieee1284_wakeup (dev->port);	return old;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -