📄 usbcore.lst
字号:
245 0x03, //字符串描述符
246 //0x0409为美式英语的ID
247 0x09,
248 0x04
249 };
250 ////////////////////////语言ID完毕//////////////////////////////////
251
252 /**************************************************/
253 /********* 本转换结果来自 **********/
254 /********* Http://computer00.21ic.org **********/
255 /********* 作者: 电脑圈圈 **********/
256 /********* 欢迎大家使用 **********/
257 /********* 版权所有,盗版请写明出处 **********/
258 /**************************************************/
259
260 //http://computer00.21ic.org/user1/2198/archives/2007/42769.html
261 //字符串“电脑圈圈的USB专区 Http://group.ednchina.com/93/”的Unicode编码
262 //8位小端格式
263 code uint8 ManufacturerStringDescriptor[82]={
264 82, //该描述符的长度为82字节
265 0x03, //字符串描述符的类型编码为0x03
266 0x35, 0x75, //电
267 0x11, 0x81, //脑
268 0x08, 0x57, //圈
269 0x08, 0x57, //圈
270 0x84, 0x76, //的
271 0x55, 0x00, //U
272 0x53, 0x00, //S
273 0x42, 0x00, //B
274 0x13, 0x4e, //专
275 0x3a, 0x53, //区
276 0x20, 0x00, //
277 0x48, 0x00, //H
278 0x74, 0x00, //t
279 0x74, 0x00, //t
280 0x70, 0x00, //p
281 0x3a, 0x00, //:
282 0x2f, 0x00, ///
283 0x2f, 0x00, ///
284 0x67, 0x00, //g
285 0x72, 0x00, //r
286 0x6f, 0x00, //o
287 0x75, 0x00, //u
288 0x70, 0x00, //p
289 0x2e, 0x00, //.
290 0x65, 0x00, //e
291 0x64, 0x00, //d
292 0x6e, 0x00, //n
293 0x63, 0x00, //c
294 0x68, 0x00, //h
295 0x69, 0x00, //i
296 0x6e, 0x00, //n
297 0x61, 0x00, //a
298 0x2e, 0x00, //.
299 0x63, 0x00, //c
300 0x6f, 0x00, //o
301 0x6d, 0x00, //m
302 0x2f, 0x00, ///
303 0x39, 0x00, //9
C51 COMPILER V7.06 USBCORE 11/16/2008 16:00:19 PAGE 6
304 0x33, 0x00, //3
305 0x2f, 0x00 ///
306 };
307 /////////////////////////厂商字符串结束/////////////////////////////
308
309 //字符串“《圈圈教你玩USB》之 假U盘”的Unicode编码
310 //8位小端格式
311 code uint8 ProductStringDescriptor[32]={
312 32, //该描述符的长度为32字节
313 0x03, //字符串描述符的类型编码为0x03
314 0x0a, 0x30, //《
315 0x08, 0x57, //圈
316 0x08, 0x57, //圈
317 0x59, 0x65, //教
318 0x60, 0x4f, //你
319 0xa9, 0x73, //玩
320 0x55, 0x00, //U
321 0x53, 0x00, //S
322 0x42, 0x00, //B
323 0x0b, 0x30, //》
324 0x4b, 0x4e, //之
325 0x20, 0x00, //
326 0x47, 0x50, //假
327 0x55, 0x00, //U
328 0xd8, 0x76, //盘
329 };
330 ////////////////////////产品字符串结束////////////////////////////
331
332 //字符串“2008-08-14”的Unicode编码
333 //8位小端格式
334 code uint8 SerialNumberStringDescriptor[22]={
335 22, //该描述符的长度为22字节
336 0x03, //字符串描述符的类型编码为0x03
337 0x32, 0x00, //2
338 0x30, 0x00, //0
339 0x30, 0x00, //0
340 0x38, 0x00, //8
341 0x2d, 0x00, //-
342 0x30, 0x00, //0
343 0x38, 0x00, //8
344 0x2d, 0x00, //-
345 0x31, 0x00, //1
346 0x34, 0x00 //4
347 };
348 //////////////////////产品序列号字符串结束/////////////////////////
349
350 /********************************************************************
351 函数功能:延时x毫秒函数。
352 入口参数:x:延时的毫秒数。
353 返 回:无。
354 备 注:无。
355 ********************************************************************/
356 void DelayXms(uint16 x)
357 {
358 1 uint16 i;
359 1 uint16 j;
360 1 for(i=0;i<x;i++)
361 1 for(j=0;j<227;j++); //循环语句延时
362 1 }
363 ////////////////////////End of function//////////////////////////////
364
365 /********************************************************************
C51 COMPILER V7.06 USBCORE 11/16/2008 16:00:19 PAGE 7
366 函数功能:USB断开连接函数。
367 入口参数:无。
368 返 回:无。
369 备 注:无。
370 ********************************************************************/
371 void UsbDisconnect(void)
372 {
373 1 #ifdef DEBUG0
Prints("断开USB连接。\r\n");
#endif
376 1 D12WriteCommand(D12_SET_MODE); //写设置模式命令
377 1 D12WriteByte(0x06); //设置模式的第一字节
378 1 D12WriteByte(0x47); //设置模式的第二字节
379 1 DelayXms(1000); //延迟1秒
380 1 }
381 ////////////////////////End of function//////////////////////////////
382
383 /********************************************************************
384 函数功能:USB连接函数。
385 入口参数:无。
386 返 回:无。
387 备 注:无。
388 ********************************************************************/
389 void UsbConnect(void)
390 {
391 1 #ifdef DEBUG0
Prints("连接USB。\r\n");
#endif
394 1 D12WriteCommand(D12_SET_MODE); //写设置模式命令
395 1 D12WriteByte(0x16); //设置模式的第一字节
396 1 D12WriteByte(0x47); //设置模式的第二字节
397 1 }
398 ////////////////////////End of function//////////////////////////////
399
400 /********************************************************************
401 函数功能:总线挂起中断处理函数。
402 入口参数:无。
403 返 回:无。
404 备 注:无。
405 ********************************************************************/
406 void UsbBusSuspend(void)
407 {
408 1 #ifdef DEBUG0
Prints("USB总线挂起。\r\n");
#endif
411 1 }
412 ////////////////////////End of function//////////////////////////////
413
414 /********************************************************************
415 函数功能:总线复位中断处理函数。
416 入口参数:无。
417 返 回:无。
418 备 注:无。
419 ********************************************************************/
420 void UsbBusReset(void)
421 {
422 1 #ifdef DEBUG0
Prints("USB总线复位。\r\n");
#endif
425 1 Ep1InIsBusy=0; //复位后端点1输入缓冲区空闲。
426 1 Ep2InIsBusy=0; //复位后端点2输入缓冲区空闲。
427 1 TransportStage=COMMAND_STAGE; //复位后传输阶段为命令阶段。
C51 COMPILER V7.06 USBCORE 11/16/2008 16:00:19 PAGE 8
428 1 }
429 ////////////////////////End of function//////////////////////////////
430
431 /********************************************************************
432 函数功能:根据pData和SendLength将数据发送到端点0的函数。
433 入口参数:无。
434 返 回:无。
435 备 注:无。
436 ********************************************************************/
437 void UsbEp0SendData(void)
438 {
439 1 //将数据写到端点中去准备发送
440 1 //写之前要先判断一下需要发送的数据是否比端点0
441 1 //最大长度大,如果超过端点大小,则一次只能发送
442 1 //最大包长的数据。端点0的最大包长在DeviceDescriptor[7]
443 1 if(SendLength>DeviceDescriptor[7])
444 1 {
445 2 //按最大包长度发送
446 2 D12WriteEndpointBuffer(1,DeviceDescriptor[7],pSendData);
447 2 //发送后剩余字节数减少最大包长
448 2 SendLength-=DeviceDescriptor[7];
449 2 //发送一次后指针位置要调整
450 2 pSendData+= DeviceDescriptor[7];
451 2 }
452 1 else
453 1 {
454 2 if(SendLength!=0)
455 2 {
456 3 //不够最大包长,可以直接发送
457 3 D12WriteEndpointBuffer(1,SendLength,pSendData);
458 3 //发送完毕后,SendLength长度变为0
459 3 SendLength=0;
460 3 }
461 2 else //如果要发送的数据包长度为0
462 2 {
463 3 if(NeedZeroPacket==1) //如果需要发送0长度数据
464 3 {
465 4 D12WriteEndpointBuffer(1,0,pSendData); //发送0长度数据包
466 4 NeedZeroPacket=0; //清需要发送0长度数据包标志
467 4 }
468 3 }
469 2 }
470 1 }
471 ////////////////////////End of function//////////////////////////////
472
473 /********************************************************************
474 函数功能:端点0输出中断处理函数。
475 入口参数:无。
476 返 回:无。
477 备 注:无。
478 ********************************************************************/
479 void UsbEp0Out(void)
480 {
481 1 #ifdef DEBUG0
Prints("USB端点0输出中断。\r\n");
#endif
484 1 //读取端点0输出最后传输状态,该操作清除中断标志
485 1 //并判断第5位是否为1,如果是,则说明是建立包
486 1 if(D12ReadEndpointLastStatus(0)&0x20)
487 1 {
488 2 D12ReadEndpointBuffer(0,16,Buffer); //读建立过程数据
489 2 D12AcknowledgeSetup(); //应答建立包
C51 COMPILER V7.06 USBCORE 11/16/2008 16:00:19 PAGE 9
490 2 D12ClearBuffer(); //清缓冲区
491 2 //将缓冲数据填到设备请求的各字段中
492 2 bmRequestType=Buffer[0];
493 2 bRequest=Buffer[1];
494 2 wValue=Buffer[2]+(((uint16)Buffer[3])<<8);
495 2 wIndex=Buffer[4]+(((uint16)Buffer[5])<<8);
496 2 wLength=Buffer[6]+(((uint16)Buffer[7])<<8);
497 2 //下面的代码判断具体的请求,并根据不同的请求进行相关操作
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -