📄 patch-2.4.4-sl811hs
字号:
+ 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 + -