usbhidio.lst
上传用户:gaoyannt
上传日期:2007-01-09
资源大小:62k
文件大小:88k
源码类别:

USB编程

开发平台:

Visual Basic

  1. CYASM Version 1.75
  2. (C) 1997 Cypress Semiconductor Corp.
  3. 0000            ;Filename: usbhidio.asm
  4. 0000            ;Version: 1.3
  5. 0000            ;Date: 11/5/99
  6. 0000            ;Copyright 1999 by Jan Axelson (jan@lvr.com)
  7. 0000            ;
  8. 0000            ;Chip: Cypress Semiconductor CY7C63001 USB Microcontroller
  9. 0000            ;Assembler: cyasm.exe
  10. 0000            ;Purpose: demonstrates USB communications with an HID-class device
  11. 0000            ;Description:
  12. 0000            ;Handles all required standard USB and HID-class requests.
  13. 0000            ;Receives data from the host in output reports
  14. 0000            ;using Interrupt transfers on endpoint 1.
  15. 0000            ;Sends data to the host in input reports
  16. 0000            ;using Control transfers on endpoint 0
  17. 0000            ;(because the chip doesn't support OUT transfers on endpoint 1).
  18. 0000            ;I used Cypress Semiconductor's js50.asm joystick example code as a base 
  19. 0000            ;in creating this program.
  20. 0000            ;The companion host software is the Visual-Basic project usbhidio.vbp.
  21. 0000            ;For more information, visit Lakeview Research at http://www.lvr.com .
  22. 0000            ;Send comments, bug reports, etc. to jan@lvr.com .
  23. 0000            
  24. 0000            ;Changes:
  25. 0000            
  26. 0000            ;V1.3: 11/20/99
  27. 0000            ;The length of the string descriptors is now correct.
  28. 0000            ;(Thanks, John Hyde)
  29. 0000            ;Changed the control_read routine to prevent error when sending a 
  30. 0000            ;multiple of 8 bytes.
  31. 0000            ;(Thanks, Dave Wright)
  32. 0000            
  33. 0000            ;V1.2:
  34. 0000            ;added watchdog resets in wait loops,
  35. 0000            ;no watchdog reset in the 1-msec. timer ISR.
  36. 0000            
  37. 0000            ;V1.1:
  38. 0000            ;Clears the watchdog only in the main routine
  39. 0000            ;(so the watchdog will detect if the main routine crashes).
  40. 0000            ;Some additions to the comments.
  41. 0000            
  42. 0000            ;V1.0:
  43. 0000            ;Clears the Watchdog timer on 1-msec. interrupt.
  44. 0000            ;(Not needed on the development board, but needed for stand-alone.)
  45. 0000            ;The Endpoint 1 ISR now sets bit 7 of Endpoint 1 TX config to 1.
  46. 0000            ;(The bit is cleared on EP1 interrupt.)
  47. 0000            
  48. 0000            ;======================================================================
  49. 0000            ;assembler directives (equates)
  50. 0000            ;======================================================================
  51. 0000            
  52. 0000            ;----------------------------------------------------------------------
  53. 0000            ;I/O registers
  54. 0000            ;----------------------------------------------------------------------
  55. 0000            
  56. 0000            ;I/O ports
  57. 0000            Port0_Data:            equ     00h      ; GPIO data port 0
  58. 0000            Port1_Data:            equ     01h      ; GPIO data port 1
  59. 0000            Port0_Interrupt:       equ     04h      ; Interrupt enable for port 0
  60. 0000            Port1_Interrupt:       equ     05h      ; Interrupt enable for port 1
  61. 0000            Port0_Pullup:          equ     08h      ; Pullup resistor control for port 0
  62. 0000            Port1_Pullup:          equ     09h      ; Pullup resistor control for port 1
  63. 0000            
  64. 0000            ;USB ports
  65. 0000            USB_EP0_TX_Config:      equ     10h     ; USB EP0 transmit configuration
  66. 0000            USB_EP1_TX_Config:      equ     11h     ; USB EP1 transmit configuration
  67. 0000            USB_Device_Address:     equ     12h     ; USB device address assigned by host
  68. 0000            USB_Status_Control:     equ     13h     ; USB status and control register
  69. 0000            USB_EP0_RX_Status:      equ     14h     ; USB EP0 receive status
  70. 0000            
  71. 0000            ;Control ports
  72. 0000            Global_Interrupt:       equ     20h     ; Global interrupt enable
  73. 0000            Watchdog:               equ     21h     ; clear watchdog Timer
  74. 0000            Timer:                  equ     23h     ; free-running Timer
  75. 0000            
  76. 0000            ;GPIO Isink registers
  77. 0000            Port0_Isink:            equ     30h
  78. 0000            Port0_Isink0:           equ     30h
  79. 0000            Port0_Isink1:           equ     31h
  80. 0000            Port0_Isink2:           equ     32h
  81. 0000            Port0_Isink3:           equ     33h
  82. 0000            Port0_Isink4:           equ     34h
  83. 0000            Port0_Isink5:           equ     35h
  84. 0000            Port0_Isink6:           equ     36h
  85. 0000            Port0_Isink7:           equ     37h
  86. 0000            Port1_Isink:            equ     38h
  87. 0000            Port1_Isink0:           equ     38h
  88. 0000            Port1_Isink1:           equ     39h
  89. 0000            Port1_Isink2:           equ     3Ah
  90. 0000            Port1_Isink3:           equ     3Bh
  91. 0000            
  92. 0000            ;Control port
  93. 0000            Status_Control:         equ     FFh
  94. 0000            
  95. 0000            ;----------------------------------------------------------------------
  96. 0000            ;Register bit values
  97. 0000            ;----------------------------------------------------------------------
  98. 0000            
  99. 0000            ;CPU Status and Control (Status_Control)
  100. 0000            RunBit:                 equ     1h     ; CPU Run bit
  101. 0000            USBReset:               equ    20h     ; USB Bus Reset bit
  102. 0000            WatchDogReset:          equ    40h     ; Watchdog Reset bit
  103. 0000            
  104. 0000            ; USB EP1 transmit configuration (USB_EP1_TX_Config)
  105. 0000            DataToggle:               equ     40h     ; Data 0/1 bit
  106. 0000            
  107. 0000            DISABLE_REMOTE_WAKEUP:  equ   0         ; bit[1] = 0
  108. 0000            ENABLE_REMOTE_WAKEUP:   equ   2         ; bit[1] = 1
  109. 0000            
  110. 0000            ;----------------------------------------------------------------------
  111. 0000            ;Interrupt masks
  112. 0000            ;----------------------------------------------------------------------
  113. 0000            
  114. 0000            ;The timer-only mask enables the 1-millisecond timer interrupt.
  115. 0000            TIMER_ONLY:               equ      4h
  116. 0000            
  117. 0000            ;The enumerate mask enables the following interrupts:
  118. 0000            ;1-millisecond timer, USB Endpoint 0
  119. 0000            ENUMERATE_MASK:          equ     0Ch
  120. 0000            
  121. 0000            ;The runtime mask enables the following interrupts:
  122. 0000            ;1-millisecond timer, USB Endpoint 0, USB Endpoint 1, GPIO
  123. 0000            RUNTIME_MASK:          equ     5Ch
  124. 0000            
  125. 0000            ;----------------------------------------------------------------------
  126. 0000            ; USB Constants
  127. 0000            ; from the USB Spec v1.1
  128. 0000            ;----------------------------------------------------------------------
  129. 0000            
  130. 0000            ;standard request codes
  131. 0000            get_status:             equ   0
  132. 0000            clear_feature:          equ   1
  133. 0000            set_feature:            equ   3
  134. 0000            set_address:            equ   5
  135. 0000            get_descriptor:         equ   6
  136. 0000            set_descriptor:         equ   7
  137. 0000            get_configuration:      equ   8
  138. 0000            set_configuration:      equ   9
  139. 0000            get_interface:          equ  10
  140. 0000            set_interface:          equ  11
  141. 0000            synch_frame:            equ  12
  142. 0000            
  143. 0000            ; standard descriptor types
  144. 0000            device:              equ  1
  145. 0000            configuration:       equ  2
  146. 0000            string:              equ  3
  147. 0000            interface:           equ  4
  148. 0000            endpoint:            equ  5
  149. 0000            
  150. 0000            ; standard feature selectors
  151. 0000            endpoint_stalled:       equ  0              ; recipient endpoint
  152. 0000            device_remote_wakeup:   equ  1              ; recipient device
  153. 0000            
  154. 0000            ;----------------------------------------------------------------------
  155. 0000            ;HID-class descriptors
  156. 0000            ;from HID Class Definition v1.1 Draft
  157. 0000            ;----------------------------------------------------------------------
  158. 0000            
  159. 0000            ;Class-specific descriptor types from section 7.1 Standard Requests
  160. 0000            HID:                    equ  21h
  161. 0000            report:                 equ  22h
  162. 0000            physical:               equ  23h
  163. 0000              
  164. 0000            ;Class-specific request codes from section 7.2 Class Specific Requests
  165. 0000            get_report:             equ   1
  166. 0000            get_idle:               equ   2
  167. 0000            get_protocol:           equ   3
  168. 0000            set_report:             equ   9
  169. 0000            set_idle:               equ  10
  170. 0000            set_protocol:           equ  11
  171. 0000            
  172. 0000            ;----------------------------------------------------------------------
  173. 0000            ;USB buffer bytes
  174. 0000            ;----------------------------------------------------------------------
  175. 0000            
  176. 0000            ;Control Endpoint 0 buffer
  177. 0000            Endpoint_0:             equ  70h        ; control endpoint
  178. 0000            Endpoint0_Byte0:        equ  70h        ; Endpoint 0, byte 0
  179. 0000            Endpoint0_Byte1:        equ  71h        ; Endpoint 0 byte 1
  180. 0000            Endpoint0_Byte2:        equ  72h        ; Endpoint 0 byte 2
  181. 0000            Endpoint0_Byte3:        equ  73h        ; Endpoint 0 byte 3
  182. 0000            Endpoint0_Byte4:        equ  74h        ; Endpoint 0 byte 4
  183. 0000            Endpoint0_Byte5:        equ  75h        ; Endpoint 0 byte 5
  184. 0000            Endpoint0_Byte6:        equ  76h        ; Endpoint 0 byte 6
  185. 0000            Endpoint0_Byte7:        equ  77h        ; Endpoint 0 byte 7
  186. 0000            
  187. 0000            
  188. 0000            ;Endpoint 0 SETUP packet bytes
  189. 0000            bmRequestType:          equ  70h
  190. 0000            bRequest:               equ  71h
  191. 0000            wValue:                 equ  72h        ; default wValue (8 bits)
  192. 0000            wValueHi:               equ  73h
  193. 0000            wIndex:                 equ  74h        ; default wIndex (8 bits)
  194. 0000            wIndexHi:               equ  75h
  195. 0000            wLength:                equ  76h        ; default wLength (8 bits)
  196. 0000            wLengthHi:              equ  77h
  197. 0000            
  198. 0000            ;Endpoint 1 buffer
  199. 0000            endpoint_1:             equ  78h
  200. 0000            Endpoint1_Byte0:        equ  78h        ; Endpoint 1, byte 0
  201. 0000            Endpoint1_Byte1:        equ  79h        ; Endpoint 1 byte 1
  202. 0000            Endpoint1_Byte2:        equ  7Ah        ; Endpoint 1 byte 2
  203. 0000            Endpoint1_Byte3:        equ  7Bh        ; Endpoint 1 byte 3
  204. 0000            Endpoint1_Byte4:        equ  7Ch        ; Endpoint 1 byte 4
  205. 0000            Endpoint1_Byte5:        equ  7Dh        ; Endpoint 1 byte 5
  206. 0000            Endpoint1_Byte6:        equ  7Eh        ; Endpoint 1 byte 6
  207. 0000            Endpoint1_Byte7:        equ  7Fh        ; Endpoint 1 byte 7
  208. 0000            
  209. 0000            ;----------------------------------------------------------------------
  210. 0000            ; Variables stored in data memory
  211. 0000            ;----------------------------------------------------------------------
  212. 0000            ;USB status
  213. 0000            remote_wakeup_status:   equ  30h          ;0=disabled, 2-enabled
  214. 0000            configuration_status:   equ  31h          ;0=unconfigured, 1=configured
  215. 0000            ;idle_status:           equ  33h          ;support SetIdle and GetIdle
  216. 0000            protocol_status:        equ  34h          ;0=boot protocol, 1=report protocol
  217. 0000            
  218. 0000            ;Other variables:
  219. 0000            suspend_counter:        equ  35h          ;number of idle bus milliseconds 
  220. 0000            loop_temp:              equ  37h          ;temporary loop variable
  221. 0000            start_send:             equ  32h          ;0=false, 1=true
  222. 0000            
  223. 0000            ;Received data:
  224. 0000            Data_Byte0:               equ  38h
  225. 0000            Data_Byte1:               equ  39h
  226. 0000            Data_Byte2:               equ  3Ah
  227. 0000            Data_Byte3:               equ  3Bh
  228. 0000            Data_Byte4:               equ  3Ch
  229. 0000            Data_Byte5:               equ  3Dh
  230. 0000            Data_Byte6:               equ  3Eh
  231. 0000            Data_Byte7:               equ  3Fh
  232. 0000            
  233. 0000            temp:                   equ  25h
  234. 0000            start_time:             equ  21h
  235. 0000            testbit:                equ  22h
  236. 0000            interrupt_mask:         equ  20h
  237. 0000            endp0_data_toggle:      equ  23h
  238. 0000            loop_counter:           equ  24h
  239. 0000            data_start:             equ  27h
  240. 0000            data_count:             equ  28h
  241. 0000            endpoint_stall:         equ  29h
  242. 0000            
  243. 0000            ;======================================================================
  244. 0000            ;interrupt vectors
  245. 0000            ;======================================================================
  246. 0000            
  247. 0000            org  00h                ; Reset vector; begin here after a reset.
  248. 0000 80 99 [05] jmp  Reset
  249. 0002            
  250. 0002            org  02h                ; 128-microsecond interrupt
  251. 0002 80 10 [05] jmp  DoNothing_ISR
  252. 0004            
  253. 0004            org  04h                ; 1024-millisecond interrupt 
  254. 0004 80 15 [05] jmp  One_mSec_ISR
  255. 0006            
  256. 0006            org  06h                ; endpoint 0 interrupt 
  257. 0006 81 24 [05] jmp  USB_EP0_ISR
  258. 0008            
  259. 0008            org  08h                ; endpoint 1 interrupt 
  260. 0008 80 8C [05] jmp  USB_EP1_ISR
  261. 000A            
  262. 000A            org  0Ah                ; reserved interrupt 
  263. 000A 80 99 [05] jmp  Reset
  264. 000C            
  265. 000C            org  0Ch                ; general purpose I/O interrupt 
  266. 000C 80 85 [05] jmp  GPIO_ISR           ; not used
  267. 000E            
  268. 000E            org  0Eh                ; Wakeup_ISR or resume interrupt 
  269. 000E 80 10 [05] jmp  DoNothing_ISR      ; not used
  270. 0010            
  271. 0010            ORG  10h
  272. 0010            
  273. 0010            ;======================================================================
  274. 0010            ;Interrupt routines
  275. 0010            ;======================================================================
  276. 0010            
  277. 0010            ;----------------------------------------------------------------------
  278. 0010            ; 128-microsecond interrupt, Cext
  279. 0010            ; Unused. If this interrupt occurs, just push the accumulator (because
  280. 0010            ; ipret pops it) and re-enable the interrupts.
  281. 0010            ;----------------------------------------------------------------------
  282. 0010            
  283. 0010            DoNothing_ISR:
  284. 0010 2D    [05]      push A
  285. 0011                 ;Enable interrupts and return
  286. 0011 1A 20 [06]      mov A,[interrupt_mask]
  287. 0013 1E 20 [13]      ipret Global_Interrupt
  288. 0015            
  289. 0015            ;----------------------------------------------------------------------
  290. 0015            ; 1-millisecond interrupt
  291. 0015            ; Check to see if the chip is in suspend mode and take appropriate action.
  292. 0015            ; Copy values to Endpoint 1's buffer for sending.
  293. 0015            ;----------------------------------------------------------------------
  294. 0015            
  295. 0015            One_mSec_ISR:
  296. 0015 2D    [05]      push A
  297. 0016 2A 21 [05] iowr Watchdog
  298. 0018            ;Find out if enumeration is complete.
  299. 0018            ;If enumerating is in progress, loop_temp = 0.
  300. 0018 1A 37 [06]      mov A, [loop_temp]
  301. 001A 16 00 [04]      cmp A, 0h
  302. 001C            ;If enumeration is still in progress, jump.
  303. 001C A0 20 [05]      jz not_main
  304. 001E            ;Enumeration has ended, so decrement the loop counter
  305. 001E            ;(so it no longer = 0).
  306. 001E 27 37 [07]      dec [loop_temp]
  307. 0020            
  308. 0020            not_main:                         
  309. 0020            ;Check for bus activity.
  310. 0020 29 13 [05]      iord USB_Status_Control
  311. 0022 10 01 [04]      and A, 01h
  312. 0024 16 00 [04]      cmp A,0h
  313. 0026            ;If no bus activity, increment the suspend counter.
  314. 0026 A0 34 [05]      jz Inc_counter
  315. 0028            ;If bus activity detected, clear the bus-activity bit,
  316. 0028 29 13 [05]      iord USB_Status_Control
  317. 002A 10 FE [04]      and A, 0FEh
  318. 002C 2A 13 [05]      iowr USB_Status_Control
  319. 002E            ;and clear the suspend counter.
  320. 002E 19 00 [04]      mov A, 0h
  321. 0030 31 35 [05]      mov [suspend_counter], A
  322. 0032 80 57 [05]      jmp Suspend_end
  323. 0034            
  324. 0034            Inc_counter:
  325. 0034            ;Keep track of the amount of time with no bus activity.
  326. 0034 23 35 [07]      inc [suspend_counter]
  327. 0036            ;Get the number of milliseconds the bus has been idle.
  328. 0036 1A 35 [06]      mov A, [suspend_counter]
  329. 0038            ;Has it been 3 milliseconds?
  330. 0038 16 03 [04]      cmp A, 03h
  331. 003A            ;If no, there's nothing else to do.
  332. 003A B0 57 [05]      jnz Suspend_end
  333. 003C            ;If yes, put the chip in Suspend mode.
  334. 003C            ;Clear the Suspend counter.
  335. 003C 19 00 [04]      mov A, 0h
  336. 003E 31 35 [05]      mov [suspend_counter], A
  337. 0040            ;Enable pullups on Port 1; disable the output DAC.
  338. 0040 19 00 [04]      mov A, 0h
  339. 0042 2A 09 [05]      iowr Port1_Pullup
  340. 0044 19 FF [04]      mov A, 0ffh
  341. 0046 2A 01 [05]      iowr Port1_Data
  342. 0048            ;Set the Suspend bit. 
  343. 0048 29 FF [05]      iord Status_Control
  344. 004A 0D 08 [04]      or A, 08h
  345. 004C 2A FF [05]      iowr Status_Control
  346. 004E            ;The chip is now in Suspend mode. 
  347. 004E            ;On exiting Suspend mode, the chip will begin 
  348. 004E            ;executing instructions here:
  349. 004E 20    [04]      nop     
  350. 004F            ;Disable pullups on Port 1. Enable the output DAC.
  351. 004F 19 FF [04]      mov A, 0ffh
  352. 0051 2A 09 [05]      iowr Port1_Pullup
  353. 0053 19 00 [04]      mov A, 0h
  354. 0055 2A 01 [05]      iowr Port1_Data
  355. 0057            
  356. 0057            Suspend_end:
  357. 0057            ;Is endpoint 1 enabled?
  358. 0057 29 11 [05]      iord USB_EP1_TX_Config
  359. 0059 16 00 [04]      cmp A,0
  360. 005B            ;If no, do nothing.
  361. 005B A0 7D [05]      jz Select
  362. 005D            ;If yes, is start_send = 1?
  363. 005D            ;(Start_send adds a short delay after enumeration.)
  364. 005D 1A 32 [06]      mov A, [start_send]
  365. 005F 16 01 [04]      cmp A, 01h
  366. 0061            ;If no, do nothing
  367. 0061 B0 7D [05]      jnz Select
  368. 0063            ;If yes, send data:
  369. 0063 80 65 [05]      jmp send_value
  370. 0065            
  371. 0065            send_value:
  372. 0065            ;Copies values from RAM into Endpoint 1's buffer
  373. 0065            ;and enables sending the bytes on the next poll.
  374. 0065            
  375. 0065            ;disable Endpoint 1 interrupts
  376. 0065 1A 20 [06]      mov A,[interrupt_mask]
  377. 0067 10 EF [04]      and A, EFh
  378. 0069 31 20 [05]      mov [interrupt_mask],A
  379. 006B 2A 20 [05]      iowr Global_Interrupt
  380. 006D            
  381. 006D            ;Copy values from RAM to Endpoint 1's buffer for transmitting to the host.
  382. 006D            ;Two bytes:
  383. 006D 1A 38 [06]      mov A, [Data_Byte0]
  384. 006F 31 78 [05]      mov [Endpoint1_Byte0], A
  385. 0071 1A 39 [06]      mov A, [Data_Byte1]
  386. 0073 31 79 [05]      mov [Endpoint1_Byte1], A
  387. 0075            ;Add more bytes if the report format specifies it:
  388. 0075            ;     mov A, [Data_Byte2]
  389. 0075            ;     mov [Endpoint1_Byte2], A
  390. 0075            ;     mov A, [Data_Byte3]
  391. 0075            ;     mov [Endpoint1_Byte3], A
  392. 0075            ;     mov A, [Data_Byte4]
  393. 0075            ;     mov [Endpoint1_Byte4], A
  394. 0075            ;     mov A, [Data_Byte5]
  395. 0075            ;     mov [Endpoint1_Byte5], A
  396. 0075            ;     mov A, [Data_Byte6]
  397. 0075            ;     mov [Endpoint1_Byte6], A
  398. 0075            ;     mov A, [Data_Byte7]
  399. 0075            ;     mov [Endpoint1_Byte7], A
  400. 0075            
  401. 0075            ;Other things to try:
  402. 0075            ;Set the value at Port 0 to equal byte 0 in Endpoint 1's buffer:
  403. 0075            ;     iord Port0_Data
  404. 0075            ;     mov [Endpoint1_Byte0], A
  405. 0075            
  406. 0075            ;Or set a value here and copy to Endpoint 1's buffer, byte 1:
  407. 0075            ;     mov A, A5h
  408. 0075            ;      mov [Endpoint1_Byte1], A
  409. 0075            
  410. 0075            ;Configure Endpoint 1's transmit register 
  411. 0075            ;so that the bytes will transmit on the next poll.
  412. 0075 29 11 [05]      iord USB_EP1_TX_Config
  413. 0077            ;Don't change the Data 0/1 bit.
  414. 0077 10 40 [04]      and A,40h
  415. 0079            ;Set bits 4 and 7 to 1 enable transmitting.
  416. 0079            ;The low nibble is the number of data bytes (2).
  417. 0079 0D 92 [04]      or A,92h
  418. 007B 2A 11 [05]      iowr USB_EP1_TX_Config
  419. 007D            
  420. 007D            Select:
  421. 007D            ;Enable Endpoint 1 interrupts.
  422. 007D 1A 20 [06]      mov A,[interrupt_mask]
  423. 007F 0D 10 [04]      or A, 10h
  424. 0081 31 20 [05]      mov [interrupt_mask],A
  425. 0083 1E 20 [13]      ipret Global_Interrupt
  426. 0085            
  427. 0085            ;----------------------------------------------------------------------
  428. 0085            ;GPIO interrupt
  429. 0085            ;Can be configured to trigger when a port bit toggles.
  430. 0085            ;Unused here.
  431. 0085            ;----------------------------------------------------------------------
  432. 0085            
  433. 0085            GPIO_ISR:
  434. 0085 2D    [05]      push A
  435. 0086 2E    [05]      push X
  436. 0087            
  437. 0087 2C    [04]      pop X
  438. 0088 31 20 [05]      mov [interrupt_mask],A
  439. 008A 1E 20 [13]      ipret Global_Interrupt
  440. 008C            
  441. 008C            ;----------------------------------------------------------------------
  442. 008C            ;Endpoint 1 ISR
  443. 008C            ;Endpoint 1 can do IN (device to host) transfers only.
  444. 008C            ;This interrupt triggers when the host acknowledges
  445. 008C            ;receiving data from endpoint 1.
  446. 008C            ;The ISR toggles the data 0/1 bit for the next transaction and
  447. 008C            ;sets the EnableRespondToIN bit so the chip will respond to the 
  448. 008C            ;next poll of the endpoint.
  449. 008C            ;----------------------------------------------------------------------
  450. 008C            
  451. 008C            USB_EP1_ISR:
  452. 008C 2D    [05]      push A
  453. 008D            ;Toggle the data 0/1 bit so it's correct for the next transaction.
  454. 008D 29 11 [05]      iord USB_EP1_TX_Config  
  455. 008F 13 40 [04]      xor A,40h
  456. 0091            ;The interrupt clears the EnableRespondToIN bit (bit 7) in the TX Config.
  457. 0091            ;Set this bit to 1 so data will go out on the next poll.
  458. 0091 0D 92 [04]      or A, 92h
  459. 0093 2A 11 [05]      iowr USB_EP1_TX_Config
  460. 0095            ;Enable interrupts and return.
  461. 0095 1A 20 [06]      mov A, [interrupt_mask]
  462. 0097 1E 20 [13]      ipret Global_Interrupt
  463. 0099            
  464. 0099            ;----------------------------------------------------------------------
  465. 0099            ; Reset processing
  466. 0099            ; Triggers on Reset or "reserved" interrupt.
  467. 0099            ;To be safe, initialize everything.
  468. 0099            ;----------------------------------------------------------------------
  469. 0099            
  470. 0099            Reset:
  471. 0099            ;Place the data stack pointer at the lowest address of Endpoint 0's buffer.
  472. 0099            ;This keeps the stack from writing over the USB buffers.
  473. 0099            ;The USB buffers are in high RAM;
  474. 0099            ;the data stack pointer pre-decrements on a Push instruction.
  475. 0099            
  476. 0099 19 70 [04]      mov A, Endpoint_0
  477. 009B 30    [05]      swap A, dsp
  478. 009C            
  479. 009C            ;Initialize to FFh
  480. 009C 19 FF [04]      mov A, 0ffh
  481. 009E 2A 00 [05]      iowr Port0_Data                 ; output ones to port 0
  482. 00A0 2A 09 [05]      iowr Port1_Pullup               ; disable port 1 pullups
  483. 00A2                                                 ; select rising edge interrupts
  484. 00A2 2A 38 [05]      iowr Port1_Isink0               ; maximum isink current Port1 bit 0
  485. 00A4 2A 39 [05]      iowr Port1_Isink1               ; maximum isink current Port1 bit 1
  486. 00A6 2A 3A [05]      iowr Port1_Isink2               ; maximum isink current Port1 bit 2
  487. 00A8 2A 3B [05]      iowr Port1_Isink3               ; maximum isink current Port1 bit 3
  488. 00AA            
  489. 00AA            ;Initialize to 00h
  490. 00AA 19 00 [04]      mov A, 0h
  491. 00AC 2A 01 [05]      iowr Port1_Data                 ; output zeros to port 1
  492. 00AE 2A 04 [05]      iowr Port0_Interrupt            ; disable port 0 interrupts
  493. 00B0 2A 08 [05]      iowr Port0_Pullup               ; enable port 0 pullups
  494. 00B2 2A 30 [05]      iowr Port0_Isink0               ; minimum sink current Port0 bit 0
  495. 00B4 2A 31 [05]      iowr Port0_Isink1               ; minimum sink current Port0 bit 1
  496. 00B6 2A 32 [05]      iowr Port0_Isink2               ; minimum sink current Port0 bit 2
  497. 00B8 2A 33 [05]      iowr Port0_Isink3               ; minimum sink current Port0 bit 3
  498. 00BA 2A 34 [05]      iowr Port0_Isink4               ; minimum sink current Port0 bit 4
  499. 00BC 2A 35 [05]      iowr Port0_Isink5               ; minimum sink current Port0 bit 5
  500. 00BE 2A 36 [05]      iowr Port0_Isink6               ; minimum sink current Port0 bit 6
  501. 00C0 2A 37 [05]      iowr Port0_Isink7               ; minimum sink current Port0 bit 7
  502. 00C2 31 78 [05]      mov [Endpoint1_Byte0],A
  503. 00C4 31 79 [05]      mov [Endpoint1_Byte1],A
  504. 00C6 31 7A [05]      mov [Endpoint1_Byte2],A
  505. 00C8 31 29 [05]      mov [endpoint_stall], A
  506. 00CA 31 30 [05]      mov [remote_wakeup_status], A
  507. 00CC 31 31 [05]      mov [configuration_status], A
  508. 00CE 31 37 [05]      mov [loop_temp], A
  509. 00D0 31 32 [05]      mov [start_send], A
  510. 00D2 2A 21 [05]      iowr Watchdog                   ; clear watchdog timer
  511. 00D4            
  512. 00D4            ;initialize values to transmit at Endpoint 1.
  513. 00D4 19 A5 [04]      mov A, A5h
  514. 00D6 31 38 [05]      mov [Data_Byte0], A
  515. 00D8 19 F0 [04]      mov A, F0h
  516. 00DA 31 39 [05]      mov [Data_Byte1], A
  517. 00DC            
  518. 00DC            ;Enable Port 1, bit 0 interrupts.
  519. 00DC            ;     mov A, 01h
  520. 00DC            ;     iowr Port1_Interrupt
  521. 00DC            ;
  522. 00DC            ;Test what kind of reset occurred: bus or watchdog?
  523. 00DC 29 FF [05]      iord Status_Control
  524. 00DE            ;Was it a bus reset?
  525. 00DE 10 20 [04]      and A, USBReset
  526. 00E0            ;If yes, jump to handle it.
  527. 00E0 B0 F7 [05]      jnz BusReset
  528. 00E2 29 FF [05]      iord Status_Control
  529. 00E4            ;Was it a watchdog reset?
  530. 00E4 10 40 [04]      and A, WatchDogReset
  531. 00E6            ;If no, continue to wait for a bus reset
  532. 00E6 A0 F0 [05]      jz suspendReset
  533. 00E8            ;
  534. 00E8            ;Watchog reset:
  535. 00E8            ;A watchdog reset means that the watchdog timer
  536. 00E8            ;wasn't cleared for 8.192 milliseconds.
  537. 00E8            ;Wait for a bus reset to bring the system alive again.
  538. 00E8            ;Enable 1-millisecond interrupt only
  539. 00E8 19 04 [04]      mov A, TIMER_ONLY
  540. 00EA 31 20 [05]      mov [interrupt_mask],A
  541. 00EC 2A 20 [05]      iowr Global_Interrupt
  542. 00EE            ;Wait for a bus reset.
  543. 00EE            WatchdogHandler:
  544. 00EE 80 EE [05]      jmp WatchdogHandler
  545. 00F0            
  546. 00F0            suspendReset:
  547. 00F0            ;Return to suspend mode to wait for a USB bus reset.
  548. 00F0 19 09 [04]      mov A, 09h
  549. 00F2 2A FF [05]      iowr Status_Control
  550. 00F4 20    [04]      nop
  551. 00F5 80 F0 [05]      jmp suspendReset
  552. 00F7            
  553. 00F7            BusReset:
  554. 00F7            ;Clear all reset bits.
  555. 00F7            ;Set bit 0 (the run bit).
  556. 00F7 19 01 [04]      mov A, RunBit
  557. 00F9 2A FF [05]      iowr Status_Control
  558. 00FB            ;Set up for enumeration (Endpoint 0 and 1-millisecond interrupts enabled)
  559. 00FB 19 0C [04]      mov A, ENUMERATE_MASK
  560. 00FD 31 20 [05]      mov [interrupt_mask],A
  561. 00FF 1F    [04]         XPAGE
  562. 0100 2A 20 [05]      iowr Global_Interrupt
  563. 0102            
  564. 0102            wait:
  565. 0102            ;Wait until configured.
  566. 0102 29 11 [05]      iord USB_EP1_TX_Config
  567. 0104 16 00 [04]      cmp A, 0
  568. 0106            ;Clear the watchdog timer
  569. 0106 2A 21 [05]      iowr Watchdog
  570. 0108            ;If not configured, continue to wait.
  571. 0108 A1 02 [05]      jz wait     
  572. 010A            ;When configured, initialize loop_temp.
  573. 010A            ;Loop_temp adds a delay in the start of transmission of data.
  574. 010A            ;The chip will respond to the first IN packet no sooner than 
  575. 010A            ;230 milliseconds after enumeration is complete.
  576. 010A            ;The delay was included in Cypress' joystick code to prevents problems 
  577. 010A            ;that occurred when power cycled off and on or the joystick was plugged
  578. 010A            ;in before the host powered up.
  579. 010A            ;I've left it in because it does no harm and 
  580. 010A            ;other hardware might have similar behavior.
  581. 010A            ;During the delay, the chip will send a NAK in response to any IN packet.
  582. 010A 19 FF [04]      mov A, 0ffh
  583. 010C 31 37 [05]      mov [loop_temp], A
  584. 010E            
  585. 010E            ;Enable endpoint 1
  586. 010E 29 11 [05]      iord USB_EP1_TX_Config
  587. 0110 0D 92 [04]      or A, 92h
  588. 0112 2A 11 [05]      iowr USB_EP1_TX_Config
  589. 0114            
  590. 0114            ;======================================================================
  591. 0114            ; The main program loop.
  592. 0114            ;======================================================================
  593. 0114            
  594. 0114            main:
  595. 0114            ;Find out if the loop_temp delay has timed out.
  596. 0114            ;Loop_temp =0 if not timed out, FFh if timed out.
  597. 0114 1A 37 [06]      mov A, [loop_temp]
  598. 0116 16 0A [04]      cmp A, 0Ah
  599. 0118            ;If no, don't enable transmitting.
  600. 0118 D1 1E [05]      jnc no_set
  601. 011A            ;If yes, enable transmitting.
  602. 011A 19 01 [04]      mov A, 01h
  603. 011C 31 32 [05]      mov [start_send], A
  604. 011E            no_set:
  605. 011E            ;Clear the watchdog timer.
  606. 011E            ;This has to be done at least once every 8 milliseconds!
  607. 011E 2A 21 [05]      iowr Watchdog
  608. 0120 29 00 [05]      iord Port0_Data
  609. 0122            nochange:
  610. 0122 81 14 [05]      jmp main
  611. 0124            
  612. 0124            ;----------------------------------------------------------------------
  613. 0124            ;The endpoint 0 ISR supports the control endpoint.
  614. 0124            ;This code enumerates and configures the hardware.
  615. 0124            ;It also responds to Set Report requests that receive data from the host.
  616. 0124            ;----------------------------------------------------------------------
  617. 0124            
  618. 0124            USB_EP0_ISR:
  619. 0124 2D    [05]      push A
  620. 0125 29 14 [05]      iord USB_EP0_RX_Status
  621. 0127            ;Has a Setup packet been received?
  622. 0127 10 01 [04]      and A, 01h
  623. 0129            ;If no, find out if it's an OUT packet.
  624. 0129 A1 3D [05]      jz check_for_out_packet
  625. 012B            ;If yes, handle it.
  626. 012B            ;Disable endpoint 0 interrupts.
  627. 012B 1A 20 [06]      mov A,[interrupt_mask]
  628. 012D 10 F7 [04]      and A, 0F7h
  629. 012F 31 20 [05]      mov [interrupt_mask], A
  630. 0131 2A 20 [05]      iowr Global_Interrupt
  631. 0133            ;Find out what the Setup packet contains and handle the request.
  632. 0133 91 83 [10]       call StageOne
  633. 0135            ;Re-enable Endpoint 0 interrupts.
  634. 0135 1A 20 [06]      mov A, [interrupt_mask]
  635. 0137 0D 08 [04]      or A, 08h
  636. 0139 31 20 [05]      mov [interrupt_mask], A
  637. 013B 81 7B [05]      jmp done_with_packet
  638. 013D            
  639. 013D            check_for_out_packet:
  640. 013D 29 14 [05]      iord USB_EP0_RX_Status
  641. 013F            ;Is it an OUT packet?
  642. 013F 10 02 [04]      and A, 02h
  643. 0141            ;If no, ignore it.
  644. 0141 A1 7B [05]      jz done_with_packet
  645. 0143            ;If yes, process the received data.
  646. 0143            ;Disable Endpoint 0 interrupts.
  647. 0143 1A 20 [06]      mov A,[interrupt_mask]
  648. 0145 10 F7 [04]      and A, 0F7h
  649. 0147 31 20 [05]      mov [interrupt_mask], A
  650. 0149 2A 20 [05]      iowr Global_Interrupt
  651. 014B            
  652. 014B            ;For debugging: set Port 0, bit 1 to show that we're here.
  653. 014B 29 00 [05]     iord Port0_Data
  654. 014D 0D 02 [04]     or a, 2
  655. 014F 2A 00 [05]     iowr Port0_Data
  656. 0151            
  657. 0151            ;Read the first byte in the buffer
  658. 0151 1A 70 [06]      mov a, [Endpoint_0]
  659. 0153            ;For debugging: if the first byte =12h, bring Port 0, bit 0 high
  660. 0153 16 12 [04]       cmp a, 12h
  661. 0155 B1 5D [05]       jnz not_a_match
  662. 0157 29 00 [05]       iord Port0_Data
  663. 0159 0D 04 [04]       or a, 4
  664. 015B 2A 00 [05]       iowr Port0_Data
  665. 015D            
  666. 015D            not_a_match:
  667. 015D            
  668. 015D            ;For debugging, add 1 to each byte read
  669. 015D            ;and copy the bytes to RAM.
  670. 015D            ;These bytes will be sent back to the host.
  671. 015D            
  672. 015D 2E    [05]       push X
  673. 015E                  ;data_count holds the number of bytes left to read.
  674. 015E                  ;X holds the index of the address to read
  675. 015E                  ;and the index of the address to store the received data.
  676. 015E                  ;Initialize the X register.
  677. 015E 1C 00 [04]       mov X, 0
  678. 0160                  
  679. 0160                  Get_Received_Data:
  680. 0160                  ;Find out if there are any bytes to read.
  681. 0160 19 00 [04]       mov A, 0
  682. 0162 17 28 [06]       cmp A, [data_count]
  683. 0164                  ;Jump if nothing to read.
  684. 0164 A1 78 [05]       jz DoneWithReceivedData
  685. 0166            
  686. 0166                  ;Get a byte.
  687. 0166 1B 70 [07]       mov A, [X + Endpoint_0]
  688. 0168                  ;For debugging, increment the received value.
  689. 0168                  ;(Endpoint 1 will send it back to the host.)
  690. 0168                  ;If the value is 255, reset to 0.
  691. 0168                  ;Otherwise increment it.
  692. 0168 16 FF [04]       cmp A, 255
  693. 016A A1 6F [05]       jz ResetToZero
  694. 016C 21    [04]       inc A
  695. 016D 81 71 [05]       jmp NewValueSet
  696. 016F                  ResetToZero:
  697. 016F 19 00 [04]       mov A, 0
  698. 0171                  NewValueSet:
  699. 0171                  ;Save the value.
  700. 0171 32 38 [06]       mov [X + Data_Byte0], A
  701. 0173                  ;Decrement the number of bytes to read.
  702. 0173 27 28 [07]       dec [data_count]
  703. 0175                  ;Increment the address to read.
  704. 0175 22    [04]       inc X
  705. 0176                  ;Do another
  706. 0176 81 60 [05]       jmp Get_Received_Data
  707. 0178            
  708. 0178                  DoneWithReceivedData:
  709. 0178 2C    [04]       pop X
  710. 0179            
  711. 0179            ;For debugging, set Port 0 to match the value written
  712. 0179            ;IN transfers can read this value back.
  713. 0179            ;     iowr Port0_Data
  714. 0179            
  715. 0179            ;Handshake by sending a 0-byte data packet.
  716. 0179 93 79 [10] call Send0ByteDataPacket
  717. 017B            
  718. 017B            done_with_packet:
  719. 017B            ;Re-enable Endpoint 0 interrupts.
  720. 017B 1A 20 [06]      mov A,[interrupt_mask]
  721. 017D 0D 08 [04]      or A, 08h
  722. 017F 31 20 [05]      mov [interrupt_mask], A
  723. 0181 1E 20 [13]      ipret Global_Interrupt
  724. 0183            
  725. 0183            ;========================================================================
  726. 0183            ;Control transfers
  727. 0183            ;========================================================================
  728. 0183            
  729. 0183            ;------------------------------------------------------------------------
  730. 0183            ;Control transfer, stage one.
  731. 0183            ;Find out whether the request is a standard device or HID request,
  732. 0183            ;the direction of data transfer, 
  733. 0183            ;and whether the request is to a device, interface, or endpoint.
  734. 0183            ;(from Table 9.2 in the USB spec)
  735. 0183            ;------------------------------------------------------------------------
  736. 0183            
  737. 0183            StageOne:
  738. 0183            ;Clear the setup flag
  739. 0183 19 00 [04]      mov A, 00h
  740. 0185 2A 14 [05]      iowr USB_EP0_RX_Status
  741. 0187            ;Set the StatusOuts bit to cause auto-handshake after receiving a data packet.
  742. 0187 19 08 [04]      mov A, 8
  743. 0189 2A 13 [05]      iowr USB_Status_Control
  744. 018B            ;bmRequestType contains the request.
  745. 018B 1A 70 [06]       mov A, [bmRequestType]
  746. 018D            
  747. 018D            ;Standard device requests. From the USB spec.
  748. 018D            ; host to device requests
  749. 018D 16 00 [04]         cmp A, 00h
  750. 018F A1 B2 [05]         jz RequestType00                 ; bmRequestType = 00000000 device
  751. 0191            ;       cmp A, 01h                       *** not required ***  
  752. 0191            ;       jz RequestType01                 ; bmRequestType = 00000001 interface
  753. 0191 16 02 [04]         cmp A, 02h              
  754. 0193 A1 C6 [05]         jz RequestType02                 ; bmRequestType = 00000010 endpoint
  755. 0195 16 80 [04]         cmp A, 80h             
  756. 0197            ; device to host requests
  757. 0197 A1 D2 [05]         jz RequestType80                 ; bmRequestType = 10000000 device
  758. 0199 16 81 [04]         cmp A, 81h
  759. 019B A1 E2 [05]         jz RequestType81                 ; bmRequestType = 10000001 interface
  760. 019D 16 82 [04]         cmp A, 82h
  761. 019F A1 EE [05]         jz RequestType82                 ; bmRequestType = 10000010 endpoint
  762. 01A1            
  763. 01A1            ;HID-class device requests. From the HID spec
  764. 01A1            ; host to device requests
  765. 01A1 16 21 [04]         cmp A, 21h
  766. 01A3 A1 FA [05]         jz RequestType21                 ; bmRequestType = 00100001 interface
  767. 01A5 16 22 [04]         cmp A, 22h                       ; *** not in HID spec ***
  768. 01A7 A2 0C [05]         jz RequestType22                 ; bmRequestType = 00100010 endpoint
  769. 01A9            ; device to host requests
  770. 01A9 16 A1 [04]         cmp A, A1h
  771. 01AB A2 14 [05]         jz RequestTypeA1                 ; bmRequestType = 10100001 interface
  772. 01AD            
  773. 01AD            ; Stall unsupported requests
  774. 01AD            SendStall:
  775. 01AD 19 A0 [04]       mov A, A0h
  776. 01AF 2A 10 [05]      iowr USB_EP0_TX_Config
  777. 01B1 3F    [08]       ret
  778. 01B2            
  779. 01B2            ;----------------------------------------------------------------------
  780. 01B2            ;Control transfer, stage two
  781. 01B2            ;Find out which request it is.
  782. 01B2            ;----------------------------------------------------------------------
  783. 01B2            
  784. 01B2            ;Host to device with device as recipient
  785. 01B2            RequestType00:
  786. 01B2            
  787. 01B2            ;The Remote Wakeup feature is disabled on reset.
  788. 01B2 1A 71 [06]      mov A, [bRequest]     ; load bRequest
  789. 01B4            ; Clear Feature                      bRequest = 1
  790. 01B4 16 01 [04]      cmp A, clear_feature
  791. 01B6 A2 24 [05]      jz ClearRemoteWakeup 
  792. 01B8            ; Set Feature                     bRequest = 3
  793. 01B8 16 03 [04]      cmp A, set_feature
  794. 01BA A2 31 [05]      jz SetRemoteWakeup
  795. 01BC            
  796. 01BC            ; Set the device address to a non-zero value.
  797. 01BC            ; Set Address                     bRequest = 5
  798. 01BC 16 05 [04]      cmp A, set_address
  799. 01BE A2 3E [05]      jz SetAddress
  800. 01C0            
  801. 01C0            ; Set Descriptor is optional.
  802. 01C0            ; Set Descriptor                bRequest = 7    *** not supported ***
  803. 01C0            
  804. 01C0            ;If wValue is zero, the device is not configured.
  805. 01C0            ;The only other legal value for this firmware is 1.
  806. 01C0            ;Set Configuration           bRequest = 9
  807. 01C0 16 09 [04]     cmp A, set_configuration
  808. 01C2 A2 45 [05]     jz SetConfiguration
  809. 01C4            
  810. 01C4            ;Stall unsupported requests.
  811. 01C4 81 AD [05]     jmp SendStall
  812. 01C6            
  813. 01C6            
  814. 01C6            ;Host to device with interface as recipient    *** not required ***
  815. 01C6            ; RequestType01:
  816. 01C6            ;        mov A, [bRequest]       ; load bRequest
  817. 01C6            
  818. 01C6            ; There are no interface features defined in the spec.
  819. 01C6            ; Clear Feature                 bRequest = 1    *** not supported ***
  820. 01C6            ; Set Feature                   bRequest = 3    *** not supported ***
  821. 01C6            
  822. 01C6            ; Set Interface is optional.
  823. 01C6            ; Set Interface                 bRequest = 11   *** not supported ***
  824. 01C6            
  825. 01C6            ;Stall unsupported requests.
  826. 01C6            ;        jmp SendStall
  827. 01C6            
  828. 01C6            ;Host to device with endpoint as recipient
  829. 01C6            RequestType02:
  830. 01C6 1A 71 [06]      mov A, [bRequest]     ; load bRequest
  831. 01C8            
  832. 01C8            ; The only standard feature defined for an endpoint is endpoint_stalled.
  833. 01C8            ; Clear Feature               bRequest = 1
  834. 01C8 16 01 [04]      cmp A, clear_feature
  835. 01CA A2 7E [05]      jz ClearEndpointStall
  836. 01CC            ; Set Feature               bRequest = 3
  837. 01CC 16 03 [04]      cmp A, set_feature
  838. 01CE A2 97 [05]      jz SetEndpointStall
  839. 01D0             
  840. 01D0            ;Stall unsupported functions.
  841. 01D0 81 AD [05]     jmp SendStall
  842. 01D2            
  843. 01D2            ;Device to host with device as recipient
  844. 01D2            RequestType80:
  845. 01D2 1A 71 [06]      mov A, [bRequest]          ; load bRequest
  846. 01D4            
  847. 01D4            ; Get Status               bRequest = 0
  848. 01D4 16 00 [04]      cmp A, get_status
  849. 01D6 A2 A8 [05]      jz GetDeviceStatus
  850. 01D8            
  851. 01D8            ; Get Descriptor               bRequest = 6
  852. 01D8 16 06 [04]      cmp A, get_descriptor
  853. 01DA A2 B2 [05]      jz GetDescriptor
  854. 01DC            
  855. 01DC            ; Get Configuration          bRequest = 8
  856. 01DC 16 08 [04]      cmp A, get_configuration
  857. 01DE A2 CA [05]      jz GetConfiguration
  858. 01E0            
  859. 01E0            ;Stall unsupported requests.
  860. 01E0 81 AD [05]      jmp SendStall
  861. 01E2            
  862. 01E2            ;Device to host with interface as recipient
  863. 01E2            RequestType81:
  864. 01E2 1A 71 [06]      mov A, [bRequest]     ; load bRequest
  865. 01E4            
  866. 01E4            ; Get Status               bRequest = 0
  867. 01E4 16 00 [04]       cmp A, get_status
  868. 01E6 A2 D4 [05]       jz GetInterfaceStatus
  869. 01E8            
  870. 01E8            ; Get Interface returns the selected alternate setting.
  871. 01E8            ;  This firmware supports no alternate settings.
  872. 01E8            ; Get Interface                 bRequest = 10   *** not supported ***
  873. 01E8            
  874. 01E8            ;The HID class defines one more request for bmRequestType=10000001
  875. 01E8            ; Get Descriptor                bRequest = 6
  876. 01E8 16 06 [04]       cmp A, get_descriptor
  877. 01EA A2 B2 [05]       jz GetDescriptor
  878. 01EC            
  879. 01EC            ;Stall unsupported functions
  880. 01EC 81 AD [05]       jmp SendStall
  881. 01EE            
  882. 01EE            ;Device to host with endpoint as recipient
  883. 01EE            RequestType82:
  884. 01EE 1A 71 [06]      mov A, [bRequest]          ; load bRequest
  885. 01F0            ; Get Status               bRequest = 0
  886. 01F0 16 00 [04]      cmp A, get_status
  887. 01F2 A2 DC [05]       jz GetEndpointStatus
  888. 01F4            
  889. 01F4            ; Get Descriptor               bRequest = 6
  890. 01F4 16 06 [04]      cmp A, get_descriptor
  891. 01F6 A2 B2 [05]      jz GetDescriptor
  892. 01F8            ; Sync Frame                  bRequest = 12   *** not supported ***
  893. 01F8            
  894. 01F8            ;Stall unsupported functions.
  895. 01F8 81 AD [05]      jmp SendStall
  896. 01FA            
  897. 01FA            
  898. 01FA            ;Check for HID class requests
  899. 01FA            
  900. 01FA            ;Host to device with endpoint as recipient
  901. 01FA            RequestType21:
  902. 01FA 1A 71 [06]       mov A, [bRequest]      ; load bRequest
  903. 01FC            
  904. 01FC            ; Set Report               bRequest = 9
  905. 01FC 16 09 [04]      cmp A, set_report
  906. 01FE 20    [04]         NOP
  907. 01FF 1F    [04]         XPAGE
  908. 0200 A2 E7 [05]      jz SetReport
  909. 0202            
  910. 0202            ; Set Idle                    bRequest = 10
  911. 0202 16 0A [04]       cmp A, set_idle
  912. 0204 A2 FA [05]       jz SetIdle
  913. 0206            
  914. 0206            ; Set Protocol               bRequest = 11
  915. 0206 16 0B [04]       cmp A, set_protocol
  916. 0208 A2 FC [05]       jz SetProtocol
  917. 020A            
  918. 020A            ;Stall unsupported requests
  919. 020A 81 AD [05]      jmp SendStall
  920. 020C            
  921. 020C            RequestType22:
  922. 020C 1A 71 [06]         mov A, [bRequest]      ; load bRequest
  923. 020E            
  924. 020E            ; Set Report               bRequest = 9
  925. 020E 16 09 [04]      cmp A, set_report     
  926. 0210 A2 E7 [05]      jz SetReport
  927. 0212            
  928. 0212            ;Stall unsupported requests
  929. 0212 81 AD [05]      jmp SendStall
  930. 0214            
  931. 0214            
  932. 0214            ;Device to host with endpoint as recipient
  933. 0214            RequestTypeA1:
  934. 0214 1A 71 [06]         mov A, [bRequest]      ; load bRequest
  935. 0216            
  936. 0216            ; Get Report               bRequest = 1
  937. 0216 16 01 [04]         cmp A, get_report
  938. 0218 A3 05 [05]         jz GetReport
  939. 021A            
  940. 021A            ; Get Idle                 bRequest = 2
  941. 021A 16 02 [04]         cmp A, get_idle
  942. 021C A3 10 [05]         jz GetIdle
  943. 021E            
  944. 021E            ; Get Protocol             bRequest = 3
  945. 021E 16 03 [04]         cmp A, get_protocol
  946. 0220 A3 12 [05]         jz GetProtocol
  947. 0222            
  948. 0222            ;Stall unsupported requests
  949. 0222 81 AD [05]         jmp SendStall
  950. 0224            
  951. 0224            ;----------------------------------------------------------------------
  952. 0224            ;Control transfer, stage three
  953. 0224            ;Process the request.
  954. 0224            ;----------------------------------------------------------------------
  955. 0224            
  956. 0224            ;The host controls whether or not a device can request a remote wakeup.
  957. 0224            
  958. 0224            ; Disable the remote wakeup capability.
  959. 0224            ClearRemoteWakeup:
  960. 0224 1A 72 [06]         mov A, [wValue]
  961. 0226 16 01 [04]         cmp A, device_remote_wakeup
  962. 0228 B1 AD [05]         jnz SendStall
  963. 022A            ;Handshake by sending a data packet
  964. 022A 93 79 [10]         call Send0ByteDataPacket
  965. 022C 19 00 [04]         mov A, DISABLE_REMOTE_WAKEUP
  966. 022E 31 30 [05]         mov [remote_wakeup_status], A
  967. 0230 3F    [08]         ret
  968. 0231            
  969. 0231            ; Enable the remote wakeup capability.
  970. 0231            SetRemoteWakeup:
  971. 0231 1A 72 [06]         mov A, [wValue]
  972. 0233 16 01 [04]         cmp A, device_remote_wakeup
  973. 0235            ;If not a match, stall.
  974. 0235 B1 AD [05]         jnz SendStall
  975. 0237            ;Handshake by sending a 0-byte data packet
  976. 0237 93 79 [10]         call Send0ByteDataPacket
  977. 0239            ;Perform the request.
  978. 0239 19 02 [04]         mov A, ENABLE_REMOTE_WAKEUP
  979. 023B 31 30 [05]         mov [remote_wakeup_status], A
  980. 023D 3F    [08]         ret
  981. 023E            
  982. 023E            SetAddress:
  983. 023E            ; Set the device address to match wValue in the Setup packet.
  984. 023E            ;Complete the requested action after completing the transaction.
  985. 023E            ;Handshake by sending a 0-byte data packet.
  986. 023E 93 79 [10]         call Send0ByteDataPacket
  987. 0240            ;Perform the request
  988. 0240 1A 72 [06]         mov A, [wValue]
  989. 0242 2A 12 [05]         iowr USB_Device_Address
  990. 0244 3F    [08]         ret
  991. 0245            
  992. 0245            SetConfiguration:
  993. 0245            ;Unconfigured: wValue=0, configured: wValue=1.
  994. 0245            ;Also clear any stall condition and set Data 0/1 to Data0.
  995. 0245            ;Handshake by sending a 0-byte data packet.
  996. 0245 93 79 [10]       call Send0ByteDataPacket
  997. 0247            ;Save the configuration status.
  998. 0247 1A 72 [06]       mov A, [wValue]
  999. 0249 31 31 [05]       mov [configuration_status], A
  1000. 024B            ;Clear any stall condtion
  1001. 024B 19 00 [04]       mov A, 0
  1002. 024D 31 29 [05]       mov [endpoint_stall], A
  1003. 024F            ;Set data 0/1 to Data0
  1004. 024F 29 11 [05]       iord USB_EP1_TX_Config
  1005. 0251 10 BF [04]       and A, ~DataToggle
  1006. 0253            
  1007. 0253            ;Set the configuration status.
  1008. 0253 2A 11 [05]      iowr USB_EP1_TX_Config     
  1009. 0255 1A 31 [06]      mov A, [configuration_status]
  1010. 0257 16 00 [04]      cmp A, 0
  1011. 0259            ;If configured, jump.
  1012. 0259 B2 69 [05]      jnz device_configured
  1013. 025B            
  1014. 025B            ;If unconfigured:
  1015. 025B            ;Disable Endpoint 1
  1016. 025B 29 11 [05]      iord USB_EP1_TX_Config
  1017. 025D 10 EF [04]      and A, EFh
  1018. 025F 2A 11 [05]      iowr USB_EP1_TX_Config
  1019. 0261            ;Disable Endpoint 1 interrupts.
  1020. 0261 1A 20 [06]      mov A, [interrupt_mask]
  1021. 0263 10 EF [04]      and A, EFh
  1022. 0265 31 20 [05]           mov [interrupt_mask], A
  1023. 0267 82 7D [05]      jmp done_configuration
  1024. 0269            
  1025. 0269            ;If configured:
  1026. 0269            device_configured:
  1027. 0269            ;Send NAK in response to IN packets
  1028. 0269 29 11 [05]      iord USB_EP1_TX_Config
  1029. 026B 10 7F [04]      and A,7Fh
  1030. 026D            ;Enable Endpoint 1
  1031. 026D 0D 10 [04]      or A, 10h
  1032. 026F 2A 11 [05]      iowr USB_EP1_TX_Config
  1033. 0271            ;Enable interrupts: Endpoint 1 and GPIO
  1034. 0271 1A 20 [06]      mov A, [interrupt_mask]
  1035. 0273 0D 50 [04]      or A, 50h
  1036. 0275 31 20 [05]      mov [interrupt_mask], A
  1037. 0277            ;Send NAK in response to Endpoint 0 OUT packets.
  1038. 0277 29 13 [05]      iord USB_Status_Control
  1039. 0279 10 EF [04]      and A,0EFh
  1040. 027B 2A 13 [05]      iowr USB_Status_Control
  1041. 027D            done_configuration:
  1042. 027D 3F    [08]         ret
  1043. 027E            
  1044. 027E            ClearEndpointStall:
  1045. 027E            ;Clear the stall condition for an endpoint.
  1046. 027E            ;For endpoint 1, also set Data 0/1 to Data 0.
  1047. 027E 1A 72 [06]         mov A, [wValue]
  1048. 0280 16 00 [04]         cmp A, endpoint_stalled
  1049. 0282 B1 AD [05]         jnz SendStall
  1050. 0284            ;
  1051. 0284            ;Clear Endpoint 1 stall
  1052. 0284            ;Handshake by sending a 0-byte data packet
  1053. 0284 93 79 [10]       call Send0ByteDataPacket
  1054. 0286            ;Clear the stall condition
  1055. 0286 19 00 [04]       mov A,0
  1056. 0288 31 29 [05]       mov [endpoint_stall], A
  1057. 028A            ;Set Data 0/1 to Data0
  1058. 028A 29 11 [05]       iord USB_EP1_TX_Config
  1059. 028C 10 BF [04]       and A, ~DataToggle
  1060. 028E 2A 11 [05]       iowr USB_EP1_TX_Config
  1061. 0290            ;Send NAK in response to Endpoint 0 OUT packets.
  1062. 0290 29 13 [05]       iord USB_Status_Control
  1063. 0292 10 EF [04]       and A,0EFh
  1064. 0294 2A 13 [05]       iowr USB_Status_Control
  1065. 0296 3F    [08]       ret
  1066. 0297            
  1067. 0297            ;Stall Endpoint 1
  1068. 0297            SetEndpointStall:
  1069. 0297 1A 72 [06]         mov A, [wValue]
  1070. 0299 16 00 [04]         cmp A, endpoint_stalled
  1071. 029B            ;Not a match, so stall
  1072. 029B B1 AD [05]         jnz SendStall
  1073. 029D            ;Handshake by sending a 0-byte data packet.
  1074. 029D 93 79 [10]         call Send0ByteDataPacket
  1075. 029F            ;Stall the endpoint.
  1076. 029F 19 01 [04]         mov A,1         
  1077. 02A1 31 29 [05]         mov [endpoint_stall], A
  1078. 02A3 19 30 [04]         mov A, 30h
  1079. 02A5 2A 11 [05]         iowr USB_EP1_TX_Config                 
  1080. 02A7 3F    [08]         ret
  1081. 02A8            
  1082. 02A8            GetDeviceStatus:
  1083. 02A8            ;Device Status is two bytes.
  1084. 02A8            ;Bit 0 must be 0 (bus-powered).
  1085. 02A8            ;Bit 1 is remote wakeup: 0=disabled, 1=enabled.
  1086. 02A8            ;All other bits are unused.
  1087. 02A8            ;Send two bytes.
  1088. 02A8 19 02 [04]         mov A, 2
  1089. 02AA 31 28 [05]         mov [data_count], A
  1090. 02AC            ;The control_read_table holds the two possible values for device status.
  1091. 02AC            ;Get the address of the first value.
  1092. 02AC 19 9C [04]         mov A, (get_dev_status_table - control_read_table)
  1093. 02AE            ;Add an index value to select the correct bytes.
  1094. 02AE 02 30 [06]         add A, [remote_wakeup_status]
  1095. 02B0            ;Send the value.
  1096. 02B0 83 3E [05]         jmp SendDescriptor
  1097. 02B2            
  1098. 02B2            GetDescriptor:
  1099. 02B2            ;The high byte of wValue contains the descriptor type.
  1100. 02B2            ;The low byte of wValue contains the descriptor index.
  1101. 02B2            
  1102. 02B2 1A 73 [06]         mov A, [wValueHi]               ; load descriptor type
  1103. 02B4            
  1104. 02B4            ;Test for standard descriptor types first.
  1105. 02B4            ;Supported descriptor types are device, configuration, string.
  1106. 02B4            ;Unsupported descriptor types are interface, endpoint.
  1107. 02B4            
  1108. 02B4            ; Get Descriptor (device)               wValueHi = 1
  1109. 02B4 16 01 [04]      cmp A, device
  1110. 02B6 A3 1C [05]      jz GetDeviceDescriptor
  1111. 02B8            ; Get Descriptor (configuration)        wValueHi = 2
  1112. 02B8 16 02 [04]      cmp A, configuration
  1113. 02BA A3 26 [05]      jz GetConfigurationDescriptor
  1114. 02BC            ; Get Descriptor (string)               wValueHi = 3
  1115. 02BC 16 03 [04]      cmp A, string
  1116. 02BE A3 2E [05]      jz GetStringDescriptor
  1117. 02C0            
  1118. 02C0            ; Test for HID-class descriptor types.
  1119. 02C0            ; Get Descriptor (HID)                  wValueHi = 21h
  1120. 02C0 16 21 [04]         cmp A, HID
  1121. 02C2 A3 5D [05]         jz GetHIDDescriptor
  1122. 02C4            ; Get Descriptor (report)               wValueHi = 22h  
  1123. 02C4 16 22 [04]      cmp A, report
  1124. 02C6 A3 07 [05]      jz GetReportDescriptor
  1125. 02C8            ; Get Descriptor (physical)             wValueHi = 23h  *** not supported ***
  1126. 02C8            ;Stall unsupported requests.
  1127. 02C8 81 AD [05]      jmp SendStall
  1128. 02CA            
  1129. 02CA            GetConfiguration:
  1130. 02CA            ;Send the current device configuration.
  1131. 02CA            ;0 = unconfigured, 1 = configured.
  1132. 02CA            
  1133. 02CA            ;Send 1 byte
  1134. 02CA 19 01 [04]         mov A, 1
  1135. 02CC 31 28 [05]         mov [data_count], A
  1136. 02CE            ;Get the address of the data to send.
  1137. 02CE 19 A6 [04]         mov A, (get_configuration_status_table - control_read_table)
  1138. 02D0            ;Add an index to point to the correct configuration.
  1139. 02D0 02 31 [06]         add A, [configuration_status]
  1140. 02D2            ;Send the data.
  1141. 02D2 83 3E [05]         jmp SendDescriptor
  1142. 02D4            
  1143. 02D4            GetInterfaceStatus:
  1144. 02D4            ;Interface status is 2 bytes, which are always 0.
  1145. 02D4            ;Send 2 bytes.
  1146. 02D4 19 02 [04]         mov A, 2
  1147. 02D6 31 28 [05]         mov [data_count], A
  1148. 02D8            ;Get the address of the data to send.
  1149. 02D8 19 A0 [04]         mov A, (get_interface_status_table - control_read_table)
  1150. 02DA            ;Send the data.
  1151. 02DA 83 3E [05]         jmp SendDescriptor
  1152. 02DC            
  1153. 02DC            GetEndpointStatus:
  1154. 02DC            ;Endpoint status is 2 bytes.
  1155. 02DC            ;Bit 0 = 0 when the endpoint is not stalled.
  1156. 02DC            ;Bit 0 = 1 when the endpoint is stalled.
  1157. 02DC            ;All other bits are unused.
  1158. 02DC            ;Send 2 bytes.
  1159. 02DC 19 02 [04]         mov A, 2
  1160. 02DE 31 28 [05]         mov [data_count], A
  1161. 02E0            ;Get the stall status.
  1162. 02E0 1A 29 [06]         mov A, [endpoint_stall]
  1163. 02E2            ;Shift left to get an index (0 or 2) for the endpoint status table
  1164. 02E2 3B    [04]         asl A
  1165. 02E3            ;Get the address of the data to send.
  1166. 02E3 01 A2 [04]         add A, (get_endpoint_status_table - control_read_table)
  1167. 02E5            ;Send the data.
  1168. 02E5 83 3E [05]         jmp SendDescriptor
  1169. 02E7            
  1170. 02E7            SetReport:
  1171. 02E7            ;The CY7C63000 doesn't support interrupt-mode OUT transfers.
  1172. 02E7            ;So the host uses Control transfers with Set_Report requests
  1173. 02E7            ;to get data from the device.
  1174. 02E7            
  1175. 02E7            ;Get the report data.
  1176. 02E7            
  1177. 02E7            ;For debugging: set Port 0, bit 0 =1 to show that we're here.
  1178. 02E7 29 00 [05]       iord Port0_Data
  1179. 02E9 0D 01 [04]       or a, 1
  1180. 02EB 2A 00 [05]       iowr Port0_Data
  1181. 02ED            
  1182. 02ED            ;Find out how many bytes to read. This value is in WLength.
  1183. 02ED            ;Save the length in data_count.
  1184. 02ED 1A 76 [06]      mov A, [wLength]
  1185. 02EF 31 28 [05]      mov [data_count], A
  1186. 02F1            
  1187. 02F1            ;Enable receiving data at endpoint 0 by setting the EnableOuts bit
  1188. 02F1            ;The bit is cleared following any Setup or OUT transaction.
  1189. 02F1 29 13 [05]      iord USB_Status_Control
  1190. 02F3 0D 10 [04]      or A, 10h
  1191. 02F5            ;Clear the StatusOuts bit to disable auto-Ack after receiving a valid 
  1192. 02F5            ;status packet in a Control read (IN) transfer.
  1193. 02F5            ;Otherwise, the USB engine will respond to a data OUT packet with a stall.
  1194. 02F5 10 F7 [04]      and A, F7h
  1195. 02F7 2A 13 [05]      iowr USB_Status_Control
  1196. 02F9            ;Now we're ready to receive the report data.
  1197. 02F9            ;An Endpoint 0 OUT interrupt signals the arrival of the report data.
  1198. 02F9 3F    [08] ret
  1199. 02FA            
  1200. 02FA            SetIdle:
  1201. 02FA 81 AD [05]         jmp SendStall   ; *** not supported ***
  1202. 02FC            
  1203. 02FC            SetProtocol:
  1204. 02FC            ;Switches between a boot protocol (wValue=0) and report protocol (wValue=1).
  1205. 02FC            ;This firmware doesn't distinguish between protocols.
  1206. 02FC 1A 72 [06]         mov A, [wValue]
  1207. 02FE 20    [04]         NOP
  1208. 02FF 1F    [04]         XPAGE
  1209. 0300 31 34 [05]         mov [protocol_status], A
  1210. 0302 93 79 [10]         call Send0ByteDataPacket
  1211. 0304 3F    [08]         ret
  1212. 0305            
  1213. 0305            GetReport:
  1214. 0305            ;Sends a report to the host.
  1215. 0305            ;The high byte of wValue contains the report type. 
  1216. 0305            ;The low byte of wValue contains the report ID.
  1217. 0305            ;Not supported (Use interrupt transfers to send data.)
  1218. 0305 81 AD [05]      jmp SendStall
  1219. 0307            
  1220. 0307            GetReportDescriptor:
  1221. 0307            ;Save the descriptor length
  1222. 0307 19 34 [04]      mov A, (end_hid_report_desc_table - hid_report_desc_table)
  1223. 0309 31 28 [05]      mov [data_count], A
  1224. 030B            ;Get the descriptor's starting address.
  1225. 030B 19 34 [04]      mov A, (hid_report_desc_table - control_read_table)
  1226. 030D 93 3E [10]      call SendDescriptor
  1227. 030F            
  1228. 030F 3F    [08]       ret
  1229. 0310            
  1230. 0310            GetIdle:
  1231. 0310            ;Not supported
  1232. 0310 81 AD [05]         jmp SendStall
  1233. 0312            
  1234. 0312            GetProtocol:
  1235. 0312            ;Send the current protocol status.
  1236. 0312            ;Send 1 byte.
  1237. 0312 19 01 [04]         mov A, 1
  1238. 0314 31 28 [05]         mov [data_count], A
  1239. 0316            ;Get the address of the data to send.
  1240. 0316 19 A8 [04]         mov A, (get_protocol_status_table - control_read_table)
  1241. 0318            ;Add an index that points to the correct data.
  1242. 0318 02 34 [06]         add A, [protocol_status]
  1243. 031A            ;Send the data.
  1244. 031A 83 3E [05]         jmp SendDescriptor
  1245. 031C                    
  1246. 031C            ; Standard Get Descriptor routines
  1247. 031C            ;
  1248. 031C            ;Send the device descriptor.
  1249. 031C            GetDeviceDescriptor:
  1250. 031C            ;Get the length of the descriptor
  1251. 031C            ;(stored in the first byte in the device descriptor table).
  1252. 031C 19 00 [04]         mov A, 0
  1253. 031E F3 E6 [14]        index device_desc_table
  1254. 0320 31 28 [05]         mov [data_count], A
  1255. 0322            ;Get the starting address of the descriptor.
  1256. 0322 19 00 [04]         mov A, (device_desc_table - control_read_table)
  1257. 0324            ;Send the descriptor.
  1258. 0324 83 3E [05]         jmp SendDescriptor
  1259. 0326            
  1260. 0326            GetConfigurationDescriptor:
  1261. 0326            ;Send the configuration descriptor.
  1262. 0326            ;Get the length of the descriptor.
  1263. 0326 19 22 [04]      mov A, (end_config_desc_table - config_desc_table)
  1264. 0328 31 28 [05]       mov [data_count], A
  1265. 032A            ;Get the starting address of the descriptor.
  1266. 032A 19 12 [04]      mov A, (config_desc_table - control_read_table)
  1267. 032C            ;Send the descriptor.
  1268. 032C 83 3E [05]      jmp SendDescriptor
  1269. 032E            
  1270. 032E            GetStringDescriptor:
  1271. 032E            ;Use the string index to find out which string it is.
  1272. 032E 1A 72 [06]      mov A, [wValue]
  1273. 0330 16 00 [04]      cmp A, 0h
  1274. 0332 A3 45 [05]      jz LanguageString
  1275. 0334 16 01 [04]      cmp A, 01h
  1276. 0336 A3 4D [05]      jz ManufacturerString
  1277. 0338 16 02 [04]      cmp A, 02h
  1278. 033A A3 55 [05]      jz ProductString
  1279. 033C            ;     cmp A, 03h
  1280. 033C            ;     jz SerialNumString
  1281. 033C            ;     cmp A, 04h
  1282. 033C            ;     jz ConfigurationString
  1283. 033C            ;     cmp A, 05h
  1284. 033C            ;     jz InterfaceString
  1285. 033C            ; No other strings supported
  1286. 033C 81 AD [05]       jmp SendStall
  1287. 033E            
  1288. 033E            SendDescriptor:
  1289. 033E            ;The starting address of the descriptor is in the accumulator. Save it.
  1290. 033E 31 27 [05]         mov [data_start], A
  1291. 0340            ;Get the descriptor length.
  1292. 0340 93 66 [10]         call get_descriptor_length
  1293. 0342            ;Send the descriptor.
  1294. 0342 93 8A [10]         call control_read
  1295. 0344 3F    [08]         ret
  1296. 0345            
  1297. 0345            ;Send the requested string.
  1298. 0345            ;For each, store the descriptor length in data_count, then send the descriptor.
  1299. 0345            LanguageString:
  1300. 0345 19 04 [04]      mov A, (USBStringDescription1 - USBStringLanguageDescription)
  1301. 0347 31 28 [05]       mov [data_count], A
  1302. 0349 19 68 [04]      mov A, (USBStringLanguageDescription - control_read_table)
  1303. 034B 83 3E [05]       jmp SendDescriptor
  1304. 034D            ManufacturerString:     
  1305. 034D 19 1A [04]      mov A, ( USBStringDescription2 - USBStringDescription1)
  1306. 034F 31 28 [05]       mov [data_count], A
  1307. 0351 19 6C [04]      mov A, (USBStringDescription1 - control_read_table)
  1308. 0353 83 3E [05]       jmp SendDescriptor
  1309. 0355            ProductString:
  1310. 0355 19 16 [04]      mov A, ( USBStringDescription3 - USBStringDescription2)
  1311. 0357 31 28 [05]       mov [data_count], A
  1312. 0359 19 86 [04]      mov A, (USBStringDescription2 - control_read_table)
  1313. 035B 83 3E [05]       jmp SendDescriptor
  1314. 035D            ;SerialNumString:
  1315. 035D            ;     mov A, ( USBStringDescription4 - USBStringDescription3)
  1316. 035D            ;      mov [data_count], A
  1317. 035D            ;     mov A, (USBStringDescription3 - control_read_table)
  1318. 035D            ;      jmp SendDescriptor
  1319. 035D            ;ConfigurationString:
  1320. 035D            ;     mov A, ( USBStringDescription5 - USBStringDescription4)
  1321. 035D            ;      mov [data_count], A
  1322. 035D            ;     mov A, (USBStringDescription4 - control_read_table)
  1323. 035D            ;      jmp SendDescriptor
  1324. 035D            ;InterfaceString:
  1325. 035D            ;     mov A, ( USBStringEnd - USBStringDescription5)
  1326. 035D            ;      mov [data_count], A
  1327. 035D            ;     mov A, (USBStringDescription5 - control_read_table)
  1328. 035D            ;      jmp SendDescriptor
  1329. 035D            
  1330. 035D            ; HID class Get Descriptor routines
  1331. 035D            ;
  1332. 035D            GetHIDDescriptor:
  1333. 035D            ;Send the HID descriptor.
  1334. 035D            ;Get the length of the descriptor.
  1335. 035D 19 09 [04]      mov A, (Endpoint_Descriptor - Class_Descriptor)
  1336. 035F 31 28 [05]       mov [data_count], A
  1337. 0361            ;Get the descriptor's starting address.
  1338. 0361 19 24 [04]      mov A, ( Class_Descriptor - control_read_table)
  1339. 0363            ;Send the descriptor.
  1340. 0363 93 3E [10]       call SendDescriptor
  1341. 0365 3F    [08]       ret
  1342. 0366            
  1343. 0366            ;======================================================================
  1344. 0366            ;USB support routines
  1345. 0366            ;======================================================================
  1346. 0366            
  1347. 0366            get_descriptor_length:
  1348. 0366            ;The host sometimes lies about the number of bytes it
  1349. 0366            ; wants from a descriptor.
  1350. 0366            ;A request to get a descriptor should return the smaller of the number 
  1351. 0366            ;of bytes requested or the actual length of the descriptor.
  1352. 0366            ;Get the requested number of bytes to send
  1353. 0366 1A 77 [06]      mov A, [wLengthHi]
  1354. 0368            ;If the requested high byte is >0, 
  1355. 0368            ;ignore the high byte and use the firmware's value.
  1356. 0368            ;(255 bytes is the maximum allowed.)
  1357. 0368 16 00 [04]      cmp A, 0
  1358. 036A B3 78 [05]      jnz use_actual_length
  1359. 036C            ;If the low byte =0, use the firmware's value.
  1360. 036C 1A 76 [06]      mov A, [wLength]
  1361. 036E 16 00 [04]      cmp A, 0
  1362. 0370 A3 78 [05]      jz use_actual_length
  1363. 0372            ;If the requested number of bytes => the firmware's value,
  1364. 0372            ;use the firmware's value.
  1365. 0372 17 28 [06]      cmp A, [data_count]
  1366. 0374 D3 78 [05]      jnc use_actual_length
  1367. 0376            ;If the requested number of bytes < the firmware's value,
  1368. 0376            ;use the requested number of bytes.
  1369. 0376 31 28 [05]      mov [data_count], A
  1370. 0378            use_actual_length:
  1371. 0378 3F    [08]         ret
  1372. 0379            
  1373. 0379            Send0ByteDataPacket:
  1374. 0379            ;Send a data packet with 0 bytes.
  1375. 0379            ;Use this handshake after receiving an OUT data packet.
  1376. 0379            ;Enable responding to IN packets and set Data 0/1 to Data 1.
  1377. 0379 19 C0 [04]      mov A, C0h
  1378. 037B 2A 10 [05]      iowr USB_EP0_TX_Config
  1379. 037D            ;Enable interrupts.
  1380. 037D 1A 20 [06]      mov A, [interrupt_mask]
  1381. 037F 2A 20 [05]      iowr Global_Interrupt
  1382. 0381            WaitForDataToTransfer:
  1383. 0381            ;Wait for the data to transfer.
  1384. 0381            ;Clear the watchdog timer
  1385. 0381 2A 21 [05]      iowr Watchdog
  1386. 0383            ;Bit 7 of USB_EP0_TX_Config is cleared when the host acknowledges
  1387. 0383            ;receiving the data.
  1388. 0383 29 10 [05]      iord USB_EP0_TX_Config
  1389. 0385 10 80 [04]      and A, 80h
  1390. 0387 B3 81 [05]      jnz WaitForDataToTransfer
  1391. 0389 3F    [08]      ret
  1392. 038A            
  1393. 038A            control_read: 
  1394. 038A            ;Do a Control Read transfer.
  1395. 038A            ;The device receives a Setup packet in the Setup stage,
  1396. 038A            ;sends 1 or more data packets (IN) in the Data stage,
  1397. 038A            ;and receives a 0-length data packet (OUT) in the Status stage.
  1398. 038A            ;Before calling this routine, the firmware must set 2 values:
  1399. 038A            ;data_start is the starting address of the descriptor to send,
  1400. 038A            ;expressed as an offset from the control read table.
  1401. 038A            ;data_count is the number of bytes in the descriptor.
  1402. 038A 2E    [05]      push X
  1403. 038B            ;Set the Data 0/1 bit to 0.
  1404. 038B 19 00 [04]      mov A, 00h
  1405. 038D 31 23 [05]      mov [endp0_data_toggle], A
  1406. 038F            
  1407. 038F            control_read_data_stage:
  1408. 038F 1C 00 [04]      mov X, 00h
  1409. 0391 19 00 [04]      mov A, 00h
  1410. 0393 31 24 [05]      mov [loop_counter], A
  1411. 0395            
  1412. 0395            ;Clear the Setup bit.
  1413. 0395 2A 14 [05]      iowr USB_EP0_RX_Status
  1414. 0397            ;Check the Setup bit.
  1415. 0397 29 14 [05]      iord USB_EP0_RX_Status
  1416. 0399 10 01 [04]      and A, 01h
  1417. 039B            ;If not cleared, another setup packet has arrived, 
  1418. 039B            ;so exit the routine.
  1419. 039B B3 E0 [05]      jnz control_read_status_stage
  1420. 039D            
  1421. 039D            ;Set the StatusOuts bit to 1 to enable auto-ACK of the OUT Status stage.
  1422. 039D 19 08 [04]      mov A, 08h
  1423. 039F 2A 13 [05]      iowr USB_Status_Control
  1424. 03A1            ;If there is no data to send, prepare a 0-length data packet.
  1425. 03A1            ;(The host might require a final 0-length packet if the descriptor is 
  1426. 03A1            ;a multiple of 8 bytes.)
  1427. 03A1 1A 28 [06]      mov A, [data_count]
  1428. 03A3 16 00 [04]      cmp A, 00h
  1429. 03A5 A3 BC [05]      jz dma_load_done
  1430. 03A7            
  1431. 03A7            dma_load_loop:
  1432. 03A7            ;Copy up to 8 bytes for transmitting into Endpoint 0's buffer
  1433. 03A7            ;and increment/decrement the various counting variables.
  1434. 03A7            
  1435. 03A7            ;Place the byte to send in the accumulator:
  1436. 03A7            ;(control_read_table) + (data_start).
  1437. 03A7 1A 27 [06]      mov A, [data_start]
  1438. 03A9 F3 E6 [14]      index control_read_table
  1439. 03AB            ;Place the byte in Endpoint 0's buffer.
  1440. 03AB 32 70 [06]      mov [X + Endpoint_0], A
  1441. 03AD            ;Increment the offset of the data being sent.
  1442. 03AD 23 27 [07]      inc [data_start]
  1443. 03AF            ;Increment the offset of Endpoint 0's buffer.
  1444. 03AF 22    [04]      inc X
  1445. 03B0            ;Increment the number of bytes stored in the buffer.
  1446. 03B0 23 24 [07]      inc [loop_counter]
  1447. 03B2            ;Decrement the number of bytes left to send.
  1448. 03B2 27 28 [07]      dec [data_count]
  1449. 03B4            ;If the count = 0, there's no more data to load.
  1450. 03B4 A3 BC [05]      jz dma_load_done
  1451. 03B6            ;If 8 bytes haven't been loaded into the buffer, get another byte.
  1452. 03B6            ;If 8 bytes have been loaded, it's the maximum for the transaction,
  1453. 03B6            ;so send the data.
  1454. 03B6 1A 24 [06]      mov A, [loop_counter]
  1455. 03B8 16 08 [04]      cmp A, 08h
  1456. 03BA B3 A7 [05]      jnz dma_load_loop
  1457. 03BC            
  1458. 03BC            dma_load_done:
  1459. 03BC            ;Send the data.
  1460. 03BC            
  1461. 03BC            ;Check the Setup bit.
  1462. 03BC            ;If it's not 0, another Setup packet has arrived, 
  1463. 03BC            ;so exit the routine.
  1464. 03BC 29 14 [05]      iord USB_EP0_RX_Status
  1465. 03BE 10 01 [04]      and A, 01h
  1466. 03C0 B3 E0 [05]      jnz control_read_status_stage
  1467. 03C2            
  1468. 03C2            ;Set the bits in the USB_EP0_TX_Config register.
  1469. 03C2            ;Toggle the Data 0/1 bit.
  1470. 03C2 1A 23 [06]      mov A, [endp0_data_toggle]
  1471. 03C4 13 40 [04]      xor A, 40h
  1472. 03C6 31 23 [05]      mov [endp0_data_toggle], A
  1473. 03C8            ;Enable responding to IN token packets.
  1474. 03C8 0D 80 [04]      or A, 80h
  1475. 03CA            ;The low 4 bits hold the number of bytes to send.
  1476. 03CA 0E 24 [06]      or A, [loop_counter]
  1477. 03CC 2A 10 [05]      iowr USB_EP0_TX_Config
  1478. 03CE            ;Enable interrupts
  1479. 03CE 1A 20 [06]      mov A, [interrupt_mask]
  1480. 03D0 2A 20 [05]      iowr Global_Interrupt
  1481. 03D2            
  1482. 03D2            wait_control_read:
  1483. 03D2            
  1484. 03D2            ;Clear the watchdog timer
  1485. 03D2 2A 21 [05]      iowr Watchdog
  1486. 03D4            
  1487. 03D4            ;Wait for the data to transfer and the host to acknowledge,
  1488. 03D4            ;indicated by Bit 7 = 0.
  1489. 03D4 29 10 [05]      iord USB_EP0_TX_Config
  1490. 03D6 10 80 [04]      and A, 80h
  1491. 03D8            ;When all of the transaction's data has transferred, 
  1492. 03D8            ;find out if there is more data to send in the transfer.
  1493. 03D8 A3 8F [05]      jz control_read_data_stage
  1494. 03DA            ;Find out if the host has sent an OUT packet to acknowledge 
  1495. 03DA            ;and end the transfer.
  1496. 03DA 29 14 [05]      iord USB_EP0_RX_Status
  1497. 03DC 10 02 [04]      and A, 02h
  1498. 03DE A3 D2 [05]      jz wait_control_read
  1499. 03E0            
  1500. 03E0            control_read_status_stage:
  1501. 03E0            ;The transfer is complete.
  1502. 03E0 2C    [04]      pop X
  1503. 03E1 1A 20 [06]      mov A, [interrupt_mask]
  1504. 03E3 2A 20 [05]      iowr Global_Interrupt
  1505. 03E5 3F    [08]      ret
  1506. 03E6            
  1507. 03E6            ;======================================================================
  1508. 03E6            ;Lookup Tables
  1509. 03E6            ;Contain the descriptors and the codes for status indicators.
  1510. 03E6            ;The firmware accesses the information by referencing a specific
  1511. 03E6            ;table's address as an offset from the control_read_table.
  1512. 03E6            ;======================================================================
  1513. 03E6            
  1514. 03E6            control_read_table:
  1515. 03E6            
  1516. 03E6            device_desc_table:
  1517. 03E6 12    [00]      db 12h          ; Descriptor length (18 bytes)
  1518. 03E7 01    [00]      db 01h          ; Descriptor type (Device)
  1519. 03E8 10    [00]      db 10h,01h      ; Complies with USB Spec. Release (0110h = release 1.10)
  1520. 03E9 01    [00] 
  1521. 03EA 00    [00]      db 00h          ; Class code (0)
  1522. 03EB 00    [00]      db 00h          ; Subclass code (0)
  1523. 03EC 00    [00]      db 00h          ; Protocol (No specific protocol)
  1524. 03ED 08    [00]      db 08h          ; Max. packet size for EP0 (8 bytes)
  1525. 03EE 25    [00]      db 25h,09h      ; Vendor ID (Lakeview Research, 0925h)
  1526. 03EF 09    [00] 
  1527. 03F0 34    [00]      db 34h,12h      ; Product ID (1234)
  1528. 03F1 12    [00] 
  1529. 03F2 01    [00]      db 01h,00h      ; Device release number (0001)
  1530. 03F3 00    [00] 
  1531. 03F4 01    [00]      db 01h          ; Mfr string descriptor index
  1532. 03F5 02    [00]      db 02h          ; Product string descriptor index
  1533. 03F6 00    [00]      db 00h          ; Serial Number string descriptor index (None)
  1534. 03F7 01    [00]      db 01h          ; Number of possible configurations (1)
  1535. 03F8            end_device_desc_table:
  1536. 03F8            
  1537. 03F8            config_desc_table:
  1538. 03F8 09    [00]      db 09h          ; Descriptor length (9 bytes)
  1539. 03F9 02    [00]      db 02h          ; Descriptor type (Configuration)
  1540. 03FA 22    [00]      db 22h,00h      ; Total data length (34 bytes)
  1541. 03FB 00    [00] 
  1542. 03FC 01    [00]      db 01h          ; Interface supported (1)
  1543. 03FD 01    [00]      db 01h          ; Configuration value (1)
  1544. 03FE 00    [00]      db 00h          ; Index of string descriptor (None)
  1545. 03FF 80    [00]      db 80h          ; Configuration (Bus powered)
  1546. 0400 32    [00]      db 32h          ; Maximum power consumption (100mA)
  1547. 0401            
  1548. 0401            Interface_Descriptor:
  1549. 0401 09    [00]      db 09h          ; Descriptor length (9 bytes)
  1550. 0402 04    [00]      db 04h          ; Descriptor type (Interface)
  1551. 0403 00    [00]      db 00h          ; Number of interface (0) 
  1552. 0404 00    [00]      db 00h          ; Alternate setting (0)
  1553. 0405 01    [00]      db 01h          ; Number of interface endpoint (1)
  1554. 0406 03    [00]      db 03h          ; Class code ()                    
  1555. 0407 00    [00]      db 00h          ; Subclass code ()                 
  1556. 0408 00    [00]      db 00h          ; Protocol code ()
  1557. 0409 00    [00]      db 00h          ; Index of string()       
  1558. 040A            
  1559. 040A            Class_Descriptor:
  1560. 040A 09    [00]      db 09h          ; Descriptor length (9 bytes)
  1561. 040B 21    [00]      db 21h          ; Descriptor type (HID)
  1562. 040C 00    [00]      db 00h,01h      ; HID class release number (1.00)
  1563. 040D 01    [00] 
  1564. 040E 00    [00]      db 00h          ; Localized country code (None)
  1565. 040F 01    [00]      db 01h          ; # of HID class dscrptr to follow (1)
  1566. 0410 22    [00]      db 22h          ; Report descriptor type (HID)
  1567. 0411                                 ; Total length of report descriptor
  1568. 0411 34    [00]      db (end_hid_report_desc_table - hid_report_desc_table),00h
  1569. 0412 00    [00] 
  1570. 0413            
  1571. 0413            Endpoint_Descriptor:
  1572. 0413 07    [00]      db 07h          ; Descriptor length (7 bytes)
  1573. 0414 05    [00]      db 05h          ; Descriptor type (Endpoint)
  1574. 0415 81    [00]      db 81h          ; Encoded address (Respond to IN, 1 endpoint)
  1575. 0416 03    [00]      db 03h          ; Endpoint attribute (Interrupt transfer)
  1576. 0417 06    [00]      db 06h,00h      ; Maximum packet size (6 bytes)
  1577. 0418 00    [00] 
  1578. 0419 0A    [00]      db 0Ah          ; Polling interval (10 ms)
  1579. 041A                  
  1580. 041A            end_config_desc_table:
  1581. 041A            
  1582. 041A            ;----------------------------------------------------------------------
  1583. 041A            ;The HID-report descriptor table
  1584. 041A            ;----------------------------------------------------------------------
  1585. 041A            
  1586. 041A            hid_report_desc_table:   
  1587. 041A 06    [00]      db 06h, A0h, FFh      ;         Usage Page (vendor defined) FFA0
  1588. 041B A0    [00] 
  1589. 041C FF    [00] 
  1590. 041D 09    [00]      db 09h, 01h     ;               Usage (vendor defined)
  1591. 041E 01    [00] 
  1592. 041F A1    [00]      db A1h, 01h     ;               Collection (Application)
  1593. 0420 01    [00] 
  1594. 0421 09    [00]      db 09h, 02h     ;               Usage (vendor defined)
  1595. 0422 02    [00] 
  1596. 0423 A1    [00]      db A1h, 00h     ;               Collection (Physical)
  1597. 0424 00    [00] 
  1598. 0425 06    [00]      db 06h, A1h, FFh ;               Usage Page (vendor defined) 
  1599. 0426 A1    [00] 
  1600. 0427 FF    [00] 
  1601. 0428            
  1602. 0428            ;The input report
  1603. 0428 09    [00]      db 09h, 03h     ;               usage - vendor defined
  1604. 0429 03    [00] 
  1605. 042A 09    [00]      db 09h, 04h     ;               usage - vendor defined
  1606. 042B 04    [00] 
  1607. 042C 15    [00]      db 15h, 80h     ;               Logical Minimum (-128)
  1608. 042D 80    [00] 
  1609. 042E 25    [00]      db 25h, 7Fh     ;               Logical Maximum (127)
  1610. 042F 7F    [00] 
  1611. 0430 35    [00]      db 35h, 00h     ;               Physical Minimum (0)
  1612. 0431 00    [00] 
  1613. 0432 45    [00]      db 45h, FFh;                    Physical Maximum (255)
  1614. 0433 FF    [00] 
  1615. 0434            ;    db 66h, 00h, 00h;               Unit (None (2 bytes))
  1616. 0434 75    [00]      db 75h, 08h     ;               Report Size (8)  (bits)
  1617. 0435 08    [00] 
  1618. 0436 95    [00]      db 95h, 02h     ;               Report Count (2)  (fields)
  1619. 0437 02    [00] 
  1620. 0438 81    [00]      db 81h, 02h     ;               Input (Data, Variable, Absolute)  
  1621. 0439 02    [00] 
  1622. 043A            
  1623. 043A            ;The output report
  1624. 043A 09    [00]      db 09h, 05h     ;               usage - vendor defined
  1625. 043B 05    [00] 
  1626. 043C 09    [00]      db 09h, 06h     ;               usage - vendor defined
  1627. 043D 06    [00] 
  1628. 043E 15    [00]      db 15h, 80h     ;               Logical Minimum (-128)
  1629. 043F 80    [00] 
  1630. 0440 25    [00]      db 25h, 7Fh     ;               Logical Maximum (127)
  1631. 0441 7F    [00] 
  1632. 0442 35    [00]      db 35h, 00h     ;               Physical Minimum (0)
  1633. 0443 00    [00] 
  1634. 0444 45    [00]      db 45h, FFh     ;               Physical Maximum (255)
  1635. 0445 FF    [00] 
  1636. 0446            ;    db 66h, 00h, 00h;               Unit (None (2 bytes))
  1637. 0446 75    [00]      db 75h, 08h     ;               Report Size (8)  (bits)
  1638. 0447 08    [00] 
  1639. 0448 95    [00]      db 95h, 02h     ;               Report Count (2)  (fields)
  1640. 0449 02    [00] 
  1641. 044A 91    [00]      db 91h, 02h     ;               Output (Data, Variable, Absolute)  
  1642. 044B 02    [00] 
  1643. 044C            
  1644. 044C C0    [00]      db C0h          ;               End Collection
  1645. 044D            
  1646. 044D C0    [00]      db C0h          ;               End Collection
  1647. 044E            
  1648. 044E            end_hid_report_desc_table:
  1649. 044E            
  1650. 044E            ;----------------------------------------------------------------------
  1651. 044E            ;String Descriptors
  1652. 044E            ;----------------------------------------------------------------------
  1653. 044E            
  1654. 044E            ;Define the strings
  1655. 044E            
  1656. 044E            ; string 0
  1657. 044E            USBStringLanguageDescription:
  1658. 044E 04    [00]     db 04h          ; Length
  1659. 044F 03    [00]     db 03h          ; Type (3=string)
  1660. 0450 09    [00]     db 09h          ; Language:  English
  1661. 0451 04    [00]     db 04h          ; Sub-language: US
  1662. 0452            ; string 1
  1663. 0452            
  1664. 0452            ;The Length value for each string =
  1665. 0452            ;((number of characters) * 2) + 2
  1666. 0452            
  1667. 0452            USBStringDescription1:     ; IManufacturerName
  1668. 0452 1A    [00]     db 1Ah          ; Length
  1669. 0453 03    [00]     db 03h          ; Type (3=string)
  1670. 0454 55 00 ...      dsu "USB Complete" ;
  1671.      53 00 42 00 20 00 43 00 6F 00 6D 00 70 00 6C 00 65 00 74 00 65 00 
  1672. 046C            
  1673. 046C            ; string 2
  1674. 046C            USBStringDescription2:     ; IProduct
  1675. 046C 16    [00]     db 16h          ; Length
  1676. 046D 03    [00]     db 03h          ; Type (3=string)
  1677. 046E 48 00 ...      dsu "HID Sample"  ;
  1678.      49 00 44 00 20 00 53 00 61 00 6D 00 70 00 6C 00 65 00 
  1679. 0482            
  1680. 0482            ;string 3
  1681. 0482            ;If the firmware contains a serial number, it must be unique
  1682. 0482            ;for each device or the devices may not enumerate properly.
  1683. 0482            USBStringDescription3:     ; serial number
  1684. 0482            
  1685. 0482            ; string 4                 
  1686. 0482            ;USBStringDescription4:     ; configuration string descriptor
  1687. 0482            ;    db 16h          ; Length
  1688. 0482            ;    db 03h          ; Type (3=string)
  1689. 0482            ;    dsu "Sample HID"  ;
  1690. 0482            
  1691. 0482            ;string 5
  1692. 0482            ;USBStringDescription5:     ; configuration string descriptor
  1693. 0482            ;    db 32h          ; Length
  1694. 0482            ;    db 03h          ; Type (3=string)
  1695. 0482            ;    dsu "EndPoint1 Interrupt Pipe"  ;
  1696. 0482            
  1697. 0482            USBStringEnd:
  1698. 0482            
  1699. 0482            ;----------------------------------------------------------------------
  1700. 0482            ;Status information.
  1701. 0482            ;The status can be either device, interface, or endpoint.
  1702. 0482            ;An index selects the correct value.
  1703. 0482            ;----------------------------------------------------------------------
  1704. 0482            get_dev_status_table:
  1705. 0482 00    [00]         db      00h, 00h        ; remote wakeup disabled, bus powered
  1706. 0483 00    [00] 
  1707. 0484 02    [00]         db      02h, 00h        ; remote wakeup enabled, bus powered
  1708. 0485 00    [00] 
  1709. 0486            get_interface_status_table:
  1710. 0486 00    [00]         db      00h, 00h        ; always return both bytes zero
  1711. 0487 00    [00] 
  1712. 0488            get_endpoint_status_table:
  1713. 0488 00    [00]         db      00h, 00h        ; not stalled
  1714. 0489 00    [00] 
  1715. 048A 01    [00]         db      01h, 00h        ; stalled
  1716. 048B 00    [00] 
  1717. 048C            get_configuration_status_table:
  1718. 048C 00    [00]         db      00h             ; not configured
  1719. 048D 01    [00]         db      01h             ; configured
  1720. 048E            get_protocol_status_table:
  1721. 048E 00    [00]         db      00h             ; boot protocol
  1722. 048F 01    [00]         db      01h             ; report protocol
  1723. 0490            
  1724. CheckSum = 1AD8
  1725. Warnings = 0
  1726. Errors   = 0
  1727. Product: CPU=63, RAM=128 bytes, ROM=4096K bytes
  1728.  ************ SYMBOLIC REFERENCE TABLE ************
  1729. Value  Label                # Uses 
  1730. -----  -------------------- ------
  1731.   f7   BusReset               1
  1732.  40a   Class_Descriptor       2
  1733.  27e   ClearEndpointStall     1
  1734.  224   ClearRemoteWakeup      1
  1735.    0 = DISABLE_REMOTE_WAKEUP   1
  1736.   40 = DataToggle             2
  1737.   38 = Data_Byte0             3
  1738.   39 = Data_Byte1             2
  1739.   3a = Data_Byte2             0
  1740.   3b = Data_Byte3             0
  1741.   3c = Data_Byte4             0
  1742.   3d = Data_Byte5             0
  1743.   3e = Data_Byte6             0
  1744.   3f = Data_Byte7             0
  1745.   10   DoNothing_ISR          2
  1746.  178   DoneWithReceivedData   1
  1747.    2 = ENABLE_REMOTE_WAKEUP   1
  1748.    c = ENUMERATE_MASK         1
  1749.   70 = Endpoint0_Byte0        0
  1750.   71 = Endpoint0_Byte1        0
  1751.   72 = Endpoint0_Byte2        0
  1752.   73 = Endpoint0_Byte3        0
  1753.   74 = Endpoint0_Byte4        0
  1754.   75 = Endpoint0_Byte5        0
  1755.   76 = Endpoint0_Byte6        0
  1756.   77 = Endpoint0_Byte7        0
  1757.   78 = Endpoint1_Byte0        2
  1758.   79 = Endpoint1_Byte1        2
  1759.   7a = Endpoint1_Byte2        1
  1760.   7b = Endpoint1_Byte3        0
  1761.   7c = Endpoint1_Byte4        0
  1762.   7d = Endpoint1_Byte5        0
  1763.   7e = Endpoint1_Byte6        0
  1764.   7f = Endpoint1_Byte7        0
  1765.   70 = Endpoint_0             4
  1766.  413   Endpoint_Descriptor    1
  1767.   85   GPIO_ISR               1
  1768.  2ca   GetConfiguration       1
  1769.  326   GetConfigurationDescriptor   1
  1770.  2b2   GetDescriptor          3
  1771.  31c   GetDeviceDescriptor    1
  1772.  2a8   GetDeviceStatus        1
  1773.  2dc   GetEndpointStatus      1
  1774.  35d   GetHIDDescriptor       1
  1775.  310   GetIdle                1
  1776.  2d4   GetInterfaceStatus     1
  1777.  312   GetProtocol            1
  1778.  305   GetReport              1
  1779.  307   GetReportDescriptor    1
  1780.  32e   GetStringDescriptor    1
  1781.  160   Get_Received_Data      1
  1782.   20 = Global_Interrupt       13
  1783.   21 = HID                    1
  1784.   34   Inc_counter            1
  1785.  401   Interface_Descriptor   0
  1786.  345   LanguageString         1
  1787.  34d   ManufacturerString     1
  1788.  171   NewValueSet            1
  1789.   15   One_mSec_ISR           1
  1790.    0 = Port0_Data             8
  1791.    4 = Port0_Interrupt        1
  1792.   30 = Port0_Isink            0
  1793.   30 = Port0_Isink0           1
  1794.   31 = Port0_Isink1           1
  1795.   32 = Port0_Isink2           1
  1796.   33 = Port0_Isink3           1
  1797.   34 = Port0_Isink4           1
  1798.   35 = Port0_Isink5           1
  1799.   36 = Port0_Isink6           1
  1800.   37 = Port0_Isink7           1
  1801.    8 = Port0_Pullup           1
  1802.    1 = Port1_Data             3
  1803.    5 = Port1_Interrupt        0
  1804.   38 = Port1_Isink            0
  1805.   38 = Port1_Isink0           1
  1806.   39 = Port1_Isink1           1
  1807.   3a = Port1_Isink2           1
  1808.   3b = Port1_Isink3           1
  1809.    9 = Port1_Pullup           3
  1810.  355   ProductString          1
  1811.   5c = RUNTIME_MASK           0
  1812.  1b2   RequestType00          1
  1813.  1c6   RequestType02          1
  1814.  1fa   RequestType21          1
  1815.  20c   RequestType22          1
  1816.  1d2   RequestType80          1
  1817.  1e2   RequestType81          1
  1818.  1ee   RequestType82          1
  1819.  214   RequestTypeA1          1
  1820.   99   Reset                  2
  1821.  16f   ResetToZero            1
  1822.    1 = RunBit                 1
  1823.   7d   Select                 2
  1824.  379   Send0ByteDataPacket    8
  1825.  33e   SendDescriptor         12
  1826.  1ad   SendStall              17
  1827.  23e   SetAddress             1
  1828.  245   SetConfiguration       1
  1829.  297   SetEndpointStall       1
  1830.  2fa   SetIdle                1
  1831.  2fc   SetProtocol            1
  1832.  231   SetRemoteWakeup        1
  1833.  2e7   SetReport              2
  1834.  183   StageOne               1
  1835.   ff = Status_Control         6
  1836.   57   Suspend_end            2
  1837.    4 = TIMER_ONLY             1
  1838.   23 = Timer                  0
  1839.   20 = USBReset               1
  1840.  452   USBStringDescription1   3
  1841.  46c   USBStringDescription2   3
  1842.  482   USBStringDescription3   1
  1843.  482   USBStringEnd           0
  1844.  44e   USBStringLanguageDescription   2
  1845.   12 = USB_Device_Address     1
  1846.  124   USB_EP0_ISR            1
  1847.   14 = USB_EP0_RX_Status      7
  1848.   10 = USB_EP0_TX_Config      5
  1849.   8c   USB_EP1_ISR            1
  1850.   11 = USB_EP1_TX_Config      17
  1851.   13 = USB_Status_Control     11
  1852.  381   WaitForDataToTransfer   1
  1853.   40 = WatchDogReset          1
  1854.   21 = Watchdog               6
  1855.   ee   WatchdogHandler        1
  1856.   71 = bRequest               8
  1857.   70 = bmRequestType          1
  1858.  13d   check_for_out_packet   1
  1859.    1 = clear_feature          2
  1860.  3f8   config_desc_table      2
  1861.    2 = configuration          1
  1862.   31 = configuration_status   4
  1863.  38a   control_read           1
  1864.  38f   control_read_data_stage   1
  1865.  3e0   control_read_status_stage   2
  1866.  3e6   control_read_table     13
  1867.   28 = data_count             19
  1868.   27 = data_start             3
  1869.    1 = device                 1
  1870.  269   device_configured      1
  1871.  3e6   device_desc_table      2
  1872.    1 = device_remote_wakeup   2
  1873.  3bc   dma_load_done          2
  1874.  3a7   dma_load_loop          1
  1875.  27d   done_configuration     1
  1876.  17b   done_with_packet       2
  1877.  41a   end_config_desc_table   1
  1878.  3f8   end_device_desc_table   0
  1879.  44e   end_hid_report_desc_table   2
  1880.   23 = endp0_data_toggle      3
  1881.    5 = endpoint               0
  1882.   78 = endpoint_1             0
  1883.   29 = endpoint_stall         5
  1884.    0 = endpoint_stalled       2
  1885.    8 = get_configuration      1
  1886.  48c   get_configuration_status_table   1
  1887.    6 = get_descriptor         3
  1888.  366   get_descriptor_length   1
  1889.  482   get_dev_status_table   1
  1890.  488   get_endpoint_status_table   1
  1891.    2 = get_idle               1
  1892.    a = get_interface          0
  1893.  486   get_interface_status_table   1
  1894.    3 = get_protocol           1
  1895.  48e   get_protocol_status_table   1
  1896.    1 = get_report             1
  1897.    0 = get_status             3
  1898.  41a   hid_report_desc_table   3
  1899.    4 = interface              0
  1900.   20 = interrupt_mask         24
  1901.   24 = loop_counter           4
  1902.   37 = loop_temp              5
  1903.  114   main                   1
  1904.  11e   no_set                 1
  1905.  122   nochange               0
  1906.  15d   not_a_match            1
  1907.   20   not_main               1
  1908.   23 = physical               0
  1909.   34 = protocol_status        2
  1910.   30 = remote_wakeup_status   4
  1911.   22 = report                 1
  1912.   65   send_value             1
  1913.    5 = set_address            1
  1914.    9 = set_configuration      1
  1915.    7 = set_descriptor         0
  1916.    3 = set_feature            2
  1917.    a = set_idle               1
  1918.    b = set_interface          0
  1919.    b = set_protocol           1
  1920.    9 = set_report             2
  1921.   32 = start_send             3
  1922.   21 = start_time             0
  1923.    3 = string                 1
  1924.   f0   suspendReset           2
  1925.   35 = suspend_counter        4
  1926.    c = synch_frame            0
  1927.   25 = temp                   0
  1928.   22 = testbit                0
  1929.  378   use_actual_length      3
  1930.   74 = wIndex                 0
  1931.   75 = wIndexHi               0
  1932.   76 = wLength                2
  1933.   77 = wLengthHi              1
  1934.   72 = wValue                 8
  1935.   73 = wValueHi               1
  1936.  102   wait                   1
  1937.  3d2   wait_control_read      1