📄 hub_811.lst
字号:
C51 COMPILER V7.06 HUB_811 07/13/2004 18:08:15 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE HUB_811
OBJECT MODULE PLACED IN hub_811.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE hub_811.c OPTIMIZE(6,SPEED) INCDIR(c:\cypress\usb\target\inc) DEBUG OBJECTE
-XTEND
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"
18 #include "ezregs.h"
19 #include "host_811.h"
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 1 xdata BYTE DevAddr, PortNum=0, PortSel;
33 1 xdata BYTE j=0;
34 1 // xdata BYTE TempDevAddr;
35 1
36 1 PortSel = 0x02; // start with port 1 first
37 1 while(j++ < pNumPort) // loop for all 4 port, bit 1 to bit 4
38 1 {
39 2 if(!(HubChange[0]&PortSel)) // test if bit representing port is set
40 2 {
41 3 PortSel <<= 1; // shift mask to test for next bit port
42 3 }
43 2 else
44 2 {
45 3 switch(HubChange[0]&PortSel) // valid downstream port number #1..#4 only
46 3 {
47 4 case 0x02: PortNum = 0x01; break; // Limit to onboard hub with 4 downstream ports
48 4 case 0x04: PortNum = 0x02; break; //
49 4 case 0x08: PortNum = 0x03; break; //
50 4 case 0x10: PortNum = 0x04; break; //
51 4 default: PortNum = HubChange[0]; break; // for debug purpose
52 4 }
53 3 break; // found one port, exit while loop now
54 3 }
C51 COMPILER V7.06 HUB_811 07/13/2004 18:08:15 PAGE 2
55 2 }
56 1
57 1 // Always use USB address #1 for HUB communication
58 1 pStat =(pPortStatus)STATUS; // keep current wPortStatus & wPortChange
59 1 if (!GetPortStatus(HUB_ADDR,PortNum,STATUS)) return 0; // If the device is already attached to hub
60 1
61 1 //------------------------------------------------------------------------------
62 1 // Device is present on current downstream port
63 1 //------------------------------------------------------------------------------
64 1 if((pStat->wPortStatus_Lo)&0x01)
65 1 {
66 2 //------------------------------------------------
67 2 // Search for unused USB address (#2..#5 valid)
68 2 //------------------------------------------------
69 2 for(DevAddr=HUB_ADDR + 1; DevAddr<MAX_DEV; DevAddr++)
70 2 {
71 3 if(uHub.bPortPresent[DevAddr] == 0)
72 3 break;
73 3 }
74 2 if(DevAddr == MAX_DEV)
75 2 {
76 3 DevAddr = 0; // open port not found (shouldn't happen)
77 3 return 0;
78 3 }
79 2
80 2 //------------------------------------------------
81 2 // Reset current attached downstream port device
82 2 //------------------------------------------------
83 2 if (!PortFeature(HUB_ADDR,CLEAR_FEATURE,C_PORT_CONNECTION,PortNum)) return 0;
84 2 do{ // Clear C_PORT_CONNECTION state
85 3 if (!GetPortStatus(HUB_ADDR,PortNum,STATUS)) return 0;
86 3 }
87 2 while(((pStat->wPortChange_Lo)&USB_PORT_STAT_C_CONNECTION));
88 2
89 2
90 2 if (!PortFeature(HUB_ADDR,SET_FEATURE,PORT_RESET,PortNum)) return 0; // reset this port for at least 10m
-s
91 2 EZUSB_Delay(10);
92 2 do{ // Set PORT_RESET
93 3 if (!GetPortStatus(HUB_ADDR,PortNum,STATUS)) return 0;
94 3 }
95 2 while( !((pStat->wPortChange_Lo)&USB_PORT_STAT_C_RESET) );
96 2
97 2
98 2 if (!PortFeature(HUB_ADDR,CLEAR_FEATURE,C_PORT_RESET,PortNum)) return 0;
99 2 do{ // Clear C_PORT_RESET state
100 3 if (!GetPortStatus(HUB_ADDR,PortNum,STATUS)) return 0;
101 3 }
102 2 while(((pStat->wPortChange_Lo)&USB_PORT_STAT_C_RESET));
103 2
104 2 //------------------------------------------------
105 2 // Determine attached downstream speed
106 2 //------------------------------------------------
107 2 if ((pStat->wPortStatus_Hi)&0x02) // check bit 9 of wPortStatus for port speed
108 2 uHub.bPortSpeed[0] = uHub.bPortSpeed[DevAddr] = 1; // '1' - lowspeed, USB address 0 must also be set
109 2 else
110 2 uHub.bPortSpeed[0] = uHub.bPortSpeed[DevAddr] = 0; // '0' - fullspeed, USB address 0 must also be set
111 2
112 2 //------------------------------------------------
113 2 // Enumerate current attached device on hub
114 2 //------------------------------------------------
115 2 EZUSB_Delay(50); // some device require a long delay before it can enumerate properly
C51 COMPILER V7.06 HUB_811 07/13/2004 18:08:15 PAGE 3
116 2 if (!EnumUsbDev(DevAddr)) // enumerate device attached to current hub downstream port
117 2 return 0;
118 2
119 2 uHub.bPortPresent[DevAddr] = 1; // set USB device present on this address
120 2 uHub.bPortNumber[DevAddr] = PortNum; // Save port number used in this address
121 2 switch(PortNum) // Downstream port #
122 2 { //
123 3 case 1: OUTA &= ~PORT1_LED; break; // Downstream Port #1
124 3 case 2: OUTA &= ~PORT2_LED; break; // Downstream Port #2
125 3 case 3: OUTA &= ~PORT3_LED; break; // Downstream Port #3
126 3 case 4: OUTA &= ~PORT4_LED; break; // Downstream Port #4
127 3 default: break;
128 3 }
129 2 }
130 1
131 1 //------------------------------------------------------------------------------
132 1 // Device is not present on current downstream port
133 1 //------------------------------------------------------------------------------
134 1 else
135 1 {
136 2 do{ // Clear C_PORT_CONNECTION state
137 3 if (!PortFeature(HUB_ADDR,CLEAR_FEATURE,C_PORT_CONNECTION,PortNum)) return 0;
138 3 if (!GetPortStatus(HUB_ADDR,PortNum,STATUS)) return 0;
139 3 } //
140 2 while(((pStat->wPortChange_Lo)&USB_PORT_STAT_C_CONNECTION));
141 2
142 2 do{ // Clear C_PORT_ENABLE state - PORT_ENABLE was set for some hub only
143 3 if (!PortFeature(HUB_ADDR,CLEAR_FEATURE,C_PORT_ENABLE,PortNum)) return 0;
144 3 if (!GetPortStatus(HUB_ADDR,PortNum,STATUS)) return 0;
145 3 } //
146 2 while(((pStat->wPortChange_Lo)&USB_PORT_STAT_C_ENABLE));
147 2
148 2 //------------------------------------------------
149 2 // Search Port Number that was detached
150 2 //------------------------------------------------
151 2 for(DevAddr=HUB_ADDR + 1; DevAddr<MAX_DEV; DevAddr++)
152 2 { // find the device
153 3 if(uHub.bPortNumber[DevAddr]==PortNum)
154 3 break;
155 3 }
156 2 if(DevAddr == MAX_DEV)
157 2 DevAddr = 0; // device not found
158 2 if(DevAddr)
159 2 {
160 3 uHub.bPortPresent[DevAddr] = 0; // clear USB device present on this address
161 3 uHub.bPortNumber[DevAddr] = 0; // clear port number for this failed address
162 3 switch(uHub.bPortNumber[DevAddr]) // Downstream port #
163 3 { //
164 4 case 1: OUTA |= PORT1_LED; break; // Downstream Port #1
165 4 case 2: OUTA |= PORT2_LED; break; // Downstream Port #2
166 4 case 3: OUTA |= PORT3_LED; break; // Downstream Port #3
167 4 case 4: OUTA |= PORT4_LED; break; // Downstream Port #4
168 4 default: break;
169 4 }
170 3 }
171 2 }
172 1 return DevAddr;
173 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 874 ----
C51 COMPILER V7.06 HUB_811 07/13/2004 18:08:15 PAGE 4
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- 4
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -