📄 hub_811.lst
字号:
C51 COMPILER V6.10 HUB_811 09/04/2002 22:22:08 PAGE 1
C51 COMPILER V6.10, COMPILATION OF MODULE HUB_811
OBJECT MODULE PLACED IN .\hub_811.OBJ
COMPILER INVOKED BY: f:\Keil\C51\BIN\C51.EXE .\hub_811.c OPTIMIZE(6,SPEED) INCDIR(c:\cypress\usb\target\inc) DEBUG OBJEC
-TEXTEND
stmt level source
1 ////////////////////////////////////////////////////////////////////////////////
2 // Cypress Semiconductor - Customer Design Center
3 ////////////////////////////////////////////////////////////////////////////////
4 // File: hub_811.c
5 // Purpose: 8051 firmware to master SL811 downstream hub (CY7C651xx).
6 // Contains hub-related control firmware.
7 // Based on SL811HST code written by cxn.
8 // H/W Target: SL811HST(Rev 1.5) + EZUSB DEV KIT
9 // IMPORTANT : Turn ON SW4 of S6-DIP-SWITCH
10 // to enable upper 32K memory on EZUSB Dev Kit
11 //
12 // $Header: /USB/ez811/firmware/Emb_Host/hub_811.c 7 5/17/02 6:09p Tpm $
13 // Copyright (c) 2002 Cypress Semiconductor. May not be reproduced without permission.
14 // See the license agreement for more details.
15 ////////////////////////////////////////////////////////////////////////////////
16
17 #include "ezusb.h"
*** ERROR 318 IN LINE 17 OF .\hub_811.c: can't open file 'ezusb.h'
18 #include "ezregs.h"
*** ERROR 318 IN LINE 18 OF .\hub_811.c: can't open file 'ezregs.h'
19 #include "host_811.h"
*** ERROR 318 IN LINE 9 OF host_811.h: can't open file 'ezusb.h'
*** ERROR 318 IN LINE 10 OF host_811.h: can't open file 'ezregs.h'
*** ERROR C141 IN LINE 55 OF HOST_811.H: syntax error near 'WORD'
*** ERROR C129 IN LINE 55 OF HOST_811.H: missing ';' before 'wVID'
20
21 extern xdata BYTE STATUS[8]; // for status data buffer
22 extern xdata BYTE HubChange[1]; // Hub port endpoint 1 data status
23 extern xdata BYTE pNumPort; // Number of downstream ports on hub
24 extern xdata pHUBDEV uHub; // Struct for downstream device on HUB
25 extern xdata pPortStatus pStat; // HID ports status
26
27 //*****************************************************************************************
28 // Hub's downstream ports enumeration routine
29 //*****************************************************************************************
30 int HubPortEnum(void)
31 {
32 xdata BYTE DevAddr, PortNum=0, PortSel;
33 xdata BYTE j=0;
34 // xdata BYTE TempDevAddr;
35
36 PortSel = 0x02; // start with port 1 first
37 while(j++ < pNumPort) // loop for all 4 port, bit 1 to bit 4
38 {
39 if(!(HubChange[0]&PortSel)) // test if bit representing port is set
40 {
41 PortSel <<= 1; // shift mask to test for next bit port
42 }
43 else
44 {
45 switch(HubChange[0]&PortSel) // valid downstream port number #1..#4 only
46 {
47 case 0x02: PortNum = 0x01; break; // Limit to onboard hub with 4 downstream ports
48 case 0x04: PortNum = 0x02; break; //
C51 COMPILER V6.10 HUB_811 09/04/2002 22:22:08 PAGE 2
49 case 0x08: PortNum = 0x03; break; //
50 case 0x10: PortNum = 0x04; break; //
51 default: PortNum = HubChange[0]; break; // for debug purpose
52 }
53 break; // found one port, exit while loop now
54 }
55 }
56
57 // Always use USB address #1 for HUB communication
58 pStat =(pPortStatus)STATUS; // keep current wPortStatus & wPortChange
59 if (!GetPortStatus(HUB_ADDR,PortNum,STATUS)) return 0; // If the device is already attached to hub
60
61 //------------------------------------------------------------------------------
62 // Device is present on current downstream port
63 //------------------------------------------------------------------------------
64 if((pStat->wPortStatus_Lo)&0x01)
65 {
66 //------------------------------------------------
67 // Search for unused USB address (#2..#5 valid)
68 //------------------------------------------------
69 for(DevAddr=HUB_ADDR + 1; DevAddr<MAX_DEV; DevAddr++)
70 {
71 if(uHub.bPortPresent[DevAddr] == 0)
72 break;
73 }
74 if(DevAddr == MAX_DEV)
75 {
76 DevAddr = 0; // open port not found (shouldn't happen)
77 return 0;
78 }
79
80 //------------------------------------------------
81 // Reset current attached downstream port device
82 //------------------------------------------------
83 if (!PortFeature(HUB_ADDR,CLEAR_FEATURE,C_PORT_CONNECTION,PortNum)) return 0;
84 do{ // Clear C_PORT_CONNECTION state
85 if (!GetPortStatus(HUB_ADDR,PortNum,STATUS)) return 0;
86 }
87 while(((pStat->wPortChange_Lo)&USB_PORT_STAT_C_CONNECTION));
88
89
90 if (!PortFeature(HUB_ADDR,SET_FEATURE,PORT_RESET,PortNum)) return 0; // reset this port for at least 10m
-s
91 EZUSB_Delay(10);
92 do{ // Set PORT_RESET
93 if (!GetPortStatus(HUB_ADDR,PortNum,STATUS)) return 0;
94 }
95 while( !((pStat->wPortChange_Lo)&USB_PORT_STAT_C_RESET) );
96
97
98 if (!PortFeature(HUB_ADDR,CLEAR_FEATURE,C_PORT_RESET,PortNum)) return 0;
99 do{ // Clear C_PORT_RESET state
100 if (!GetPortStatus(HUB_ADDR,PortNum,STATUS)) return 0;
101 }
102 while(((pStat->wPortChange_Lo)&USB_PORT_STAT_C_RESET));
103
104 //------------------------------------------------
105 // Determine attached downstream speed
106 //------------------------------------------------
107 if ((pStat->wPortStatus_Hi)&0x02) // check bit 9 of wPortStatus for port speed
108 uHub.bPortSpeed[0] = uHub.bPortSpeed[DevAddr] = 1; // '1' - lowspeed, USB address 0 must also be set
109 else
C51 COMPILER V6.10 HUB_811 09/04/2002 22:22:08 PAGE 3
110 uHub.bPortSpeed[0] = uHub.bPortSpeed[DevAddr] = 0; // '0' - fullspeed, USB address 0 must also be set
111
112 //------------------------------------------------
113 // Enumerate current attached device on hub
114 //------------------------------------------------
115 EZUSB_Delay(50); // some device require a long delay before it can enumerate properly
116 if (!EnumUsbDev(DevAddr)) // enumerate device attached to current hub downstream port
117 return 0;
118
119 uHub.bPortPresent[DevAddr] = 1; // set USB device present on this address
120 uHub.bPortNumber[DevAddr] = PortNum; // Save port number used in this address
121 switch(PortNum) // Downstream port #
122 { //
123 case 1: OUTA &= ~PORT1_LED; break; // Downstream Port #1
124 case 2: OUTA &= ~PORT2_LED; break; // Downstream Port #2
125 case 3: OUTA &= ~PORT3_LED; break; // Downstream Port #3
126 case 4: OUTA &= ~PORT4_LED; break; // Downstream Port #4
127 default: break;
128 }
129 }
130
131 //------------------------------------------------------------------------------
132 // Device is not present on current downstream port
133 //------------------------------------------------------------------------------
134 else
135 {
136 do{ // Clear C_PORT_CONNECTION state
137 if (!PortFeature(HUB_ADDR,CLEAR_FEATURE,C_PORT_CONNECTION,PortNum)) return 0;
138 if (!GetPortStatus(HUB_ADDR,PortNum,STATUS)) return 0;
139 } //
140 while(((pStat->wPortChange_Lo)&USB_PORT_STAT_C_CONNECTION));
141
142 do{ // Clear C_PORT_ENABLE state - PORT_ENABLE was set for some hub only
143 if (!PortFeature(HUB_ADDR,CLEAR_FEATURE,C_PORT_ENABLE,PortNum)) return 0;
144 if (!GetPortStatus(HUB_ADDR,PortNum,STATUS)) return 0;
145 } //
146 while(((pStat->wPortChange_Lo)&USB_PORT_STAT_C_ENABLE));
147
148 //------------------------------------------------
149 // Search Port Number that was detached
150 //------------------------------------------------
151 for(DevAddr=HUB_ADDR + 1; DevAddr<MAX_DEV; DevAddr++)
152 { // find the device
153 if(uHub.bPortNumber[DevAddr]==PortNum)
154 break;
155 }
156 if(DevAddr == MAX_DEV)
157 DevAddr = 0; // device not found
158 if(DevAddr)
159 {
160 uHub.bPortPresent[DevAddr] = 0; // clear USB device present on this address
161 uHub.bPortNumber[DevAddr] = 0; // clear port number for this failed address
162 switch(uHub.bPortNumber[DevAddr]) // Downstream port #
163 { //
164 case 1: OUTA |= PORT1_LED; break; // Downstream Port #1
165 case 2: OUTA |= PORT2_LED; break; // Downstream Port #2
166 case 3: OUTA |= PORT3_LED; break; // Downstream Port #3
167 case 4: OUTA |= PORT4_LED; break; // Downstream Port #4
168 default: break;
169 }
170 }
171 }
C51 COMPILER V6.10 HUB_811 09/04/2002 22:22:08 PAGE 4
172 return DevAddr;
173 }
C51 COMPILATION COMPLETE. 0 WARNING(S), 6 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -