Reduce patch sections space of DATEL platform (#108)

This commit is contained in:
Edoardo Lolletti
2026-01-12 21:22:41 +01:00
committed by GitHub
parent 9d21940b60
commit 08cf835b05
4 changed files with 100 additions and 40 deletions

View File

@@ -10,7 +10,7 @@ BEGIN_ASM_FUNC datel_readSpiByte
movs r0, 0xFF
@u8 datel_readWriteSpiByte(u8);
BEGIN_ASM_FUNC datel_readWriteSpiByte
push {r1-r3, lr}
push {r1-r3}
ldr r3, =REG_MCCNT0
@ Wait if there's a transfer in progress (can happen if the random byte sent by the cycle spi function is still on its way)
1:
@@ -27,7 +27,8 @@ BEGIN_ASM_FUNC datel_readWriteSpiByte
@uppper half always 0
ldrh r0, [r3, #2]
cmp r0, #0
pop {r1-r3, pc}
pop {r1-r3}
mov pc,lr
@u16 datel_readWriteSpiShort();
BEGIN_ASM_FUNC datel_readSpiShort
@@ -53,12 +54,13 @@ BEGIN_ASM_FUNC datel_readSpiByteTimeout
subs r4, r4, #1
bne 1b
1:
pop {r1-r4, pc}
pop {r1-r4,pc}
@bool datel_waitSpiByteTimeout();
BEGIN_ASM_FUNC datel_waitSpiByteTimeout
push {r1-r4, lr}
@ use a timeout of 0x1000 instead of 0xFFFF, easier to setup
push {r1-r4}
push {lr}
@ use a timeout of 0x10000 instead of 0xFFFF, easier to setup
@ ldr r2, =DATEL_SD_WRITE_TIMEOUT_LEN
movs r2, #1
lsls r2, #16
@@ -69,15 +71,19 @@ BEGIN_ASM_FUNC datel_waitSpiByteTimeout
bne 1b
movs r0, #0
pop {r1-r4, pc}
b end
1:
movs r0, #1
pop {r1-r4, pc}
end:
pop {r1}
mov lr,r1
pop {r1-r4}
mov pc,lr
.section "datel_spi_send", "ax"
.section "datel_cycle_spi", "ax"
@void datel_cycleSpi();
datel_cycleSpi:
BEGIN_ASM_FUNC datel_cycleSpi
push {r0-r5, lr}
adr r0, datel_cycleSpi_data
ldm r0!, {r1,r3,r4}
@@ -106,7 +112,14 @@ datel_sendNtrCommandF2:
beq datel_sendNtrCommandF2
pop {r0-r5, pc}
.balign 4
.pool
datel_cycleSpi_data:
.word REG_MCCNT0
.word 0x00FFA040 @ MCCNT0_MODE_SPI | MCCNT0_SPI_HOLD_CS | MCCNT0_ENABLE in lower 16 bit, 0xFF in upper 16
.word 0xA07F6000 @ MCCNT1_RESET_OFF | MCCNT1_CMD_SCRAMBLE | MCCNT1_READ_DATA_DESCRAMBLE | MCCNT1_CLOCK_SCRAMBLER | MCCNT1_LATENCY2(0x3F)
.section "datel_spi_send", "ax"
@ NOTE!!!: This function needs to set r0 last with mov or something similar so that it updates the zero flags
@u8 datel_spiSendSDIOCommandR0(u32 arg, u8 cmd);
BEGIN_ASM_FUNC datel_spiSendSDIOCommandR0
@@ -115,12 +128,14 @@ BEGIN_ASM_FUNC datel_spiSendSDIOCommandR0
BEGIN_ASM_FUNC datel_spiSendSDIOCommand
push {r0-r7, lr}
bl datel_cycleSpi
ldr r3, datel_spiSendSDIOCommandR0_CycleSpi
@ branch to datel_cycleSpi
bl datel_spiSendSDIOCommandR0_InterworkR3
adr r4, datel_spiSendSDIOCommandR0_ReadSpiByteTimeout
adr r3, datel_spiSendSDIOCommandR0_ReadSpiByteTimeout
@ r3 contains ReadSpiByteTimeout
@ r7 contains ReadWriteSpiByte
ldm r4!, {r3,r7}
ldm r3, {r3,r7}
@ we use the cmd and arg directly from the stack
@ r0 is on top, r1 is right below, we read the command id as the last byte pushed of r1,
@@ -157,7 +172,9 @@ BEGIN_ASM_FUNC datel_spiSendSDIOCommand
bcc datel_spiSendSDIOCommandR0_Interwork
movs r0, r6
pop {r1}
pop {r1-r7, pc}
pop {r1-r7}
pop {r2}
mov pc,r2
datel_spiSendSDIOCommandR0_Interwork:
bx r7
@@ -165,10 +182,9 @@ datel_spiSendSDIOCommandR0_InterworkR3:
bx r3
.balign 4
.pool
datel_cycleSpi_data:
.word REG_MCCNT0
.word 0x00FFA040 @ MCCNT0_MODE_SPI | MCCNT0_SPI_HOLD_CS | MCCNT0_ENABLE in lower 16 bit, 0xFF in upper 16
.word 0xA07F6000 @ MCCNT1_RESET_OFF | MCCNT1_CMD_SCRAMBLE | MCCNT1_READ_DATA_DESCRAMBLE | MCCNT1_CLOCK_SCRAMBLER | MCCNT1_LATENCY2(0x3F)
.global datel_spiSendSDIOCommandR0_CycleSpi
datel_spiSendSDIOCommandR0_CycleSpi:
.word 0
.global datel_spiSendSDIOCommandR0_ReadSpiByteTimeout
datel_spiSendSDIOCommandR0_ReadSpiByteTimeout:
.word 0