Changeset 2152


Ignore:
Timestamp:
Jan 26, 2011, 11:40:25 PM (5 years ago)
Author:
wmb
Message:

USB - extensive surgery on USB probing code so hot-plug works behind hubs.

Location:
dev/usb2
Files:
15 edited

Legend:

Unmodified
Added
Removed
  • dev/usb2/device/hub/hub.fth

    r1 r2152  
    3434   decode-int nip nip
    3535;
     36: ?make-hub20-dev  ( hub-dev -- hub-dev )
     37   is-hub20?  if                                ( hub-dev )
     38      " hub20-dev" get-my-property   if         ( hub-dev )
     39         dup encode-int " hub20-dev" property   ( hub-dev )
     40      else   \ Property already exists          ( hub-dev adr len )
     41         2drop                                  ( hub-dev )
     42      then                                      ( hub-dev )
     43   then                                         ( hub-dev )
     44;
    3645: probe-hub  ( -- )
    3746   ['] hub-id catch 0=  if
    38       is-hub20?  if
    39          dup encode-int " hub20-dev" property
    40       then
     47      ?make-hub20-dev
    4148      probe-hub-xt execute
     49   then
     50;
     51: reprobe-hub  ( -- )
     52   ['] hub-id catch 0=  if
     53      reprobe-hub-xt execute
    4254   then
    4355;
  • dev/usb2/hcd/dev-info.fth

    r1674 r2152  
    6363: di-out-data-toggle  ( pipe idx -- )  2dup di-out-data@ 1 xor -rot di-out-data!  ;
    6464
    65 : ok-to-add-device?  ( -- flag )  cur-dev 1+ #max-dev <  ;
    66 : new-address  ( -- dev )
     65: next-device#  ( -- true | dev false )
     66   cur-dev 1+ #max-dev >=  if  true exit  then
    6767   cur-dev 1+ dup to cur-dev 
    6868   /pipe0 0 cur-dev di-maxpayload!
     69   false
    6970;
    7071
  • dev/usb2/hcd/device.fth

    r1690 r2152  
    11110 value cfg-desc-buf                    \ Configuration Descriptor
    12120 value dev-desc-buf                    \ Device Descriptor
    13 0 value gen-desc-buf                    \ Any Descriptor
    14130 value d$-desc-buf                     \ Device String Descriptor
    15140 value v$-desc-buf                     \ Vendor String Descriptor
     
    2625      /cfg alloc-mem dup to cfg-desc-buf /cfg erase
    2726      /cfg alloc-mem dup to dev-desc-buf /cfg erase
    28       /cfg alloc-mem dup to gen-desc-buf /cfg erase
    2927      /str alloc-mem dup to d$-desc-buf /str erase
    3028      /str alloc-mem dup to v$-desc-buf /str erase
     
    3533   cfg-desc-buf ?dup  if  /cfg free-mem  0 to cfg-desc-buf  then
    3634   dev-desc-buf ?dup  if  /cfg free-mem  0 to dev-desc-buf  then
    37    gen-desc-buf ?dup  if  /cfg free-mem  0 to gen-desc-buf  then
    3835   d$-desc-buf  ?dup  if  /str free-mem  0 to d$-desc-buf   then
    3936   v$-desc-buf  ?dup  if  /str free-mem  0 to v$-desc-buf   then
     
    4138;
    4239
     40: dev-desc@  ( index -- byte )  dev-desc-buf + c@  ;
     41: get-class  ( -- class subclass protocol )
     42   4 dev-desc@ ?dup  if                 ( class )
     43      \ Class is in device descriptor
     44      true to class-in-dev?                     ( class )
     45      5 dev-desc@  6 dev-desc@                  ( class subclass protocol )
     46   else                                         ( )
     47      \ Class is in interface descriptor
     48      false to class-in-dev?                    ( )
     49      cfg-desc-buf my-address find-intf-desc    ( intf-adr )
     50      >r  r@ 5 + c@  r@ 6 + c@   r> 7 + c@      ( class subclass protocol )
     51   then
     52;
     53
    4354: make-class-properties  ( -- )
    44    dev-desc-buf cfg-desc-buf my-address get-class       ( class subclass protocol )
     55   get-class  ( class subclass protocol )
    4556   " protocol" int-property
    4657   " subclass" int-property
     
    8495;
    8596
     97: get-vid  ( adr -- vendor product rev )
     98   dev-desc-buf 8 + le-w@   dev-desc-buf d# 10 + le-w@  dev-desc-buf c + le-w@
     99;
     100
    86101: make-vendor-properties  ( -- )
    87    dev-desc-buf get-vid                 ( vendor product rev )
     102   get-vid                      ( vendor product rev )
    88103   " release"   int-property
    89104   " device-id" int-property
     
    257272;
    258273
    259 : reuse-node  ( dev intf port phandle -- )
    260    >r drop                        ( dev intf r: phandle )
    261 
    262    2dup reregister-pipes          ( dev intf r: phandle )
    263    drop                           ( dev      r: phandle )
    264 
    265    \ Change the assigned-address property without leaking memory
    266    " assigned-address" r@ get-package-property  if  ( dev r: phandle )
    267       drop                                  ( r: phandle )
    268    else                                     ( dev adr len r: phandle )
    269       drop be-l!                            ( r: phandle )
    270    then                                     ( r: phandle )
    271 
     274: probe-hub-node  ( phandle -- )
     275   >r                                       ( r: phandle )
    272276   " probe-hub" r@ find-method  if          ( xt r: phandle )
    273277      r@ push-package                       ( xt r: phandle )
     
    278282      pop-package                           ( r: phandle )
    279283   then                                     ( r: phandle )
    280 
    281284   r> drop
    282285;
    283 
     286: reuse-node  ( dev intf port phandle -- )
     287   >r drop                        ( dev intf r: phandle )
     288
     289   2dup reregister-pipes          ( dev intf r: phandle )
     290   drop                           ( dev      r: phandle )
     291
     292   \ Change the assigned-address property without leaking memory
     293   " assigned-address" r@ get-package-property  if  ( dev r: phandle )
     294      drop                                  ( r: phandle )
     295   else                                     ( dev adr len r: phandle )
     296      drop be-l!                            ( r: phandle )
     297   then                                     ( r: phandle )
     298
     299   r> probe-hub-node
     300;
    284301: id-match?  ( dev intf port phandle -- dev intf port phandle flag? )
    285302   " vendor-id" 2 pick get-package-property  if  false exit  then
     
    289306   " release" 2 pick get-package-property  if  r> r> 2drop  false exit  then
    290307   decode-int nip nip   >r     ( dev intf port phandle r: vid did rev )
    291    dev-desc-buf get-vid        ( dev intf port phandle  vid1 did1 rev1 r: vid did rev )
     308   get-vid                     ( dev intf port phandle  vid1 did1 rev1 r: vid did rev )
    292309   r> = -rot  r> = -rot  r> =  and and
    293310;
     
    336353
    337354\ Get all the descriptors we need in making properties now because target is
    338 \ questionable in the child's context.
     355\ questionable in the child's context.  The descriptor buffers are not instance
     356\ data, so they can be accessed by code that is defined in the root hub node
     357\ but executing in a subordinate hub node context or a child node context.
    339358
    340359h# 409 constant language                        \ Unicode id
     360\ Executed in root hub node context
    341361: get-string ( lang idx adr -- actual )
    342362   over 0=  if  3drop  0 exit  then             \ No string index
    343363   -rot get-str-desc
    344364;
     365
     366\ Executed in root hub node context
    345367: get-str-descriptors  ( -- )
    346368   language                                     ( lang )
     
    349371       dev-desc-buf d# 16 + c@ s$-desc-buf get-string to /s$-desc-buf
    350372;
    351 : refresh-desc-bufs  ( -- )
     373
     374\ Executed in root hub node context
     375: refresh-desc-bufs  ( dev -- )
     376   set-target
    352377   dev-desc-buf 12 get-dev-desc to /dev-desc-buf                \ Refresh dev-desc-buf
    353378   cfg-desc-buf  0 get-cfg-desc to /cfg-desc-buf                \ Refresh cfg-desc-buf
     
    355380;
    356381
    357 : set-maxpayload  ( dev -- )
    358    dev-desc-buf /pipe0 get-dev-desc  if
    359       dev-desc-buf 7 + c@ 0 rot di-maxpayload!
    360    else
    361       drop
    362    then
    363 ;
    364 
     382\ Executed in root hub node context
     383: get-initial-descriptors  ( dev -- )
     384   dev-desc-buf /pipe0 get-dev-desc  if         ( dev )
     385      dev-desc-buf 7 + c@ 0 rot di-maxpayload!  ( )
     386   else                                         ( dev )
     387      drop                                      ( )
     388   then                                         ( )
     389   cfg-desc-buf 0 get-cfg-desc to /cfg-desc-buf ( )
     390;
     391
     392\ Executed in hub node context (root hub or subordinate hub) - creates new child nodes via (make-device-node)
    365393: make-device-node  ( port dev -- )
    366    dup set-maxpayload                   ( port dev )
    367    cfg-desc-buf 0 get-cfg-desc dup to /cfg-desc-buf
    368    0=  if  2drop  exit  then
    369    cfg-desc-buf 4 + c@ 0  ?do           ( port dev )
    370       dup set-target                    ( port dev )            \ Refresh target
    371       refresh-desc-bufs                 ( port dev )
    372       2dup swap i (make-device-node)    ( port dev )
    373    loop  2drop                          ( )
     394   dup " get-initial-descriptors" my-self $call-method  ( port dev )
     395   /cfg-desc-buf 0=  if  2drop  exit  then              ( port dev )
     396   cfg-desc-buf 4 + c@ 0  ?do                           ( port dev )
     397      dup " refresh-desc-bufs" my-self $call-method     ( port dev )
     398      2dup swap i (make-device-node)                    ( port dev )
     399   loop  2drop                                          ( )
     400;
     401
     402\ See hcd/ehci/probehub.fth for information about hub20-dev and hub20-port
     403
     404: get-hub20-dev  ( -- hub-dev )
     405   " hub20-dev" get-inherited-property 0=  if   ( value$ )
     406      decode-int nip nip                        ( hub-dev )
     407   else                                         ( )
     408      1                                         ( hub-dev )
     409   then                                         ( hub-dev )
     410;
     411
     412: get-hub20-port  ( port -- port' )
     413   " hub20-port" get-inherited-property 0=  if  ( port value$ )
     414      rot drop                                  ( value$ )
     415      decode-int nip nip                        ( port' )
     416   then                                         ( port )
     417;
     418
     419\ Executed in the root hub node context
     420: setup-new-node  ( port speed hub-port hub-dev -- true | port dev xt false )
     421  \ Allocate device number
     422   next-device#  if  2drop  exit  then  ( port speed hub-port hub-dev dev )
     423
     424   tuck di-hub!                         ( port speed hub-port dev )
     425   tuck di-port!                        ( port speed dev )
     426   tuck di-speed!                       ( port dev )
     427
     428   0 set-target                         ( port dev )    \ Address it as device 0
     429   dup set-address  if                  ( port dev )    \ Assign it usb addr dev
     430      ." Retrying with a delay" cr
     431      over reset-port  d# 5000 ms
     432      dup set-address  if               ( port dev )    \ Assign it usb addr dev
     433         \ Recycle device number?
     434         2drop false exit               ( -- false )
     435      then                              ( port dev )
     436   then                                 ( port dev )
     437
     438   dup set-target                       ( port dev )    \ Address it as device dev
     439   ['] make-device-node  true           ( port dev xt )
     440;
     441
     442\ Begins execution in a (root or subordinate) hub node context, creates an instance record
     443\ for the subordinate hub node "phandle", switches to that instance context, executes
     444\ "reprobe-hub" in that context, destroys the instance, and returns to the original context.
     445: reprobe-hub-node  ( phandle -- )
     446   >r                                       ( r: phandle )
     447   " reprobe-hub" r@ find-method  if        ( xt r: phandle )
     448      r@ push-package                       ( xt r: phandle )
     449      " " new-instance                      ( xt r: phandle )
     450      set-default-unit                      ( xt r: phandle )
     451      execute                               ( r: phandle )
     452      destroy-instance                      ( r: phandle )
     453      pop-package                           ( r: phandle )
     454   then                                     ( r: phandle )
     455   r> drop
     456;
     457
     458\ Returns true if there is a child hub node associated with port
     459: port-is-hub?  ( port -- false | phandle true )
     460   my-self ihandle>phandle child                       ( port phandle )
     461   begin  ?dup  while                                  ( port phandle )
     462      " name" 2 pick get-package-property 0=  if       ( port phandle adr len )
     463         1-  " hub" $=  if                             ( port phandle )
     464            " reg" 2 pick get-package-property 0=  if  ( port phandle adr len )
     465               decode-int nip nip                      ( port phandle port1 )
     466               2 pick =  if                            ( port phandle )
     467                  nip true exit                        ( -- phandle true )
     468               then                                    ( port phandle )
     469            then                                       ( port phandle )
     470         then                                          ( port phandle )
     471      then                                             ( port phandle )
     472      peer                                             ( port phandle' )
     473   repeat                                              ( port )
     474   drop false                                          ( false )
    374475;
    375476
  • dev/usb2/hcd/ehci/control.fth

    r1651 r2152  
    6666         pt-ctrl  of  QH_MULT1  d#  64  endof   ( qh endp-char endp-cap /max )
    6767         pt-bulk  of  QH_MULT1  d# 512  endof   ( qh endp-char endp-cap /max )
    68          ( default )  r> QH_MULT1  my-maxpayload r>
     68         ( default )  >r QH_MULT1  my-maxpayload r>
    6969                                                ( qh endp-char endp-cap /max )
    7070      endcase
  • dev/usb2/hcd/ehci/loadpkg.fth

    r1 r2152  
    2222fload ${BP}/dev/usb2/hcd/fcode.fth              \ Load fcode driver for child
    2323fload ${BP}/dev/usb2/hcd/device.fth             \ Make child node & its properties
     24fload ${BP}/dev/usb2/hcd/ehci/probehub.fth      \ USB 2.0 hub specific stuff
    2425fload ${BP}/dev/usb2/hcd/ehci/probe.fth         \ Probe root hub
    25 fload ${BP}/dev/usb2/hcd/ehci/probehub.fth      \ USB 2.0 hub specific stuff
    26 fload ${BP}/dev/usb2/hcd/probehub.fth           \ Probe usb hub
    27 
    28 
     26fload ${BP}/dev/usb2/hcd/probehub.fth           \ Generic hub probing
  • dev/usb2/hcd/ehci/probe.fth

    r1998 r2152  
    66
    77: make-root-hub-node  ( port -- )
    8    ok-to-add-device? 0=  if  drop exit  then            \ Can't add another device
    9 
    10    0 set-target                         ( port )        \ Address it as device 0
    11 
     8   \ Some devices (e.g. Lexar USB-to-SD) fail unless you get the cfg desc from device 0 first
     9   0 set-target \ First address it as device 0  ( port )
    1210   speed-high 0 di-speed!     \ Use high speed for getting the device descriptor
    13    \ Some devices (e.g. Lexar USB-to-SD) don't work unless you do this first
    14    dev-desc-buf h# 40 get-cfg-desc drop
    15 
    16    new-address                          ( port dev )
    17    speed-high over di-speed!            ( port dev )
    18 
    19    0 set-target                         ( port dev )    \ Address it as device 0
    20 
    21    dup set-address  if                  ( port dev )    \ Assign it usb addr dev
    22       ." Retrying with a delay" cr
    23       over reset-port  d# 5000 ms
    24       dup set-address  if               ( port dev )    \ Assign it usb addr dev
    25          2drop exit
    26       then
    27    then ( port dev )
    28 
    29    dup set-target                       ( port dev )    \ Address it as device dev
    30    make-device-node                     ( )
     11   dev-desc-buf h# 40 get-cfg-desc drop         ( port )
     12
     13   speed-high                                   ( port speed )
     14
     15   \ hub-port and hub-dev route USB 1.1 transactions through USB 2.0 hubs
     16   over get-hub20-port  get-hub20-dev           ( port speed hub-port hub-dev )
     17
     18   \ Execute setup-new-node in root context and make-device-node in hub node context
     19   setup-new-node  if  execute  then    ( )
    3120;
    3221
     
    4433      else                                      \ A high speed device detected
    4534         dup ['] make-root-hub-node catch  if   \ Process high speed device
    46             drop ." Failed to probe root port " dup .d cr
     35            drop ." Failed to make root hub node for port " dup .d cr
    4736            true to probe-error?
    4837         then
     
    10695\         i rm-obsolete-children                        \ Remove obsolete device nodes
    10796         i probe-root-hub-port                  \ Probe it
     97      else
     98         i port-is-hub?  if     ( phandle )     \ Already-connected hub?
     99            reprobe-hub-node                    \ Check for changes on its ports
     100         then
    108101      then
    109102   loop
  • dev/usb2/hcd/ehci/probehub.fth

    r1 r2152  
    3232
    3333: ?set-hub20-port  ( speed dev port -- )
    34    " hub20-dev" my-parent ihandle>phandle get-package-property 0=  if
    35       2drop nip swap speed-high <>  if
    36          " hub20-port" int-property
    37       else
    38          drop
    39       then
    40    else
    41       3drop
    42    then
     34   " hub20-dev" my-parent ihandle>phandle get-package-property 0=  if  ( speed dev port value$ )
     35      2drop                                     ( speed dev port )
     36      nip swap speed-high <>  if                ( port )
     37         encode-int " hub20-port" property      ( )
     38      else                                      ( speed )
     39         drop                                   ( )
     40      then                                      ( )
     41   else                                         ( speed dev port )
     42      3drop                                     ( )
     43   then                                         ( )
    4344;
    4445' ?set-hub20-port to make-dev-property-hook
    45 
    46 : get-hub20-dev  ( -- hub-dev )
    47    " hub20-dev" get-inherited-property 0=  if
    48       decode-int nip nip
    49    else
    50       1
    51    then
    52 ;
    53 
    54 : get-hub20-port  ( port -- port' )
    55    " hub20-port" get-inherited-property 0=  if
    56       rot drop                          ( $ )
    57       decode-int nip nip
    58    then
    59 ;
    60 
    61 \ Initialize USB 2.0 specific characteristics in di
    62 : set-usb20-char  ( port dev -- )
    63         get-hub20-dev  over di-hub!
    64    swap get-hub20-port swap di-port!
    65 ;
    6646
    6747headers
  • dev/usb2/hcd/hcd-call.fth

    r1704 r2152  
    1111: dma-free     ( virt size -- )              " dma-free" $call-parent     ;
    1212
    13 : set-target  ( device -- )  " set-target" $call-parent  ;
    14 : probe-hub-xt  ( -- adr )   " probe-hub-xt" $call-parent  ;
    15 : set-pipe-maxpayload  ( size len -- ) " set-pipe-maxpayload" $call-parent  ;
     13\ Probing support
     14: set-target  ( device -- )
     15   " set-target" $call-parent
     16 ;
     17: probe-hub-xt  ( -- adr )
     18    " probe-hub-xt" $call-parent
     19;
     20: reprobe-hub-xt  ( -- adr )
     21    " reprobe-hub-xt" $call-parent
     22;
     23: set-pipe-maxpayload  ( size len -- )
     24   " set-pipe-maxpayload" $call-parent
     25;
     26: setup-new-node  ( port speed hub-port hub-dev -- false | port dev xt true )
     27   " setup-new-node" $call-parent
     28;
     29: get-initial-descriptors  ( dev -- )
     30   " get-initial-descriptors" $call-parent
     31;
     32: refresh-desc-bufs  ( dev -- )
     33   " refresh-desc-bufs" $call-parent
     34;
    1635
    1736\ Control pipe operations
  • dev/usb2/hcd/ohci/probe.fth

    r1654 r2152  
    55headers
    66
    7 : enable-root-hub-port  ( port -- )
     7: reset-port  ( port -- )
    88   >r
    99   h# 1.0002 r@ hc-rh-psta!             \ enable port
     
    1919
    2020: probe-root-hub-port  ( port -- )
    21    dup hc-rh-psta@ 1 and 0=  if  drop exit  then        \ No device connected
    22    ok-to-add-device? 0=  if  drop exit  then            \ Can't add another device
     21   dup hc-rh-psta@ 1 and 0=  if  drop exit  then        ( port )        \ No device connected
    2322
    24    dup enable-root-hub-port             ( port )
    25    new-address                          ( port dev )
    26    over hc-rh-psta@ 200 and  if  speed-low  else  speed-full  then over di-speed!
     23   \ Reset the port to determine the speed
     24   dup reset-port                                       ( port )
     25   dup hc-rh-psta@ 200 and  if  speed-low  else  speed-full  then       ( port speed )
    2726
    28    0 set-target                         ( port dev )    \ Address it as device 0
    29    dup set-address  if  2drop exit  then ( port dev )   \ Assign it usb addr dev
    30    dup set-target                       ( port dev )    \ Address it as device dev
    31    make-device-node                     ( )
     27   \ hub-port and hub-speed are irrelevant for OHCI (USB 1.1)
     28   0 0                                                  ( port speed hub-port hub-dev )
     29
     30   \ Execute setup-new-node in root context and make-device-node in hub node context
     31   setup-new-node  if  execute  then                    ( port dev xt )
    3232;
    3333
     
    100100         then
    101101         3.0000 i hc-rh-psta!                   \ Clear change bits
     102      else
     103         i port-is-hub?  if     ( phandle )     \ Already-connected hub?
     104            reprobe-hub-node                    \ Check for changes on its ports
     105         then
    102106      then
    103107   loop
  • dev/usb2/hcd/probehub.fth

    r2070 r2152  
    88[then]
    99
    10 : power-hub-port   ( port -- )      PORT_POWER  DR_PORT set-feature drop  ;
    11 : reset-hub-port   ( dev port -- )  PORT_RESET  DR_PORT set-feature drop  d# 20 ms  ;
     108 buffer: hub-buf                       \ For hub probing
     11
     12: power-hub-port   ( port -- )  PORT_POWER  DR_PORT " set-feature" $call-parent drop  ;
     13: reset-hub-port   ( port -- )  PORT_RESET  DR_PORT " set-feature" $call-parent drop  d# 20 ms  ;
     14: clear-status-change  ( port -- )  C_PORT_CONNECTION  DR_PORT " clear-feature" $call-parent drop  ;
     15: parent-set-target  ( dev -- )  " set-target" $call-parent  ;
     16: get-port-status  ( port -- error? )
     17   hub-buf 4  2 pick   DR_PORT " get-status" $call-parent    ( port actual usberror )
     18   nip  if                                   ( port )
     19      ." Failed to get port status for port " u. cr
     20      true                                   ( true )
     21   else                                      ( port )
     22      drop false                             ( false )
     23   then                                      ( )
     24;
     25: port-status-changed?  ( hub-dev port -- false | connected? true )
     26   swap parent-set-target       ( port )
     27   dup get-port-status  if      ( port )
     28      drop false exit           ( -- false )
     29   then                         ( port )
     30
     31   hub-buf 2+ c@  1 and  if     ( port )
     32      \ Status changed
     33      clear-status-change       ( )
     34      hub-buf c@ 1 and  0<>     ( connected? )
     35      true                      ( connected? true )
     36   else                         ( port )
     37      drop false                ( false )
     38   then
     39;
    1240
    1341: probe-hub-port  ( hub-dev port -- )
    14    swap set-target                      ( port )
    15    dup reset-hub-port                   ( port )
     42   \ Reset the port to determine the speed
     43   swap parent-set-target                       ( port )
     44   dup reset-hub-port                           ( port )
    1645
    17    gen-desc-buf 4 2 pick DR_PORT get-status nip  if
    18       ." Failed to get port status for port " u. cr
    19       exit
    20    then                                 ( port )
     46   \ get-port-status fills hub-buf with connection status, speed, and other information
     47   dup get-port-status                          ( port error? )
     48   over clear-status-change                     ( port error? )
     49   if  drop exit  then                          ( port )
    2150
    22    gen-desc-buf c@ 1 and 0=  if drop exit  then        \ No device connected
    23    ok-to-add-device?     0=  if  drop exit  then        \ Can't add another device
     51   hub-buf c@ 1 and 0=  if drop exit  then     \ No device connected
     52   hub-buf le-w@ h# 600 and 9 >>                ( port speed )
    2453
    25    new-address                          ( port dev )
    26    gen-desc-buf le-w@ h# 600 and 9 >> over di-speed!
    27                                         ( port dev )
    28    2dup set-usb20-char                  ( port dev )
     54   \ hub-port and hub-dev route USB 1.1 transactions through USB 2.0 hubs
     55   over get-hub20-port  get-hub20-dev           ( port speed hub-port hub-dev )
    2956
    30    0 set-target                         ( port dev )    \ Address it as device 0
    31    dup set-address  if  2drop exit  then ( port dev )   \ Assign it usb addr dev
    32    dup set-target                       ( port dev )    \ Address it as device dev
    33    make-device-node                     ( )
     57   \ Execute setup-new-node in root context and make-device-node in hub node context
     58   " setup-new-node" $call-parent  if  execute  then  ( )
    3459;
    3560
     61: hub-#ports  ( -- n )
     62   hub-buf 8 0 0 HUB DR_HUB " get-desc" $call-parent nip  if
     63      ." Failed to get hub descriptor" cr
     64      0 exit
     65   then
     66   hub-buf 2 + c@ 1+            ( #ports )
     67;
     68: hub-delay  ( -- #2ms )  hub-buf 5 + c@  ;
     69
     70: power-hub-ports  ( #ports -- )
     71   1  ?do  i power-hub-port  loop           ( )
     72   
     73   hub-delay 2* ms                          ( )
     74
     75   " usb-delay" ['] evaluate catch  if      ( )
     76      2drop  d# 100                         ( ms )
     77   then                                     ( ms )
     78   ms
     79;
     80
     81: safe-probe-hub-port  ( hub-dev port -- )
     82   tuck ['] probe-hub-port catch  if    ( port x x )
     83      2drop  ." Failed to probe hub port " . cr  ( )
     84   else                                 ( port )
     85      drop                              ( )
     86   then                                 ( )
     87;
    3688external
    3789: probe-hub  ( dev -- )
    38    dup set-target                       ( hub-dev )
    39    gen-desc-buf 8 0 0 HUB DR_HUB get-desc nip  if
    40       ." Failed to get hub descriptor" cr
    41       exit
    42    then
     90   dup parent-set-target                ( hub-dev )
     91   hub-#ports                           ( hub-dev #ports )
    4392
    44    gen-desc-buf dup 5 + c@ swap         ( hub-dev #2ms adr )
    45    2 + c@ 1+                            ( hub-dev #2ms #ports )
     93   " configuration#" get-int-property
     94   " set-config" $call-parent           ( hub-dev #ports usberr )
     95   if  drop  ." Failed to set config for hub at " u. cr exit  then  ( hub-dev #ports )
    4696
    47    " configuration#" get-int-property set-config        ( hub-dev #2ms #ports usberr )
    48    if  2drop  ." Failed to set config for hub at " u. cr exit  then
     97   dup power-hub-ports                  ( hub-dev #ports )
    4998
    50    tuck  1  ?do  i power-hub-port  loop  2* ms
    51                                         ( hub-dev #ports )
    52    " usb-delay" ['] evaluate catch  if  ( hub-dev #ports x x )
    53       2drop  d# 100                     ( hub-dev #ports ms )
    54    then                                 ( hub-dev #ports ms )
    55    ms
    56 
    57    ( hub-dev #ports ) 1  ?do
    58       dup i ['] probe-hub-port  catch  if
    59          2drop
    60          ." Failed to probe hub port " i u. cr
    61       then
    62    loop  drop
     99   1  ?do                                       ( hub-dev )
     100      dup i safe-probe-hub-port                 ( hub-dev )
     101   loop                                         ( hub-dev )
     102   drop                                         ( )
    63103;
    64104
    65105: probe-hub-xt  ( -- adr )  ['] probe-hub  ;
     106
     107: do-reprobe-hub  ( dev -- )
     108   dup parent-set-target                        ( hub-dev )
     109   hub-#ports  1  ?do                           ( hub-dev )
     110      dup i port-status-changed?  if            ( hub-dev connected? )
     111         if                                     ( hub-dev )
     112            dup i safe-probe-hub-port           ( hub-dev )
     113     \   else  Handle disconnect
     114         then                                   ( hub-dev )
     115      else                                      ( hub-dev )
     116         i port-is-hub?  if                     ( hub-dev phandle )
     117            reprobe-hub-node                    ( hub-dev )
     118         then                                   ( hub-dev )
     119      then                                      ( hub-dev )
     120   loop                                         ( hub-dev )
     121   drop                                         ( )
     122;
     123
     124: reprobe-hub-xt  ( -- adr )  ['] do-reprobe-hub  ;
    66125
    67126headers
  • dev/usb2/hcd/uhci/loadpkg.fth

    r1 r2152  
    2222fload ${BP}/dev/usb2/hcd/fcode.fth              \ Load fcode driver for child
    2323fload ${BP}/dev/usb2/hcd/device.fth             \ Make child node & its properties
     24fload ${BP}/dev/usb2/hcd/probehub.fth           \ Probe usb hub
    2425fload ${BP}/dev/usb2/hcd/uhci/probe.fth         \ Probe root hub
    25 fload ${BP}/dev/usb2/hcd/probehub.fth           \ Probe usb hub
    2626
    2727
  • dev/usb2/hcd/uhci/probe.fth

    r1656 r2152  
    55headers
    66
    7 \ We mustn't wait more than 3 ms between releasing the reset and enabling
    8 \ the port to begin the SOF stream, otherwise some devices (e.g. pl2303)
    9 \ will go into suspend state and then not respond to set-address.
    10 : reset-root-hub-port  ( port -- )
    11    dup >r  portsc@ h# 20e invert and    ( value r: port )  \ Clear reset, enable, status
    12    dup h# 200 or  r@ portsc!            ( value r: port )  \ Reset port
    13    d# 30 ms                             ( value r: port )  \ > 10 ms - reset time
    14    dup r@ portsc!                       ( value r: port )  \ Release reset
    15    1 ms                                 ( value r: port )  \ > 5.3 uS - reconnect time
    16    h# e or  r> portsc!                  ( )  \ Enable port and clear status
    17 ;
     7: probe-root-hub-port  ( port -- )
     8   \ Reset the port to perform connection status and speed detection
     9   dup reset-port                               ( port )
     10   dup portsc@ 1 and 0=  if  drop exit  then    ( port )        \ No device-connected
    1811
    19 : probe-root-hub-port  ( port -- )
    20    dup reset-root-hub-port
    21    dup portsc@ 1 and 0=  if  drop exit  then            \ No device-connected
    22    ok-to-add-device? 0=  if  drop exit  then            \ Can't add another device
     12   dup portsc@ 100 and  if  speed-low  else  speed-full  then   ( port speed )
    2313
    24    new-address                          ( port dev )
    25    over portsc@ 100 and  if  speed-low  else  speed-full  then
    26    over di-speed!                       ( port dev )
     14   \ hub-port and hub-speed are irrelevant for UHCI (USB 1.1)
     15   0 0                                                  ( port speed hub-port hub-dev )
    2716
    28    0 set-target                         ( port dev )    \ Address it as device 0
    29    dup set-address  if  2drop exit  then ( port dev )   \ Assign it usb addr dev
    30    dup set-target                       ( port dev )    \ Address it as device dev
    31    make-device-node                     ( )
     17   \ Execute setup-new-node in root context and make-device-node in hub node context
     18   setup-new-node  if  execute  then                    ( )
    3219;
    3320
     
    4734         then
    4835         i portsc@ i portsc!                    \ Clear change bits
     36      else
     37         i port-is-hub?  if     ( phandle )     \ Already-connected hub?
     38            reprobe-hub-node                    \ Check for changes on its ports
     39         then
    4940      then
    5041   loop
  • dev/usb2/hcd/uhci/uhci.fth

    r1987 r2152  
    3838: portsc@     ( port -- data )  2* 10 + uhci-w@  ;
    3939: portsc!     ( data port -- )  2* 10 + uhci-w!  ;
     40
     41\ We mustn't wait more than 3 ms between releasing the reset and enabling
     42\ the port to begin the SOF stream, otherwise some devices (e.g. pl2303)
     43\ will go into suspend state and then not respond to set-address.
     44: reset-port  ( port -- )
     45   dup >r  portsc@ h# 20e invert and    ( value r: port )  \ Clear reset, enable, status
     46   dup h# 200 or  r@ portsc!            ( value r: port )  \ Reset port
     47   d# 30 ms                             ( value r: port )  \ > 10 ms - reset time
     48   dup r@ portsc!                       ( value r: port )  \ Release reset
     49   1 ms                                 ( value r: port )  \ > 5.3 uS - reconnect time
     50   h# e or  r> portsc!                  ( )  \ Enable port and clear status
     51;
    4052
    4153: reset-usb  ( -- )
  • dev/usb2/pkt-data.fth

    r1 r2152  
    8181\ Use tmp-l to make sure that le-l! and le-w! are atomic writes
    8282
    83 instance variable tmp-l
     83variable tmp-l
    8484: le-w@   ( a -- w )   dup c@ swap ca1+ c@ bwjoin  ;
    8585: (le-w!) ( w a -- )   >r  wbsplit r@ ca1+ c! r> c!  ;
  • dev/usb2/pkt-func.fth

    r1 r2152  
    2323      dup c@ +                          ( intfidx adr' )
    2424   repeat
    25 ;
    26 
    27 : get-class  ( dev-adr cfg-adr intfidx -- protocol subclass class )
    28    rot dup 4 + c@ ?dup 0=  if           ( cfg-adr intfidx dev-adr )
    29       false to class-in-dev?            \ Class is not in device descriptor
    30       drop find-intf-desc               ( intf-adr )
    31       dup 5 + c@ swap dup 6 + c@ swap 7 + c@
    32    else                                 \ Class is in device-descriptor
    33       true to class-in-dev?             ( cfg-adr intfidx dev-adr class )
    34       2swap 2drop                       ( dev-adr class )
    35       swap dup 5 + c@ swap 6 + c@
    36    then
    37 ;
    38 
    39 : get-vid  ( adr -- vendor product rev )
    40    dup 8 + le-w@ swap dup d# 10 + le-w@ swap c + le-w@
    4125;
    4226
Note: See TracChangeset for help on using the changeset viewer.