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

📄 keyspan.c

📁 基于S3CEB2410平台LINUX操作系统下 USB驱动源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
			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 = 1;	msg.xonChar = 17;	msg.xoffChar = 19;	if (reset_port) {		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 = 0xff;	}	else {		msg._txOn = (! p_priv->break_on);		msg._txOff = 0;		msg.txFlush = 0;		msg.txBreak = (p_priv->break_on);		msg.rxOn = 1;		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)) != 0) {		dbg(__FUNCTION__ " usb_submit_urb(setup) failed (%d)\n", err);	}#if 0	else {		dbg(__FUNCTION__ " usb_submit_urb(%d) OK %d bytes (end %d)",		    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  keyspan_device_details		*d_details;	urb_t *this_urb;	int err;	s_priv = (struct keyspan_serial_private *)(serial->private);	p_priv = (struct keyspan_port_private *)(port->private);	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(__FUNCTION__ " oops no urb.\n");		return -1;	}	p_priv->resend_cont = 1;	if (this_urb->status == -EINPROGRESS) {		dbg (__FUNCTION__ " already writing\n");		return(-1);	}	memset(&msg, 0, sizeof (struct keyspan_usa28_portControlMessage));	msg.setBaudRate = 1;	if (keyspan_usa19_calc_baud(p_priv->baud, d_details->baudclk,		&msg.baudHi, &msg.baudLo, NULL) == KEYSPAN_INVALID_BAUD_RATE ) {		dbg(__FUNCTION__ "Invalid baud rate requested %d.", 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 = 1;	msg.forwardMs = 10;	msg.breakThreshold = 45;	msg.xonChar = 17;	msg.xoffChar = 19;	msg._txOn = 1;	msg._txOff = 0;	msg.txFlush = 0;	msg.txForceXoff = 0;	msg.txBreak = 0;	msg.rxOn = 1;	msg.rxOff = 0;	msg.rxFlush = 0;	msg.rxForward = 0;	/*msg.returnStatus = 1;	msg.resetDataToggle = 0xff;*/	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)) != 0) {		dbg(__FUNCTION__ " usb_submit_urb(setup) failed\n");	}#if 0	else {		dbg(__FUNCTION__ " usb_submit_urb(setup) OK %d bytes",		    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 keyspan_serial_private 		*s_priv;	struct keyspan_port_private 		*p_priv;	const  keyspan_device_details		*d_details;	int 					glocont_urb;	urb_t 					*this_urb;	int 					err;	int					device_port;	dbg ("%s\n", __FUNCTION__);	s_priv = (struct keyspan_serial_private *)(serial->private);	p_priv = (struct keyspan_port_private *)(port->private);	d_details = s_priv->device_details;	glocont_urb = d_details->glocont_endpoint;	this_urb = s_priv->glocont_urb;		/* Work out which port within the device is being setup */	device_port = port->number - port->serial->minor;	dbg(__FUNCTION__ " endpoint %d port %d (%d)\n", usb_pipeendpoint(this_urb->pipe), port->number, device_port);		/* Make sure we have an urb then send the message */	if (this_urb == NULL) {		dbg(__FUNCTION__ " oops no urb for port %d.\n", port->number);		return -1;	}	p_priv->resend_cont = 1;	if (this_urb->status == -EINPROGRESS) {		/*  dbg (__FUNCTION__ " already writing"); */		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) == KEYSPAN_INVALID_BAUD_RATE ) {			dbg(__FUNCTION__ "Invalid baud rate %d requested, using 9600.\n",			    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 = 1;	msg.xonChar = 17;	msg.xoffChar = 19;		msg._txOn = 1;	msg._txOff = 0;	msg.txFlush = 0;	msg.txBreak = 0;	msg.rxOn = 1;	msg.rxOff = 0;	msg.rxFlush = 0;	msg.rxForward = 0;	msg.enablePort = 0xff;	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;	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)) != 0) {		dbg(__FUNCTION__ " usb_submit_urb(setup) failed (%d)\n", err);	}#if 0	else {		dbg(__FUNCTION__ " usb_submit_urb(%d) OK %d bytes (end %d)",		    outcont_urb, this_urb->transfer_buffer_length,		    usb_pipeendpoint(this_urb->pipe));	}#endif	return (0);}static void keyspan_send_setup(struct usb_serial_port *port, int reset_port){	struct usb_serial *serial = port->serial;	struct keyspan_serial_private 	*s_priv;	const keyspan_device_details	*d_details;	s_priv = (struct keyspan_serial_private *)(serial->private);	d_details = s_priv->device_details;	switch (d_details->msg_format) {	case msg_usa26:		keyspan_usa26_send_setup(serial, port, reset_port);		break;	case msg_usa28:		keyspan_usa28_send_setup(serial, port, reset_port);		break;	case msg_usa49:		keyspan_usa49_send_setup(serial, port, reset_port);		break;	}}/* Gets called by the "real" driver (ie once firmware is loaded   and renumeration has taken place. */static int keyspan_startup (struct usb_serial *serial){	int				i, err;	struct usb_serial_port		*port;	struct keyspan_serial_private 	*s_priv;	struct keyspan_port_private	*p_priv;	const keyspan_device_details	*d_details;	dbg("keyspan_startup called.\n");	for (i = 0; (d_details = keyspan_devices[i]) != NULL; ++i)		if (d_details->product_id == serial->dev->descriptor.idProduct)			break;	if (d_details == NULL) {		printk(KERN_ERR __FUNCTION__ ": unknown product id %x\n",		       serial->dev->descriptor.idProduct);		return 1;	}	/* Setup private data for serial driver */	serial->private = kmalloc(sizeof(struct keyspan_serial_private),				  GFP_KERNEL);	if (!serial->private) {		dbg(__FUNCTION__ "kmalloc for keyspan_serial_private failed.\n");		return (1);	}	memset(serial->private, 0, sizeof(struct keyspan_serial_private));	s_priv = (struct keyspan_serial_private *)(serial->private);	s_priv->device_details = d_details;			/* Now setup per port private data */	for (i = 0; i < serial->num_ports; i++) {		port = &serial->port[i];		port->private = kmalloc(sizeof(struct keyspan_port_private),					GFP_KERNEL);		if (!port->private) {			dbg(__FUNCTION__ "kmalloc for keyspan_port_private (%d) failed!.\n", i);			return (1);		}		memset(port->private, 0, sizeof(struct keyspan_port_private));		p_priv = (struct keyspan_port_private *)(port->private);		p_priv->device_details = d_details;	}	keyspan_setup_urbs(serial);	s_priv->instat_urb->dev = serial->dev;	if ((err = usb_submit_urb(s_priv->instat_urb)) != 0) {		dbg(__FUNCTION__ " submit instat urb failed %d\n", err);	}				return (0);}static void keyspan_shutdown (struct usb_serial *serial){	int				i, j;	struct usb_serial_port		*port;	struct keyspan_serial_private 	*s_priv;	struct keyspan_port_private	*p_priv;	dbg("keyspan_shutdown called\n");	s_priv = (struct keyspan_serial_private *)(serial->private);	/* Stop reading/writing urbs */	stop_urb(s_priv->instat_urb);	stop_urb(s_priv->glocont_urb);	for (i = 0; i < serial->num_ports; ++i) {		port = &serial->port[i];		p_priv = (struct keyspan_port_private *)(port->private);		stop_urb(p_priv->inack_urb);		stop_urb(p_priv->outcont_urb);		for (j = 0; j < 2; j++) {			stop_urb(p_priv->in_urbs[j]);			stop_urb(p_priv->out_urbs[j]);		}	}	/* Now free them */	if (s_priv->instat_urb)		usb_free_urb(s_priv->instat_urb);	if (s_priv->glocont_urb)		usb_free_urb(s_priv->glocont_urb);	for (i = 0; i < serial->num_ports; ++i) {		port = &serial->port[i];		p_priv = (struct keyspan_port_private *)(port->private);		if (p_priv->inack_urb)			usb_free_urb(p_priv->inack_urb);		if (p_priv->outcont_urb)			usb_free_urb(p_priv->outcont_urb);		for (j = 0; j < 2; j++) {			if (p_priv->in_urbs[j])				usb_free_urb(p_priv->in_urbs[j]);			if (p_priv->out_urbs[j])				usb_free_urb(p_priv->out_urbs[j]);		}	}	/*  dbg("Freeing serial->private."); */	kfree(serial->private);	/*  dbg("Freeing port->private."); */	/* Now free per port private data */	for (i = 0; i < serial->num_ports; i++) {		port = &serial->port[i];		while (port->open_count > 0) {			--port->open_count;			MOD_DEC_USE_COUNT;		}		kfree(port->private);	}}MODULE_AUTHOR( DRIVER_AUTHOR );MODULE_DESCRIPTION( DRIVER_DESC );MODULE_LICENSE("GPL");MODULE_PARM(debug, "i");MODULE_PARM_DESC(debug, "Debug enabled or not");

⌨️ 快捷键说明

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