📄 vend_ax.lst
字号:
C51 COMPILER V7.50 VEND_AX 04/23/2009 15:18:28 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 BROWSE 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
12 extern BOOL GotSUD; // 接收设置数据标志
13 extern BOOL Sleep;
14 extern BOOL Rwuen;
15 extern BOOL Selfpwr;
16
17 BYTE Configuration; // 当前设置
18 BYTE AlternateSetting; // 交替设置
19 sbit PA0 = IOA ^ 0;
20 sbit PA1 = IOA ^ 1;
21 sbit PA2 = IOA ^ 2;
22 sbit PA3 = IOA ^ 3;
23 sbit PA4 = IOA ^ 4;
24 sbit PA5 = IOA ^ 5;
25 sbit PA6 = IOA ^ 6;
26 sbit PA7 = IOA ^ 7;
27
28 // EZUSB FX2 PORTD = FD[15:8], when IFCFG[1:0]=10 and WORDWIDE=1
29 sbit PD0 = IOD ^ 0;
30 sbit PD1 = IOD ^ 1;
31 sbit PD2 = IOD ^ 2;
32 sbit PD3 = IOD ^ 3;
33 sbit PD4 = IOD ^ 4;
34 sbit PD5 = IOD ^ 5;
35 sbit PD6 = IOD ^ 6;
36 sbit PD7 = IOD ^ 7;
37 //-----------------------------------------------------------------------------
38 // 常量
39 //-----------------------------------------------------------------------------
40 #define VR_UPLOAD 0xc0
41 #define VR_DOWNLOAD 0x40
42
43 #define VR_ANCHOR_DLD 0xa0 // handled by core
44 #define VR_EEPROM 0xa2 // 上传/下载到 EEPROM
45 #define VR_RAM 0xa3 // 上传/下载到外部ram
46 #define VR_SETI2CADDR 0xa4
47 #define VR_GETI2C_TYPE 0xa5 // 8或16 字节地址
48 #define VR_GET_CHIP_REV 0xa6 // Rev A, B = 0, Rev C = 2 // NOTE: New TNG Rev
49 #define VR_TEST_MEM 0xa7 // runs mem test and returns result
50 #define VR_RENUM 0xa8 // 重枚举
51 #define VR_DB_FX 0xa9 // Force use of double byte address EEPROM (for FX)
52 #define VR_I2C_100 0xaa // put the i2c bus in 100Khz mode
53 #define VR_I2C_400 0xab // put the i2c bus in 400Khz mode
54 #define VR_NOSDPAUTO 0xac // test code. does uploads using SUDPTR with manual length override
55
C51 COMPILER V7.50 VEND_AX 04/23/2009 15:18:28 PAGE 2
56
57 #define VR_C1 0xC1 // put the i2c bus in 400Khz mode
58
59
60 #define SERIAL_ADDR 0x50
61 #define EP0BUFF_SIZE 0x40
62
63 #define GET_CHIP_REV() ((CPUCS >> 4) & 0x00FF) // EzUSB Chip Rev Field
64
65 //-----------------------------------------------------------------------------
66 // 全局变量
67 //-----------------------------------------------------------------------------
68 BYTE DB_Addr; //TPM Dual Byte Address stat
69 BYTE I2C_Addr; //TPM I2C address
70
71 //-----------------------------------------------------------------------------
72 // 函数原型
73 //-----------------------------------------------------------------------------
74 void EEPROMWrite(WORD addr, BYTE length, BYTE xdata *buf); //TPM EEPROM Write
75 void EEPROMRead(WORD addr, BYTE length, BYTE xdata *buf); //TPM EEPROM Read
76
77 //-----------------------------------------------------------------------------
78 // 任务分配器挂钩
79 // 以下挂钩由任务分配器调用
80 //-----------------------------------------------------------------------------
81
82 void TD_Init(void) // 在起始调用一次
83 {
84 1 Rwuen = TRUE; // 使能远程唤醒
85 1 EZUSB_InitI2C(); // 初始化I2C总线
86 1 }
87
88 void TD_Poll(void) // 当设备闲置时,重复调用
89 {
90 1 }
91
92 BOOL TD_Suspend(void) // 在设备进入挂起方式时调用
93 {
94 1 return(TRUE);
95 1 }
96
97 BOOL TD_Resume(void) // 在设备恢复会调用
98 {
99 1 return(TRUE);
100 1 }
101
102 //-----------------------------------------------------------------------------
103 // 设备请求挂钩
104 //-----------------------------------------------------------------------------
105
106
107 BOOL DR_GetDescriptor(void)
108 {
109 1 return(TRUE);
110 1 }
111
112 BOOL DR_SetConfiguration(void) // 当设置配置指令被接受时调用
113 {
114 1 Configuration = SETUPDAT[2];
115 1 return(TRUE); // 由用户代码处理
116 1 }
117
C51 COMPILER V7.50 VEND_AX 04/23/2009 15:18:28 PAGE 3
118 BOOL DR_GetConfiguration(void) // 当设置配置指令被接受时调用
119 {
120 1 EP0BUF[0] = Configuration;
121 1 EP0BCH = 0;
122 1 EP0BCL = 1;
123 1 return(TRUE); // 由用户代码处理
124 1 }
125
126 BOOL DR_SetInterface(void) // 当设置接口命令获取时调用
127 {
128 1 AlternateSetting = SETUPDAT[2];
129 1 return(TRUE); // 由用户代码处理
130 1 }
131
132 BOOL DR_GetInterface(void) // 当设置接口命令获取时调用
133 {
134 1 EP0BUF[0] = AlternateSetting;
135 1 EP0BCH = 0;
136 1 EP0BCL = 1;
137 1 return(TRUE); // 由用户代码处理
138 1 }
139
140 BOOL DR_GetStatus(void)
141 {
142 1 return(TRUE);
143 1 }
144
145 BOOL DR_ClearFeature(void)
146 {
147 1 return(TRUE);
148 1 }
149
150 BOOL DR_SetFeature(void)
151 {
152 1 return(TRUE);
153 1 }
154 //定义自己的厂商请求
155 #define VR_GET_FRAMENO 0xb0//得到帧计数
156 #define VR_GET_MFRAMENO 0xb1//得到微帧计数
157 BOOL DR_VendorCmnd(void)
158 {
159 1 WORD addr, len, bc;
160 1 WORD ChipRev;
161 1 WORD i;
162 1
163 1 // Determine I2C boot eeprom device address; addr = 0x0 for 8 bit addr eeproms (24LC00)
164 1 I2C_Addr = SERIAL_ADDR | ((I2CS & 0x10) >> 4); // addr=0x01 for 16 bit addr eeprom (LC65)
165 1 // Indicate if it is a dual byte address part
166 1 DB_Addr = (BOOL)(I2C_Addr & 0x01); //TPM: ID1 is 16 bit addr bit - set by rocker sw or jumper
167 1
168 1 switch(SETUPDAT[1])//判断请求类型
169 1 { //TPM handle new commands
170 2 case VR_GET_FRAMENO:
171 2 *EP0BUF = USBFRAMEL;
172 2 *(EP0BUF+1)=USBFRAMEH;
173 2 EP0BCH = 0;
174 2 EP0BCL = 2;
175 2 EP0CS |= bmHSNAK;
176 2 break;
177 2 case VR_GET_MFRAMENO:
178 2 *EP0BUF = MICROFRAME;
179 2 EP0BCH = 0;
C51 COMPILER V7.50 VEND_AX 04/23/2009 15:18:28 PAGE 4
180 2 EP0BCL = 1;
181 2 EP0CS |= bmHSNAK;
182 2 break;
183 2 case VR_GETI2C_TYPE:
184 2 *EP0BUF = DB_Addr;
185 2 EP0BCH = 0;
186 2 EP0BCL = 1; // Arm endpoint with # bytes to transfer
187 2 EP0CS |= bmHSNAK; // Acknowledge handshake phase of device request
188 2 break;
189 2 case VR_GET_CHIP_REV:
190 2 ChipRev = GET_CHIP_REV();
191 2 *EP0BUF = ChipRev;
192 2 EP0BCH = 0;
193 2 EP0BCL = 1; // Arm endpoint with # bytes to transfer
194 2 EP0CS |= bmHSNAK; // Acknowledge handshake phase of device request
195 2 break;
196 2 case VR_TEST_MEM:
197 2 *EP0BUF = 0x0F; // Fail
198 2 EP0BCH = 0;
199 2 EP0BCL = 1; // Arm endpoint with # bytes to transfer
200 2 EP0CS |= bmHSNAK; // Acknowledge handshake phase of device request
201 2 break;
202 2 case VR_SETI2CADDR:
203 2 I2C_Addr = SETUPDAT[2];
204 2 break;
205 2 case VR_I2C_100:
206 2 /*I2CTL &= ~bm400KHZ;
207 2 EP0BCH = 0;
208 2 EP0BCL = 0;*/
209 2 // Serial_SendChar('A', 0);
210 2
211 2 break;
212 2
213 2 case VR_C1:
214 2 CPUCS = 0x10; // CLKSPD[1:0]=10, for 48MHz operation
215 2 // CLKOE=0, don't drive CLKOUT
216 2
217 2 IFCONFIG = 0xE8;
218 2 // IFCLKSRC=1 , FIFOs executes on internal clk source
219 2 // xMHz=1 , 48MHz internal clk rate
220 2 // IFCLKOE=1 , Don't drive IFCLK pin signal at 48MHz
221 2 // IFCLKPOL=0 , Don't invert IFCLK pin signal from internal clk
222 2 // ASYNC=1 , master samples asynchronous
223 2 // GSTATE=0 , Don't drive GPIF states out on PORTE[2:0], debug WF
224 2 // IFCFG[1:0]=00, Port
225 2 OEA=0xFD;//OEA,OEB,OED控制口的输入输出使能,1为输出,0为输入
226 2 OEB=0xff;
227 2 OED=0xff;
228 2 IOA=0xFF;//IOA,IOB.IOD 为端口上输入输出数据
229 2
230 2 PA2=0;//读
231 2
232 2 IOB=0x01;
233 2 IOD=0x30;
234 2
235 2 EZUSB_Delay(100);
236 2
237 2 PA2=1;//写
238 2
239 2 EZUSB_Delay(100);
240 2
241 2 OEB=0x00;//端点B、D输入
C51 COMPILER V7.50 VEND_AX 04/23/2009 15:18:28 PAGE 5
242 2 OED=0x00;
243 2
244 2 PA0=1;
245 2 EZUSB_Delay(100);
246 2 PA0=0; //转换开始
247 2 EZUSB_Delay(100);
248 2 PA0=1;
249 2
250 2 while (PA1==1); //等待中断到来
251 2 EZUSB_Delay(100);
252 2
253 2 PA4=0; //片选信号有效
254 2 PA2=0; //读数据
255 2
256 2 EZUSB_Delay(100);
257 2
258 2 *EP0BUF =IOB;
259 2 *(EP0BUF+1) = IOD; //通过EP0端点发送到主机
260 2 PA2=1;
261 2 PA4=1;
262 2 EP0BCH = 0;
263 2 EP0BCL = 2;
264 2 EP0CS |= bmHSNAK;
265 2
266 2 break;
267 2
268 2
269 2
270 2 case VR_I2C_400:
271 2 I2CTL |= bm400KHZ;
272 2 EP0BCH = 0;
273 2 EP0BCL = 0;
274 2 break;
275 2 case VR_RENUM:
276 2 *EP0BUF = 7;
277 2 EP0BCH = 0;
278 2 EP0BCL = 1; // Arm endpoint with # bytes to transfer
279 2 EP0CS |= bmHSNAK; // Acknowledge handshake phase of device request
280 2 EZUSB_Delay(1000);
281 2 EZUSB_Discon(TRUE); // renumerate until setup received
282 2 break;
283 2 case VR_NOSDPAUTO:
284 2 // we want specify our own length for the transfer so
285 2 // disable the automatic length feature of the Setup Data Autopointer
286 2 SUDPTRCTL &= ~bmSDPAUTO;
287 2
288 2 EP0BCH = SETUPDAT[7];
289 2 EP0BCL = SETUPDAT[6];
290 2 SUDPTRH = SETUPDAT[3];
291 2 SUDPTRL = SETUPDAT[2];
292 2 break;
293 2
294 2 case VR_DB_FX:
295 2 DB_Addr = 0x01; //TPM: need to assert double byte
296 2 I2C_Addr |= 0x01; //TPM: need to assert double byte
297 2 // NOTE: This case falls through !
298 2 case VR_RAM:
299 2 case VR_EEPROM:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -