📄 usb_setup.lst
字号:
179 1 {
180 2 Force_Stall();
181 2 }
182 1 if (Ep_Status[0] != EP_STALL)
183 1 {
184 2 UWrite_Byte(E0CSR, rbSOPRDY);
185 2 UWrite_Byte(E0CSR, rbDATAEND);
186 2 }
187 1 }
188 void Set_Feature()
189 {
190 1 if ((Setup.bmRequestType & 0x02) && // 意义同上
191 1 (Setup.wValue[0] == ENDPOINT_HALT) &&
192 1 ((Setup.wIndex[0] == IN_EP1) ||
193 1 (Setup.wIndex[0] == OUT_EP2)))
194 1 {
195 2 if (Setup.wIndex[0] == IN_EP1)
196 2 {
197 3 UWrite_Byte (INDEX, 1);
198 3 UWrite_Byte (EINCSRL, rbInSDSTL); // rbInSDSTL=1,发送STALL作为对IN令牌的响应,
199 3 // 在端点1中断处理函数中将rbInSDSTl和rbInSTSTL清零
200 3 Ep_Status[1] = EP_HALT; // 端点1到HALT状态
201 3 }
202 2 else
203 2 {
204 3 UWrite_Byte(INDEX, 2);
205 3 UWrite_Byte (EOUTCSRL, rbOutSDSTL); // 同上
206 3 Ep_Status[2] = EP_HALT;
207 3 }
208 2 }
209 1 else
210 1 {
211 2 Force_Stall();
212 2 }
213 1 if (Ep_Status[0] != EP_STALL)
214 1 {
215 2 UWrite_Byte(E0CSR, rbSOPRDY);
216 2 UWrite_Byte(E0CSR, rbDATAEND);
217 2 }
218 1 }
219 void Set_Address()
220 {
221 1 if (Setup.wValue[0] != 0)
222 1 {
223 2 USB_State = DEV_ADDRESS; // 收到不为0的地址,设备处于地址状态,此次传输的
224 2 UWrite_Byte(FADDR, Setup.wValue[0]);// 状态阶段结束后新地址将起作用
225 2 Ep_Status[0] = EP_IDLE;
226 2
227 2 }
228 1 else
229 1 {
230 2 USB_State = DEV_DEFAULT; // 收到的地址为0,设备仍旧处于默认状态
231 2 }
232 1 UWrite_Byte(E0CSR, rbSOPRDY);
233 1 UWrite_Byte(E0CSR, rbDATAEND);
234 1
235 1 }
236 void Get_Descriptor()
237 {
238 1 unsigned int In_DataSize=0; // 要发送的数据总量
239 1 In_DataSize=Setup.wLength[0]+Setup.wLength[1]*256;
240 1 switch(Setup.wValue[1]) // 判断描述符的类型
C51 COMPILER V6.12 USB_SETUP 08/20/2006 19:41:25 PAGE 5
241 1 {
242 2 case DSC_DEVICE: // 设备描述符
243 2 DataPtr = DeviceDesc;
244 2 if(In_DataSize>18)
245 2 {DataSize = 18; }
246 2 else
247 2 {DataSize = In_DataSize;}
248 2 break;
249 2 case DSC_CONFIG: // 配置描述符
250 2 DataPtr = ConfigDesc;
251 2 if(In_DataSize==0x09)
252 2 {
253 3 DataSize=0x09;
254 3 }
255 2 else if(In_DataSize==0x20)
256 2 {
257 3 DataSize=0x20;
258 3 }
259 2 else if(In_DataSize==0xff)
260 2 {
261 3 DataSize=0x20;
262 3 }
263 2 break;
264 2 case DSC_STRING: // 字符串描述符
265 2 DataPtr=&StringDes[Setup.wValue[0]];
266 2 DataSize=In_DataSize;
267 2 break;
268 2 default: break;
269 2 }
270 1 UWrite_Byte(E0CSR, rbSOPRDY);
271 1 Ep_Status[0] = EP_TX; // 端点0在发送状态
272 1 DataSent = 0;
273 1 }
274 void Get_Configuration()
275 {
276 1 if (USB_State == DEV_CONFIGURED) // If the device is configured, then return value 0x01
277 1 { // since this software only supports one configuration
278 2 DataPtr = ONES_PACKET;
279 2 DataSize = 1;
280 2 }
281 1 if (USB_State == DEV_ADDRESS) // If the device is in address state, it is not
282 1 { // configured, so return 0x00
283 2 DataPtr = ZERO_PACKET;
284 2 DataSize = 1;
285 2 }
286 1 if (Ep_Status[0] != EP_STALL)
287 1 {
288 2 UWrite_Byte(E0CSR, rbSOPRDY);
289 2 Ep_Status[0] = EP_TX;
290 2 DataSent = 0;
291 2 }
292 1 }
293 void Set_Configuration()
294 {
295 1 if (Setup.wValue[0] > 0) // Any positive configuration request
296 1 { // results in configuration being set to 1
297 2 USB_State = DEV_CONFIGURED;
298 2 ///////////////////////////////////////////////////////////////////////////////////
299 2 UWrite_Byte(INDEX, 1);
300 2 UWrite_Byte(EINCSRH,0xa0); // 双缓冲、ISO、FIFO分割和强制数据Toggle禁止,IN端点
301 2 Ep_Status[1]=EP_IDLE;
302 2
C51 COMPILER V6.12 USB_SETUP 08/20/2006 19:41:25 PAGE 6
303 2 UWrite_Byte(INDEX, 2);
304 2 UWrite_Byte(EOUTCSRH, 0x80); // 双缓冲和ISO禁止,OUT端点
305 2 Ep_Status[2]=EP_IDLE;
306 2 ///////////////////////////////////////////////////////////////////////////////////
307 2 UWrite_Byte(INDEX, 0);
308 2 }
309 1 else
310 1 {
311 2 USB_State = DEV_ADDRESS; // 设备仍旧在地址状态
312 2 Ep_Status[1]=EP_STALL;
313 2 Ep_Status[2]=EP_STALL;
314 2 }
315 1 if (Ep_Status[0] != EP_STALL)
316 1 {
317 2 UWrite_Byte(E0CSR, rbSOPRDY);
318 2 UWrite_Byte(E0CSR, rbDATAEND);
319 2 }
320 1 }
321 void Get_Interface()
322 {
323 1 DataPtr = ZERO_PACKET;
324 1 DataSize = 1;
325 1 if (Ep_Status[0] != EP_STALL)
326 1 {
327 2 UWrite_Byte(E0CSR, rbSOPRDY);
328 2 Ep_Status[0] = EP_TX;
329 2 DataSent = 0;
330 2 }
331 1 }
332 void Set_Interface()
333 {
334 1 UWrite_Byte(E0CSR, rbSOPRDY);
335 1 UWrite_Byte(E0CSR, rbDATAEND);
336 1 }
337
338 void Get_Maxlun() // U盘支持一个逻辑单元,返回1即可
339 {
340 1 DataPtr = ZERO_PACKET;
341 1 DataSize = 1;
342 1 if (Ep_Status[0] != EP_STALL)
343 1 {
344 2 Ep_Status[0] = EP_TX;
345 2 DataSent = 0;
346 2 }
347 1 UWrite_Byte(E0CSR, rbSOPRDY);
348 1 }
349 ////////////////////////////////////////////////////////////////////////////////////////////////////
350
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1234 ----
CONSTANT SIZE = 115 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 23 4
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 1 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -