chap_9.c
上传用户:ids068
上传日期:2013-04-04
资源大小:639k
文件大小:32k
源码类别:

USB编程

开发平台:

C/C++

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