Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- purpose: EHCI USB Controller intr pipes transaction processing
- copyright: Copyright 2006 FirmWorks. All rights reserved.
- hex
- headers
- \ XXX Need to implement periodic interrupt transactions
- d# 500 constant intr-in-timeout
- 0 instance value intr-in-pipe
- 0 instance value intr-in-interval
- 0 instance value intr-in-qh
- 0 instance value intr-in-qtd
- : intr-in-data@ ( -- n ) intr-in-pipe target di-in-data@ di-data>td-data ;
- : intr-in-data! ( n -- ) td-data>di-data intr-in-pipe target di-in-data! ;
- : toggle-intr-in-data ( -- ) intr-in-pipe target di-in-data-toggle ;
- : fixup-intr-in-data ( qh -- n )
- usb-error USB_ERR_STALL and if
- drop TD_TOGGLE_DATA0
- else
- >hcqh-overlay >hcqtd-token le-l@
- then
- intr-in-data!
- ;
- : process-intr-args ( buf len pipe timeout -- ) process-bulk-args ;
- : alloc-intr-qhqtds ( -- qh qtd ) alloc-bulk-qhqtds ;
- : fill-intr-io-qtds ( dir qtd -- )
- my-#qtds 0 do ( dir qtd )
- my-buf my-buf-phys /my-buf 3 pick fill-qtd-bptrs
- ( dir qtd /bptr )
- 2 pick over d# 16 << or ( dir qtd /bptr token )
- TD_C_ERR3 or TD_STAT_ACTIVE or ( dir qtd /bptr token' )
- intr-in-data@ toggle-intr-in-data or ( dir qtd /bptr token' )
- 2 pick >hcqtd-token le-l! ( dir qtd /bptr )
- my-buf++ ( dir qtd )
- dup fixup-last-qtd ( dir qtd )
- >qtd-next l@ ( dir qtd' )
- loop 2drop ( )
- ;
- external
- : begin-intr-in ( buf len pipe interval -- )
- debug? if ." begin-intr-in" cr then
- intr-in-qh if 4drop exit then \ Already started
- to intr-in-interval
- dup to intr-in-pipe
- intr-in-timeout process-intr-args
- alloc-intr-qhqtds to intr-in-qtd to intr-in-qh
- \ IN qTDs
- TD_PID_IN intr-in-qtd fill-intr-io-qtds
- \ Start intr in transaction
- intr-in-qh pt-intr fill-qh
- intr-in-qh my-speed intr-in-interval insert-intr-qh
- ;
- : intr-in? ( -- actual usberr )
- intr-in-qh 0= if 0 USB_ERR_INV_OP exit then
- clear-usb-error
- process-hc-status
- intr-in-qh dup sync-qhqtds
- qh-done? if
- intr-in-qh error? if
- 0
- else
- intr-in-qtd dup intr-in-qh >qh-#qtds l@ get-actual
- over >qtd-buf rot >qtd-pbuf l@ 2 pick dma-sync
- then
- intr-in-qh fixup-intr-in-data
- else
- 0
- then
- usb-error
- ;
- headers
- : restart-intr-in-qtd ( qtd -- )
- begin ?dup while
- dup >hcqtd-bptr0 dup le-l@ h# ffff.f000 and swap le-l!
- dup >qtd-/buf l@ d# 16 <<
- TD_STAT_ACTIVE or TD_C_ERR3 or TD_PID_IN or
- intr-in-data@ or
- over >hcqtd-token le-l!
- >qtd-next l@
- repeat
- ;
- external
- : restart-intr-in ( -- )
- intr-in-qh 0= if exit then
- \ Setup qTD again
- intr-in-qtd restart-intr-in-qtd
- \ Setup QH again
- intr-in-qh >hcqh-endp-char dup le-l@ QH_TD_TOGGLE invert and swap le-l!
- intr-in-qtd >qtd-phys l@ intr-in-qh >hcqh-overlay >hcqtd-next le-l!
- intr-in-qh sync-qhqtds
- ;
- : end-intr-in ( -- )
- debug? if ." end-intr-in" cr then
- intr-in-qh 0= if exit then
- intr-in-qh dup fixup-intr-in-data
- intr-in-qtd map-out-bptrs
- dup remove-intr-qh free-qhqtds
- 0 to intr-in-qh 0 to intr-in-qtd
- ;
- headers
- : (end-extra) ( -- ) (end-extra) end-intr-in ;
- ' (end-extra) to end-extra
Add Comment
Please, Sign In to add comment