chap_9.c
Upload User: ids068
Upload Date: 2013-04-04
Package Size: 639k
Code Size: 35k
Category:

USB develop

Development Platform:

C/C++

  1. //***********************************************************************
  2. //                         *
  3. //                P H I L I P S   P R O P R I E T A R Y              *
  4. //                                                                      *
  5. //          COPYRIGHT (c)   1999 BY PHILIPS SINGAPORE (APIC).        *
  6. //                    --  ALL RIGHTS RESERVED  --                  *
  7. //                                                                      *
  8. //  File Name :       USBDebug.c                                    *
  9. //  Author :       Albert Goh         *
  10. //  Created :       3 March 2000                                *
  11. //                                                                      *
  12. //***********************************************************************
  13. //***********************************************************************
  14. //                                                                      *
  15. // USBDebug has the ability to test the USB core in Bus enumeration or  *
  16. // in CBI/bulk mode.                                                   *
  17. //                                                                      *
  18. //***********************************************************************
  19. //***********************************************************************
  20. //                                                                      *
  21. //  Module History             *
  22. //  **************             *
  23. //                   *
  24. //  Date    Version Author Changes       *
  25. //  ====    ======= ====== =======       *
  26. //  030300   0.1  Albert Created           *
  27. //                                                                      *
  28. //***********************************************************************
  29. //***********************************************************************
  30. //*                *
  31. //*                      Include Files Definition    *
  32. //*                *
  33. //***********************************************************************
  34. #include "standard.h"
  35. #include "Kernel.h"
  36. #include "D14.h"
  37. #include "usb.h"
  38. #include "viic_c51.h"
  39. extern  D14_CNTRL_REG volatile xdata  D14_Cntrl_Reg;
  40. extern void Init_D14(void);
  41. extern UC code Standard_Device_Descriptor[];
  42. extern UC code Bulk_Interface_Descriptor[];
  43. extern UC code Iso_Interface_Descriptor[];
  44. extern UC code Standard_Config_Descriptor[];
  45. extern UC code Standard_Manufacturer_String[];
  46. extern UC code Standard_Product_String[];
  47. extern UC code Standard_String_ID[];
  48. extern UC code Bulk_In_Descriptor[];
  49. extern UC code Bulk_Out_Descriptor[];
  50. extern UC code Int_In_Descriptor[];
  51. extern UC code Int_Out_Descriptor[];
  52. extern UC code Iso_In_Descriptor[];
  53. extern UC code Iso_Out_Descriptor[];
  54. extern UC code Iso_In_Zero_Descriptor[];
  55. extern UC code Iso_Out_Zero_Descriptor[];
  56. extern UC code HS_Device_Descriptor[];
  57. extern UC code HS_Device_Qualifier[];
  58. extern UC code HS_Bulk_Interface_Descriptor[];
  59. extern UC code HS_Bulk_In_Descriptor[];
  60. extern UC code HS_Bulk_Out_Descriptor[];
  61. extern UC code HS_Int_In_Descriptor[];
  62. extern UC code HS_Int_Out_Descriptor[];
  63. extern UC code Other_Speed_Config_Descriptor[];
  64. extern UI count;
  65. extern void Start_mSEC_Timer(Data);
  66. extern void Start_SEC_Timer(Data);
  67. extern void Check_Busy(void);
  68. extern void TaskFile_Update(void);
  69. extern UI Temp;
  70. extern UC Device_Config_Value;
  71. extern KERNEL Kernel_Flag;
  72. extern DMA_INT_FLAG DMA_Int_Flag;
  73. extern USB_INT_FLAG USB_Int_Flag;
  74. extern USBCBW USB_CBW;
  75. extern void Init_Device(void);
  76. extern UC code Test_Packet[];
  77. extern void Init_Endpoint(void);
  78. extern void Init_Device(void);
  79. extern void Set_USB(void);
  80. extern void ZLG7290_SendBuf(unsigned char * disp_buf,unsigned char num);
  81. //***********************************************************************
  82. //*                *
  83. //*                  Prototype Routine Definition      *
  84. //*                *
  85. //***********************************************************************
  86. unsigned int read_endpoint(unsigned char endp,unsigned int len,unsigned char *buf);
  87. void USB_Setup(void);
  88. void reserved(void);
  89. void Send_Device_Status(void);
  90. void Send_Interface_Status(void);
  91. void Send_Endpoint_Status(void);
  92. void Vendor_Specific_Command(void);
  93. void Send_Status(unsigned char tran_status);
  94. void Set_Interface_Value(void);
  95. void Get_Interface_Value(void);
  96. void Process_Synch_Frame(void);
  97. void get_status(void);
  98. void clear_feature(void);
  99. void set_feature(void);
  100. void set_address(void);
  101. void get_descriptor(void);
  102. void get_config(void);
  103. void set_config(void);
  104. void get_interface(void);
  105. void set_interface(void);
  106. void Set_Descriptor(void);
  107. void reserved(void);
  108. void ep0in_ack(void);
  109. void ep0out_ack(void);
  110. void wait_ep0tx(void);
  111. void wait_ep0rx(void);
  112. //***********************************************************************
  113. //*                *
  114. //*                      Variable Definition        *
  115. //*                *
  116. //***********************************************************************
  117. USB_INT_FLAG  USB_Int_Flag;
  118. USB_DEVICE_REQ idata USB_Device_Request;
  119. USB_DEVICE USB_Device;
  120. UC code disp_buf0[8]={0,0,0,0,0,0,0,0}; //LED初始化值
  121. UC code disp_buf1[8]={1,1,1,1,1,1,1,1}; //LED初始化值
  122. UC code *Descriptor_Ptr;
  123. UC idata Endpt_FIFO[MAX_BUF];
  124. UI FIFO_Count;
  125. UC VID[2],PID[2];
  126. FILESIZE FileSize;
  127. UI PIO_Count;
  128. UC File_Number;
  129. UC Current_File,bytecouter;
  130. ULI bytecount;
  131. //USB标准请求
  132. code void (*StandardDeviceRequest[])(void) =
  133. {
  134. get_status,
  135. clear_feature,
  136. reserved,
  137. set_feature,
  138. reserved,
  139. set_address,
  140. get_descriptor,
  141. reserved,
  142. get_config,
  143. set_config,
  144. get_interface,
  145. set_interface,
  146. reserved,
  147. reserved,
  148. reserved,
  149. reserved
  150. };
  151. //***********************************************************************
  152. //*                *
  153. //*                      Routine Definition    *
  154. //*                *
  155. //***********************************************************************
  156. //***********************************************************************
  157. //*                     *
  158. //* Routine  :  USB Debug Mode                                     *
  159. //* Input :  USB Interrupt Register           *
  160. //* Output :  None                                    *
  161. //* Function :  Branch to respective ISR                      *
  162. //*                *
  163. //***********************************************************************
  164. void USB_Debug_Mode(void)
  165. {
  166. //端点0接收到setup包处理      
  167.     if(USB_Int_Flag.BITS.EP0SETUP)
  168. {
  169. EA_DISABLE;
  170. USB_Setup();
  171. EA_ENABLE;
  172. }
  173. //挂起处理
  174. if(USB_Int_Flag.BITS.SUSP)
  175. {
  176. //清除挂起标志
  177. EA_DISABLE;
  178. USB_Int_Flag.BITS.SUSP = 0;
  179. EA_ENABLE;
  180. //ISP1581进入挂起状态           
  181. D14_Cntrl_Reg.D14_MODE.BITS.GOSUSP = 1;
  182. D14_Cntrl_Reg.D14_MODE.BITS.GOSUSP = 0;
  183. }
  184. //挂起恢复处理
  185. if(USB_Int_Flag.BITS.RESUME)
  186. {
  187. //清除恢复标志
  188. EA_DISABLE;
  189. USB_Int_Flag.BITS.RESUME = 0;         
  190. EA_ENABLE;
  191. //产生一个恢复信号
  192. D14_Cntrl_Reg.D14_MODE.BITS.SNDRSU = 1;
  193. D14_Cntrl_Reg.D14_MODE.BITS.SNDRSU = 0;
  194.     }
  195. //高速状态
  196. if(USB_Int_Flag.BITS.HS_STAT)
  197. {
  198. //清除高速状态标志
  199. EA_DISABLE;
  200. USB_Int_Flag.BITS.HS_STAT = 0;
  201. EA_ENABLE;
  202. if(Kernel_Flag.BITS.HS_FS_State == FULL_SPEED)
  203. {
  204. //切换高速指示
  205. HS_FS_LED = HIGH_SPEED_LED;
  206. //设置高速模式状态
  207. Kernel_Flag.BITS.HS_FS_State = HIGH_SPEED;
  208. //重新配置高速端点
  209. Init_Endpoint();
  210. // PIO_Count = 64;
  211. PIO_Count = 512;
  212. }
  213. }
  214. }
  215. //***********************************************************************
  216. //*      *
  217. //* Routine  :                                                 *
  218. //* Input : None                    *
  219. //* Output : None                                 *
  220. //* Function :                                             *
  221. //* *
  222. //***********************************************************************
  223. //建立包处理
  224. void USB_Setup(void)
  225. {
  226. unsigned char type, req;
  227. //清除EP0SETUP中断标志
  228. USB_Int_Flag.BITS.EP0SETUP = 0;   
  229. //清除总线复位标志
  230.     Kernel_Flag.BITS.Bus_Reset = 0;
  231. //选择端点0SETUP缓冲区
  232. D14_Cntrl_Reg.D14_ENDPT_INDEX = 0x20;
  233. //读取USB请求
  234. //读取请求类型
  235. USB_Device_Request.bmRequestType =  D14_Cntrl_Reg.D14_DATA_PORT_LSB;
  236. //读取请求号
  237. USB_Device_Request.bRequest = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
  238. //读取16bit请求数据
  239. USB_Device_Request.wValue = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
  240. USB_Device_Request.wValue <<= 8;
  241. USB_Device_Request.wValue |= D14_Cntrl_Reg.D14_DATA_PORT_LSB;
  242. //读取16bit请求索引
  243. USB_Device_Request.wIndex = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
  244. USB_Device_Request.wIndex <<= 8;
  245. USB_Device_Request.wIndex |= D14_Cntrl_Reg.D14_DATA_PORT_LSB;
  246. //读取16bit长度
  247. USB_Device_Request.wLength = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
  248. USB_Device_Request.wLength <<= 8;
  249. USB_Device_Request.wLength |= D14_Cntrl_Reg.D14_DATA_PORT_LSB;
  250. //长度处理(高低8位对调)
  251. Temp = USB_Device_Request.wLength;
  252. USB_Device_Request.wLength = 0;
  253. USB_Device_Request.wLength = (UC) Temp;
  254. USB_Device_Request.wLength <<= 8;
  255. Temp >>= 8;
  256. USB_Device_Request.wLength |= Temp;
  257. type = USB_Device_Request.bmRequestType & 0x60;
  258. req = USB_Device_Request.bRequest & 0x0f;
  259. //厂商请求
  260. if (type == 0x40)
  261. {
  262. Vendor_Specific_Command();//厂商请求处理
  263. }
  264. else if (type == 0x00)
  265. (*StandardDeviceRequest[req])();//调用标准请求
  266. }
  267. //***********************************************************************
  268. //*      *
  269. //* Routine  :                                                 *
  270. //* Input : None                    *
  271. //* Output : None                                 *
  272. //* Function :                                             *
  273. //* *
  274. //***********************************************************************
  275. //厂商请求处理
  276. void Vendor_Specific_Command(void)
  277. {
  278. if(USB_Device_Request.bRequest == 0x0C)
  279. {
  280. switch (USB_Device_Request.wIndex)
  281. {
  282. case GET_FIRMWARE_VERSION  ://获取固件版本
  283. if(USB_Device_Request.wLength == 1)
  284. {
  285. //select endpoint
  286. D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
  287. //set the data length to 1 byte
  288. D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = 1;
  289. D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0;
  290. //sent 0x21 as data
  291. D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x22;//版本号
  292. wait_ep0tx();
  293. ep0out_ack();
  294. // ep0in_ack();
  295. break;
  296. }
  297. case SETUP_DMA_REQUEST :
  298. //Out Token Ack detected
  299. wait_ep0rx();
  300. D14_Cntrl_Reg.D14_ENDPT_INDEX = 0;
  301. //
  302. FileSize.Size.Address[0] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
  303. FileSize.Size.Address[1] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
  304. FileSize.Size.Address[2] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
  305. //读取传输字节数
  306. Temp = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
  307. bytecount = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
  308. bytecount <<= 8;
  309. bytecount |= Temp;
  310. //读取传输方式
  311. FileSize.Size.DIR = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
  312. ep0in_ack();
  313. Kernel_Flag.BITS.Transfer_Start = 1;//标志传输数据开始
  314. break;
  315. case GET_SET_EEPROM_REQUEST  ://对EEPROM操作的请求
  316. //Out Token Ack detected
  317. wait_ep0rx();
  318. D14_Cntrl_Reg.D14_ENDPT_INDEX = 0;
  319. //
  320. FileSize.Size.Address[0] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
  321. FileSize.Size.Address[1] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
  322. FileSize.Size.Address[2] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
  323. //读取传输字节数
  324. Temp = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
  325. bytecount = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
  326. bytecount <<= 8;
  327. bytecount |= Temp;
  328. bytecouter=(UC)bytecount;
  329. //读取传输方式
  330. FileSize.Size.DIR = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
  331. ep0in_ack();
  332. Kernel_Flag.BITS.Transfer_Start = 1;//标志传输数据开始
  333. break;
  334. default :
  335. if(USB_Device_Request.bmRequestType == 0xC0)
  336. {
  337. ep0in_ack();
  338. break;
  339. }
  340. if(USB_Device_Request.bmRequestType == 0x40)
  341. {
  342. D14_Cntrl_Reg.D14_ENDPT_INDEX = 0;
  343. D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;
  344. while(!USB_Int_Flag.BITS.EP0SETUP)
  345. {
  346. //读取ISP1581中断寄存器
  347. USB_Int_Flag.VALUE |= D14_Cntrl_Reg.D14_INT.VALUE;
  348. //回写ISP1581中断寄存器
  349. D14_Cntrl_Reg.D14_INT.VALUE = USB_Int_Flag.VALUE;
  350. if(USB_Int_Flag.BITS.SUSP || USB_Int_Flag.BITS.RESET)
  351. return;
  352. }
  353. USB_Int_Flag.BITS.EP0TX = 0;
  354. break;
  355. }
  356. }
  357. }
  358. }
  359. //***********************************************************************
  360. //*      *
  361. //* Routine  :                                                 *
  362. //* Input : None                    *
  363. //* Output : None                                 *
  364. //* Function :                                             *
  365. //* *
  366. //***********************************************************************
  367. void reserved(void)
  368. {
  369. }
  370. //Get_Descriptor()获取描述符
  371. void get_descriptor(void)
  372. {
  373. switch(USB_Device_Request.wValue)
  374. {
  375. case  1://设备描述符
  376. //选择描述符
  377. if(Kernel_Flag.BITS.HS_FS_State == FULL_SPEED)
  378. Descriptor_Ptr = &Standard_Device_Descriptor[0]; //set pointer to device descriptor
  379. if(Kernel_Flag.BITS.HS_FS_State == HIGH_SPEED)
  380. Descriptor_Ptr = &HS_Device_Descriptor[0]; //set pointer to device descriptor
  381. count = *Descriptor_Ptr; //read in descriptor length
  382. //选择端点号
  383. D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
  384. //写下发送字节数
  385. D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = 0x12;
  386. D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0;
  387. //send descriptor
  388. //发送描述符
  389. while(count != 0)
  390. {
  391. D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
  392. count--;
  393. Descriptor_Ptr++;
  394. }
  395. wait_ep0tx();
  396. ep0out_ack();
  397. break;
  398. case  2        :  //获取配置描述符
  399. USB_Int_Flag.BITS.EP0RX = 0;
  400. Temp = 64;
  401. Descriptor_Ptr = &Standard_Config_Descriptor[0]; //set pointer to configuration descriptor
  402. count = *Descriptor_Ptr; //get configuration Descriptor length
  403. //选择端点号1
  404. D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
  405. //check if only configuration descriptor required
  406. //检查描述符长度,决定是只发送配置描述符还是描述符集合
  407. if(count >= USB_Device_Request.wLength) //Send only Configuration descriptor
  408. {
  409. //写入发送字节数
  410. D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = (UC) USB_Device_Request.wLength;
  411. D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = (UC) (USB_Device_Request.wLength >> 8);
  412. //send descriptor
  413. //发送描述符
  414. for(count = 0 ; count < USB_Device_Request.wLength ; count++)
  415. {
  416. D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
  417. Descriptor_Ptr++;
  418. }
  419. wait_ep0tx();
  420. ep0out_ack();
  421. }
  422. else //send Configuration,Interface and Endpoint descriptor
  423. {
  424. //发送描述符集合(配置+接口+端点)
  425. if(USB_Device_Request.wLength >= 32)
  426. {
  427. //写入配置描述符
  428. while(count != 0)
  429. {
  430. D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
  431. count--;
  432. Descriptor_Ptr++;
  433. }
  434. //选择高速还是全速接口描述符
  435. if(Kernel_Flag.BITS.HS_FS_State == FULL_SPEED)
  436. Descriptor_Ptr = &Bulk_Interface_Descriptor[0]; //set pointer to interface descriptor
  437. if(Kernel_Flag.BITS.HS_FS_State == HIGH_SPEED)
  438. Descriptor_Ptr = &HS_Bulk_Interface_Descriptor[0]; //set pointer to interface descriptor
  439. count = *Descriptor_Ptr; //get the descriptor count
  440. //写入接口描述符
  441. while(count != 0)
  442. {
  443. D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
  444. count--;
  445. Descriptor_Ptr++;
  446. }
  447. //选择高速还是全速端点1IN描述符
  448. if(Kernel_Flag.BITS.HS_FS_State == FULL_SPEED)
  449. Descriptor_Ptr = &Int_In_Descriptor[0]; //set pointer to interface descriptor
  450. if(Kernel_Flag.BITS.HS_FS_State == HIGH_SPEED)
  451. Descriptor_Ptr = &HS_Int_In_Descriptor[0]; //set pointer to interface descriptor
  452. count = *Descriptor_Ptr; //read in descriptor length
  453. //写入端点1IN描述符
  454. while(count != 0)
  455. {
  456. D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
  457. count--;
  458. Descriptor_Ptr++;
  459. }
  460. //选择高速还是全速端点1OUT描述符
  461. if(Kernel_Flag.BITS.HS_FS_State == FULL_SPEED)
  462. Descriptor_Ptr = &Int_Out_Descriptor[0]; //set pointer to interface descriptor
  463. if(Kernel_Flag.BITS.HS_FS_State == HIGH_SPEED)
  464. Descriptor_Ptr = &HS_Int_Out_Descriptor[0]; //set pointer to interface descriptor
  465. count = *Descriptor_Ptr; //read in descriptor length
  466. //写入端点1OUT描述符
  467. while(count != 0)
  468. {
  469. D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
  470. count--;
  471. Descriptor_Ptr++;
  472. }
  473. //选择高速还是全速端点2IN描述符
  474. if(Kernel_Flag.BITS.HS_FS_State == FULL_SPEED)
  475. Descriptor_Ptr = &Bulk_In_Descriptor[0]; //set pointer to interface descriptor
  476. if(Kernel_Flag.BITS.HS_FS_State == HIGH_SPEED)
  477. Descriptor_Ptr = &HS_Bulk_In_Descriptor[0]; //set pointer to interface descriptor
  478. count = *Descriptor_Ptr; //read in descriptor length
  479. //写入端点2IN描述符
  480. while(count != 0)
  481. {
  482. D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
  483. count--;
  484. Descriptor_Ptr++;
  485. }
  486. //选择高速还是全速端点2OUT描述符
  487. if(Kernel_Flag.BITS.HS_FS_State == FULL_SPEED)
  488. Descriptor_Ptr = &Bulk_Out_Descriptor[0]; //set pointer to interface descriptor
  489. if(Kernel_Flag.BITS.HS_FS_State == HIGH_SPEED)
  490. Descriptor_Ptr = &HS_Bulk_Out_Descriptor[0]; //set pointer to interface descriptor
  491. count = *Descriptor_Ptr; //read in descriptor length
  492. //写入端点2OUT描述符
  493. while(count != 0)
  494. {
  495. D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
  496. count--;
  497. Descriptor_Ptr++;
  498. }
  499. }
  500. //使端点有效
  501. D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.VENDP = 1; //validate FIFO
  502. wait_ep0tx();
  503. ep0out_ack();
  504. }
  505. break;
  506. case  3:  //获取字符串描述符
  507. Descriptor_Ptr = &Standard_String_ID[0]; //set pointer to interface descriptor
  508. count = *Descriptor_Ptr; //get length
  509. D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
  510. if(USB_Device_Request.wLength < count)
  511. count = USB_Device_Request.wLength; //get the remaining length
  512. D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = count;
  513. D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0;
  514. //send string ID
  515. while(count != 0)
  516. {
  517. D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr; //fill up FIFO
  518. Descriptor_Ptr++;
  519. count--;
  520. }
  521. wait_ep0tx();
  522. ep0out_ack();
  523. break;
  524. case  4:  
  525. reserved();
  526. break;
  527. case  5:  //获取端点描述符
  528. Temp = 0;
  529. if((USB_Device_Request.wValue & 0x00ff) > 0x0001)
  530. {
  531. D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;
  532. while(!USB_Int_Flag.BITS.EP0SETUP)
  533. {
  534. //读取ISP1581中断寄存器
  535. USB_Int_Flag.VALUE |= D14_Cntrl_Reg.D14_INT.VALUE;
  536. //回写ISP1581中断寄存器
  537. D14_Cntrl_Reg.D14_INT.VALUE = USB_Int_Flag.VALUE;
  538. if(USB_Int_Flag.BITS.SUSP || USB_Int_Flag.BITS.RESET)
  539. return;
  540. }
  541. USB_Int_Flag.BITS.EP0TX = 0;
  542. }
  543. else
  544. {
  545. Descriptor_Ptr = &Bulk_Out_Descriptor[0]; //set pointer to Bulk Out endpoint descriptor
  546. count = *Descriptor_Ptr; //read in descriptor length
  547. D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
  548. if(count >= USB_Device_Request.wLength)
  549. {
  550. Temp = USB_Device_Request.wLength;
  551. //send endpoint descriptor
  552. D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = (UC) Temp;
  553. D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = (UC) (Temp >> 8);
  554. for(count = 0 ; count < USB_Device_Request.wLength ; count++)
  555. {
  556. D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
  557. Descriptor_Ptr++;
  558. }
  559. wait_ep0tx();
  560. ep0out_ack();
  561. }
  562. else
  563. {
  564. USB_Device_Request.wLength -= count; //send Endpoint descriptor
  565. Temp += count;
  566. while(count != 0)
  567. {
  568. D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
  569. count--;
  570. Descriptor_Ptr++;
  571. }
  572. Descriptor_Ptr = &Bulk_In_Descriptor[0]; //set pointer to Bulk In endpoint descriptor
  573. count = *Descriptor_Ptr; //read in descriptor length
  574. if(count >= USB_Device_Request.wLength)
  575. {
  576. Temp += USB_Device_Request.wLength;
  577. //send endpoint descriptor
  578. D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = (UC) Temp;
  579. D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = (UC) (Temp >> 8);
  580. for(count = 0 ; count < USB_Device_Request.wLength ; count++)
  581. {
  582. D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
  583. Descriptor_Ptr++;
  584. }
  585. wait_ep0tx();
  586. ep0out_ack();
  587. }
  588. else
  589. {
  590. USB_Device_Request.wLength -= count; //send Endpoint descriptor
  591. Temp += count;
  592. D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = (UC) Temp;
  593. D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = (UC) (Temp >> 8);
  594. while(count != 0)
  595. {
  596. D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
  597. count--;
  598. Descriptor_Ptr++;
  599. }
  600. wait_ep0tx();
  601. ep0out_ack();
  602. }
  603. }
  604. }
  605. break;
  606. case  6:  //获取设备限制描述符
  607. Descriptor_Ptr = &HS_Device_Qualifier[0]; //set pointer to High Speed device descriptor
  608. count = *Descriptor_Ptr; //read in descriptor length
  609. D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
  610. if(USB_Device_Request.wLength < count)
  611. {
  612. D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = (UC) USB_Device_Request.wLength;
  613. D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0;
  614. count = USB_Device_Request.wLength;
  615. }
  616. else
  617. {
  618. D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = count;
  619. D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0;
  620. }
  621. while(count != 0)
  622. {
  623. D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr; //fill up FIFO
  624. Descriptor_Ptr++;
  625. count--;
  626. };
  627. wait_ep0tx();
  628. ep0out_ack();
  629. break;
  630. case  7  ://获取速度配置描述符
  631. Temp = 64;
  632. Descriptor_Ptr = &Other_Speed_Config_Descriptor[0]; //set pointer to configuration descriptor
  633. count = *Descriptor_Ptr; //get configuration Descriptor length
  634. D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
  635. if(count >= USB_Device_Request.wLength) //Send only Configuration descriptor
  636. {
  637. D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = (UC) USB_Device_Request.wLength;
  638. D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = (UC) (USB_Device_Request.wLength >> 8);
  639. for(count = 0 ; count < USB_Device_Request.wLength ; count++)
  640. {
  641. D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
  642. Descriptor_Ptr++;
  643. }
  644. wait_ep0tx();
  645. ep0out_ack();
  646. }
  647. else //send Configuration,Interface and Endpoint descriptor
  648. {
  649. if(USB_Device_Request.wLength >= 32)
  650. {
  651. while(count != 0)
  652. {
  653. D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
  654. count--;
  655. Descriptor_Ptr++;
  656. }
  657. Descriptor_Ptr = &Bulk_Interface_Descriptor[0]; //set pointer to interface descriptor
  658. count = *Descriptor_Ptr; //get the descriptor count
  659. while(count != 0)
  660. {
  661. D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
  662. count--;
  663. Descriptor_Ptr++;
  664. }
  665. Descriptor_Ptr = &Int_In_Descriptor[0]; //set pointer to interface descriptor
  666. count = *Descriptor_Ptr; //read in descriptor length
  667. while(count != 0)
  668. {
  669. D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
  670. count--;
  671. Descriptor_Ptr++;
  672. }
  673. Descriptor_Ptr = &Int_Out_Descriptor[0]; //set pointer to interface descriptor
  674. count = *Descriptor_Ptr; //read in descriptor length
  675. while(count != 0)
  676. {
  677. D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
  678. count--;
  679. Descriptor_Ptr++;
  680. }
  681. Descriptor_Ptr = &Bulk_In_Descriptor[0]; //set pointer to interface descriptor
  682. count = *Descriptor_Ptr; //read in descriptor length
  683. while(count != 0)
  684. {
  685. D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
  686. count--;
  687. Descriptor_Ptr++;
  688. }
  689. Descriptor_Ptr = &Bulk_Out_Descriptor[0]; //set pointer to interface descriptor
  690. count = *Descriptor_Ptr; //read in descriptor length
  691. while(count != 0)
  692. {
  693. D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
  694. count--;
  695. Descriptor_Ptr++;
  696. }
  697. }
  698. D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.VENDP = 1; //validate FIFO
  699. wait_ep0tx();
  700. ep0out_ack();
  701. }
  702. break;
  703. case  8:  
  704. break;
  705. default  :
  706. D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
  707. D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;
  708. while(!USB_Int_Flag.BITS.EP0SETUP)
  709. {
  710. //读取ISP1581中断寄存器
  711. USB_Int_Flag.VALUE |= D14_Cntrl_Reg.D14_INT.VALUE;
  712. //回写ISP1581中断寄存器
  713. D14_Cntrl_Reg.D14_INT.VALUE = USB_Int_Flag.VALUE;
  714. if(USB_Int_Flag.BITS.SUSP || USB_Int_Flag.BITS.RESET)
  715. return;
  716. }
  717. USB_Int_Flag.BITS.EP0TX = 0;
  718. break;
  719. }
  720. }
  721. //Set_Address设置地址
  722. void set_address(void)
  723. {
  724. USB_Int_Flag.BITS.EP0RX = 0;
  725. D14_Cntrl_Reg.D14_ADDRESS.BITS.DEVADDR = (USB_Device_Request.wValue >> 8);//设置地址
  726. //状态响应
  727. ep0in_ack();
  728. }
  729. //Set_Config设置配置
  730. void set_config(void)
  731. {
  732. USB_Int_Flag.BITS.EP0RX = 0;
  733. if(USB_Device_Request.wValue == 0)
  734. {
  735. Device_Config_Value = 0;
  736. ep0in_ack();
  737. }
  738. else if (USB_Device_Request.wValue ==  0x0100)
  739.     {
  740. //配置设备
  741. Device_Config_Value = (UC) (USB_Device_Request.wValue >> 8);
  742. // USB_Device.BITS.State = USB_Configured;
  743. ep0in_ack();
  744. }
  745. else
  746. {
  747. D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
  748. D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;
  749. while(!USB_Int_Flag.BITS.EP0SETUP)
  750. {
  751. //读取ISP1581中断寄存器
  752. USB_Int_Flag.VALUE |= D14_Cntrl_Reg.D14_INT.VALUE;
  753. //回写ISP1581中断寄存器
  754. D14_Cntrl_Reg.D14_INT.VALUE = USB_Int_Flag.VALUE;
  755. if(USB_Int_Flag.BITS.SUSP || USB_Int_Flag.BITS.RESET)
  756. return;
  757. }
  758. USB_Int_Flag.BITS.EP0TX = 0;
  759. }
  760. }
  761. //Get_Config获取配置
  762. void get_config(void)
  763. {
  764. D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
  765. D14_Cntrl_Reg.D14_DATA_PORT_LSB = Device_Config_Value;
  766. D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.VENDP = 1;
  767. wait_ep0tx();
  768. ep0out_ack();
  769. }
  770. //Clear_Feature特性清除
  771. void clear_feature(void)
  772. {
  773. unsigned char bRecipient = USB_Device_Request.bmRequestType & 0x0f;
  774. //端点
  775. if(bRecipient == 0x02 &&USB_Device_Request.wValue == 0x0000)
  776. {
  777. switch(USB_Device_Request.wIndex)
  778. {
  779. case  0x8000   :
  780. D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
  781. break;
  782. case  0x0000   :
  783. D14_Cntrl_Reg.D14_ENDPT_INDEX = 0;
  784. break;
  785. case  0x8100   :
  786. D14_Cntrl_Reg.D14_ENDPT_INDEX = 3;
  787. break;
  788. case  0x0100   :
  789. D14_Cntrl_Reg.D14_ENDPT_INDEX = 2;
  790. break;
  791. case  0x8200   :
  792. D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;
  793. break;
  794. case  0x0200   :
  795. D14_Cntrl_Reg.D14_ENDPT_INDEX = 4;
  796. break;
  797. case  0x8300   :
  798. D14_Cntrl_Reg.D14_ENDPT_INDEX = 7;
  799. break;
  800. case  0x0300   :
  801. D14_Cntrl_Reg.D14_ENDPT_INDEX = 6;
  802. break;
  803. case  0x8400   :
  804. D14_Cntrl_Reg.D14_ENDPT_INDEX = 9;
  805. break;
  806. case  0x0400   :
  807. D14_Cntrl_Reg.D14_ENDPT_INDEX = 8;
  808. break;
  809. case  0x8500   :
  810. D14_Cntrl_Reg.D14_ENDPT_INDEX = 11;
  811. break;
  812. case  0x0500   :
  813. D14_Cntrl_Reg.D14_ENDPT_INDEX = 10;
  814. break;
  815. case  0x8600   :
  816. D14_Cntrl_Reg.D14_ENDPT_INDEX = 13;
  817. break;
  818. case  0x0600   :
  819. D14_Cntrl_Reg.D14_ENDPT_INDEX = 12;
  820. break;
  821. case  0x8700   :
  822. D14_Cntrl_Reg.D14_ENDPT_INDEX = 15;
  823. break;
  824. case  0x0700   :
  825. D14_Cntrl_Reg.D14_ENDPT_INDEX = 14;
  826. break;
  827. default        :  
  828. break;
  829. }                                                                                                      
  830. D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 0;
  831. Kernel_Flag.BITS.Endpt_Stall = 0;
  832. D14_Cntrl_Reg.D14_ENDPT_TYPE.BITS.ENABLE = OFF; //disable FIFO
  833. D14_Cntrl_Reg.D14_ENDPT_TYPE.BITS.ENABLE = ON; //disable FIFO
  834. ep0in_ack();
  835. USB_Device.BITS.Halt = 0;
  836. }   
  837. else if(bRecipient == 0x00 && USB_Device_Request.wValue == 0x0100)
  838. { //远程唤醒
  839. USB_Device.BITS.Remote_Wakeup = 0;
  840. ep0in_ack();
  841. }
  842. else
  843. {
  844. D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
  845. D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;
  846. while(!USB_Int_Flag.BITS.EP0SETUP)
  847. {
  848. //读取ISP1581中断寄存器
  849. USB_Int_Flag.VALUE |= D14_Cntrl_Reg.D14_INT.VALUE;
  850. //回写ISP1581中断寄存器
  851. D14_Cntrl_Reg.D14_INT.VALUE = USB_Int_Flag.VALUE;
  852. if(USB_Int_Flag.BITS.SUSP || USB_Int_Flag.BITS.RESET)
  853. return;
  854. }
  855. USB_Int_Flag.BITS.EP0TX = 0;
  856. }
  857. }
  858. //Get_Status获取设备状态
  859. void get_status(void)
  860. {
  861. if(USB_Device_Request.bmRequestType == 0x80)
  862. {
  863. //端点0IN返回0x01,0x00两字节
  864. D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
  865. D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = 2;
  866. D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0;
  867. D14_Cntrl_Reg.D14_DATA_PORT_LSB = 1;
  868. D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0;
  869. //等待发送完毕
  870. wait_ep0tx();
  871. ep0out_ack();
  872. }
  873. if(USB_Device_Request.bmRequestType == 0x81)
  874. {
  875. //端点0IN返回0x00,0x00两字节
  876. D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
  877. D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = 2;
  878. D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0;
  879. D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0;
  880. D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0;
  881. wait_ep0tx();
  882. ep0out_ack();
  883. }
  884. if(USB_Device_Request.bmRequestType == 0x82)
  885. {
  886. Temp = 0;
  887. Temp = USB_Device.BITS.Halt;
  888. D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
  889. D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = 2;
  890. D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0;
  891. D14_Cntrl_Reg.D14_DATA_PORT_LSB = (UC) Temp;
  892. D14_Cntrl_Reg.D14_DATA_PORT_MSB = (UC) (Temp >> 8);
  893. wait_ep0tx();
  894. ep0out_ack();
  895. }
  896. }
  897. //Set_Feature特性设置
  898. //不支持测试模式
  899. void set_feature(void)
  900. {
  901. unsigned char bRecipient = USB_Device_Request.bmRequestType & 0x0f;
  902. //端点
  903. if(bRecipient == 0x02 && USB_Device_Request.wValue == 0x0000)
  904. {
  905. switch(USB_Device_Request.wIndex)
  906. {
  907. case  0x8000   :
  908. D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
  909. break;
  910. case  0x0000   :
  911. D14_Cntrl_Reg.D14_ENDPT_INDEX = 0;
  912. break;
  913. case  0x8100   :
  914. D14_Cntrl_Reg.D14_ENDPT_INDEX = 3;
  915. break;
  916. case  0x0100   :
  917. D14_Cntrl_Reg.D14_ENDPT_INDEX = 2;
  918. break;
  919. case  0x8200   :
  920. D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;
  921. break;
  922. case  0x0200   :
  923. D14_Cntrl_Reg.D14_ENDPT_INDEX = 4;
  924. break;
  925. case  0x8300   :
  926. D14_Cntrl_Reg.D14_ENDPT_INDEX = 7;
  927. break;
  928. case  0x0300   :
  929. D14_Cntrl_Reg.D14_ENDPT_INDEX = 6;
  930. break;
  931. case  0x8400   :
  932. D14_Cntrl_Reg.D14_ENDPT_INDEX = 9;
  933. break;
  934. case  0x0400   :
  935. D14_Cntrl_Reg.D14_ENDPT_INDEX = 8;
  936. break;
  937. case  0x8500   :
  938. D14_Cntrl_Reg.D14_ENDPT_INDEX = 11;
  939. break;
  940. case  0x0500   :
  941. D14_Cntrl_Reg.D14_ENDPT_INDEX = 10;
  942. break;
  943. case  0x8600   :
  944. D14_Cntrl_Reg.D14_ENDPT_INDEX = 13;
  945. break;
  946. case  0x0600   :
  947. D14_Cntrl_Reg.D14_ENDPT_INDEX = 12;
  948. break;
  949. case  0x8700   :
  950. D14_Cntrl_Reg.D14_ENDPT_INDEX = 15;
  951. break;
  952. case  0x0700   :
  953. D14_Cntrl_Reg.D14_ENDPT_INDEX = 14;
  954. break;
  955. default        :  
  956. break;
  957. }                                                                                                      
  958. D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;
  959. Kernel_Flag.BITS.Endpt_Stall = 1;
  960. D14_Cntrl_Reg.D14_ENDPT_TYPE.BITS.ENABLE = OFF; //disable FIFO
  961. //D14_Cntrl_Reg.D14_ENDPT_TYPE.BITS.ENABLE = ON; //disable FIFO
  962. ep0in_ack();
  963. USB_Device.BITS.Halt = 0;
  964. }   
  965. else if(bRecipient == 0x00 && USB_Device_Request.wValue == 0x0100)
  966. { //远程唤醒
  967. USB_Device.BITS.Remote_Wakeup = 1;
  968. ep0in_ack();
  969. }
  970. else
  971. {
  972. D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
  973. D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;
  974. while(!USB_Int_Flag.BITS.EP0SETUP)
  975. {
  976. //读取ISP1581中断寄存器
  977. USB_Int_Flag.VALUE |= D14_Cntrl_Reg.D14_INT.VALUE;
  978. //回写ISP1581中断寄存器
  979. D14_Cntrl_Reg.D14_INT.VALUE = USB_Int_Flag.VALUE;
  980. if(USB_Int_Flag.BITS.SUSP || USB_Int_Flag.BITS.RESET)
  981. return;
  982. }
  983. USB_Int_Flag.BITS.EP0TX = 0;
  984. }
  985. }
  986. //Get_Interface 获取接口状态
  987. void get_interface(void)
  988. {
  989. if(USB_Device_Request.wValue != 0)
  990. {
  991. D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;
  992. while(!USB_Int_Flag.BITS.EP0SETUP)
  993. {
  994. //读取ISP1581中断寄存器
  995. USB_Int_Flag.VALUE |= D14_Cntrl_Reg.D14_INT.VALUE;
  996. //回写ISP1581中断寄存器
  997. D14_Cntrl_Reg.D14_INT.VALUE = USB_Int_Flag.VALUE;
  998. if(USB_Int_Flag.BITS.SUSP || USB_Int_Flag.BITS.RESET)
  999. return;
  1000. }
  1001. USB_Int_Flag.BITS.EP0TX = 0;
  1002. }
  1003. else
  1004. {
  1005. D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
  1006. D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = 1;
  1007. D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0;
  1008. if(!USB_Device.BITS.Alter_Interface)
  1009. D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0;
  1010. else
  1011. D14_Cntrl_Reg.D14_DATA_PORT_LSB = 1;
  1012. wait_ep0tx();
  1013. ep0in_ack();
  1014. }
  1015. }
  1016. //Set_Interface 设置接口状态
  1017. void set_interface(void)
  1018. {
  1019. if(USB_Device_Request.wIndex == 0 && USB_Device_Request.wValue == 0x0100)
  1020. USB_Device.BITS.Alter_Interface = 1;
  1021. if(USB_Device_Request.wIndex == 0x0100 && USB_Device_Request.wValue == 0)
  1022. USB_Device.BITS.Alter_Interface = 0;
  1023. if(USB_Device_Request.wIndex == 0 && USB_Device_Request.wValue == 0)
  1024. USB_Device.BITS.Alter_Interface = 0;
  1025. ep0in_ack();
  1026. }
  1027. //端点0IN状态响应
  1028. void ep0in_ack(void)
  1029. {
  1030. D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
  1031. D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STATUS = 1;
  1032. wait_ep0tx();
  1033. }
  1034. //端点0IN状态响应
  1035. void wait_ep0tx(void)
  1036. {
  1037. //end of status stage
  1038. while(!USB_Int_Flag.BITS.EP0TX)
  1039. {
  1040. //读取ISP1581中断寄存器
  1041. USB_Int_Flag.VALUE |= D14_Cntrl_Reg.D14_INT.VALUE;
  1042. //回写ISP1581中断寄存器
  1043. D14_Cntrl_Reg.D14_INT.VALUE = USB_Int_Flag.VALUE;
  1044. if(USB_Int_Flag.BITS.SUSP || USB_Int_Flag.BITS.RESET)
  1045. return;
  1046. }
  1047. USB_Int_Flag.BITS.EP0TX = 0;
  1048. }
  1049. //端点0OUT状态响应
  1050. void ep0out_ack(void)
  1051. {
  1052. //设置状态响应
  1053. //acknowledge status stage
  1054. D14_Cntrl_Reg.D14_ENDPT_INDEX = 0;
  1055. D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STATUS = 1;
  1056. // D14_Cntrl_Reg.D14_CONTROL_FUNCTION.VALUE = 2;
  1057. wait_ep0rx();
  1058. }
  1059. //端点0OUT状态响应
  1060. void wait_ep0rx(void)
  1061. {
  1062. while(!USB_Int_Flag.BITS.EP0RX)
  1063. {
  1064. //读取ISP1581中断寄存器
  1065. USB_Int_Flag.VALUE |= D14_Cntrl_Reg.D14_INT.VALUE;
  1066. //回写ISP1581中断寄存器
  1067. D14_Cntrl_Reg.D14_INT.VALUE = USB_Int_Flag.VALUE;
  1068. if(USB_Int_Flag.BITS.SUSP || USB_Int_Flag.BITS.RESET)
  1069. return;
  1070. }
  1071. USB_Int_Flag.BITS.EP0RX = 0;
  1072. }
  1073. #pragma disable
  1074. /*
  1075. unsigned int read_endpoint(unsigned char endp,unsigned int len,unsigned char *buf)
  1076. {
  1077. unsigned int datalen;
  1078. D14_Cntrl_Reg.D14_ENDPT_INDEX = endp;
  1079. len = D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB;
  1080. len <<= 8;
  1081. len += D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB;
  1082. datalen=len;
  1083. while(datalen-- != 0)
  1084. {
  1085. *buf = D14_Cntrl_Reg.D14_DATA_PORT_LSB; //fill up FIFO
  1086. buf++;
  1087. }
  1088. return len;
  1089. }
  1090. unsigned int write_endpoint(unsigned char endp,unsigned int len,unsigned char *buf)
  1091. {
  1092. unsigned int datalen;
  1093. D14_Cntrl_Reg.D14_ENDPT_INDEX = endp;
  1094. D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = (unsigned char) len;
  1095. D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = (unsigned char) (len>>8);
  1096. datalen=len;
  1097. while(datalen-- != 0)
  1098. {
  1099. D14_Cntrl_Reg.D14_DATA_PORT_LSB = *buf; //fill up FIFO
  1100. buf++;
  1101. }
  1102. return len;
  1103. }*/
  1104. void delay()
  1105. {
  1106. UC i,j;
  1107. for(i=0;i<200;i++)
  1108. for(j=0;j<200;j++);
  1109. }
  1110. void rt2_process()
  1111. {
  1112. UC  i,j;
  1113. if(USB_Device_Request.wIndex==GET_SET_EEPROM_REQUEST)
  1114. {
  1115. USB_Device_Request.wValue=USB_Device_Request.wValue>>8;
  1116. if(bytecouter>8)
  1117. {
  1118. j=bytecouter/8;
  1119. for(i=0;i<j;i++)
  1120. {
  1121. ISendStr(0xa0,((UC)(USB_Device_Request.wValue+(i*8))),&Endpt_FIFO[i*8],8);
  1122. delay();
  1123. }
  1124. j=bytecouter%8;
  1125. ISendStr(0xa0,((UC)(USB_Device_Request.wValue+(i*8))),&Endpt_FIFO[i*8],j);
  1126. delay();
  1127. }
  1128. else
  1129. ISendStr(0xa0,(UC)USB_Device_Request.wValue,Endpt_FIFO,bytecouter);
  1130. delay();
  1131. }
  1132. for(i=0;i<64;i++)
  1133. Endpt_FIFO[i]=0;
  1134. ZLG7290_SendBuf(disp_buf1,8);
  1135. delay();
  1136. }
  1137. void tt2_process()
  1138. {
  1139. if(USB_Device_Request.wIndex==GET_SET_EEPROM_REQUEST)
  1140. {
  1141. USB_Device_Request.wValue=USB_Device_Request.wValue>>8;
  1142. IRcvStr(0xa0,(UC)USB_Device_Request.wValue,Endpt_FIFO,bytecouter);
  1143. delay();
  1144. ZLG7290_SendBuf(disp_buf0,8);
  1145. delay();
  1146. }
  1147. }