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

USB编程

开发平台:

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