summaryrefslogtreecommitdiff
path: root/usbdux
diff options
context:
space:
mode:
authorBernd Porr <mail@berndporr.me.uk>2015-07-22 09:27:12 +0100
committerKyle McMartin <kyle@kernel.org>2015-07-22 13:40:38 -0400
commit22e3407bda1bcc4ce0317b14cd75add80b3f41a4 (patch)
treece1d25a92c4f6396b39e1218cba9de282a8adff9 /usbdux
parent00810902b5227ef2e2f799b36f969f1482565af2 (diff)
usbdux: usbduxsigma: added soft interval mode in the firmware
urb->interval is ignored in xhci drivers. Instead, the firmware has an interval counter and transmits data at this interval. The uframes in-between are zero length packets. In order to be backward compatible with older kernels which support only USB 2.0 and 1.1 there are two ADC modes in the firmware. The old one which assumes that the interval is established by the host (urb->interval) and the new one where the interval value is transmitted to the firmware. Signed-off-by: Bernd Porr <mail@berndporr.me.uk> Signed-off-by: Kyle McMartin <kyle@kernel.org>
Diffstat (limited to 'usbdux')
-rw-r--r--usbdux/usbduxsigma_firmware.asm27
1 files changed, 27 insertions, 0 deletions
diff --git a/usbdux/usbduxsigma_firmware.asm b/usbdux/usbduxsigma_firmware.asm
index 071d5d6b..90998a0b 100644
--- a/usbdux/usbduxsigma_firmware.asm
+++ b/usbdux/usbduxsigma_firmware.asm
@@ -39,6 +39,8 @@
.equ DPTRL,85H
.equ DPTRH,86h
.equ ASYNC_ON,87h
+ .equ INTERVAL,88h ; uframe/frame interval
+ .equ INTCTR,89h ; interval counter
;;; actual code
.org 0000h ; after reset the processor starts here
@@ -546,7 +548,18 @@ sof_isr:
push 07h ; R7
clr IE.7 ; make sure that no other int's disturbe us
+
+ mov r0,#INTCTR ; interval counter
+ mov a,@r0 ; get the value
+ dec a ; decrement
+ mov @r0,a ; save it again
+ jz sof_adc ; we do ADC functions
+ ljmp epfull ; we skip all adc functions
+sof_adc:
+ mov r1,#INTERVAL ; get the interval
+ mov a,@r1 ; get it
+ mov @r0,a ; save it in the counter
mov a,EP2468STAT
anl a,#20H ; full?
jnz epfull ; EP6-buffer is full
@@ -762,6 +775,7 @@ ep1out_jmp:
sjmp nothing ; a=6
sjmp pwm_on ; a=7
sjmp pwm_off ; a=8
+ sjmp startadcint ; a=9
nothing:
ljmp over_da
@@ -790,12 +804,25 @@ initsgADchannel:
sjmp over_da
+startadcint:
+ mov dptr,#0e781h ; FIFO buffer of EP1OUT from 2nd byte
+
+ movx a,@dptr ; interval is the 1st byte
+ inc dptr ; data pointer
+ sjmp startadc2 ; the other paramters as with startadc
;;; config AD:
;;; we write to the registers of the A/D converter
startadc:
mov dptr,#0e781h ; FIFO buffer of EP1OUT from 2nd byte
+ mov a,#1 ; interval is 1 here all the time
+startadc2:
+ mov r0,#INTERVAL ; set it
+ mov @r0,a
+ mov r0,#INTCTR ; the counter is also just one
+ mov @r0,a
+
movx a,@dptr ; get length of channel list
inc dptr
mov r0,#MAXSMPL