ili9341: moved io code into own file. changed args to r0-r11.

This commit is contained in:
Martin Preuss
2025-05-21 01:44:38 +02:00
parent b3d7d492d7
commit de94590fa0
3 changed files with 310 additions and 330 deletions

View File

@@ -155,6 +155,7 @@
#ifdef MODULES_ILI9341
.include "modules/lcd2/ili9341/defs.asm"
.include "modules/lcd2/ili9341/main.asm"
.include "modules/lcd2/ili9341/io_spi.asm"
#endif

View File

@@ -0,0 +1,112 @@
; ***************************************************************************
; copyright : (C) 2025 by Martin Preuss
; email : martin@libchipcard.de
;
; ***************************************************************************
; * This file is part of the project "AqHome". *
; * Please see toplevel file COPYING of that project for license details. *
; ***************************************************************************
; generally we use the following parameters here:
; @param r1:r0 background color
; @param r3:r2 foreground color
; @param r5:r4 X0
; @param r7:r6 Y0
; @param r9:r8 X1/W
; @param r11:r10 Y1/H
; ***************************************************************************
; defines
.equ ILI9341_SPIMODE = (0<<SPIHW_MODE_SPEED0_BIT) | \
(0<<SPIHW_MODE_SPEED1_BIT) | \
(1<<SPIHW_MODE_DOUBLESPEED_BIT) | \
(0<<SPIHW_MODE_DATAORDER_BIT) | \
(0<<SPIHW_MODE_CPOL_BIT) | \
(0<<SPIHW_MODE_CPHA_BIT)
; ***************************************************************************
; code
.cseg
; ---------------------------------------------------------------------------
; @routine ILI9341IoInit @global
ILI9341IoInit:
; setup pins
sbi ILI9341_RESET_DDR, ILI9341_RESET_PIN ; RESET= output
sbi ILI9341_RESET_OUTPUT, ILI9341_RESET_PIN ; RESET= high
sbi ILI9341_DC_DDR, ILI9341_DC_PIN ; DC = output
sbi ILI9341_LED_DDR, ILI9341_LED_PIN ; LED = output
cbi ILI9341_LED_OUTPUT, ILI9341_LED_PIN ; LED = low
ret
; @end
; ---------------------------------------------------------------------------
; @routine ili9341BeginSpi
;
; @clobbers r16, r17
ili9341BeginSpi:
ldi r16, ILI9341_SPIMODE
ldi r17, ILI9341_DEVICENUM
rjmp SPIHW_MasterStart ; (R18)
; @end
; ---------------------------------------------------------------------------
; @routine ili9341EndSpi
;
; @clobbers r16
ili9341EndSpi:
rjmp SPIHW_MasterStop ; (R16)
; @end
ili9341SendCommand:
cbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low
cbi ILI9341_DC_OUTPUT, ILI9341_DC_PIN ; D low
nop
rcall SPIHW_MasterTransfer
sbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low
ret
; @end
ili9341SendData:
cbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low
sbi ILI9341_DC_OUTPUT, ILI9341_DC_PIN ; D high
rcall SPIHW_MasterTransfer ; (R16)
sbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low
ret
; @end
; @param r19:18 data
ili9341Send16BitData:
cbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low
sbi ILI9341_DC_OUTPUT, ILI9341_DC_PIN ; D high
mov r16, r19
rcall SPIHW_MasterTransfer ; (R16)
mov r16, r18
rcall SPIHW_MasterTransfer ; (R16)
sbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low
ret
; @end

View File

@@ -7,16 +7,13 @@
; * Please see toplevel file COPYING of that project for license details. *
; ***************************************************************************
; ***************************************************************************
; defines
.equ ILI9341_SPIMODE = (0<<SPIHW_MODE_SPEED0_BIT) | \
(0<<SPIHW_MODE_SPEED1_BIT) | \
(1<<SPIHW_MODE_DOUBLESPEED_BIT) | \
(0<<SPIHW_MODE_DATAORDER_BIT) | \
(0<<SPIHW_MODE_CPOL_BIT) | \
(0<<SPIHW_MODE_CPHA_BIT)
; generally we use the following parameters here:
; @param r1:r0 background color
; @param r3:r2 foreground color
; @param r5:r4 X0
; @param r7:r6 Y0
; @param r9:r8 X1/W
; @param r11:r10 Y1/H
; ***************************************************************************
@@ -24,8 +21,6 @@
.dseg
ILI9341_foregroundColor: .byte 2
ILI9341_backgroundColor: .byte 2
ILI9341_buffer: .byte 128
@@ -40,12 +35,7 @@ ILI9341_buffer: .byte 128
; @routine ILI9341_Init @global
ILI9341_Init:
; setup pins
sbi ILI9341_RESET_DDR, ILI9341_RESET_PIN ; RESET= output
sbi ILI9341_RESET_OUTPUT, ILI9341_RESET_PIN ; RESET= high
sbi ILI9341_DC_DDR, ILI9341_DC_PIN ; DC = output
sbi ILI9341_LED_DDR, ILI9341_LED_PIN ; LED = output
cbi ILI9341_LED_OUTPUT, ILI9341_LED_PIN ; LED = low
rcall ILI9341IoInit
rcall ILI9341_Reset
@@ -54,24 +44,33 @@ ILI9341_Init:
ldi r16, 0xff
rcall ILI9341_SetBacklight
ldi r17, 0xff
ldi r16, 0xff
mov r3, r16
ldi r16, 0xff
mov r2, r16
rcall ili9341Test5
; 0bRRRRRGGGGGGBBBBB
ldi r17, 0b11111000 ; red
ldi r16, 0b11111000 ; red
mov r3, r16
ldi r16, 0b00000000 ; red
; rcall ILI9341_FillScreen
mov r2, r16
rcall ili9341Test2
; 0bRRRRRGGGGGGBBBBB
ldi r17, 0b00000000
ldi r16, 0b00000000
mov r3, r16
ldi r16, 0b00011111 ; blue
mov r2, r16
rcall ili9341Test3
; 0bRRRRRGGGGGGBBBBB
ldi r17, 0b00000111 ; green
ldi r16, 0b00000111 ; green
mov r3, r16
ldi r16, 0b11100000 ; green
mov r2, r16
rcall ili9341Test4
; set foreground color
@@ -86,12 +85,16 @@ ILI9341_Init:
mov r1, r16
; set Xpos
ldi r18, LOW(100)
ldi r19, LOW(100)
ldi r16, LOW(100)
mov r4, r16
ldi r16, HIGH(100)
mov r5, r16
; setYpos
ldi r20, LOW(150)
ldi r21, HIGH(150)
ldi r16, LOW(150)
mov r6, r16
ldi r16, HIGH(150)
mov r7, r16
; set font pos
ldi zl, LOW(font8x8*2)
@@ -122,6 +125,41 @@ ILI9341_Fini:
; ---------------------------------------------------------------------------
; @routine ili9341_SendCommands
;
; @clobbers r16
; Z=byte pointer to command list (as for LPM)
ili9341SendCommands:
rcall ili9341BeginSpi
ili9341SendCommands_loop1:
lpm r16, Z+ ; read command
lpm r18, Z+ ; read number of args
cpi r18, 0xff ; end?
breq ili9341SendCommands_end
rcall ili9341SendCommand
mov r19, r18
andi r19, 1 ; if 1: need to skip filler byte
tst r18
breq ili9341SendCommands_loop1 ; no args, next command
ili9341SendCommands_loop2:
lpm r16, Z+
rcall ili9341SendData ; (R16)
dec r18
brne ili9341SendCommands_loop2
add zl, r19 ; possibly skip filler byte
adc zh, r19
sub zh, r19
rjmp ili9341SendCommands_loop1
ili9341SendCommands_end:
rcall ili9341EndSpi ; (R16)
ret
; @end
; ---------------------------------------------------------------------------
; @routine ILI9341_Reset @global
@@ -215,42 +253,7 @@ ILI9341_LeaveSleepMode:
; @param r17:r16 color
ILI9341_FillScreen:
push r16
push r17
rcall ili9341BeginSpi ; (R16, R17)
clr r18
clr r19
clr r20
clr r21
ldi r22, LOW(ILI9341_DSP_WIDTH-1)
ldi r23, HIGH(ILI9341_DSP_WIDTH-1)
ldi r24, LOW(ILI9341_DSP_HEIGHT-1)
ldi r25, HIGH(ILI9341_DSP_HEIGHT-1)
rcall ili9341SetAddressWindow ; (R16)
pop r19 ; color high
pop r18 ; color low
; start RAM write
ldi r16, ILI9341_CMD_RAMWR
rcall ili9341SendCommand
ldi r24, LOW(ILI9341_DSP_HEIGHT-1)
ldi r25, HIGH(ILI9341_DSP_HEIGHT-1)
ILI9341_FillScreen_loopH:
push r24
push r25
ldi r24, LOW(ILI9341_DSP_WIDTH)
ldi r25, HIGH(ILI9341_DSP_WIDTH)
ILI9341_FillScreen_loopW:
rcall ili9341Send16BitData
sbiw r25:r24, 1
brne ILI9341_FillScreen_loopW
pop r25
pop r24
sbiw r25:r24, 1
brne ILI9341_FillScreen_loopH
rcall ili9341EndSpi
; TODO
ret
; @end
@@ -258,57 +261,55 @@ ILI9341_FillScreen_loopW:
; ---------------------------------------------------------------------------
; @routine ILI9341_FillRect
; @param r17:r16 color
; @param r19:r18 X
; @param r21:r20 Y
; @param r23:r22 W
; @param r25:r24 H
; @param r3:r2 color
; @param r5:r4 X0
; @param r7:r6 Y0
; @param r9:r8 X1/W
; @param r11:r10 Y1/H
ILI9341_FillRect:
push r16
push r17
rcall ili9341BeginSpi ; (R16, R17)
ldi r16, 1
push r22
push r23
push r24
push r25
sub r22, r16 ; X1=X+W-1
sbc r23, r16
add r23, r16
add r22, r18
adc r23, r19
sub r24, r16 ; Y1=Y+H-1
sbc r25, r16
add r25, r16
add r24, r20
adc r25, r21
rcall ili9341SetAddressWindow ; (R16)
pop r25
pop r24
pop r23
pop r22
pop r19 ; color high (pop from r17)
pop r18 ; color low (pop from r16)
sbi ILI9341_DC_OUTPUT, ILI9341_DC_PIN ; D high (send data)
rcall ili9341BeginSpi ; (R16, R17)
push r8 ; W
push r9
push r10
push r11
ldi r16, 1
sub r8, r16 ; X1=X+W-1
sbc r9, r16
add r9, r16
add r8, r4
adc r9, r5
sub r10, r16 ; Y1=Y+H-1
sbc r11, r16
add r11, r16
add r10, r6
adc r11, r7
rcall ili9341SetAddressWindow ; (R16)
pop r11
pop r10
pop r9
pop r8
mov r18, r2 ; color
mov r19, r3
mov r22, r10 ; H low
mov r23, r11 ; H high
ldi r16, ILI9341_CMD_RAMWR ; start writing ro RAM
rcall ili9341SendCommand
ILI9341_FillRect_loopH:
push r24
push r25
mov r24, r22 ; W low
mov r25, r23 ; W high
mov r24, r8 ; W low
mov r25, r9 ; W high
ILI9341_FillRect_loopW:
mov r16, r19 ; color high
rcall SPIHW_MasterTransfer ; (R16)
mov r16, r18 ; color high
rcall SPIHW_MasterTransfer ; (R16)
sbiw r25:r24, 1
brne ILI9341_FillRect_loopW
pop r25
pop r24
sbiw r25:r24, 1
rcall ili9341Send16BitData ; send r19:r18
sbiw r25:r24, 1
brne ILI9341_FillRect_loopW
mov r24, r22 ; H low
mov r25, r23 ; H high
sbiw r25:r24, 1 ; dec
mov r22, r24 ; save in r23:r22
mov r23, r25
brne ILI9341_FillRect_loopH
rcall ili9341EndSpi
ret
@@ -319,10 +320,10 @@ ILI9341_FillRect_loopW:
; ---------------------------------------------------------------------------
; @routine ili9341SetAddressWindow
;
; @param r19:r18 X0
; @param r21:r20 Y0
; @param r23:r22 X1
; @param r25:r24 Y1
; @param r5:r4 X0
; @param r7:r6 Y0
; @param r9:r8 X1
; @param r11:r10 Y1
; @clobbers R16
ili9341SetAddressWindow:
@@ -330,28 +331,28 @@ ili9341SetAddressWindow:
ldi r16, ILI9341_CMD_CASET
rcall ili9341SendCommand
; X0
mov r16, r19
mov r16, r5
rcall ili9341SendData
mov r16, r18
mov r16, r4
rcall ili9341SendData
; X1
mov r16, r23
mov r16, r9
rcall ili9341SendData
mov r16, r22
mov r16, r8
rcall ili9341SendData
; send row address
ldi r16, ILI9341_CMD_PASET
rcall ili9341SendCommand
; Y0
mov r16, r21
mov r16, r7
rcall ili9341SendData
mov r16, r20
mov r16, r6
rcall ili9341SendData
; Y1
mov r16, r25
mov r16, r11
rcall ili9341SendData
mov r16, r24
mov r16, r10
rcall ili9341SendData
ret
@@ -359,36 +360,18 @@ ili9341SetAddressWindow:
; ---------------------------------------------------------------------------
; @routine ili9341_WriteStringX1At
; @param R16 character to write
; @param r19:r18 X pos
; @param r21:r20 Y pos
; @param R01:R00 background color
; @param R03:R02 foreground color
; @param Z pointer to font
; @param Y pointer to RAM to store data to
; @clobbers
ili9341_WriteStringX1At:
ret
; @end
; ---------------------------------------------------------------------------
; @routine ili9341_WriteCharacterX1At
; @param R16 character to write
; @param r19:r18 X pos
; @param r21:r20 Y pos
; @param R01:R00 background color
; @param R03:R02 foreground color
; @param X pointer to font
; @param Y pointer to RAM to store data to
; @clobbers
; @param R16 character to write
; @param r5:r4 X
; @param r7:r6 Y
; @param r1:r0 background color
; @param r3:r2 foreground color
; @param Z pointer to font
; @param X pointer to RAM to store data to
; @return r5:r4 new X (advanced by character width)
; @clobbers r16, r17, r18, r19, r24, r25, x, z
ili9341_WriteCharacterX1At:
push xl
@@ -399,20 +382,25 @@ ili9341_WriteCharacterX1At:
ldi r17, 7
; calc X1
mov r22, r18
mov r23, r19
add r22, r17
adc r23, r17
sub r23, r17
mov r8, r4
mov r9, r5
add r8, r17
adc r9, r17
sub r9, r17
; calc Y1
mov r24, r20
mov r25, r21
add r24, r17
adc r25, r17
sub r25, r17
mov r10, r6
mov r11, r7
add r10, r17
adc r11, r17
sub r11, r17
rcall ili9341BeginSpi ; (r16, r17)
rcall ili9341SetAddressWindow ; (R16)
ldi r16, 8 ; increment X pos for next char
add r4, r16
adc r5, r16
sub r5, r16
ldi r16, ILI9341_CMD_RAMWR ; start writing ro RAM
rcall ili9341SendCommand
ldi r17, 64 ; 8x8
@@ -431,14 +419,14 @@ ili9341_WriteCharacterX1At_loop:
; ---------------------------------------------------------------------------
; @routine ili9341_WriteCharacterX2At
; @param R16 character to write
; @param r19:r18 X pos
; @param r21:r20 Y pos
; @param R01:R00 background color
; @param R03:R02 foreground color
; @param X pointer to font
; @param Y pointer to RAM to store data to
; @clobbers
; @param R16 character to write
; @param r5:r4 X
; @param r7:r6 Y
; @param r1:r0 background color
; @param r3:r2 foreground color
; @param Z pointer to font
; @param X pointer to RAM to store data to
; @clobbers r16, r17, r18, r19, r24, r25, x, z
ili9341_WriteCharacterX2At:
push xl
@@ -449,20 +437,24 @@ ili9341_WriteCharacterX2At:
ldi r17, 15
; calc X1
mov r22, r18
mov r23, r19
add r22, r17
adc r23, r17
sub r23, r17
mov r8, r4
mov r9, r5
add r8, r17
adc r9, r17
sub r9, r17
; calc Y1
mov r24, r20
mov r25, r21
add r24, r17
adc r25, r17
sub r25, r17
mov r10, r6
mov r11, r7
add r10, r17
adc r11, r17
sub r11, r17
rcall ili9341BeginSpi ; (r16, r17)
rcall ili9341SetAddressWindow ; (R16)
ldi r16, 16 ; increment X pos for next char
add r4, r16
adc r5, r16
sub r5, r16
ldi r16, ILI9341_CMD_RAMWR ; start writing ro RAM
rcall ili9341SendCommand
ldi r17, 0 ; 256 bytes
@@ -481,11 +473,11 @@ ili9341_WriteCharacterX2At_loop:
; ---------------------------------------------------------------------------
; @routine ili9341WriteCharacterFromFont8x8x1
; @param R16 character to write
; @param R01:R00 background color
; @param R03:R02 foreground color
; @param Z pointer to font
; @param X pointer to RAM to store data to
; @param R16 character to write
; @param R1:R0 background color
; @param R3:R2 foreground color
; @param Z pointer to font
; @param X pointer to RAM to store data to
; @clobbers r17, r24, r25, x, z
ili9341WriteCharacterFromFont8x8x1:
@@ -516,11 +508,11 @@ ili9341WriteCharacterFromFont8x8x1_loop2end:
; ---------------------------------------------------------------------------
; @routine ili9341WriteCharacterFromFont8x8x2
; @param R16 character to write
; @param R01:R00 background color
; @param R03:R02 foreground color
; @param Z pointer to font
; @param X pointer to RAM to store data to
; @param R16 character to write
; @param R1:R0 background color
; @param R3:R2 foreground color
; @param Z pointer to font
; @param X pointer to RAM to store data to
; @clobbers r17, r22, r23, r24, r25, x, z
ili9341WriteCharacterFromFont8x8x2:
@@ -594,100 +586,6 @@ ili9341WriteCharacterFromFont8x8_gotPos:
ili9341SendCommand:
cbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low
cbi ILI9341_DC_OUTPUT, ILI9341_DC_PIN ; D low
nop
rcall SPIHW_MasterTransfer
sbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low
ret
; @end
ili9341SendData:
cbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low
sbi ILI9341_DC_OUTPUT, ILI9341_DC_PIN ; D high
rcall SPIHW_MasterTransfer ; (R16)
sbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low
ret
; @end
; @param r19:18 data
ili9341Send16BitData:
cbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low
sbi ILI9341_DC_OUTPUT, ILI9341_DC_PIN ; D high
mov r16, r19
rcall SPIHW_MasterTransfer ; (R16)
mov r16, r18
rcall SPIHW_MasterTransfer ; (R16)
sbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low
ret
; @end
; ---------------------------------------------------------------------------
; @routine ili9341BeginSpi
;
; @clobbers r16, r17
ili9341BeginSpi:
ldi r16, ILI9341_SPIMODE
ldi r17, ILI9341_DEVICENUM
rjmp SPIHW_MasterStart ; (R18)
; @end
; ---------------------------------------------------------------------------
; @routine ili9341EndSpi
;
; @clobbers r16
ili9341EndSpi:
rjmp SPIHW_MasterStop ; (R16)
; @end
; ---------------------------------------------------------------------------
; @routine ili9341SendCommands
;
; @clobbers r16
; Z=byte pointer to command list (as for LPM)
ili9341SendCommands:
rcall ili9341BeginSpi
ili9341SendCommands_loop1:
lpm r16, Z+ ; read command
lpm r18, Z+ ; read number of args
cpi r18, 0xff ; end?
breq ili9341SendCommands_end
rcall ili9341SendCommand
mov r19, r18
andi r19, 1 ; if 1: need to skip filler byte
tst r18
breq ili9341SendCommands_loop1 ; no args, next command
ili9341SendCommands_loop2:
lpm r16, Z+
rcall ili9341SendData ; (R16)
dec r18
brne ili9341SendCommands_loop2
add zl, r19 ; possibly skip filler byte
adc zh, r19
sub zh, r19
rjmp ili9341SendCommands_loop1
ili9341SendCommands_end:
rcall ili9341EndSpi ; (R16)
ret
; @end
ili9341Test1:
rcall ili9341BeginSpi
ldi r16, 0x04
@@ -713,64 +611,33 @@ ili9341Test1:
; @param %2 W
; @param %3 H
.macro M_ILI9341_FILL_RECT
push r16
push r17
rcall ili9341BeginSpi ; (R16, R17)
ldi r18, LOW(@0) ; X0
ldi r19, HIGH(@0)
ldi r20, LOW(@1) ; Y0
ldi r21, HIGH(@1)
ldi r22, LOW(@0+@2-1) ; X1
ldi r23, HIGH(@0+@2-1)
ldi r24, LOW(@1+@3-1) ; y1
ldi r25, HIGH(@1+@3-1) ; y1
rcall ili9341SetAddressWindow ; (R16)
pop r19 ; color high
pop r18 ; color low
ldi r16, LOW(@0) ; X0
mov r4, r16
ldi r16, HIGH(@0)
mov r5, r16
ldi r16, LOW(@1) ; Y0
mov r6, r16
ldi r16, HIGH(@1)
mov r7, r16
ldi r16, LOW(@2) ; W
mov r8, r16
ldi r16, HIGH(@2)
mov r9, r16
; start RAM write
ldi r16, ILI9341_CMD_RAMWR
rcall ili9341SendCommand
ldi r16, LOW(@3) ; H
mov r10, r16
ldi r16, HIGH(@3)
mov r11, r16
cbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low
sbi ILI9341_DC_OUTPUT, ILI9341_DC_PIN ; D high
ldi r24, LOW(@3) ; height
ldi r25, HIGH(@3)
l_loopH_%:
push r24
push r25
ldi r24, LOW(@2) ; width
ldi r25, HIGH(@2)
l_loopW_%:
M_IO_WRITE SPDR, r19
rcall SPIHW_WaitForTransferComplete ; (R16)
M_IO_WRITE SPDR, r18
rcall SPIHW_WaitForTransferComplete ; (R16)
sbiw r25:r24, 1
brne l_loopW_%
pop r25
pop r24
sbiw r25:r24, 1
brne l_loopH_%
sbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low
rcall ili9341EndSpi
rcall ILI9341_FillRect
.endmacro
ili9341Test2:
M_ILI9341_FILL_RECT 10, 20, 70, 100
ldi r18, LOW(10) ; X
ldi r19, HIGH(10)
ldi r20, LOW(20) ; Y
ldi r21, HIGH(20)
ldi r22, LOW(70) ; W
ldi r23, HIGH(70)
ldi r24, LOW(100) ; H
ldi r25, HIGH(100)
rjmp ILI9341_FillRect
ret