xpt2046 now basically works.

This commit is contained in:
Martin Preuss
2025-11-10 19:33:40 +01:00
parent 03f794b253
commit ece4fe824a
3 changed files with 228 additions and 68 deletions

View File

@@ -260,7 +260,7 @@ test:
.include "modules/lcd2/ili9341/font12x20_1.asm"
;.include "common/list_t.asm"
;.include "common/tree_t.asm"
;.include "common/divide.asm"
.include "common/divide.asm"
.include "modules/lcd2/gui/style.asm"
.include "win_netstats.asm"

View File

@@ -56,19 +56,20 @@ WinNetStats_Init:
; @param @0 Y
; @param @1 data address
; @param @0 X
; @param @1 Y
; @param @2 data address
.macro WINNETSTATS_PRINTDATA
ldi r16, 160 ; X
ldi r16, @0 ; X
mov r4, r16
clr r5
ldi r16, LOW(STYLE_WIN_TITLE_HEIGHT+@0) ; Y
ldi r16, LOW(STYLE_WIN_TITLE_HEIGHT+@1) ; Y
mov r6, r16
ldi r16, HIGH(@0)
ldi r16, HIGH(@1)
mov r7, r16
lds r16, @1 ; data
lds r17, @1+1
lds r16, @2 ; data
lds r17, @2+1
bigcall Window_WriteHexWordAt
.endmacro
@@ -120,24 +121,26 @@ WinNetStats_Update:
ldi yh, HIGH(winNetstats)
; packets in
WINNETSTATS_PRINTDATA 2, netInterfaceData+NET_IFACE_OFFS_PACKETSIN_LOW
WINNETSTATS_PRINTDATA 160, 2, netInterfaceData+NET_IFACE_OFFS_PACKETSIN_LOW
; packets out
WINNETSTATS_PRINTDATA 24, netInterfaceData+NET_IFACE_OFFS_PACKETSOUT_LOW
WINNETSTATS_PRINTDATA 160, 24, netInterfaceData+NET_IFACE_OFFS_PACKETSOUT_LOW
; eContent
WINNETSTATS_PRINTDATA 46, netInterfaceData+NET_IFACE_OFFS_ERR_CONTENT_LOW
WINNETSTATS_PRINTDATA 160, 46, netInterfaceData+NET_IFACE_OFFS_ERR_CONTENT_LOW
; eIO
WINNETSTATS_PRINTDATA 68, netInterfaceData+NET_IFACE_OFFS_ERR_IO_LOW
WINNETSTATS_PRINTDATA 160, 68, netInterfaceData+NET_IFACE_OFFS_ERR_IO_LOW
; eMsgSize
WINNETSTATS_PRINTDATA 90, netInterfaceData+NET_IFACE_OFFS_ERR_MSGSIZE_LOW
WINNETSTATS_PRINTDATA 160, 90, netInterfaceData+NET_IFACE_OFFS_ERR_MSGSIZE_LOW
; X
WINNETSTATS_PRINTDATA 112, xpt2046CurrentX
WINNETSTATS_PRINTDATA 160, 112, xpt2046CurrentX
WINNETSTATS_PRINTDATA 240, 112, xpt2046RawX
; Y
WINNETSTATS_PRINTDATA 134, xpt2046CurrentY
WINNETSTATS_PRINTDATA 160, 134, xpt2046CurrentY
WINNETSTATS_PRINTDATA 240, 134, xpt2046RawY
; Z
WINNETSTATS_PRINTDATA 156, xpt2046CurrentZ
WINNETSTATS_PRINTDATA 160, 156, xpt2046CurrentZ
; update num
WINNETSTATS_PRINTDATA 178, winNetstatsUpdateNum
WINNETSTATS_PRINTDATA 160, 178, winNetstatsUpdateNum
ret
; @end

View File

@@ -37,6 +37,11 @@
.equ XPT2046_FLAGS_CHGCOORD_BIT = 6
.equ XPT2046_FLAGS_CHGPRESS_BIT = 5
.equ XPT2046_CALIB_XLEFT = 0x0c0
.equ XPT2046_CALIB_XRIGHT = 0x780
.equ XPT2046_CALIB_YTOP = 0x0c0
.equ XPT2046_CALIB_YBOTTOM = 0x7a0
; ***************************************************************************
@@ -45,12 +50,19 @@
.dseg
xpt2046ValueBuffer: .byte (XPT2046_AVERAGE*2)
xpt2046RawX: .byte 2
xpt2046RawY: .byte 2
xpt2046CurrentX: .byte 2
xpt2046CurrentY: .byte 2
xpt2046CurrentZ: .byte 2
xpt2046Flags: .byte 1
xpt2046Timer: .byte 1
xpt2046LeftX: .byte 2
xpt2046FactorX: .byte 2
xpt2046TopY: .byte 2
xpt2046FactorY: .byte 2
; ***************************************************************************
@@ -76,6 +88,8 @@ XPT2046_Init:
sts xpt2046Timer, r16
rcall xpt2046CalcCalibration
ret
; @end
@@ -116,6 +130,95 @@ XPT2046_GetFlagsResetChg:
; ---------------------------------------------------------------------------
; @routine xpt2046CalcCalibration
;
xpt2046CalcCalibration:
; calibrate X (hardcoded for now)
ldi r18, LOW(XPT2046_CALIB_XLEFT)
ldi r19, HIGH(XPT2046_CALIB_XLEFT)
ldi r20, LOW(XPT2046_CALIB_XRIGHT)
ldi r21, HIGH(XPT2046_CALIB_XRIGHT)
ldi r22, LOW(DISPLAY_HEIGHT)
ldi r23, HIGH(DISPLAY_HEIGHT)
rcall xpt2046CalcCalibX
; calibrate Y (hardcoded for now)
ldi r18, LOW(XPT2046_CALIB_YTOP)
ldi r19, HIGH(XPT2046_CALIB_YTOP)
ldi r20, LOW(XPT2046_CALIB_YBOTTOM)
ldi r21, HIGH(XPT2046_CALIB_YBOTTOM)
ldi r22, LOW(DISPLAY_WIDTH)
ldi r23, HIGH(DISPLAY_WIDTH)
rcall xpt2046CalcCalibY
ret
; @end
; ---------------------------------------------------------------------------
; @routine xpt2046CalcCalibX
;
; @param r19:r18: xLeft
; @param r21:r20 xRight
; @param r23:r22 display hardware width
xpt2046CalcCalibX:
sts xpt2046LeftX, r18
sts xpt2046LeftX+1, r19
mov r24, r20
mov r25, r21
sub r24, r18
sbc r25, r19
lsl r24 ; *2
rol r25
lsl r24 ; *4
rol r25
lsl r24 ; *8
rol r25
mov r20, r24
mov r21, r25
bigcall Utils_Divu16_16_16 ; R17:R16=result
sts xpt2046FactorX, r16
sts xpt2046FactorX+1, r17
ret
; @end
; ---------------------------------------------------------------------------
; @routine xpt2046CalcCalibY
;
; @param r19:r18: yTop
; @param r21:r20 yBottom
; @param r23:r22 display hardware height
xpt2046CalcCalibY:
sts xpt2046TopY, r18
sts xpt2046TopY+1, r19
mov r24, r20
mov r25, r21
sub r24, r18
sbc r25, r19
lsl r24 ; *2
rol r25
lsl r24 ; *4
rol r25
lsl r24 ; *8
rol r25
mov r20, r24
mov r21, r25
bigcall Utils_Divu16_16_16 ; R17:R16=result
sts xpt2046FactorY, r16
sts xpt2046FactorY+1, r17
ret
; @end
; ---------------------------------------------------------------------------
; @routine xpt2046UpdateValues
@@ -127,33 +230,17 @@ xpt2046UpdateValues:
lds r23, xpt2046Flags
rcall xpt2046BeginSpi ; (R16, R17)
; rcall xpt2046UpdateZ
rcall xpt2046UpdateZ
ldi r16, XPT2046_CMD_READ_Z1
rcall xpt2046SendCommandRecv12Bit ; (R16)
sts xpt2046CurrentZ, r18
sts xpt2046CurrentZ+1, r19
ldi r16, LOW(XPT2046_Z_THRESHOLD)
ldi r17, HIGH(XPT2046_Z_THRESHOLD)
sub r18, r16
sbc r19, r17
brcc xpt2046UpdateValues_aboveThreshold
cbr r23, (1<<XPT2046_FLAGS_PRESSED_BIT) ; Z below threshold, not pressed
rjmp xpt2046UpdateValues_checkPressChg
xpt2046UpdateValues_aboveThreshold:
ori r23, (1<<XPT2046_FLAGS_PRESSED_BIT)
xpt2046UpdateValues_checkPressChg:
eor r16, r23
andi r16, (1<<XPT2046_FLAGS_PRESSED_BIT)
breq xpt2046UpdateValues_checkPress
ori r23, (1<<XPT2046_FLAGS_CHGPRESS_BIT)
xpt2046UpdateValues_checkPress:
mov r16, r23
andi r16, (1<<XPT2046_FLAGS_PRESSED_BIT) ; only read coords if pressed
breq xpt2046UpdateValues_storeFlags
rcall xpt2046UpdateX
rcall xpt2046UpdateY
rcall xpt2046UpdateRawX
rcall xpt2046UpdateRawY
rcall xpt2046CalcX
rcall xpt2046CalcY
xpt2046UpdateValues_storeFlags:
sts xpt2046Flags, r23
@@ -167,53 +254,123 @@ xpt2046UpdateValues_storeFlags:
; ---------------------------------------------------------------------------
; @routine xpt2046UpdateX
; @routine xpt2046CalcX
;
; @param r23 current xpt2046Flag (modified by routine)
; @clobbers (r16, r18, r19, r20, r21)
; @clobbers (r16, r17, r18, r19, r20, r21, r22)
xpt2046UpdateX:
; dummy read
ldi r16, XPT2046_CMD_READ_X
rcall xpt2046SendCommandRecv12Bit ; (R16)
ldi r16, XPT2046_CMD_READ_X
rcall xpt2046ReadAvgValues ; (r16, r18, r19, r20, r21)
rcall xpt2046AverageValues ; (r16, r17, r21)
lds r16, xpt2046CurrentX
lds r17, xpt2046CurrentX+1
sts xpt2046CurrentX, r18
sts xpt2046CurrentX+1, r19
xpt2046CalcX:
push r23
lds r20, xpt2046RawY
lds r21, xpt2046RawY+1
lds r16, xpt2046TopY
lds r17, xpt2046TopY+1
sub r20, r16
sbc r21, r17
brcc xpt2046CalcX_trans
clr r20
clr r21
xpt2046CalcX_trans:
lsl r20 ; *2
rol r21
lsl r20 ; *4
rol r21
lsl r20 ; *8
rol r21
lds r22, xpt2046FactorY
lds r23, xpt2046FactorY+1
bigcall Utils_Divu16_16_16
lds r18, xpt2046CurrentX
lds r19, xpt2046CurrentX+1
sts xpt2046CurrentX, r16
sts xpt2046CurrentX+1, r17
pop r23
sub r16, r18
sbc r17, r19
breq xpt2046UpdateX_ret
breq xpt2046CalcX_ret
ori r23, (1<<XPT2046_FLAGS_CHGCOORD_BIT)
xpt2046UpdateX_ret:
xpt2046CalcX_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine xpt2046UpdateY
; @routine xpt2046CalcY
;
; @param r23 current xpt2046Flag (modified by routine)
; @clobbers (r16, r17, r18, r19, r20, r21, r22)
xpt2046CalcY:
push r23
lds r20, xpt2046RawX
lds r21, xpt2046RawX+1
lds r16, xpt2046LeftX
lds r17, xpt2046LeftX+1
sub r20, r16
sbc r21, r17
brcc xpt2046CalcY_trans
clr r20
clr r21
xpt2046CalcY_trans:
lsl r20 ; *2
rol r21
lsl r20 ; *4
rol r21
lsl r20 ; *8
rol r21
lds r22, xpt2046FactorX
lds r23, xpt2046FactorX+1
bigcall Utils_Divu16_16_16
lds r18, xpt2046CurrentY
lds r19, xpt2046CurrentY+1
sts xpt2046CurrentY, r16
sts xpt2046CurrentY+1, r17
pop r23
sub r16, r18
sbc r17, r19
breq xpt2046CalcY_ret
ori r23, (1<<XPT2046_FLAGS_CHGCOORD_BIT)
xpt2046CalcY_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine xpt2046UpdateRawX
;
; @clobbers (r16, r17, r18, r19, r20, r21)
xpt2046UpdateRawX:
; dummy read
ldi r16, XPT2046_CMD_READ_X
rcall xpt2046SendCommandRecv12Bit ; (R16)
ldi r16, XPT2046_CMD_READ_X
rcall xpt2046ReadAvgValues ; (r16, r18, r19, r20, r21)
rcall xpt2046AverageValues ; (r16, r17, r21)
sts xpt2046RawX, r18
sts xpt2046RawX+1, r19
ret
; @end
; ---------------------------------------------------------------------------
; @routine xpt2046UpdateRawY
;
; @param r23 current xpt2046Flag (modified by routine)
; @clobbers (r16, r18, r19, r20, r21)
xpt2046UpdateY:
xpt2046UpdateRawY:
; read Y
ldi r16, XPT2046_CMD_READ_Y
rcall xpt2046ReadAvgValues ; (r16, r18, r19, r20, r21)
rcall xpt2046AverageValues ; (r16, r17, r21)
lds r16, xpt2046CurrentY
lds r17, xpt2046CurrentY+1
sts xpt2046CurrentY, r18
sts xpt2046CurrentY+1, r19
sub r16, r18
sbc r17, r19
breq xpt2046UpdateY_ret
ori r23, (1<<XPT2046_FLAGS_CHGCOORD_BIT)
xpt2046UpdateY_ret:
sts xpt2046RawY, r18
sts xpt2046RawY+1, r19
ret
; @end
@@ -236,10 +393,10 @@ xpt2046UpdateZ:
sub r18, r16
sbc r19, r17
mov r16, r23
brcs xpt2046UpdateZ_overThreshold
brcc xpt2046UpdateZ_aboveThreshold
cbr r23, (1<<XPT2046_FLAGS_PRESSED_BIT) ; Z below threshold, not pressed
rjmp xpt2046UpdateZ_checkPressChg
xpt2046UpdateZ_overThreshold:
xpt2046UpdateZ_aboveThreshold:
ori r23, (1<<XPT2046_FLAGS_PRESSED_BIT)
xpt2046UpdateZ_checkPressChg:
eor r16, r23