📄 vend_ax.lst
字号:
C51 COMPILER V7.50 VEND_AX 06/04/2006 20:12:23 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE VEND_AX
OBJECT MODULE PLACED IN VEND_AX.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE VEND_AX.C OPTIMIZE(6,SPEED) DEFINE(NO_RENUM) DEBUG OBJECTEXTEND
line level source
1 #pragma NOIV // Do not generate interrupt vectors
2 //-----------------------------------------------------------------------------
3 // File: periph.c
4 // Contents: Hooks required to implement USB peripheral function.
5 //
6 // Copyright (c) 2000 Cypress Semiconductor All rights reserved
7 //-----------------------------------------------------------------------------
8 #include "fx2.h"
9 #include "Fx2regs.h"
10
11 extern BOOL GotSUD; // Received setup data flag
12 extern BOOL Sleep;
13 extern BOOL Rwuen;
14 extern BOOL Selfpwr;
15
16 BYTE Configuration; // Current configuration
17 BYTE AlternateSetting; // Alternate settings
18
19 //-----------------------------------------------------------------------------
20 // Constants
21 //-----------------------------------------------------------------------------
22 #define VR_UPLOAD 0xc0
23 #define VR_DOWNLOAD 0x40
24
25 #define VR_ANCHOR_DLD 0xa0 // handled by core
26 #define VR_EEPROM 0xa2 // loads (uploads) EEPROM
27 #define VR_RAM 0xa3 // loads (uploads) external ram
28 #define VR_SETI2CADDR 0xa4
29 #define VR_GETI2C_TYPE 0xa5 // 8 or 16 byte address
30 #define VR_GET_CHIP_REV 0xa6 // Rev A, B = 0, Rev C = 2 // NOTE: New TNG Rev
31 #define VR_TEST_MEM 0xa7 // runs mem test and returns result
32 #define VR_RENUM 0xa8 // renum
33 #define VR_DB_FX 0xa9 // Force use of double byte address EEPROM (for FX)
34 #define VR_I2C_100 0xaa // put the i2c bus in 100Khz mode
35 #define VR_I2C_400 0xab // put the i2c bus in 400Khz mode
36 #define VR_NOSDPAUTO 0xac // test code. does uploads using SUDPTR with manual length override
37
38 #define SERIAL_ADDR 0x50
39 #define EP0BUFF_SIZE 0x40
40
41 #define GET_CHIP_REV() ((CPUCS >> 4) & 0x00FF) // EzUSB Chip Rev Field
42
43 //-----------------------------------------------------------------------------
44 // Global Variables
45 //-----------------------------------------------------------------------------
46 BYTE DB_Addr; //TPM Dual Byte Address stat
47 BYTE I2C_Addr; //TPM I2C address
48
49 //-----------------------------------------------------------------------------
50 // Prototypes
51 //-----------------------------------------------------------------------------
52 void EEPROMWrite(WORD addr, BYTE length, BYTE xdata *buf); //TPM EEPROM Write
53 void EEPROMRead(WORD addr, BYTE length, BYTE xdata *buf); //TPM EEPROM Read
54
55 //-----------------------------------------------------------------------------
C51 COMPILER V7.50 VEND_AX 06/04/2006 20:12:23 PAGE 2
56 // Task Dispatcher hooks
57 // The following hooks are called by the task dispatcher.
58 //-----------------------------------------------------------------------------
59
60 void TD_Init(void) // Called once at startup
61 {
62 1 Rwuen = TRUE; // Enable remote-wakeup
63 1 EZUSB_InitI2C(); // Initialize I2C Bus
64 1 }
65
66 void TD_Poll(void) // Called repeatedly while the device is idle
67 {
68 1 }
69
70 BOOL TD_Suspend(void) // Called before the device goes into suspend mode
71 {
72 1 return(TRUE);
73 1 }
74
75 BOOL TD_Resume(void) // Called after the device resumes
76 {
77 1 return(TRUE);
78 1 }
79
80 //-----------------------------------------------------------------------------
81 // Device Request hooks
82 // The following hooks are called by the end point 0 device request parser.
83 //-----------------------------------------------------------------------------
84
85
86 BOOL DR_GetDescriptor(void)
87 {
88 1 return(TRUE);
89 1 }
90
91 BOOL DR_SetConfiguration(void) // Called when a Set Configuration command is received
92 {
93 1 Configuration = SETUPDAT[2];
94 1 return(TRUE); // Handled by user code
95 1 }
96
97 BOOL DR_GetConfiguration(void) // Called when a Get Configuration command is received
98 {
99 1 EP0BUF[0] = Configuration;
100 1 EP0BCH = 0;
101 1 EP0BCL = 1;
102 1 return(TRUE); // Handled by user code
103 1 }
104
105 BOOL DR_SetInterface(void) // Called when a Set Interface command is received
106 {
107 1 AlternateSetting = SETUPDAT[2];
108 1 return(TRUE); // Handled by user code
109 1 }
110
111 BOOL DR_GetInterface(void) // Called when a Set Interface command is received
112 {
113 1 EP0BUF[0] = AlternateSetting;
114 1 EP0BCH = 0;
115 1 EP0BCL = 1;
116 1 return(TRUE); // Handled by user code
117 1 }
C51 COMPILER V7.50 VEND_AX 06/04/2006 20:12:23 PAGE 3
118
119 BOOL DR_GetStatus(void)
120 {
121 1 return(TRUE);
122 1 }
123
124 BOOL DR_ClearFeature(void)
125 {
126 1 return(TRUE);
127 1 }
128
129 BOOL DR_SetFeature(void)
130 {
131 1 return(TRUE);
132 1 }
133 //定义自己的厂商请求
134 #define VR_GET_FRAMENO 0xb0//得到帧计数
135 #define VR_GET_MFRAMENO 0xb1//得到微帧计数
136 BOOL DR_VendorCmnd(void)
137 {
138 1 WORD addr, len, bc;
139 1 WORD ChipRev;
140 1 WORD i;
141 1
142 1 // Determine I2C boot eeprom device address; addr = 0x0 for 8 bit addr eeproms (24LC00)
143 1 I2C_Addr = SERIAL_ADDR | ((I2CS & 0x10) >> 4); // addr=0x01 for 16 bit addr eeprom (LC65)
144 1 // Indicate if it is a dual byte address part
145 1 DB_Addr = (BOOL)(I2C_Addr & 0x01); //TPM: ID1 is 16 bit addr bit - set by rocker sw or jumper
146 1
147 1 switch(SETUPDAT[1])//判断请求类型
148 1 { //TPM handle new commands
149 2 case VR_GET_FRAMENO:
150 2 *EP0BUF = USBFRAMEL;
151 2 *(EP0BUF+1)=USBFRAMEH;
152 2 EP0BCH = 0;
153 2 EP0BCL = 2;
154 2 EP0CS |= bmHSNAK;
155 2 break;
156 2 case VR_GET_MFRAMENO:
157 2 *EP0BUF = MICROFRAME;
158 2 EP0BCH = 0;
159 2 EP0BCL = 1;
160 2 EP0CS |= bmHSNAK;
161 2 break;
162 2 case VR_GETI2C_TYPE:
163 2 *EP0BUF = DB_Addr;
164 2 EP0BCH = 0;
165 2 EP0BCL = 1; // Arm endpoint with # bytes to transfer
166 2 EP0CS |= bmHSNAK; // Acknowledge handshake phase of device request
167 2 break;
168 2 case VR_GET_CHIP_REV:
169 2 ChipRev = GET_CHIP_REV();
170 2 *EP0BUF = ChipRev;
171 2 EP0BCH = 0;
172 2 EP0BCL = 1; // Arm endpoint with # bytes to transfer
173 2 EP0CS |= bmHSNAK; // Acknowledge handshake phase of device request
174 2 break;
175 2 case VR_TEST_MEM:
176 2 *EP0BUF = 0x0F; // Fail
177 2 EP0BCH = 0;
178 2 EP0BCL = 1; // Arm endpoint with # bytes to transfer
179 2 EP0CS |= bmHSNAK; // Acknowledge handshake phase of device request
C51 COMPILER V7.50 VEND_AX 06/04/2006 20:12:23 PAGE 4
180 2 break;
181 2 case VR_SETI2CADDR:
182 2 I2C_Addr = SETUPDAT[2];
183 2 break;
184 2 case VR_I2C_100:
185 2 I2CTL &= ~bm400KHZ;
186 2 EP0BCH = 0;
187 2 EP0BCL = 0;
188 2 break;
189 2 case VR_I2C_400:
190 2 I2CTL |= bm400KHZ;
191 2 EP0BCH = 0;
192 2 EP0BCL = 0;
193 2 break;
194 2 case VR_RENUM:
195 2 *EP0BUF = 7;
196 2 EP0BCH = 0;
197 2 EP0BCL = 1; // Arm endpoint with # bytes to transfer
198 2 EP0CS |= bmHSNAK; // Acknowledge handshake phase of device request
199 2 EZUSB_Delay(1000);
200 2 EZUSB_Discon(TRUE); // renumerate until setup received
201 2 break;
202 2 case VR_NOSDPAUTO:
203 2 // we want specify our own length for the transfer so
204 2 // disable the automatic length feature of the Setup Data Autopointer
205 2 SUDPTRCTL &= ~bmSDPAUTO;
206 2
207 2 EP0BCH = SETUPDAT[7];
208 2 EP0BCL = SETUPDAT[6];
209 2 SUDPTRH = SETUPDAT[3];
210 2 SUDPTRL = SETUPDAT[2];
211 2 break;
212 2
213 2 case VR_DB_FX:
214 2 DB_Addr = 0x01; //TPM: need to assert double byte
215 2 I2C_Addr |= 0x01; //TPM: need to assert double byte
216 2 // NOTE: This case falls through !
217 2 case VR_RAM:
218 2 case VR_EEPROM:
219 2 addr = SETUPDAT[2]; // Get address and length
220 2 addr |= SETUPDAT[3] << 8;
221 2 len = SETUPDAT[6];
222 2 len |= SETUPDAT[7] << 8;
223 2 // Is this an upload command ?
224 2 if(SETUPDAT[0] == VR_UPLOAD)
225 2 {
226 3 while(len) // Move requested data through EP0IN
227 3 { // one packet at a time.
228 4
229 4 while(EP0CS & bmEPBUSY);
230 4
231 4 if(len < EP0BUFF_SIZE)
232 4 bc = len;
233 4 else
234 4 bc = EP0BUFF_SIZE;
235 4
236 4 // Is this a RAM upload ?
237 4 if(SETUPDAT[1] == VR_RAM)
238 4 {
239 5 for(i=0; i<bc; i++)
240 5 *(EP0BUF+i) = *((BYTE xdata *)addr+i);
241 5 }
C51 COMPILER V7.50 VEND_AX 06/04/2006 20:12:23 PAGE 5
242 4 else
243 4 {
244 5 for(i=0; i<bc; i++)
245 5 *(EP0BUF+i) = 0xcd;
246 5 EEPROMRead(addr,(WORD)bc,(WORD)EP0BUF);
247 5 }
248 4
249 4 EP0BCH = 0;
250 4 EP0BCL = (BYTE)bc; // Arm endpoint with # bytes to transfer
251 4
252 4 addr += bc;
253 4 len -= bc;
254 4
255 4 }
256 3 }
257 2 // Is this a download command ?
258 2 else if(SETUPDAT[0] == VR_DOWNLOAD)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -