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

📄 keyspan.c

📁 linux 内核源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
		msg.rxForward = 0;		msg.returnStatus = 0;		msg.resetDataToggle = 0;	}	/* Sending intermediate configs */	else {		msg._txOn = (! p_priv->break_on);		msg._txOff = 0;		msg.txFlush = 0;		msg.txBreak = (p_priv->break_on);		msg.rxOn = 0;		msg.rxOff = 0;		msg.rxFlush = 0;		msg.rxForward = 0;		msg.returnStatus = 0;		msg.resetDataToggle = 0x0;	}		/* Do handshaking outputs */		msg.setTxTriState_setRts = 0xff;	msg.txTriState_rts = p_priv->rts_state;	msg.setHskoa_setDtr = 0xff;	msg.hskoa_dtr = p_priv->dtr_state;			p_priv->resend_cont = 0;	memcpy (this_urb->transfer_buffer, &msg, sizeof(msg));		/* send the data out the device on control endpoint */	this_urb->transfer_buffer_length = sizeof(msg);	this_urb->dev = serial->dev;	if ((err = usb_submit_urb(this_urb, GFP_ATOMIC)) != 0) {		dbg("%s - usb_submit_urb(setup) failed (%d)", __FUNCTION__, err);	}#if 0	else {		dbg("%s - usb_submit_urb(%d) OK %d bytes (end %d)", __FUNCTION__		    outcont_urb, this_urb->transfer_buffer_length,		    usb_pipeendpoint(this_urb->pipe));	}#endif	return (0);}static int keyspan_usa28_send_setup(struct usb_serial *serial,				    struct usb_serial_port *port,				    int reset_port){	struct keyspan_usa28_portControlMessage	msg;			struct keyspan_serial_private	 	*s_priv;	struct keyspan_port_private 		*p_priv;	const struct keyspan_device_details	*d_details;	struct urb				*this_urb;	int 					device_port, err;	dbg ("%s", __FUNCTION__);	s_priv = usb_get_serial_data(serial);	p_priv = usb_get_serial_port_data(port);	d_details = s_priv->device_details;	device_port = port->number - port->serial->minor;	/* only do something if we have a bulk out endpoint */	if ((this_urb = p_priv->outcont_urb) == NULL) {		dbg("%s - oops no urb.", __FUNCTION__);		return -1;	}	/* Save reset port val for resend.	   Don't overwrite resend for open/close condition. */	if ((reset_port + 1) > p_priv->resend_cont)		p_priv->resend_cont = reset_port + 1;	if (this_urb->status == -EINPROGRESS) {		dbg ("%s already writing", __FUNCTION__);		mdelay(5);		return(-1);	}	memset(&msg, 0, sizeof (struct keyspan_usa28_portControlMessage));	msg.setBaudRate = 1;	if (d_details->calculate_baud_rate(p_priv->baud, d_details->baudclk,		&msg.baudHi, &msg.baudLo, NULL, device_port) == KEYSPAN_INVALID_BAUD_RATE ) {		dbg("%s - Invalid baud rate requested %d.", __FUNCTION__, p_priv->baud);		msg.baudLo = 0xff;		msg.baudHi = 0xb2;	/* Values for 9600 baud */	}	/* If parity is enabled, we must calculate it ourselves. */	msg.parity = 0;		/* XXX for now */	msg.ctsFlowControl = (p_priv->flow_control == flow_cts);	msg.xonFlowControl = 0;	/* Do handshaking outputs, DTR is inverted relative to RTS */		msg.rts = p_priv->rts_state;	msg.dtr = p_priv->dtr_state;	msg.forwardingLength = 16;	msg.forwardMs = 10;	msg.breakThreshold = 45;	msg.xonChar = 17;	msg.xoffChar = 19;	/*msg.returnStatus = 1;	msg.resetDataToggle = 0xff;*/	/* Opening port */	if (reset_port == 1) {		msg._txOn = 1;		msg._txOff = 0;		msg.txFlush = 0;		msg.txForceXoff = 0;		msg.txBreak = 0;		msg.rxOn = 1;		msg.rxOff = 0;		msg.rxFlush = 1;		msg.rxForward = 0;		msg.returnStatus = 0;		msg.resetDataToggle = 0xff;	}	/* Closing port */	else if (reset_port == 2) {		msg._txOn = 0;		msg._txOff = 1;		msg.txFlush = 0;		msg.txForceXoff = 0;		msg.txBreak = 0;		msg.rxOn = 0;		msg.rxOff = 1;		msg.rxFlush = 1;		msg.rxForward = 0;		msg.returnStatus = 0;		msg.resetDataToggle = 0;	}	/* Sending intermediate configs */	else {		msg._txOn = (! p_priv->break_on);		msg._txOff = 0;		msg.txFlush = 0;		msg.txForceXoff = 0;		msg.txBreak = (p_priv->break_on);		msg.rxOn = 0;		msg.rxOff = 0;		msg.rxFlush = 0;		msg.rxForward = 0;		msg.returnStatus = 0;		msg.resetDataToggle = 0x0;	}	p_priv->resend_cont = 0;	memcpy (this_urb->transfer_buffer, &msg, sizeof(msg));	/* send the data out the device on control endpoint */	this_urb->transfer_buffer_length = sizeof(msg);	this_urb->dev = serial->dev;	if ((err = usb_submit_urb(this_urb, GFP_ATOMIC)) != 0) {		dbg("%s - usb_submit_urb(setup) failed", __FUNCTION__);	}#if 0	else {		dbg("%s - usb_submit_urb(setup) OK %d bytes", __FUNCTION__,		    this_urb->transfer_buffer_length);	}#endif	return (0);}static int keyspan_usa49_send_setup(struct usb_serial *serial,				    struct usb_serial_port *port,				    int reset_port){	struct keyspan_usa49_portControlMessage	msg;	struct usb_ctrlrequest 			*dr = NULL;	struct keyspan_serial_private 		*s_priv;	struct keyspan_port_private 		*p_priv;	const struct keyspan_device_details	*d_details;	struct urb				*this_urb;	int 					err, device_port;	dbg ("%s", __FUNCTION__);	s_priv = usb_get_serial_data(serial);	p_priv = usb_get_serial_port_data(port);	d_details = s_priv->device_details;	this_urb = s_priv->glocont_urb;	/* Work out which port within the device is being setup */	device_port = port->number - port->serial->minor;	dbg("%s - endpoint %d port %d (%d)",__FUNCTION__, usb_pipeendpoint(this_urb->pipe), port->number, device_port);		/* Make sure we have an urb then send the message */	if (this_urb == NULL) {		dbg("%s - oops no urb for port %d.", __FUNCTION__, port->number);		return -1;	}	/* Save reset port val for resend.	   Don't overwrite resend for open/close condition. */	if ((reset_port + 1) > p_priv->resend_cont)		p_priv->resend_cont = reset_port + 1;	if (this_urb->status == -EINPROGRESS) {		/*  dbg ("%s - already writing", __FUNCTION__); */		mdelay(5);		return(-1);	}	memset(&msg, 0, sizeof (struct keyspan_usa49_portControlMessage));	/*msg.portNumber = port->number;*/	msg.portNumber = device_port;			/* Only set baud rate if it's changed */		if (p_priv->old_baud != p_priv->baud) {		p_priv->old_baud = p_priv->baud;		msg.setClocking = 0xff;		if (d_details->calculate_baud_rate		    (p_priv->baud, d_details->baudclk, &msg.baudHi,		     &msg.baudLo, &msg.prescaler, device_port) == KEYSPAN_INVALID_BAUD_RATE ) {			dbg("%s - Invalid baud rate %d requested, using 9600.", __FUNCTION__,			    p_priv->baud);			msg.baudLo = 0;			msg.baudHi = 125;	/* Values for 9600 baud */			msg.prescaler = 10;		}		//msg.setPrescaler = 0xff;	}	msg.lcr = (p_priv->cflag & CSTOPB)? STOPBITS_678_2: STOPBITS_5678_1;	switch (p_priv->cflag & CSIZE) {	case CS5:		msg.lcr |= USA_DATABITS_5;		break;	case CS6:		msg.lcr |= USA_DATABITS_6;		break;	case CS7:		msg.lcr |= USA_DATABITS_7;		break;	case CS8:		msg.lcr |= USA_DATABITS_8;		break;	}	if (p_priv->cflag & PARENB) {		/* note USA_PARITY_NONE == 0 */		msg.lcr |= (p_priv->cflag & PARODD)?			USA_PARITY_ODD: USA_PARITY_EVEN;	}	msg.setLcr = 0xff;	msg.ctsFlowControl = (p_priv->flow_control == flow_cts);	msg.xonFlowControl = 0;	msg.setFlowControl = 0xff;		msg.forwardingLength = 16;	msg.xonChar = 17;	msg.xoffChar = 19;	/* Opening port */ 	if (reset_port == 1) {		msg._txOn = 1;		msg._txOff = 0;		msg.txFlush = 0;		msg.txBreak = 0;		msg.rxOn = 1;		msg.rxOff = 0;		msg.rxFlush = 1;		msg.rxForward = 0;		msg.returnStatus = 0;		msg.resetDataToggle = 0xff;		msg.enablePort = 1;		msg.disablePort = 0;	}	/* Closing port */	else if (reset_port == 2) {		msg._txOn = 0;		msg._txOff = 1;		msg.txFlush = 0;		msg.txBreak = 0;		msg.rxOn = 0;		msg.rxOff = 1;		msg.rxFlush = 1;		msg.rxForward = 0;		msg.returnStatus = 0;		msg.resetDataToggle = 0;		msg.enablePort = 0;		msg.disablePort = 1;	}	/* Sending intermediate configs */	else {		msg._txOn = (! p_priv->break_on);		msg._txOff = 0;		msg.txFlush = 0;		msg.txBreak = (p_priv->break_on);		msg.rxOn = 0;		msg.rxOff = 0;		msg.rxFlush = 0;		msg.rxForward = 0;		msg.returnStatus = 0;		msg.resetDataToggle = 0x0;		msg.enablePort = 0;		msg.disablePort = 0;	}		/* Do handshaking outputs */		msg.setRts = 0xff;	msg.rts = p_priv->rts_state;	msg.setDtr = 0xff;	msg.dtr = p_priv->dtr_state;			p_priv->resend_cont = 0;	/* if the device is a 49wg, we send control message on usb control EP 0 */	if (d_details->product_id == keyspan_usa49wg_product_id) {		dr = (void *)(s_priv->ctrl_buf);		dr->bRequestType = USB_TYPE_VENDOR | USB_DIR_OUT;		dr->bRequest = 0xB0;	/* 49wg control message */;		dr->wValue = 0;		dr->wIndex = 0;		dr->wLength = cpu_to_le16(sizeof(msg));		memcpy (s_priv->glocont_buf, &msg, sizeof(msg));		usb_fill_control_urb(this_urb, serial->dev, usb_sndctrlpipe(serial->dev, 0),			     (unsigned char *)dr, s_priv->glocont_buf, sizeof(msg),			     usa49_glocont_callback, serial);	} else {		memcpy(this_urb->transfer_buffer, &msg, sizeof(msg));			/* send the data out the device on control endpoint */		this_urb->transfer_buffer_length = sizeof(msg);		this_urb->dev = serial->dev;	}	if ((err = usb_submit_urb(this_urb, GFP_ATOMIC)) != 0) {		dbg("%s - usb_submit_urb(setup) failed (%d)", __FUNCTION__, err);	}#if 0	else {		dbg("%s - usb_submit_urb(%d) OK %d bytes (end %d)", __FUNCTION__,			   outcont_urb, this_urb->transfer_buffer_length,			   usb_pipeendpoint(this_urb->pipe));	}#endif	return (0);}static int keyspan_usa90_send_setup(struct usb_serial *serial,				    struct usb_serial_port *port,				    int reset_port){	struct keyspan_usa90_portControlMessage	msg;			struct keyspan_serial_private 		*s_priv;	struct keyspan_port_private 		*p_priv;	const struct keyspan_device_details	*d_details;	struct urb				*this_urb;	int 					err;	u8						prescaler;	dbg ("%s", __FUNCTION__);	s_priv = usb_get_serial_data(serial);	p_priv = usb_get_serial_port_data(port);	d_details = s_priv->device_details;	/* only do something if we have a bulk out endpoint */	if ((this_urb = p_priv->outcont_urb) == NULL) {		dbg("%s - oops no urb.", __FUNCTION__);		return -1;	}	/* Save reset port val for resend.	   Don't overwrite resend for open/close condition. */	if ((reset_port + 1) > p_priv->resend_cont)		p_priv->resend_cont = reset_port + 1;	if (this_urb->status == -EINPROGRESS) {		dbg ("%s already writing", __FUNCTION__);		mdelay(5);		return(-1);	}	memset(&msg, 0, sizeof (struct keyspan_usa90_portControlMessage));	/* Only set baud rate if it's changed */		if (p_priv->old_baud != p_priv->baud) {		p_priv->old_baud = p_priv->baud;		msg.setClocking = 0x01;		if (d_details->calculate_baud_rate		    (p_priv->baud, d_details->baudclk, &msg.baudHi,		     &msg.baudLo, &prescaler, 0) == KEYSPAN_INVALID_BAUD_RATE ) {			dbg("%s - Invalid baud rate %d requested, using 9600.", __FUNCTION__,			    p_priv->baud);			p_priv->baud = 9600;			d_details->calculate_baud_rate (p_priv->baud, d_details->baudclk, 				&msg.baudHi, &msg.baudLo, &prescaler, 0);		}		msg.setRxMode = 1;		msg.setTxMode = 1;	}	/* modes must always be correctly specified */	if (p_priv->baud > 57600)	{		msg.rxMode = RXMODE_DMA;		msg.txMode = TXMODE_DMA;	}	else	{		msg.rxMode = RXMODE_BYHAND;		msg.txMode = TXMODE_BYHAND;	}	msg.lcr = (p_priv->cflag & CSTOPB)? STOPBITS_678_2: STOPBITS_5678_1;	switch (p_priv->cflag & CSIZE) {	case CS5:		msg.lcr |= USA_DATABITS_5;		break;	case CS6:		msg.lcr |= USA_DATABITS_6;		break;	case CS7:		msg.lcr |= USA_DATABITS_7;		break;	case CS8:		msg.lcr |= USA_DATABITS_8;		break;	}	if (p_priv->cflag & PARENB) {		/* note USA_PARITY_NONE == 0 */		msg.lcr |= (p_priv->cflag & PARODD)?			USA_PARITY_ODD: USA_PARITY_EVEN;	}	if (p_priv->old_cflag != p_priv->cflag) {		p_priv->old_cflag = p_priv->cflag;		msg.setLcr = 0x01;	}	if (p_priv->flow_control == flow_cts)		msg.txFlowControl = TXFLOW_CTS;	msg.setTxFlowControl = 0x01;	msg.setRxFlowControl = 0x01;		msg.rxForwardingLength = 16;	msg.rxForwardingTimeout = 16;		msg.txAckSetting = 0;	msg.xonChar = 17;	msg.xoffChar = 19;	/* Opening port */ 	if (reset_port == 1) {		msg.portEnabled = 1;		msg.rxFlush = 1;		msg.txBreak = (p_priv->break_on);	}	/* Closing port */	else if (reset_port == 2) {		msg.portEnabled = 0;	}	/* Sending intermediate configs */	else {		if (port->open_count)			msg.portEnabled = 1;		msg.txBreak = (p_priv->break_on);	}	/* Do handshaking outputs */		msg.setRts = 0x01;	msg.rts = p_priv->rts_state;	msg.setDtr = 0x01;	msg.dtr = p_priv->dtr_state;			p_priv->resend_cont = 0;	memcpy (this_urb->transfer_buffer, &msg, sizeof(msg));		/* send the data out the device on control endpoint */	this_urb->transfer_buffer_length = sizeof(msg);	this_urb->dev =

⌨️ 快捷键说明

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