|
|
1.1 root 1: \ *****************************************************************************
2: \ * Copyright (c) 2004, 2008 IBM Corporation
3: \ * All rights reserved.
4: \ * This program and the accompanying materials
5: \ * are made available under the terms of the BSD License
6: \ * which accompanies this distribution, and is available at
7: \ * http://www.opensource.org/licenses/bsd-license.php
8: \ *
9: \ * Contributors:
10: \ * IBM Corporation - initial implementation
11: \ ****************************************************************************/
12:
13:
14: \ ----------------------------------------------------------------------------
15: \ On detection of a hub after reading the device descriptor this package has to
16: \ be called so that the hub enumeration is done to idenitify the down stream
17: \ device
18: \ --------------------------------------------------------------------------
19: \ OF properties
20: \ --------------------------------------------------------------------------
21:
22:
23: s" hub" device-name
24: s" usb" device-type
25: 1 encode-int s" #address-cells" property
26: 0 encode-int s" #size-cells" property
27:
28: \ converts physical address to text unit string
29:
30:
31: : encode-unit ( port-addr -- unit-str unit-len ) 1 hex-encode-unit ;
32:
33:
34: \ Converts text unit string to phyical address
35:
36:
37: : decode-unit ( addr len -- port-addr ) 1 hex-decode-unit ;
38:
39: 0 VALUE new-device-address
40: 0 VALUE port-number
41: 0 VALUE MPS-DCP
42: 0 VALUE mps
43: 0 VALUE my-usb-address
44:
45: 00 value device-speed
46:
47:
48: \ Get parameters passed from the parent.
49:
50: : mps-property-set ( -- )
51: s" HUB Compiling mps-property-set " usb-debug-print
52: s" USB-ADDRESS" get-my-property ( TRUE | prop-addr prop-len FALSE )
53: IF
54: s" notpossible" usb-debug-print
55: ELSE
56: decode-int nip nip to my-usb-address
57: THEN
58: s" MPS-DCP" get-my-property ( TRUE | prop-addr prop-len FALSE )
59: IF
60: s" MPS-DCP property not found Assuming 8 as MAX PACKET SIZE" ( str len )
61: usb-debug-print
62: s" for the default control pipe" usb-debug-print
63: 8 to MPS-DCP
64: ELSE
65: s" MPS-DCP property found!!" usb-debug-print ( prop-addr prop-len FALSE )
66: decode-int nip nip to MPS-DCP
67: THEN
68: ;
69:
70:
71: \ --------------------------------------------------------------------------
72: \ Constant declarations
73: \ --------------------------------------------------------------------------
74:
75:
76: 2303080000000000 CONSTANT hppwr-set
77: 2301080000000000 CONSTANT hppwr-clear
78: 2303040000000000 CONSTANT hprst-set
79: A300000000000400 CONSTANT hpsta-get
80: 2303010000000000 CONSTANT hpena-set
81: A006002900000000 CONSTANT hubds-get
82: 8 CONSTANT DEFAULT-CONTROL-MPS
83: 12 CONSTANT DEVICE-DESCRIPTOR-LEN
84: 9 CONSTANT CONFIG-DESCRIPTOR-LEN
85: 20 CONSTANT BULK-CONFIG-DESCRIPTOR-LEN
86:
87:
88: \ TODO:
89: \ CONFIG-DESCRIPTOR-LEN should be only 9. The interface
90: \ and endpoint descriptors returned along with config
91: \ descriptor are variable and 0x19 is a very wrong VALUE
92: \ to specify for this #define.
93:
94:
95: 1 CONSTANT DEVICE-DESCRIPTOR-TYPE
96: 1 CONSTANT DEVICE-DESCRIPTOR-TYPE-OFFSET
97: 4 CONSTANT DEVICE-DESCRIPTOR-DEVCLASS-OFFSET
98: 7 CONSTANT DEVICE-DESCRIPTOR-MPS-OFFSET
99: 9 CONSTANT HUB-DEVICE-CLASS
100: 0 CONSTANT NO-CLASS
101:
102:
103: \ --------------------------------------------------------------------------
104: \ Temporary Variable declarations
105: \ --------------------------------------------------------------------------
106:
107: 00 VALUE temp1
108: 00 VALUE temp2
109: 00 VALUE temp3
110: 00 VALUE po2pg \ Power On to Power Good
111:
112:
113: \ --------------------------------------------------------------------------
114: \ Buffer allocations
115: \ --------------------------------------------------------------------------
116:
117:
118: VARIABLE setup-packet \ 8 bytes for setup packet
119: VARIABLE ch-buffer \ 1 byte character buffer
120:
121: INSTANCE VARIABLE dd-buffer
122: INSTANCE VARIABLE cd-buffer
123:
124: \ TODO:
125: \ Should arrive a proper value for the size of the "cd-buffer"
126:
127: 8 chars alloc-mem VALUE status-buffer
128: 9 chars alloc-mem VALUE hd-buffer
129:
130:
131: : (allocate-mem) ( -- )
132: DEVICE-DESCRIPTOR-LEN chars alloc-mem dd-buffer !
133: BULK-CONFIG-DESCRIPTOR-LEN chars alloc-mem cd-buffer !
134: ;
135:
136:
137: : (de-allocate-mem) ( -- )
138: dd-buffer @ ?dup IF
139: DEVICE-DESCRIPTOR-LEN free-mem
140: 0 dd-buffer !
141: THEN
142: cd-buffer @ ?dup IF
143: BULK-CONFIG-DESCRIPTOR-LEN free-mem
144: 0 cd-buffer !
145: THEN
146: ;
147:
148:
149: \ standard open firmware methods
150:
151: : open ( -- TRUE )
152: (allocate-mem)
153: TRUE
154: ;
155:
156: : close ( -- )
157: (de-allocate-mem)
158: ;
159:
160:
161: \ --------------------------------------------------------------------------
162: \ Parent's method
163: \ --------------------------------------------------------------------------
164:
165:
166: : controlxfer ( dir addr dlen setup-packet MPS ep-fun -- TRUE|FALSE )
167: s" controlxfer" $call-parent
168: ;
169:
170: : control-std-set-address ( speedbit -- usb-address TRUE|FALSE )
171: s" control-std-set-address" $call-parent
172: ;
173:
174: : control-std-get-device-descriptor
175: ( data-buffer data-len MPS funcAddr -- TRUE|FALSE )
176: s" control-std-get-device-descriptor" $call-parent
177: ;
178:
179: : control-std-get-configuration-descriptor
180: ( data-buffer data-len MPS funcAddr -- TRUE|FALSE )
181: s" control-std-get-configuration-descriptor" $call-parent
182: ;
183:
184: : control-std-get-maxlun
185: ( MPS fun-addr dir data-buff data-len -- TRUE|FALSE )
186: s" control-std-get-maxlun" $call-parent
187: ;
188:
189: : control-std-set-configuration
190: ( configvalue FuncAddr -- TRUE|FALSE )
191: s" control-std-set-configuration" $call-parent
192: ;
193:
194: : control-std-get-string-descriptor
195: ( StringIndex data-buffer data-len MPS FuncAddr -- TRUE|FALSE )
196: s" control-std-get-string-descriptor" $call-parent
197: ;
198:
199: : rw-endpoint
200: ( pt ed-type toggle buffer length mps address -- toggle TRUE|toggle FALSE )
201: s" rw-endpoint" $call-parent
202: ;
203:
204: : debug-td ( -- )
205: s" debug-td" $call-parent
206: ;
207:
208: \ *** NEW ****
209: : control-bulk-reset ( MPS fun-addr dir data-buff data-len -- TRUE | FALSE )
210: s" control-bulk-reset" $call-parent
211: ;
212:
213:
214: \ --------------------------------------------------------------------------
215: \ HUB specific methods
216: \ --------------------------------------------------------------------------
217: \ To bring on the power on a valid port of a hub with a valid USB address
218: \ --------------------------------------------------------------------------
219:
220:
221: : control-hub-port-power-set ( port# -- TRUE|FALSE )
222: hppwr-set setup-packet ! ( port#)
223: setup-packet 4 + c!
224: 0 0 0 setup-packet MPS-DCP my-usb-address controlxfer ( TRUE | FALSE )
225: ;
226:
227:
228: \ --------------------------------------------------------------------------
229: \ To put power off on ports where device detection or enumeration has failed
230: \ --------------------------------------------------------------------------
231:
232:
233: : control-hub-port-power-clear ( port#-- TRUE|FALSE )
234: hppwr-clear setup-packet ! ( port#)
235: setup-packet 4 + c!
236: 0 0 0 setup-packet MPS-DCP my-usb-address controlxfer ( TRUE|FALSE )
237: ;
238:
239:
240: \ -------------------------------------------------------------------------
241: \ To reset a valid port of a hub with a valid USB
242: \ address
243: \ --------------------------------------------------------------------------
244:
245:
246: : control-hub-port-reset-set ( port# -- TRUE|FALSE )
247: hprst-set setup-packet ! ( port# )
248: setup-packet 4 + c!
249: 0 0 0 setup-packet MPS-DCP my-usb-address controlxfer ( TRUE|FALSE )
250: ;
251:
252:
253: \ -------------------------------------------------------------------------
254: \ To enable a particular valid port of a hub with a valid USB address
255: \ -------------------------------------------------------------------------
256:
257:
258: : control-hub-port-enable ( port# -- TRUE|FALSE )
259: hpena-set setup-packet ! ( port# )
260: setup-packet 4 + c!
261: 0 0 0 setup-packet MPS-DCP my-usb-address controlxfer ( TRUE|FALSE )
262: ;
263:
264:
265: \ -------------------------------------------------------------------------
266: \ To get the status of a valid port of a hub with
267: \ a valid USB address
268: \ -------------------------------------------------------------------------
269:
270:
271: : control-hub-port-status-get ( buffer port# -- TRUE|FALSE )
272: hpsta-get setup-packet ! ( buffer port# )
273: setup-packet 4 + c! ( buffer )
274: 0 swap 4 setup-packet MPS-DCP my-usb-address controlxfer ( TRUE|FALSE )
275: ;
276:
277:
278: \ --------------------------------------------------------------------------
279: \ To get the hub descriptor to understand how many ports are vailable and the
280: \ specs of those ports
281: \ ---------------------------------------------------------------------------
282:
283:
284: : control-get-hub-descriptor ( buffer buffer-length -- TRUE|FALSE )
285: hubds-get setup-packet !
286: dup setup-packet 6 + w!-le ( buffer buffer-length )
287: 0 -rot setup-packet MPS-DCP my-usb-address controlxfer ( TRUE|FALSE )
288: ;
289:
290:
291: s" usb-enumerate.fs" INCLUDED
292:
293:
294: : hub-configure-port ( port# -- )
295:
296: \ this port has been powered on
297: \ send reset to enable port and
298: \ start device detection by hub
299: \ some devices require a long timeout here (10s)
300:
301: \ Step 1: check if reset state ended
302:
303: BEGIN ( port# )
304: status-buffer 4 erase ( port# )
305: status-buffer over control-hub-port-status-get drop ( port# )
306: status-buffer w@-le 102 and 0= ( port# TRUE|FALSE )
307: WHILE ( port# )
308: REPEAT ( port# )
309: po2pg 3 * ms \ wait for bPwrOn2PwrGood*3 ms
310:
311: \ STEP 2: Reset the port.
312: \ (this also enables the port)
313: dup control-hub-port-reset-set drop ( port# )
314: BEGIN ( port# )
315: status-buffer 4 erase ( port# )
316: status-buffer over control-hub-port-status-get drop ( port# )
317: status-buffer w@-le 10 and ( port# TRUE|FALSE )
318: WHILE ( port# )
319: REPEAT ( port# )
320:
321: \ STEP 3: Check if a device is connected to the port.
322:
323: status-buffer 4 erase ( port# )
324: status-buffer over control-hub-port-status-get drop ( port# )
325: status-buffer w@-le 103 and 103 <> ( port# TRUE|FALSE )
326: s" Port status bits: " status-buffer w@-le usb-debug-print-val
327: IF ( port# )
328: drop
329: s" Connect status: No device connected " usb-debug-print
330: EXIT
331: THEN
332:
333:
334: \ STEP 4: Assign an address to this device.
335:
336: status-buffer w@-le 200 and 4 lshift \ get speed bit
337: dup to device-speed \ store speed bit
338: ( port# speedbit )
339: control-std-set-address ( port# usb-addr TRUE|FALSE )
340: 50 ms ( port# usb-addr TRUE|FALSE )
341: debug-td ( port# usb-addr TRUE|FALSE )
342: IF ( port# usb-addr )
343: device-speed or ( port# usb-addr+speedbit )
344: to new-device-address ( port# )
345: to port-number
346: dd-buffer @ DEVICE-DESCRIPTOR-LEN erase
347: dd-buffer @ DEFAULT-CONTROL-MPS DEFAULT-CONTROL-MPS new-device-address
348: ( buffer mps mps usb-addr )
349: control-std-get-device-descriptor ( TRUE|FALSE )
350: IF
351: dd-buffer @ DEVICE-DESCRIPTOR-TYPE-OFFSET + c@ ( descriptor-type )
352: DEVICE-DESCRIPTOR-TYPE <> ( TRUE|FALSE )
353: IF
354: s" HUB: ERROR!! Invalid Device Descriptor for the new device"
355: usb-debug-print
356: ELSE
357: dd-buffer @ DEVICE-DESCRIPTOR-MPS-OFFSET + c@ to mps
358:
359: \ Re-read the device descriptor again with the known MPS.
360:
361: dd-buffer @ DEVICE-DESCRIPTOR-LEN erase
362: dd-buffer @ DEVICE-DESCRIPTOR-LEN mps new-device-address
363: ( buffer descp-len mps usb-addr )
364: \ s" DEVICE DESCRIPTOR: " usb-debug-print
365: control-std-get-device-descriptor invert
366: IF
367: s" ** reading dev-descriptor failed ** " usb-debug-print
368: THEN
369: create-usb-device-tree
370: THEN
371: ELSE
372: s" ERROR!! Failed to get device descriptor" usb-debug-print
373: THEN
374: ELSE ( port# )
375: s" USB Set Adddress failed!!" usb-debug-print ( port# )
376: s" Clearing Port Power..." usb-debug-print ( port# )
377: control-hub-port-power-clear ( TRUE|FALSE )
378: IF
379: s" Port power down " usb-debug-print
380: ELSE
381: s" Unable to clear port power!!!" usb-debug-print
382: THEN
383: THEN
384: ;
385:
386:
387: \ ---------------------------------------------------------------------------
388: \ To enumerate all the valid ports of hub
389: \ TODO:
390: \ 1. Remove hardcoded constants.
391: \ 2. Remove Endian Dependencies.
392: \ 3. Return values of controlxfer should be checked.
393: \ ---------------------------------------------------------------------------
394:
395: : hub-enumerate ( -- )
396: cd-buffer @ CONFIG-DESCRIPTOR-LEN erase
397:
398: \ Get HUB configuration and SET the configuration
399: \ note: remove hard-coded constants.
400:
401: cd-buffer @ CONFIG-DESCRIPTOR-LEN MPS-DCP my-usb-address
402: ( buffer descp-len mps usb-address )
403: control-std-get-configuration-descriptor drop
404: cd-buffer @ 1+ c@ 2 <> IF
405: s" Unable to read configuration descriptor" usb-debug-print
406: EXIT
407: THEN
408: cd-buffer @ 4 + c@ 1 <> IF
409: s" Not a valid HUB config descriptor" usb-debug-print
410: EXIT
411: THEN
412:
413: \ TODO: Do further checkings on the returned Configuration descriptor
414: \ before proceeding to accept it.
415:
416: cd-buffer @ 5 + c@ to temp1 \ Store the configuration in temp1
417: temp1 my-usb-address control-std-set-configuration drop
418: my-usb-address to temp1
419: hd-buffer 9 erase
420: hd-buffer 9 control-get-hub-descriptor drop
421:
422: \ PENDING: 1. Check Return value.
423: \ 2. HUB descriptor size is variable. Currently we r hardcoding
424: \ a value of 9.
425:
426: hd-buffer 2 + c@ to temp2 \ number of downstream ports
427:
428: s" HUB: Found " usb-debug-print
429: s" number of downstream hub ports! : " temp2 usb-debug-print-val
430: hd-buffer 5 + c@ to po2pg \ get bPwrOn2PwrGood
431:
432: \ power on all present hub ports
433: \ to allow slow devices to set up
434:
435: temp2 1+ 1 DO
436: i control-hub-port-power-set drop
437: d# 20 ms
438: LOOP
439:
440: d# 200 ms \ some devices need a long time (10s)
441:
442: \ now start detection and configuration for these ports
443:
444: temp2 1+ 1 DO
445: s" hub-configure-port: " i usb-debug-print-val
446: i hub-configure-port
447: LOOP
448: ;
449:
450:
451: \ --------------------------------------------------------------------------
452: \ To initialize hub
453: \ --------------------------------------------------------------------------
454:
455: (allocate-mem)
456: mps-property-set
457: hub-enumerate
458: (de-allocate-mem)
459:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.