abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 00:11 | Nová verze

    Open source modální textový editor Helix, inspirovaný editory Vim, Neovim či Kakoune, byl vydán ve verzi 25.07. Přehled novinek se záznamy terminálových sezení v asciinema v oznámení na webu. Detailně v CHANGELOGu na GitHubu.

    Ladislav Hagara | Komentářů: 0
    včera 20:44 | IT novinky

    Americký výrobce čipů Nvidia získal od vlády prezidenta Donalda Trumpa souhlas s prodejem svých pokročilých počítačových čipů používaných k vývoji umělé inteligence (AI) H20 do Číny. Prodej těchto čipů speciálně upravených pro čínský trh by tak mohl být brzy obnoven, uvedla firma na svém blogu. Americká vláda zakázala prodej v dubnu, v době eskalace obchodního sporu mezi oběma zeměmi. Tehdy to zdůvodnila obavami, že by čipy mohla využívat čínská armáda.

    Ladislav Hagara | Komentářů: 0
    včera 17:22 | Nová verze

    3D software Blender byl vydán ve verzi 4.5 s prodlouženou podporou. Podrobnosti v poznámkách k vydání. Videopředstavení na YouTube.

    Ladislav Hagara | Komentářů: 0
    14.7. 22:22 | Komunita

    Open source webový aplikační framework Django slaví 20. narozeniny.

    Ladislav Hagara | Komentářů: 0
    14.7. 16:11 | Komunita

    V Brestu dnes začala konference vývojářů a uživatelů linuxové distribuce Debian DebConf25. Na programu je řada zajímavých přednášek. Sledovat je lze online.

    Ladislav Hagara | Komentářů: 0
    14.7. 11:33 | IT novinky

    Před 30 lety, tj. 14. července 1995, se začala používat přípona .mp3 pro soubory s hudbou komprimovanou pomocí MPEG-2 Audio Layer 3.

    Ladislav Hagara | Komentářů: 26
    14.7. 10:55 | IT novinky

    Výroba 8bitových domácích počítačů Commodore 64 byla ukončena v dubnu 1994. Po více než 30 letech byl představen nový oficiální Commodore 64 Ultimate (YouTube). S deskou postavenou na FPGA. Ve 3 edicích v ceně od 299 dolarů a plánovaným dodáním v říjnu a listopadu letošního roku.

    Ladislav Hagara | Komentářů: 20
    13.7. 17:55 | Zajímavý projekt

    Společnost Hugging Face ve spolupráci se společností Pollen Robotics představila open source robota Reachy Mini (YouTube). Předobjednat lze lite verzi za 299 dolarů a wireless verzi s Raspberry Pi 5 za 449 dolarů.

    Ladislav Hagara | Komentářů: 17
    11.7. 16:44 | Komunita

    Dnes v 17:30 bude oficiálně vydána open source počítačová hra DOGWALK vytvořena v 3D softwaru Blender a herním enginu Godot. Release party proběhne na YouTube od 17:00.

    Ladislav Hagara | Komentářů: 3
    11.7. 14:55 | Humor

    McDonald's se spojil se společností Paradox a pracovníky nabírá také pomocí AI řešení s virtuální asistentkou Olivii běžící na webu McHire. Ian Carroll a Sam Curry se na toto AI řešení blíže podívali a opravdu je překvapilo, že se mohli přihlásit pomocí jména 123456 a hesla 123456 a získat přístup k údajům o 64 milionech uchazečů o práci.

    Ladislav Hagara | Komentářů: 16
    Jaký je váš oblíbený skriptovací jazyk?
     (59%)
     (26%)
     (7%)
     (3%)
     (1%)
     (1%)
     (4%)
    Celkem 398 hlasů
     Komentářů: 16, poslední 8.6. 21:05
    Rozcestník

    Administrace komentářů

    Jste na stránce určené pro řešení chyb a problémů týkajících se diskusí a komentářů. Můžete zde našim administrátorům reportovat špatně zařazenou či duplicitní diskusi, vulgární či osočující příspěvek a podobně. Děkujeme vám za vaši pomoc, více očí více vidí, společně můžeme udržet vysokou kvalitu AbcLinuxu.cz.

    Příspěvek
    4.3.2006 22:33 kozzi | skóre: 55 | blog: vse_o_vsem | Pacman (Bratrušov)
    Rozbalit Rozbalit vše Re: Anydata problem vyresen (uz nemusim vypinat modem pro kazde pripoj
    
    *** anydata.orig.c	2006-02-03 07:03:08.000000000 +0100
    --- anydata.c	2006-03-05 18:41:28.000000000 +0100
    ***************
    *** 1,86 ****
      /*
    !  * AnyData CDMA Serial USB driver
       *
    !  * Copyright (C) 2005 Greg Kroah-Hartman <gregkh@suse.de>
       *
    -  *	This program is free software; you can redistribute it and/or
    -  *	modify it under the terms of the GNU General Public License version
    -  *	2 as published by the Free Software Foundation.
       */
      
      #include <linux/kernel.h>
      #include <linux/init.h>
      #include <linux/tty.h>
      #include <linux/module.h>
      #include <linux/usb.h>
      #include "usb-serial.h"
      
      static struct usb_device_id id_table [] = {
    ! 	{ USB_DEVICE(0x16d5, 0x6501) },	/* AirData CDMA device */
    ! 	{ },
      };
    - MODULE_DEVICE_TABLE(usb, id_table);
      
    ! /* if overridden by the user, then use their value for the size of the
    !  * read and write urbs */
    ! static int buffer_size;
    ! static int debug;
      
      static struct usb_driver anydata_driver = {
      	.name =		"anydata",
      	.probe =	usb_serial_probe,
      	.disconnect =	usb_serial_disconnect,
      	.id_table =	id_table,
    ! 	.no_dynamic_id = 	1,
      };
      
    ! static int anydata_open(struct usb_serial_port *port, struct file *filp)
    ! {
    ! 	char *buffer;
    ! 	int result = 0;
      
    ! 	dbg("%s - port %d", __FUNCTION__, port->number);
      
    - 	if (buffer_size) {
    - 		/* override the default buffer sizes */
    - 		buffer = kmalloc(buffer_size, GFP_KERNEL);
    - 		if (!buffer) {
    - 			dev_err(&port->dev, "%s - out of memory.\n",
    - 				__FUNCTION__);
    - 			return -ENOMEM;
    - 		}
    - 		kfree (port->read_urb->transfer_buffer);
    - 		port->read_urb->transfer_buffer = buffer;
    - 		port->read_urb->transfer_buffer_length = buffer_size;
    - 
    - 		buffer = kmalloc(buffer_size, GFP_KERNEL);
    - 		if (!buffer) {
    - 			dev_err(&port->dev, "%s - out of memory.\n",
    - 				__FUNCTION__);
    - 			return -ENOMEM;
    - 		}
    - 		kfree (port->write_urb->transfer_buffer);
    - 		port->write_urb->transfer_buffer = buffer;
    - 		port->write_urb->transfer_buffer_length = buffer_size;
    - 		port->bulk_out_size = buffer_size;
    - 	}
    - 
    - 	/* Start reading from the device */
    - 	usb_fill_bulk_urb(port->read_urb, port->serial->dev,
    - 			  usb_rcvbulkpipe(port->serial->dev,
    - 				  	  port->bulk_in_endpointAddress),
    - 			  port->read_urb->transfer_buffer,
    - 			  port->read_urb->transfer_buffer_length,
    - 			  usb_serial_generic_write_bulk_callback, port);
    - 	result = usb_submit_urb(port->read_urb, GFP_KERNEL);
    - 	if (result)
    - 		dev_err(&port->dev,
    - 			"%s - failed submitting read urb, error %d\n",
    - 			__FUNCTION__, result);
    - 
    - 	return result;
    - }
      
      static struct usb_serial_driver anydata_device = {
      	.driver = {
      		.owner =	THIS_MODULE,
    --- 1,131 ----
      /*
    !  * Prolific ANYDATA USB to serial adaptor driver
    !  * Based on ANYDATA USB driver
       *
    !  * Copyright (C) 2006 Daniel Kozak (kozzi11@gmail.com)
    !  * 
    !  * Original driver for 2.2.x by anonymous
    !  *
    !  *	This program is free software; you can redistribute it and/or modify
    !  *	it under the terms of the GNU General Public License as published by
    !  *	the Free Software Foundation; either version 2 of the License.
    !  *
    !  * See Documentation/usb/usb-serial.txt for more information on using this driver
       *
       */
      
    + #include <linux/config.h>
      #include <linux/kernel.h>
    + #include <linux/errno.h>
      #include <linux/init.h>
    + #include <linux/slab.h>
      #include <linux/tty.h>
    + #include <linux/tty_driver.h>
    + #include <linux/tty_flip.h>
    + #include <linux/serial.h>
      #include <linux/module.h>
    + #include <linux/moduleparam.h>
    + #include <linux/spinlock.h>
    + #include <asm/uaccess.h>
      #include <linux/usb.h>
      #include "usb-serial.h"
    + #include "anydata.h"
    + 
    + /*
    +  * Version Information
    +  */
    + #define DRIVER_DESC "Prolific ANYDATA USB to serial adaptor driver"
    + 
    + static int debug;
    + 
    + #define ANYDATA_CLOSING_WAIT	(30*HZ)
    + 
    + #define ANYDATA_BUF_SIZE		1024
    + #define ANYDATA_TMP_BUF_SIZE	1024
    + 
    + struct anydata_buf {
    + 	unsigned int	buf_size;
    + 	char		*buf_buf;
    + 	char		*buf_get;
    + 	char		*buf_put;
    + };
      
      static struct usb_device_id id_table [] = {
    ! 	{ USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ID) },
    ! 				/* Terminating entry */
      };
      
    ! MODULE_DEVICE_TABLE (usb, id_table);
      
      static struct usb_driver anydata_driver = {
      	.name =		"anydata",
      	.probe =	usb_serial_probe,
      	.disconnect =	usb_serial_disconnect,
      	.id_table =	id_table,
    ! 	//.no_dynamic_id = 	1,
      };
      
    ! #define SET_LINE_REQUEST_TYPE		0x21
    ! #define SET_LINE_REQUEST		0x20
      
    ! #define SET_CONTROL_REQUEST_TYPE	0x21
    ! #define SET_CONTROL_REQUEST		0x22
    ! #define CONTROL_DTR			0x01
    ! #define CONTROL_RTS			0x02
    ! 
    ! #define BREAK_REQUEST_TYPE		0x21
    ! #define BREAK_REQUEST			0x23	
    ! #define BREAK_ON			0xffff
    ! #define BREAK_OFF			0x0000
    ! 
    ! #define GET_LINE_REQUEST_TYPE		0xa1
    ! #define GET_LINE_REQUEST		0x21
    ! 
    ! #define VENDOR_WRITE_REQUEST_TYPE	0x40
    ! #define VENDOR_WRITE_REQUEST		0x01
    ! 
    ! #define VENDOR_READ_REQUEST_TYPE	0xc0
    ! #define VENDOR_READ_REQUEST		0x01
    ! 
    ! #define UART_STATE			0x08
    ! #define UART_STATE_TRANSIENT_MASK	0x74
    ! #define UART_DCD			0x01
    ! #define UART_DSR			0x02
    ! #define UART_BREAK_ERROR		0x04
    ! #define UART_RING			0x08
    ! #define UART_FRAME_ERROR		0x10
    ! #define UART_PARITY_ERROR		0x20
    ! #define UART_OVERRUN_ERROR		0x40
    ! #define UART_CTS			0x80
    ! 
    ! /* function prototypes for a ANYDATA serial converter */
    ! static int anydata_open (struct usb_serial_port *port, struct file *filp);
    ! static void anydata_close (struct usb_serial_port *port, struct file *filp);
    ! static int anydata_ioctl (struct usb_serial_port *port, struct file *file,
    ! 			 unsigned int cmd, unsigned long arg);
    ! static void anydata_read_int_callback (struct urb *urb, struct pt_regs *regs);
    ! static void anydata_read_bulk_callback (struct urb *urb, struct pt_regs *regs);
    ! static void anydata_write_bulk_callback (struct urb *urb, struct pt_regs *regs);
    ! static int anydata_write (struct usb_serial_port *port,
    ! 			 const unsigned char *buf, int count);
    ! static void anydata_send (struct usb_serial_port *port);
    ! static int anydata_write_room(struct usb_serial_port *port);
    ! static int anydata_chars_in_buffer(struct usb_serial_port *port);
    ! static void anydata_break_ctl(struct usb_serial_port *port,int break_state);
    ! static int anydata_startup (struct usb_serial *serial);
    ! static void anydata_shutdown (struct usb_serial *serial);
    ! static struct anydata_buf *anydata_buf_alloc(unsigned int size);
    ! static void anydata_buf_free(struct anydata_buf *pb);
    ! static void anydata_buf_clear(struct anydata_buf *pb);
    ! static unsigned int anydata_buf_data_avail(struct anydata_buf *pb);
    ! static unsigned int anydata_buf_space_avail(struct anydata_buf *pb);
    ! static unsigned int anydata_buf_put(struct anydata_buf *pb, const char *buf,
    ! 	unsigned int count);
    ! static unsigned int anydata_buf_get(struct anydata_buf *pb, char *buf,
    ! 	unsigned int count);
      
      
    + /* All of the device info needed for the ANYDATA SIO serial converter */
      static struct usb_serial_driver anydata_device = {
      	.driver = {
      		.owner =	THIS_MODULE,
    ***************
    *** 92,123 ****
      	.num_bulk_out =		NUM_DONT_CARE,
      	.num_ports =		1,
      	.open =			anydata_open,
      };
      
    ! static int __init anydata_init(void)
      {
      	int retval;
      
      	retval = usb_serial_register(&anydata_device);
      	if (retval)
    ! 		return retval;
      	retval = usb_register(&anydata_driver);
      	if (retval)
    ! 		usb_serial_deregister(&anydata_device);
      	return retval;
      }
      
    ! static void __exit anydata_exit(void)
      {
    ! 	usb_deregister(&anydata_driver);
    ! 	usb_serial_deregister(&anydata_device);
      }
      
      module_init(anydata_init);
      module_exit(anydata_exit);
      MODULE_LICENSE("GPL");
      
      module_param(debug, bool, S_IRUGO | S_IWUSR);
      MODULE_PARM_DESC(debug, "Debug enabled or not");
    ! module_param(buffer_size, int, 0);
    ! MODULE_PARM_DESC(buffer_size, "Size of the transfer buffers");
    --- 137,942 ----
      	.num_bulk_out =		NUM_DONT_CARE,
      	.num_ports =		1,
      	.open =			anydata_open,
    + 	.close =		anydata_close,
    + 	.write =		anydata_write,
    + 	.ioctl =		anydata_ioctl,
    + 	.break_ctl =		anydata_break_ctl,
    + 	.read_bulk_callback =	anydata_read_bulk_callback,
    + 	.read_int_callback =	anydata_read_int_callback,
    + 	.write_bulk_callback =	anydata_write_bulk_callback,
    + 	.write_room =		anydata_write_room,
    + 	.chars_in_buffer =	anydata_chars_in_buffer,
    + 	.attach =		anydata_startup,
    + 	.shutdown =		anydata_shutdown,
    + };
    + 
    + enum anydata_type {
    + 	type_0,		/* don't know the difference between type 0 and */
    + 	type_1,		/* type 1, until someone from prolific tells us... */
    + 	HX,		/* HX version of the anydata chip */
    + };
    + 
    + struct anydata_private {
    + 	spinlock_t lock;
    + 	struct anydata_buf *buf;
    + 	int write_urb_in_use;
    + 	wait_queue_head_t delta_msr_wait;
    + 	u8 line_control;
    + 	u8 line_status;
    + 	u8 termios_initialized;
    + 	enum anydata_type type;
      };
      
    ! 
    ! static int anydata_startup (struct usb_serial *serial)
    ! {
    ! 	struct anydata_private *priv;
    ! 	enum anydata_type type = type_0;
    ! 	int i;
    ! 
    ! 	if (serial->dev->descriptor.bDeviceClass == 0x02)
    ! 		type = type_0;
    ! 	else if (serial->dev->descriptor.bMaxPacketSize0 == 0x40)
    ! 		type = HX;
    ! 	else if (serial->dev->descriptor.bDeviceClass == 0x00)
    ! 		type = type_1;
    ! 	else if (serial->dev->descriptor.bDeviceClass == 0xFF)
    ! 		type = type_1;
    ! 	dbg("device type: %d", type);
    ! 
    ! 	for (i = 0; i < serial->num_ports; ++i) {
    ! 		priv = kmalloc (sizeof (struct anydata_private), GFP_KERNEL);
    ! 		if (!priv)
    ! 			goto cleanup;
    ! 		memset (priv, 0x00, sizeof (struct anydata_private));
    ! 		spin_lock_init(&priv->lock);
    ! 		priv->buf = anydata_buf_alloc(ANYDATA_BUF_SIZE);
    ! 		if (priv->buf == NULL) {
    ! 			kfree(priv);
    ! 			goto cleanup;
    ! 		}
    ! 		init_waitqueue_head(&priv->delta_msr_wait);
    ! 		priv->type = type;
    ! 		usb_set_serial_port_data(serial->port[i], priv);
    ! 	}
    ! 	return 0;
    ! 
    ! cleanup:
    ! 	for (--i; i>=0; --i) {
    ! 		priv = usb_get_serial_port_data(serial->port[i]);
    ! 		anydata_buf_free(priv->buf);
    ! 		kfree(priv);
    ! 		usb_set_serial_port_data(serial->port[i], NULL);
    ! 	}
    ! 	return -ENOMEM;
    ! }
    ! 
    ! static int set_control_lines (struct usb_device *dev, u8 value)
      {
      	int retval;
    + 	
    + 	retval = usb_control_msg (dev, usb_sndctrlpipe (dev, 0),
    + 				  SET_CONTROL_REQUEST, SET_CONTROL_REQUEST_TYPE,
    + 				  value, 0, NULL, 0, 100);
    + 	dbg("%s - value = %d, retval = %d", __FUNCTION__, value, retval);
    + 	return retval;
    + }
    + 
    + static int anydata_write (struct usb_serial_port *port,  const unsigned char *buf, int count)
    + {
    + 	struct anydata_private *priv = usb_get_serial_port_data(port);
    + 	unsigned long flags;
    + 
    + 	dbg("%s - port %d, %d bytes", __FUNCTION__, port->number, count);
    + 
    + 	if (!count)
    + 		return count;
    + 
    + 	spin_lock_irqsave(&priv->lock, flags);
    + 	count = anydata_buf_put(priv->buf, buf, count);
    + 	spin_unlock_irqrestore(&priv->lock, flags);
    + 
    + 	anydata_send(port);
    + 
    + 	return count;
    + }
    + 
    + static void anydata_send(struct usb_serial_port *port)
    + {
    + 	int count, result;
    + 	struct anydata_private *priv = usb_get_serial_port_data(port);
    + 	unsigned long flags;
    + 
    + 	dbg("%s - port %d", __FUNCTION__, port->number);
    + 
    + 	spin_lock_irqsave(&priv->lock, flags);
    + 
    + 	if (priv->write_urb_in_use) {
    + 		spin_unlock_irqrestore(&priv->lock, flags);
    + 		return;
    + 	}
    + 
    + 	count = anydata_buf_get(priv->buf, port->write_urb->transfer_buffer,
    + 		port->bulk_out_size);
    + 
    + 	if (count == 0) {
    + 		spin_unlock_irqrestore(&priv->lock, flags);
    + 		return;
    + 	}
    + 
    + 	priv->write_urb_in_use = 1;
    + 
    + 	spin_unlock_irqrestore(&priv->lock, flags);
    + 
    + 	usb_serial_debug_data(debug, &port->dev, __FUNCTION__, count, port->write_urb->transfer_buffer);
    + 
    + 	port->write_urb->transfer_buffer_length = count;
    + 	port->write_urb->dev = port->serial->dev;
    + 	result = usb_submit_urb (port->write_urb, GFP_ATOMIC);
    + 	if (result) {
    + 		dev_err(&port->dev, "%s - failed submitting write urb, error %d\n", __FUNCTION__, result);
    + 		priv->write_urb_in_use = 0;
    + 		// TODO: reschedule anydata_send
    + 	}
    + 
    + 	schedule_work(&port->work);
    + }
    + 
    + static int anydata_write_room(struct usb_serial_port *port)
    + {
    + 	struct anydata_private *priv = usb_get_serial_port_data(port);
    + 	int room = 0;
    + 	unsigned long flags;
    + 
    + 	dbg("%s - port %d", __FUNCTION__, port->number);
    + 
    + 	spin_lock_irqsave(&priv->lock, flags);
    + 	room = anydata_buf_space_avail(priv->buf);
    + 	spin_unlock_irqrestore(&priv->lock, flags);
    + 
    + 	dbg("%s - returns %d", __FUNCTION__, room);
    + 	return room;
    + }
    + 
    + static int anydata_chars_in_buffer(struct usb_serial_port *port)
    + {
    + 	struct anydata_private *priv = usb_get_serial_port_data(port);
    + 	int chars = 0;
    + 	unsigned long flags;
    + 
    + 	dbg("%s - port %d", __FUNCTION__, port->number);
    + 
    + 	spin_lock_irqsave(&priv->lock, flags);
    + 	chars = anydata_buf_data_avail(priv->buf);
    + 	spin_unlock_irqrestore(&priv->lock, flags);
    + 
    + 	dbg("%s - returns %d", __FUNCTION__, chars);
    + 	return chars;
    + }
    + 
    + 
    + 
    + static int anydata_open (struct usb_serial_port *port, struct file *filp)
    + {
    + 	struct usb_serial *serial = port->serial;
    + 	struct anydata_private *priv = usb_get_serial_port_data(port);
    + 	unsigned char *buf;
    + 	int result;
    + 
    + 	dbg("%s -  port %d", __FUNCTION__, port->number);
    + 
    + 	if (priv->type != HX) {
    + 		usb_clear_halt(serial->dev, port->write_urb->pipe);
    + 		usb_clear_halt(serial->dev, port->read_urb->pipe);
    + 	}
    + 
    + 	buf = kmalloc(10, GFP_KERNEL);
    + 	if (buf==NULL)
    + 		return -ENOMEM;
    + 
    + #define FISH(a,b,c,d)								\
    + 	result=usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev,0),	\
    + 			       b, a, c, d, buf, 1, 100);			\
    + 	dbg("0x%x:0x%x:0x%x:0x%x  %d - %x",a,b,c,d,result,buf[0]);
    + 
    + #define SOUP(a,b,c,d)								\
    + 	result=usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev,0),	\
    + 			       b, a, c, d, NULL, 0, 100);			\
    + 	dbg("0x%x:0x%x:0x%x:0x%x  %d",a,b,c,d,result);
    + 
    + 	FISH (VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, 0x8484, 0);
    + 	SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 0x0404, 0);
    + 	FISH (VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, 0x8484, 0);
    + 	FISH (VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, 0x8383, 0);
    + 	FISH (VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, 0x8484, 0);
    + 	SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 0x0404, 1);
    + 	FISH (VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, 0x8484, 0);
    + 	FISH (VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, 0x8383, 0);
    + 	SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 0, 1);
    + 	SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 1, 0);
    + 
    + 	if (priv->type == HX) {
    + 		/* HX chip */
    + 		SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 2, 0x44);
    + 		/* reset upstream data pipes */
    +           	SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 8, 0);
    +         	SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 9, 0);
    + 	} else {
    + 		SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 2, 0x24);
    + 	}
    + 
    + 	kfree(buf);
    + 
    + 	/* Setup termios */
    + 	//FIXME: need to assert RTS and DTR if CRTSCTS off
    + 
    + 	dbg("%s - submitting read urb", __FUNCTION__);
    + 	port->read_urb->dev = serial->dev;
    + 	result = usb_submit_urb (port->read_urb, GFP_KERNEL);
    + 	if (result) {
    + 		dev_err(&port->dev, "%s - failed submitting read urb, error %d\n", __FUNCTION__, result);
    + 		anydata_close (port, NULL);
    + 		return -EPROTO;
    + 	}
    + 
    + 	dbg("%s - submitting interrupt urb", __FUNCTION__);
    + 	port->interrupt_in_urb->dev = serial->dev;
    + 	result = usb_submit_urb (port->interrupt_in_urb, GFP_KERNEL);
    + 	if (result) {
    + 		dev_err(&port->dev, "%s - failed submitting interrupt urb, error %d\n", __FUNCTION__, result);
    + 		anydata_close (port, NULL);
    + 		return -EPROTO;
    + 	}
    + 	return 0;
    + }
    + 
    + 
    + static void anydata_close (struct usb_serial_port *port, struct file *filp)
    + {
    + 	struct anydata_private *priv = usb_get_serial_port_data(port);
    + 	unsigned long flags;
    + 	unsigned int c_cflag;
    + 	int bps;
    + 	long timeout;
    + 	wait_queue_t wait;						\
    + 
    + 	dbg("%s - port %d", __FUNCTION__, port->number);
    + 
    + 	/* wait for data to drain from the buffer */
    + 	spin_lock_irqsave(&priv->lock, flags);
    + 	timeout = ANYDATA_CLOSING_WAIT;
    + 	init_waitqueue_entry(&wait, current);
    + 	add_wait_queue(&port->tty->write_wait, &wait);
    + 	for (;;) {
    + 		set_current_state(TASK_INTERRUPTIBLE);
    + 		if (anydata_buf_data_avail(priv->buf) == 0
    + 		|| timeout == 0 || signal_pending(current)
    + 		|| !usb_get_intfdata(port->serial->interface))	/* disconnect */
    + 			break;
    + 		spin_unlock_irqrestore(&priv->lock, flags);
    + 		timeout = schedule_timeout(timeout);
    + 		spin_lock_irqsave(&priv->lock, flags);
    + 	}
    + 	set_current_state(TASK_RUNNING);
    + 	remove_wait_queue(&port->tty->write_wait, &wait);
    + 	/* clear out any remaining data in the buffer */
    + 	anydata_buf_clear(priv->buf);
    + 	spin_unlock_irqrestore(&priv->lock, flags);
    + 
    + 	/* wait for characters to drain from the device */
    + 	/* (this is long enough for the entire 256 byte */
    + 	/* anydata hardware buffer to drain with no flow */
    + 	/* control for data rates of 1200 bps or more, */
    + 	/* for lower rates we should really know how much */
    + 	/* data is in the buffer to compute a delay */
    + 	/* that is not unnecessarily long) */
    + 	bps = tty_get_baud_rate(port->tty);
    + 	if (bps > 1200)
    + 		timeout = max((HZ*2560)/bps,HZ/10);
    + 	else
    + 		timeout = 2*HZ;
    + 	schedule_timeout_interruptible(timeout);
    + 
    + 	/* shutdown our urbs */
    + 	dbg("%s - shutting down urbs", __FUNCTION__);
    + 	usb_kill_urb(port->write_urb);
    + 	usb_kill_urb(port->read_urb);
    + 	usb_kill_urb(port->interrupt_in_urb);
    + 
    + 	if (port->tty) {
    + 		c_cflag = port->tty->termios->c_cflag;
    + 		if (c_cflag & HUPCL) {
    + 			/* drop DTR and RTS */
    + 			spin_lock_irqsave(&priv->lock, flags);
    + 			priv->line_control = 0;
    + 			spin_unlock_irqrestore (&priv->lock, flags);
    + 			set_control_lines (port->serial->dev, 0);
    + 		}
    + 	}
    + }
    + 
    + 
    + 
    + static int wait_modem_info(struct usb_serial_port *port, unsigned int arg)
    + {
    + 	struct anydata_private *priv = usb_get_serial_port_data(port);
    + 	unsigned long flags;
    + 	unsigned int prevstatus;
    + 	unsigned int status;
    + 	unsigned int changed;
    + 
    + 	spin_lock_irqsave (&priv->lock, flags);
    + 	prevstatus = priv->line_status;
    + 	spin_unlock_irqrestore (&priv->lock, flags);
    + 
    + 	while (1) {
    + 		interruptible_sleep_on(&priv->delta_msr_wait);
    + 		/* see if a signal did it */
    + 		if (signal_pending(current))
    + 			return -ERESTARTSYS;
    + 		
    + 		spin_lock_irqsave (&priv->lock, flags);
    + 		status = priv->line_status;
    + 		spin_unlock_irqrestore (&priv->lock, flags);
    + 		
    + 		changed=prevstatus^status;
    + 		
    + 		if (((arg & TIOCM_RNG) && (changed & UART_RING)) ||
    + 		    ((arg & TIOCM_DSR) && (changed & UART_DSR)) ||
    + 		    ((arg & TIOCM_CD)  && (changed & UART_DCD)) ||
    + 		    ((arg & TIOCM_CTS) && (changed & UART_CTS)) ) {
    + 			return 0;
    + 		}
    + 		prevstatus = status;
    + 	}
    + 	/* NOTREACHED */
    + 	return 0;
    + }
    + 
    + static int anydata_ioctl (struct usb_serial_port *port, struct file *file, unsigned int cmd, unsigned long arg)
    + {
    + 	dbg("%s (%d) cmd = 0x%04x", __FUNCTION__, port->number, cmd);
    + 
    + 	switch (cmd) {
    + 		case TIOCMIWAIT:
    + 			dbg("%s (%d) TIOCMIWAIT", __FUNCTION__,  port->number);
    + 			return wait_modem_info(port, arg);
    + 
    + 		default:
    + 			dbg("%s not supported = 0x%04x", __FUNCTION__, cmd);
    + 			break;
    + 	}
    + 
    + 	return -ENOIOCTLCMD;
    + }
    + 
    + static void anydata_break_ctl (struct usb_serial_port *port, int break_state)
    + {
    + 	struct usb_serial *serial = port->serial;
    + 	u16 state;
    + 	int result;
    + 
    + 	dbg("%s - port %d", __FUNCTION__, port->number);
    + 
    + 	if (break_state == 0)
    + 		state = BREAK_OFF;
    + 	else
    + 		state = BREAK_ON;
    + 	dbg("%s - turning break %s", __FUNCTION__, state==BREAK_OFF ? "off" : "on");
    + 
    + 	result = usb_control_msg (serial->dev, usb_sndctrlpipe (serial->dev, 0),
    + 				  BREAK_REQUEST, BREAK_REQUEST_TYPE, state, 
    + 				  0, NULL, 0, 100);
    + 	if (result)
    + 		dbg("%s - error sending break = %d", __FUNCTION__, result);
    + }
    + 
    + 
    + static void anydata_shutdown (struct usb_serial *serial)
    + {
    + 	int i;
    + 	struct anydata_private *priv;
    + 
    + 	dbg("%s", __FUNCTION__);
    + 
    + 	for (i = 0; i < serial->num_ports; ++i) {
    + 		priv = usb_get_serial_port_data(serial->port[i]);
    + 		if (priv) {
    + 			anydata_buf_free(priv->buf);
    + 			kfree(priv);
    + 			usb_set_serial_port_data(serial->port[i], NULL);
    + 		}
    + 	}		
    + }
    + 
    + static void anydata_update_line_status(struct usb_serial_port *port,
    + 				      unsigned char *data,
    + 				      unsigned int actual_length)
    + {
    + 
    + 	struct anydata_private *priv = usb_get_serial_port_data(port);
    + 	unsigned long flags;
    + 	u8 status_idx = UART_STATE;
    + 	u8 length = UART_STATE + 1;
    + 
      
    + 
    + 	if (actual_length < length)
    + 		goto exit;
    + 
    +         /* Save off the uart status for others to look at */
    + 	spin_lock_irqsave(&priv->lock, flags);
    + 	priv->line_status = data[status_idx];
    + 	spin_unlock_irqrestore(&priv->lock, flags);
    + 
    + exit:
    + 	return;
    + }
    + 
    + static void anydata_read_int_callback (struct urb *urb, struct pt_regs *regs)
    + {
    + 	struct usb_serial_port *port = (struct usb_serial_port *) urb->context;
    + 	unsigned char *data = urb->transfer_buffer;
    + 	unsigned int actual_length = urb->actual_length;
    + 	int status;
    + 
    + 	dbg("%s (%d)", __FUNCTION__, port->number);
    + 
    + 	switch (urb->status) {
    + 	case 0:
    + 		/* success */
    + 		break;
    + 	case -ECONNRESET:
    + 	case -ENOENT:
    + 	case -ESHUTDOWN:
    + 		/* this urb is terminated, clean up */
    + 		dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status);
    + 		return;
    + 	default:
    + 		dbg("%s - nonzero urb status received: %d", __FUNCTION__, urb->status);
    + 		goto exit;
    + 	}
    + 
    + 	usb_serial_debug_data(debug, &port->dev, __FUNCTION__, urb->actual_length, urb->transfer_buffer);
    + 	anydata_update_line_status(port, data, actual_length);
    + 
    + exit:
    + 	status = usb_submit_urb (urb, GFP_ATOMIC);
    + 	if (status)
    + 		dev_err(&urb->dev->dev, "%s - usb_submit_urb failed with result %d\n",
    + 			__FUNCTION__, status);
    + }
    + 
    + 
    + static void anydata_read_bulk_callback (struct urb *urb, struct pt_regs *regs)
    + {
    + 	struct usb_serial_port *port = (struct usb_serial_port *) urb->context;
    + 	struct anydata_private *priv = usb_get_serial_port_data(port);
    + 	struct tty_struct *tty;
    + 	unsigned char *data = urb->transfer_buffer;
    + 	unsigned long flags;
    + 	int i;
    + 	int result;
    + 	u8 status;
    + 	char tty_flag;
    + 
    + 	dbg("%s - port %d", __FUNCTION__, port->number);
    + 
    + 	if (urb->status) {
    + 		dbg("%s - urb->status = %d", __FUNCTION__, urb->status);
    + 		if (!port->open_count) {
    + 			dbg("%s - port is closed, exiting.", __FUNCTION__);
    + 			return;
    + 		}
    + 		if (urb->status == -EPROTO) {
    + 			/* ANYDATA mysteriously fails with -EPROTO reschedule the read */
    + 			dbg("%s - caught -EPROTO, resubmitting the urb", __FUNCTION__);
    + 			urb->status = 0;
    + 			urb->dev = port->serial->dev;
    + 			result = usb_submit_urb(urb, GFP_ATOMIC);
    + 			if (result)
    + 				dev_err(&urb->dev->dev, "%s - failed resubmitting read urb, error %d\n", __FUNCTION__, result);
    + 			return;
    + 		}
    + 		dbg("%s - unable to handle the error, exiting.", __FUNCTION__);
    + 		return;
    + 	}
    + 
    + 	usb_serial_debug_data(debug, &port->dev, __FUNCTION__, urb->actual_length, data);
    + 
    + 	/* get tty_flag from status */
    + 	tty_flag = TTY_NORMAL;
    + 
    + 	spin_lock_irqsave(&priv->lock, flags);
    + 	status = priv->line_status;
    + 	priv->line_status &= ~UART_STATE_TRANSIENT_MASK;
    + 	spin_unlock_irqrestore(&priv->lock, flags);
    + 	wake_up_interruptible (&priv->delta_msr_wait);
    + 
    + 	/* break takes precedence over parity, */
    + 	/* which takes precedence over framing errors */
    + 	if (status & UART_BREAK_ERROR )
    + 		tty_flag = TTY_BREAK;
    + 	else if (status & UART_PARITY_ERROR)
    + 		tty_flag = TTY_PARITY;
    + 	else if (status & UART_FRAME_ERROR)
    + 		tty_flag = TTY_FRAME;
    + 	dbg("%s - tty_flag = %d", __FUNCTION__, tty_flag);
    + 
    + 	tty = port->tty;
    + 	if (tty && urb->actual_length) {
    + 			/* overrun is special, not associated with a char */
    + 		if (status & UART_OVERRUN_ERROR)
    + 			tty_insert_flip_char(tty, 0, TTY_OVERRUN);
    + 		for (i = 0; i < urb->actual_length; ++i)
    + 			tty_insert_flip_char (tty, data[i], tty_flag);
    + 		tty_flip_buffer_push (tty);
    + 	}
    + 
    + 	/* Schedule the next read _if_ we are still open */
    + 	if (port->open_count) {
    + 		urb->dev = port->serial->dev;
    + 		result = usb_submit_urb(urb, GFP_ATOMIC);
    + 		if (result)
    + 			dev_err(&urb->dev->dev, "%s - failed resubmitting read urb, error %d\n", __FUNCTION__, result);
    + 	}
    + 
    + 	return;
    + }
    + 
    + 
    + 
    + static void anydata_write_bulk_callback (struct urb *urb, struct pt_regs *regs)
    + {
    + 	struct usb_serial_port *port = (struct usb_serial_port *) urb->context;
    + 	struct anydata_private *priv = usb_get_serial_port_data(port);
    + 	int result;
    + 
    + 	dbg("%s - port %d", __FUNCTION__, port->number);
    + 
    + 	switch (urb->status) {
    + 	case 0:
    + 		/* success */
    + 		break;
    + 	case -ECONNRESET:
    + 	case -ENOENT:
    + 	case -ESHUTDOWN:
    + 		/* this urb is terminated, clean up */
    + 		dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status);
    + 		priv->write_urb_in_use = 0;
    + 		return;
    + 	default:
    + 		/* error in the urb, so we have to resubmit it */
    + 		dbg("%s - Overflow in write", __FUNCTION__);
    + 		dbg("%s - nonzero write bulk status received: %d", __FUNCTION__, urb->status);
    + 		port->write_urb->transfer_buffer_length = 1;
    + 		port->write_urb->dev = port->serial->dev;
    + 		result = usb_submit_urb (port->write_urb, GFP_ATOMIC);
    + 		if (result)
    + 			dev_err(&urb->dev->dev, "%s - failed resubmitting write urb, error %d\n", __FUNCTION__, result);
    + 		else
    + 			return;
    + 	}
    + 
    + 	priv->write_urb_in_use = 0;
    + 
    + 	/* send any buffered data */
    + 	anydata_send(port);
    + }
    + 
    + 
    + /*
    +  * anydata_buf_alloc
    +  *
    +  * Allocate a circular buffer and all associated memory.
    +  */
    + 
    + static struct anydata_buf *anydata_buf_alloc(unsigned int size)
    + {
    + 
    + 	struct anydata_buf *pb;
    + 
    + 
    + 	if (size == 0)
    + 		return NULL;
    + 
    + 	pb = (struct anydata_buf *)kmalloc(sizeof(struct anydata_buf), GFP_KERNEL);
    + 	if (pb == NULL)
    + 		return NULL;
    + 
    + 	pb->buf_buf = kmalloc(size, GFP_KERNEL);
    + 	if (pb->buf_buf == NULL) {
    + 		kfree(pb);
    + 		return NULL;
    + 	}
    + 
    + 	pb->buf_size = size;
    + 	pb->buf_get = pb->buf_put = pb->buf_buf;
    + 
    + 	return pb;
    + 
    + }
    + 
    + 
    + /*
    +  * anydata_buf_free
    +  *
    +  * Free the buffer and all associated memory.
    +  */
    + 
    + static void anydata_buf_free(struct anydata_buf *pb)
    + {
    + 	if (pb) {
    + 		kfree(pb->buf_buf);
    + 		kfree(pb);
    + 	}
    + }
    + 
    + 
    + /*
    +  * anydata_buf_clear
    +  *
    +  * Clear out all data in the circular buffer.
    +  */
    + 
    + static void anydata_buf_clear(struct anydata_buf *pb)
    + {
    + 	if (pb != NULL)
    + 		pb->buf_get = pb->buf_put;
    + 		/* equivalent to a get of all data available */
    + }
    + 
    + 
    + /*
    +  * anydata_buf_data_avail
    +  *
    +  * Return the number of bytes of data available in the circular
    +  * buffer.
    +  */
    + 
    + static unsigned int anydata_buf_data_avail(struct anydata_buf *pb)
    + {
    + 	if (pb != NULL)
    + 		return ((pb->buf_size + pb->buf_put - pb->buf_get) % pb->buf_size);
    + 	else
    + 		return 0;
    + }
    + 
    + 
    + /*
    +  * anydata_buf_space_avail
    +  *
    +  * Return the number of bytes of space available in the circular
    +  * buffer.
    +  */
    + 
    + static unsigned int anydata_buf_space_avail(struct anydata_buf *pb)
    + {
    + 	if (pb != NULL)
    + 		return ((pb->buf_size + pb->buf_get - pb->buf_put - 1) % pb->buf_size);
    + 	else
    + 		return 0;
    + }
    + 
    + 
    + /*
    +  * anydata_buf_put
    +  *
    +  * Copy data data from a user buffer and put it into the circular buffer.
    +  * Restrict to the amount of space available.
    +  *
    +  * Return the number of bytes copied.
    +  */
    + 
    + static unsigned int anydata_buf_put(struct anydata_buf *pb, const char *buf,
    + 	unsigned int count)
    + {
    + 
    + 	unsigned int len;
    + 
    + 
    + 	if (pb == NULL)
    + 		return 0;
    + 
    + 	len  = anydata_buf_space_avail(pb);
    + 	if (count > len)
    + 		count = len;
    + 
    + 	if (count == 0)
    + 		return 0;
    + 
    + 	len = pb->buf_buf + pb->buf_size - pb->buf_put;
    + 	if (count > len) {
    + 		memcpy(pb->buf_put, buf, len);
    + 		memcpy(pb->buf_buf, buf+len, count - len);
    + 		pb->buf_put = pb->buf_buf + count - len;
    + 	} else {
    + 		memcpy(pb->buf_put, buf, count);
    + 		if (count < len)
    + 			pb->buf_put += count;
    + 		else /* count == len */
    + 			pb->buf_put = pb->buf_buf;
    + 	}
    + 
    + 	return count;
    + 
    + }
    + 
    + 
    + /*
    +  * anydata_buf_get
    +  *
    +  * Get data from the circular buffer and copy to the given buffer.
    +  * Restrict to the amount of data available.
    +  *
    +  * Return the number of bytes copied.
    +  */
    + 
    + static unsigned int anydata_buf_get(struct anydata_buf *pb, char *buf,
    + 	unsigned int count)
    + {
    + 
    + 	unsigned int len;
    + 
    + 
    + 	if (pb == NULL)
    + 		return 0;
    + 
    + 	len = anydata_buf_data_avail(pb);
    + 	if (count > len)
    + 		count = len;
    + 
    + 	if (count == 0)
    + 		return 0;
    + 
    + 	len = pb->buf_buf + pb->buf_size - pb->buf_get;
    + 	if (count > len) {
    + 		memcpy(buf, pb->buf_get, len);
    + 		memcpy(buf+len, pb->buf_buf, count - len);
    + 		pb->buf_get = pb->buf_buf + count - len;
    + 	} else {
    + 		memcpy(buf, pb->buf_get, count);
    + 		if (count < len)
    + 			pb->buf_get += count;
    + 		else /* count == len */
    + 			pb->buf_get = pb->buf_buf;
    + 	}
    + 
    + 	return count;
    + 
    + }
    + 
    + static int __init anydata_init (void)
    + {
    + 	int retval;
      	retval = usb_serial_register(&anydata_device);
      	if (retval)
    ! 		goto failed_usb_serial_register;
      	retval = usb_register(&anydata_driver);
      	if (retval)
    ! 		goto failed_usb_register;
    ! 	info(DRIVER_DESC);
    ! 	return 0;
    ! failed_usb_register:
    ! 	usb_serial_deregister(&anydata_device);
    ! failed_usb_serial_register:
      	return retval;
      }
      
    ! 
    ! static void __exit anydata_exit (void)
      {
    ! 	usb_deregister (&anydata_driver);
    ! 	usb_serial_deregister (&anydata_device);
      }
      
    + 
      module_init(anydata_init);
      module_exit(anydata_exit);
    + 
    + MODULE_DESCRIPTION(DRIVER_DESC);
      MODULE_LICENSE("GPL");
      
      module_param(debug, bool, S_IRUGO | S_IWUSR);
      MODULE_PARM_DESC(debug, "Debug enabled or not");
    ! 
    
    
    
    vyse uvedeny text oznacte (cely) a vlozte jej do textoveho editoru
    ulote jej jako anydata.diff tento vznikli soubor skopirujte do adresare 
    /cesta/k/vasim/zdrojum/linuxu/drivers/usb/serial/
     např" cp anydata.diff /usr/src/linux-2.6.15/drivers/usb/serial/" 
    potom prejde do slozky kam jste skopirovaly anydata.diff 
    napr" cd /usr/src/linux-2.6.15/drivers/usb/serial/"
    a zadejte prikaz:  patch -p0 < anydata.diff
    
    poznamka:(navod plati pro jadra od rady 2.6.15)
    Linux je jako mušketýři "jeden za všechny, všichni za jednoho"

    V tomto formuláři můžete formulovat svou stížnost ohledně příspěvku. Nejprve vyberte typ akce, kterou navrhujete provést s diskusí či příspěvkem. Potom do textového pole napište důvody, proč by měli admini provést vaši žádost, problém nemusí být patrný na první pohled. Odkaz na příspěvek bude přidán automaticky.

    Vaše jméno
    Váš email
    Typ požadavku
    Slovní popis
    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.