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

📄 patch-2.4.4-sl811hs

📁 基于Linux的USB芯片SL811主机驱动程序,由芯片厂家提供.
💻 4-SL811HS
📖 第 1 页 / 共 5 页
字号:
+	struct list_head iso_list;		/* set of isoc endpoints */+	struct list_head intr_list;		/* ordered (tree) set of int endpoints */+	struct list_head del_list;		/* set of entpoints to be deleted */++	td_array_t * td_array; +	td_array_t a_td_array;+	td_array_t i_td_array [2];++ 	struct list_head hci_hcd_list;	/* list of all hci_hcd */+  	struct usb_bus * bus;    		/* our bus */++//	int trans;						/* number of transactions pending */+	int active_urbs;+        int active_trans;+	int frame_number;					/* frame number */+	hcipriv_t hp;			/* individual part of hc type */+	int nakCnt;+	int last_packet_nak;++} hci_t;+++/*-------------------------------------------------------------------------*/+/* condition (error) CC codes and mapping OHCI like+ * */+ +#define TD_CC_NOERROR      0x00+#define TD_CC_CRC          0x01+#define TD_CC_BITSTUFFING  0x02+#define TD_CC_DATATOGGLEM  0x03+#define TD_CC_STALL        0x04+#define TD_DEVNOTRESP      0x05+#define TD_PIDCHECKFAIL    0x06+#define TD_UNEXPECTEDPID   0x07+#define TD_DATAOVERRUN     0x08+#define TD_DATAUNDERRUN    0x09+#define TD_BUFFEROVERRUN   0x0C+#define TD_BUFFERUNDERRUN  0x0D+#define TD_NOTACCESSED     0x0F++// static int cc_to_error[16] = { ++/* mapping of the OHCI CC status to error codes */ +//	/* No  Error  */               USB_ST_NOERROR,+//	/* CRC Error  */               USB_ST_CRC,+//	/* Bit Stuff  */               USB_ST_BITSTUFF,+//	/* Data Togg  */               USB_ST_CRC,+//	/* Stall      */               USB_ST_STALL,+//	/* DevNotResp */               USB_ST_NORESPONSE,+//	/* PIDCheck   */               USB_ST_BITSTUFF,+//	/* UnExpPID   */               USB_ST_BITSTUFF,+//	/* DataOver   */               USB_ST_DATAOVERRUN,+//	/* DataUnder  */               USB_ST_DATAUNDERRUN,+//	/* reservd    */               USB_ST_NORESPONSE,+//	/* reservd    */               USB_ST_NORESPONSE,+//	/* BufferOver */               USB_ST_BUFFEROVERRUN,+//	/* BuffUnder  */               USB_ST_BUFFERUNDERRUN,+//	/* Not Access */               USB_ST_NORESPONSE,+//	/* Not Access */               USB_ST_NORESPONSE +//};+++/*-------------------------------------------------------------------------*/+/* PID - packet ID + * */+#if 0 +#define PID_SETUP	0+#define PID_OUT		1+#define PID_IN		2+#endif+/*-------------------------------------------------------------------------*/+/* misc + * */++#define min(a,b) (((a)<(b))?(a):(b))  +// #define GET_FRAME_NUMBER(hci) (hci)->frame_number++/*-------------------------------------------------------------------------*/+/* functions+ * */+ +/* urb interface functions */+static int hci_get_current_frame_number (struct usb_device *usb_dev);+static int hci_unlink_urb (urb_t * urb);++static int qu_queue_urb (hci_t * hci, urb_t * urb);+++/* root hub */+static int rh_init_int_timer (urb_t * urb);+static int rh_submit_urb (urb_t *urb);+static int rh_unlink_urb (urb_t *urb);++/* schedule functions */+static int sh_add_packet (hci_t * hci, urb_t * urb);++/* hc specific functions */+static inline void hc_flush_data_cache (hci_t * hci, void * data, int len);+static inline int hc_parse_trans (hci_t * hci, int * actbytes, __u8 * data, +			int * cc, int * toggle, int length, int pid, int urb_state);+static inline int hc_add_trans (hci_t * hci, int len, void * data,+		int toggle, int maxps, int slow, int endpoint, int address, +		int pid, int format, int urb_state);++static void hc_start_int (hci_t * hci);+static void hc_stop_int (hci_t * hci);+static void SL811Write (hci_t * hci, char offset, char data);++/* debug| print the main components of an URB     + * small: 0) header + data packets 1) just header */++static void urb_print (urb_t * urb, char * str, int small)+{+	unsigned int pipe= urb->pipe;+	int i, len;+	+	if (!urb->dev || !urb->dev->bus) {+		dbg("%s URB: no dev", str);+		return;+	}+	+	printk("%s URB:[%4x] dev:%2d,ep:%2d-%c,type:%s,flags:%4x,len:%d/%d,stat:%d(%x)\n", +			str,+		 	hci_get_current_frame_number (urb->dev), +		 	usb_pipedevice (pipe),+		 	usb_pipeendpoint (pipe), +		 	usb_pipeout (pipe)? 'O': 'I',+		 	usb_pipetype (pipe) < 2? (usb_pipeint (pipe)? "INTR": "ISOC"):+		 		(usb_pipecontrol (pipe)? "CTRL": "BULK"),+		 	urb->transfer_flags, +		 	urb->actual_length, +		 	urb->transfer_buffer_length,+		 	urb->status, urb->status);+	if (!small) {+		if (usb_pipecontrol (pipe)) {+			printk ( __FILE__ ": cmd(8):");+			for (i = 0; i < 8 ; i++) +				printk (" %02x", ((__u8 *) urb->setup_packet) [i]);+			printk ("\n");+		}+		if (urb->transfer_buffer_length > 0 && urb->transfer_buffer) {+			printk ( __FILE__ ": data(%d/%d):", +				urb->actual_length, +				urb->transfer_buffer_length);+			len = usb_pipeout (pipe)? +						urb->transfer_buffer_length: urb->actual_length;+			for (i = 0; i < 2096 && i < len; i++) +				printk (" %02x", ((__u8 *) urb->transfer_buffer) [i]);+			printk ("%s stat:%d\n", i < len? "...": "", urb->status);+		}+	} +}+diff -urN -X dontdiff linux-vanilla/drivers/usb/hc_sl811.c linux/drivers/usb/hc_sl811.c--- linux-vanilla/drivers/usb/hc_sl811.c	Wed Dec 31 17:00:00 1969+++ linux/drivers/usb/hc_sl811.c	Fri Feb  8 16:56:39 2002@@ -0,0 +1,1474 @@+/*-------------------------------------------------------------------------*/+/*-------------------------------------------------------------------------*+ * SL811HS USB HCD for Linux Version 0.1 (10/28/2001)+ * + * requires (includes) hc_simple.[hc] simple generic HCD frontend+ *  + * COPYRIGHT(C) 2001 by CYPRESS SEMICONDUCTOR INC.+ *+ *-------------------------------------------------------------------------*+ * 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, or+ * (at your option) any later version.+ *+ * This program is distributed in the hope that it will be useful,+ * but WITHOUT ANY WARRANTY; without even the implied warranty of+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the+ * GNU General Public License for more details.+ *+ * You should have received a copy of the GNU General Public License+ * along with this program; if not, write to the Free Software+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA+ *+ *-------------------------------------------------------------------------*/++#include <linux/config.h>+#include <linux/module.h>+#include <linux/kernel.h>+#include <linux/delay.h>+#include <linux/sched.h>+#include <linux/malloc.h>+#include <linux/errno.h>+#include <linux/init.h>+#include <linux/smp_lock.h>+#include <linux/list.h>+#include <linux/ioport.h>+#include <asm/io.h>+#include <asm/arch/irq.h>++#include <linux/usb.h>++#undef HC_URB_TIMEOUT+#undef HC_SWITCH_INT+#undef HC_ENABLE_ISOC++#define SL811_DEBUG_ERR++#ifdef SL811_DEBUG_ERR+#define DBGERR(fmt, args...) printk(fmt,## args)+#else+#define DBGERR(fmt, args...)+#endif++#ifdef SL811_DEBUG+#define DBG(fmt, args...) printk(fmt,## args)+#else+#define DBG(fmt, args...)+#endif++#ifdef SL811_DEBUG_FUNC+#define DBGFUNC(fmt, args...) printk(fmt,## args)+#else+#define DBGFUNC(fmt, args...)+#endif++#ifdef SL811_DEBUG_DATA+#define DBGDATAR(fmt, args...) printk(fmt,## args)+#define DBGDATAW(fmt, args...) printk(fmt,## args)+#else+#define DBGDATAR(fmt, args...)+#define DBGDATAW(fmt, args...)+#endif++#ifdef SL811_DEBUG_VERBOSE+#define DBGVERBOSE(fmt, args...) printk(fmt,## args)+#else+#define DBGVERBOSE(fmt, args...)+#endif++#define TRUE 1+#define FALSE 0++#define HC_SWITCH_INT+#include "hc_sl811.h"+#include "hc_simple.h"++static int urb_debug = 0;+ +#include "hc_simple.c"+#include "hc_sl811_rh.c"+++/* The base_addr, data_reg_addr, and irq number are board specific.+ * The current values are design to run on the Accelent SA1110 IDP+ * NOTE: values need to modify for different development boards + */++static int base_addr = 0xd3800000;+static int data_reg_addr = 0xd3810000;+static int irq = 34;+++/* forware declaration */++int SL11StartXaction(hci_t *hci, __u8 addr, __u8 epaddr, int pid, int len, +                     int toggle, int slow, int urb_state);++static int sofWaitCnt =0;++MODULE_PARM(urb_debug,"i");+MODULE_PARM_DESC(urb_debug,"debug urb messages, default is 0 (no)");++MODULE_PARM(base_addr,"i");+MODULE_PARM_DESC(base_addr,"sl811 base address 0xd3800000");+MODULE_PARM(data_reg_addr,"i");+MODULE_PARM_DESC(data_reg_addr,"sl811 data register address 0xd3810000");+MODULE_PARM(irq,"i");+MODULE_PARM_DESC(irq,"IRQ 34 (default)");++static int hc_reset (hci_t * hci);++/***************************************************************************+ * Function Name : SL811Read+ *+ * Read a byte of data from the SL811H/SL11H+ *+ * Input:  hci = data structure for the host controller+ *         offset = address of SL811/SL11H register or memory+ *+ * Return: data + **************************************************************************/++char SL811Read(hci_t *hci, char offset)+{  +   hcipriv_t *hp = &hci->hp; +   char data;+   writeb(offset, hp->hcport);+   wmb();+   data = readb (hp->hcport2);+   rmb();+   return (data);+}++/***************************************************************************+ * Function Name : SL811Write+ *+ * Write a byte of data to the SL811H/SL11H+ *+ * Input:  hci = data structure for the host controller+ *         offset = address of SL811/SL11H register or memory+ *         data  = the data going to write to SL811H+ *+ * Return: none + **************************************************************************/++void SL811Write(hci_t *hci, char offset, char data)+{ +   hcipriv_t *hp = &hci->hp; +   writeb(offset, hp->hcport);+   writeb(data, hp->hcport2);+   wmb();+}+++/***************************************************************************+ * Function Name : SL811BufRead+ *+ * Read consecutive bytes of data from the SL811H/SL11H buffer+ *+ * Input:  hci = data structure for the host controller+ *         offset = SL811/SL11H register offset+ *         buf = the buffer where the data will store+ *         size = number of bytes to read+ *+ * Return: none + **************************************************************************/++void SL811BufRead(hci_t *hci, short offset, char *buf, short size)+{	+   hcipriv_t *hp = &hci->hp; +   if( size <= 0) +       return;+   writeb((char) offset, hp->hcport);+   wmb();+   DBGDATAR ("SL811BufRead: offset = 0x%x, data = ", offset);+   while (size--)+   {+       *buf++ = (char)readb(hp->hcport2);+       DBGDATAR ("0x%x ", *(buf-1));+       rmb(); +   }+   DBGDATAR ("\n");+}++/***************************************************************************+ * Function Name : SL811BufWrite+ *+ * Write consecutive bytes of data to the SL811H/SL11H buffer+ *+ * Input:  hci = data structure for the host controller+ *         offset = SL811/SL11H register offset+ *         buf = the data buffer + *         size = number of bytes to write+ *+ * Return: none + **************************************************************************/++void SL811BufWrite(hci_t *hci, short offset, char *buf, short size)+{	+   hcipriv_t *hp = &hci->hp; +   if(size<=0) +       return;+   writeb((char) offset, hp->hcport);+   wmb();+   DBGDATAW ("SL811BufWrite: offset = 0x%x, data = ", offset);+   while (size--) +   {+       DBGDATAW ("0x%x ", *buf);+       writeb(*buf, hp->hcport2);+       wmb();   +       buf++;+   }+   DBGDATAW ("\n");+}++/***************************************************************************+ * Function Name : regTest+ *+ * This routine test the Read/Write functionality of SL811HS registers  + *+ * 1) Store original register value into a buffer+ * 2) Write to registers with a RAMP pattern. (10, 11, 12, ..., 255)+ * 3) Read from register+ * 4) Compare the written value with the read value and make sure they are + *    equivalent+ * 5) Restore the original register value + *+ * Input:  hci = data structure for the host controller+ *   + *+ * Return: TRUE = passed; FALSE = failed + **************************************************************************/++int regTest(hci_t *hci)+{+   int i, data, result = TRUE;+   char buf[256];++   DBGFUNC ("Enter regTest\n");+   for (i=0x10; i < 256; i++)+   {+       /* save the original buffer */+       buf[i] = (char) SL811Read(hci, i);+ +       /* Write the new data to the buffer */+       SL811Write(hci, i, i);+   }++   /* compare the written data */+   for (i=0x10; i < 256; i++)+   {+       data = SL811Read(hci, i);+       if (data != i)+       {+	   DBGERR ("Pattern test failed!! value = 0x%x, s/b 0x%x\n", +                    data, i);+           result = FALSE;	+       }+   }++   /* restore the data */+   for (i=0x10; i < 256; i++)+   {+       SL811Write(hci, i, buf[i]);+   }+   +   return (result);+}++/***************************************************************************+ * Function Name : regShow+ *+ * Display all SL811HS register values+ *+ * Input:  hci = data structure for the host controller+ *+ * Return: none + **************************************************************************/

⌨️ 快捷键说明

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