參考資料:
http://nano.lichee.pro/
https://mangopi.org/mangopi_r
TCON

DEBE

main.s
.global _start
.equiv TCON_BASE, 0x01c0c000
.equiv DRAM_BASE, 0x01c01000
.equiv CCU_BASE, 0x01c20000
.equiv GPIO_BASE, 0x01c20800
.equiv UART1_BASE, 0x01c25400
.equiv DEBE_BASE, 0x01e60000
.equiv PLL_VIDEO_CTRL_REG, 0x0010
.equiv PLL_DDR_CTRL_REG, 0x0020
.equiv PLL_PERIPH_CTRL_REG, 0x0028
.equiv AHB_APB_HCLKC_CFG_REG, 0x0054
.equiv BUS_CLK_GATING_REG0, 0x0060
.equiv BUS_CLK_GATING_REG1, 0x0064
.equiv BUS_CLK_GATING_REG2, 0x0068
.equiv DRAM_GATING_REG, 0x0100
.equiv BUS_SOFT_RST_REG0, 0x02c0
.equiv BUS_SOFT_RST_REG1, 0x02c4
.equiv BUS_SOFT_RST_REG2, 0x02d0
.equiv BE_CLK_REG, 0x0104
.equiv FE_CLK_REG, 0x010C
.equiv TCON_CLK_REG, 0x0118
.equiv PA, (0x24 * 0)
.equiv PB, (0x24 * 1)
.equiv PC, (0x24 * 2)
.equiv PD, (0x24 * 3)
.equiv PE, (0x24 * 4)
.equiv PF, (0x24 * 5)
.equiv PORT_CFG0, 0x0000
.equiv PORT_CFG1, 0x0004
.equiv PORT_CFG2, 0x0008
.equiv PORT_DATA, 0x0010
.equiv SDR_PAD_DRV, 0x02c0
.equiv SDR_PAD_PUL, 0x02c4
.equiv UART_RBR, 0x0000
.equiv UART_DLL, 0x0000
.equiv UART_DLH, 0x0004
.equiv UART_IER, 0x0004
.equiv UART_IIR, 0x0008
.equiv UART_LCR, 0x000c
.equiv UART_MCR, 0x0010
.equiv UART_USR, 0x007c
.equiv DRAM_SCONR, 0x00
.equiv DRAM_STMG0R, 0x04
.equiv DRAM_STMG1R, 0x08
.equiv DRAM_SCTLR, 0x0c
.equiv DRAM_SREFR, 0x10
.equiv DRAM_DDLYR, 0x24
.equiv DRAM_DRPTR0, 0x30
.equiv TCON_CTRL_REG, 0x000
.equiv TCON_INT_REG0, 0x004
.equiv TCON_INT_REG1, 0x008
.equiv TCON_FRM_CTRL_REG, 0x010
.equiv TCON_FRM_SEED0_R_REG, 0x014
.equiv TCON_FRM_SEED0_G_REG, 0x018
.equiv TCON_FRM_SEED0_B_REG, 0x01C
.equiv TCON_FRM_SEED1_R_REG, 0x020
.equiv TCON_FRM_SEED1_G_REG, 0x024
.equiv TCON_FRM_SEED1_B_REG, 0x028
.equiv TCON_FRM_TBL_REG0, 0x02C
.equiv TCON_FRM_TBL_REG1, 0x030
.equiv TCON_FRM_TBL_REG2, 0x034
.equiv TCON_FRM_TBL_REG3, 0x038
.equiv TCON0_CTRL_REG, 0x040
.equiv TCON_CLK_CTRL_REG, 0x044
.equiv TCON0_BASIC_TIMING_REG0, 0x048
.equiv TCON0_BASIC_TIMING_REG1, 0x04C
.equiv TCON0_BASIC_TIMING_REG2, 0x050
.equiv TCON0_BASIC_TIMING_REG3, 0x054
.equiv TCON0_HV_TIMING_REG, 0x058
.equiv TCON0_CPU_IF_REG, 0x060
.equiv TCON0_CPU_WR_REG, 0x064
.equiv TCON0_CPU_RD_REG, 0x068
.equiv TCON0_CPU_RD_NX_REG, 0x06C
.equiv TCON0_IO_CTRL_REG0, 0x088
.equiv TCON0_IO_CTRL_REG1, 0x08C
.equiv TCON1_CTRL_REG, 0x090
.equiv TCON1_BASIC_REG0, 0x094
.equiv TCON1_BASIC_REG1, 0x098
.equiv TCON1_BASIC_REG2, 0x09C
.equiv TCON1_BASIC_REG3, 0x0A0
.equiv TCON1_BASIC_REG4, 0x0A4
.equiv TCON1_BASIC_REG5, 0x0A8
.equiv TCON1_IO_CTRL_REG0, 0x0F0
.equiv TCON1_IO_CTRL_REG1, 0x0F4
.equiv TCON_DEBUG_INFO_REG, 0x0FC
.equiv DEBE_MODE_CTRL_REG, 0x800
.equiv DEBE_COLOR_CTRL_REG, 0x804
.equiv DEBE_DISP_SIZE_REG, 0x808
.equiv DEBE_LAY0_SIZE_REG, 0x810
.equiv DEBE_LAY1_SIZE_REG, 0x814
.equiv DEBE_LAY2_SIZE_REG, 0x818
.equiv DEBE_LAY3_SIZE_REG, 0x81C
.equiv DEBE_LAY0_CODNT_REG, 0x820
.equiv DEBE_LAY1_CODNT_REG, 0x824
.equiv DEBE_LAY2_CODNT_REG, 0x828
.equiv DEBE_LAY3_CODNT_REG, 0x82C
.equiv DEBE_LAY0_LINEWIDTH_REG, 0x840
.equiv DEBE_LAY1_LINEWIDTH_REG, 0x844
.equiv DEBE_LAY2_LINEWIDTH_REG, 0x848
.equiv DEBE_LAY3_LINEWIDTH_REG, 0x84C
.equiv DEBE_LAY0_FB_ADDR_REG, 0x850
.equiv DEBE_LAY1_FB_ADDR_REG, 0x854
.equiv DEBE_LAY2_FB_ADDR_REG, 0x858
.equiv DEBE_LAY3_FB_ADDR_REG, 0x85C
.equiv DEBE_LAY0_FB_HI_ADDR_REG, 0x860
.equiv DEBE_LAY1_FB_HI_ADDR_REG, 0x864
.equiv DEBE_LAY2_FB_HI_ADDR_REG, 0x868
.equiv DEBE_LAY3_FB_HI_ADDR_REG, 0x86c
.equiv DEBE_REGBUFF_CTRL_REG, 0x870
.equiv DEBE_LAY0_ATT_CTRL_REG0, 0x890
.equiv DEBE_LAY1_ATT_CTRL_REG0, 0x894
.equiv DEBE_LAY2_ATT_CTRL_REG0, 0x898
.equiv DEBE_LAY3_ATT_CTRL_REG0, 0x89C
.equiv DEBE_LAY0_ATT_CTRL_REG1, 0x8A0
.equiv DEBE_LAY1_ATT_CTRL_REG1, 0x8A4
.equiv DEBE_LAY2_ATT_CTRL_REG1, 0x8A8
.equiv DEBE_LAY3_ATT_CTRL_REG1, 0x8AC
.equiv XRES, 320
.equiv YRES, 240
.equiv V_FRONT_PORCH, 0x11e
.equiv V_BACK_PORCH, 2
.equiv V_SYNC_LEN, 1
.equiv H_SYNC_LEN, 0x12
.equiv H_BACK_PORCH, 2
.equiv H_FRONT_PORCH, 0x465
.equiv VRAM_PHYS, 0x80000000
.arm
.text
_start:
.long 0xea000016
.byte 'e', 'G', 'O', 'N', '.', 'B', 'T', '0'
.long 0, __spl_size
.byte 'S', 'P', 'L', 2
.long 0, 0
.long 0, 0, 0, 0, 0, 0, 0, 0
.long 0, 0, 0, 0, 0, 0, 0, 0
_vector:
b reset
b .
b .
b .
b .
b .
b .
b .
reset:
mov sp, #0x8000
bl init_pll_module
bl init_uart_module
bl init_dram_module
ldr r1, =VRAM_PHYS
ldr r2, =XRES * 80 * 2
ldr r3, =0xf800f800
0:
str r3, [r1]
add r1, #4
subs r2, #4
bne 0b
ldr r2, =XRES * 80 * 2
ldr r3, =0x07e007e0
0:
str r3, [r1]
add r1, #4
subs r2, #4
bne 0b
ldr r2, =XRES * 80 * 2
ldr r3, =0x001f001f
0:
str r3, [r1]
add r1, #4
subs r2, #4
bne 0b
bl init_tcon_module
b .
spi_9bits_write:
push {r4, lr}
ldr r4, =GPIO_BASE
ldr r2, [r4, #(PD + PORT_DATA)]
bic r2, #(1 << 11)
str r2, [r4, #(PD + PORT_DATA)]
ldr r1, =9
0:
tst r0, #0x100
biceq r2, #(1 << 10)
orrne r2, #(1 << 10)
lsl r0, #1
bic r2, #(1 << 9)
str r2, [r4, #(PD + PORT_DATA)]
orr r2, #(1 << 9)
str r2, [r4, #(PD + PORT_DATA)]
subs r1, #1
bne 0b
orr r2, #(1 << 11)
str r2, [r4, #(PD + PORT_DATA)]
pop {r4, pc}
init_lcd_module:
push {lr}
ldr r0, =0x00fe
bl spi_9bits_write
ldr r0, =0x00ef
bl spi_9bits_write
ldr r0, =0x0036
bl spi_9bits_write
ldr r0, =0x0140
bl spi_9bits_write
ldr r0, =0x003a
bl spi_9bits_write
ldr r0, =0x0155
bl spi_9bits_write
ldr r0, =0x0084
bl spi_9bits_write
ldr r0, =0x0104
bl spi_9bits_write
ldr r0, =0x0086
bl spi_9bits_write
ldr r0, =0x01fb
bl spi_9bits_write
ldr r0, =0x0087
bl spi_9bits_write
ldr r0, =0x0179
bl spi_9bits_write
ldr r0, =0x0089
bl spi_9bits_write
ldr r0, =0x010b
bl spi_9bits_write
ldr r0, =0x008a
bl spi_9bits_write
ldr r0, =0x0120
bl spi_9bits_write
ldr r0, =0x008b
bl spi_9bits_write
ldr r0, =0x0180
bl spi_9bits_write
ldr r0, =0x008d
bl spi_9bits_write
ldr r0, =0x013b
bl spi_9bits_write
ldr r0, =0x008e
bl spi_9bits_write
ldr r0, =0x01cf
bl spi_9bits_write
ldr r0, =0x00ec
bl spi_9bits_write
ldr r0, =0x0133
bl spi_9bits_write
ldr r0, =0x0102
bl spi_9bits_write
ldr r0, =0x014c
bl spi_9bits_write
ldr r0, =0x0098
bl spi_9bits_write
ldr r0, =0x013e
bl spi_9bits_write
ldr r0, =0x009c
bl spi_9bits_write
ldr r0, =0x014b
bl spi_9bits_write
ldr r0, =0x0099
bl spi_9bits_write
ldr r0, =0x013e
bl spi_9bits_write
ldr r0, =0x009d
bl spi_9bits_write
ldr r0, =0x014b
bl spi_9bits_write
ldr r0, =0x009b
bl spi_9bits_write
ldr r0, =0x0155
bl spi_9bits_write
ldr r0, =0x00e8
bl spi_9bits_write
ldr r0, =0x0111
bl spi_9bits_write
ldr r0, =0x0100
bl spi_9bits_write
ldr r0, =0x00ff
bl spi_9bits_write
ldr r0, =0x0162
bl spi_9bits_write
ldr r0, =0x00c3
bl spi_9bits_write
ldr r0, =0x0120
bl spi_9bits_write
ldr r0, =0x00c4
bl spi_9bits_write
ldr r0, =0x0103
bl spi_9bits_write
ldr r0, =0x00c9
bl spi_9bits_write
ldr r0, =0x010a
bl spi_9bits_write
ldr r0, =0x003a
bl spi_9bits_write
ldr r0, =0x0155
bl spi_9bits_write
ldr r0, =0x0084
bl spi_9bits_write
ldr r0, =0x0161
bl spi_9bits_write
ldr r0, =0x008a
bl spi_9bits_write
ldr r0, =0x0140
bl spi_9bits_write
ldr r0, =0x00f6
bl spi_9bits_write
ldr r0, =0x01c7
bl spi_9bits_write
ldr r0, =0x00b0
bl spi_9bits_write
ldr r0, =0x0163
bl spi_9bits_write
ldr r0, =0x00b5
bl spi_9bits_write
ldr r0, =0x0102
bl spi_9bits_write
ldr r0, =0x0102
bl spi_9bits_write
ldr r0, =0x0114
bl spi_9bits_write
ldr r0, =0x00f0
bl spi_9bits_write
ldr r0, =0x014a
bl spi_9bits_write
ldr r0, =0x0110
bl spi_9bits_write
ldr r0, =0x010a
bl spi_9bits_write
ldr r0, =0x010a
bl spi_9bits_write
ldr r0, =0x0126
bl spi_9bits_write
ldr r0, =0x0139
bl spi_9bits_write
ldr r0, =0x00f2
bl spi_9bits_write
ldr r0, =0x014a
bl spi_9bits_write
ldr r0, =0x0110
bl spi_9bits_write
ldr r0, =0x010a
bl spi_9bits_write
ldr r0, =0x010a
bl spi_9bits_write
ldr r0, =0x0126
bl spi_9bits_write
ldr r0, =0x0139
bl spi_9bits_write
ldr r0, =0x00f1
bl spi_9bits_write
ldr r0, =0x0150
bl spi_9bits_write
ldr r0, =0x018f
bl spi_9bits_write
ldr r0, =0x01af
bl spi_9bits_write
ldr r0, =0x013b
bl spi_9bits_write
ldr r0, =0x013f
bl spi_9bits_write
ldr r0, =0x017f
bl spi_9bits_write
ldr r0, =0x00f3
bl spi_9bits_write
ldr r0, =0x0150
bl spi_9bits_write
ldr r0, =0x018f
bl spi_9bits_write
ldr r0, =0x01af
bl spi_9bits_write
ldr r0, =0x013b
bl spi_9bits_write
ldr r0, =0x013f
bl spi_9bits_write
ldr r0, =0x017f
bl spi_9bits_write
ldr r0, =0x00ba
bl spi_9bits_write
ldr r0, =0x010a
bl spi_9bits_write
ldr r0, =0x0035
bl spi_9bits_write
ldr r0, =0x0100
bl spi_9bits_write
ldr r0, =0x0021
bl spi_9bits_write
ldr r0, =0x00fe
bl spi_9bits_write
ldr r0, =0x00ee
bl spi_9bits_write
ldr r0, =0x0011
bl spi_9bits_write
ldr r0, =0x0029
bl spi_9bits_write
ldr r0, =0x002c
bl spi_9bits_write
pop {pc}
init_tcon_module:
push {r4, lr}
ldr r4, =GPIO_BASE
ldr r1, [r4, #(PD + PORT_CFG0)]
ldr r2, =0xfffff000
bic r1, r2
ldr r2, =0x22222000
orr r1, r2
str r1, [r4, #(PD + PORT_CFG0)]
ldr r1, [r4, #(PD + PORT_CFG1)]
ldr r2, =0x0000ffff
bic r1, r2
ldr r2, =0x00001112
orr r1, r2
str r1, [r4, #(PD + PORT_CFG1)]
ldr r1, [r4, #(PD + PORT_CFG2)]
ldr r2, =0x00ff0f00
bic r1, r2
ldr r2, =0x00220200
orr r1, r2
str r1, [r4, #(PD + PORT_CFG2)]
ldr r1, [r4, #(PE + PORT_CFG0)]
ldr r2, =0x0f000000
bic r1, r2
ldr r2, =0x01000000
orr r1, r2
str r1, [r4, #(PE + PORT_CFG0)]
ldr r1, =0xffffffff
str r1, [r4, #(PD + PORT_DATA)]
ldr r1, =0xffffffff
str r1, [r4, #(PE + PORT_DATA)]
bl init_lcd_module
ldr r4, =CCU_BASE
ldr r1, =(1 << 31) | (1 << 25) | (1 << 24) | (98 << 8) | (7 << 0)
str r1, [r4, #PLL_VIDEO_CTRL_REG]
ldr r1, [r4, #DRAM_GATING_REG]
orr r1, #(1 << 26) | (1 << 24)
str r1, [r4, #DRAM_GATING_REG]
ldr r1, [r4, #FE_CLK_REG]
orr r1, #(1 << 31)
str r1, [r4, #FE_CLK_REG]
ldr r1, [r4, #BE_CLK_REG]
orr r1, #(1 << 31)
str r1, [r4, #BE_CLK_REG]
ldr r1, [r4, #TCON_CLK_REG]
orr r1, #(1 << 31)
orr r1, #(1 << 25)
str r1, [r4, #TCON_CLK_REG]
ldr r1, [r4, #BUS_CLK_GATING_REG1]
orr r1, #(1 << 14)
orr r1, #(1 << 12)
orr r1, #(1 << 4)
str r1, [r4, #BUS_CLK_GATING_REG1]
ldr r1, [r4, #BUS_SOFT_RST_REG1]
orr r1, #(1 << 14)
orr r1, #(1 << 12)
orr r1, #(1 << 4)
str r1, [r4, #BUS_SOFT_RST_REG1]
ldr r1, =DEBE_BASE + 0x800
ldr r2, =0x200
ldr r3, =0
0:
str r3, [r1]
add r1, #4
subs r2, #4
bne 0b
ldr r4, =TCON_BASE
ldr r1, [r4, #TCON_CTRL_REG]
bic r1, #(1 << 0)
str r1, [r4, #TCON_CTRL_REG]
ldr r4, =DEBE_BASE
ldr r1, [r4, #DEBE_MODE_CTRL_REG]
orr r1, #(1 << 0)
str r1, [r4, #DEBE_MODE_CTRL_REG]
ldr r1, =(XRES << 4)
str r1, [r4, #DEBE_LAY0_LINEWIDTH_REG]
ldr r1, =(5 << 8)
str r1, [r4, #DEBE_LAY0_ATT_CTRL_REG1]
ldr r1, =((YRES - 1) << 16) | ((XRES - 1) << 0)
str r1, [r4, #DEBE_DISP_SIZE_REG]
str r1, [r4, #DEBE_LAY0_SIZE_REG]
ldr r1, [r4, #DEBE_MODE_CTRL_REG]
orr r1, #(1 << 8)
str r1, [r4, #DEBE_MODE_CTRL_REG]
ldr r1, [r4, #DEBE_REGBUFF_CTRL_REG]
orr r1, #(1 << 0)
str r1, [r4, #DEBE_REGBUFF_CTRL_REG]
ldr r1, [r4, #DEBE_MODE_CTRL_REG]
orr r1, #(1 << 1)
str r1, [r4, #DEBE_MODE_CTRL_REG]
ldr r1, =VRAM_PHYS << 3
str r1, [r4, #DEBE_LAY0_FB_ADDR_REG]
ldr r1, =VRAM_PHYS >> 29
str r1, [r4, #DEBE_LAY0_FB_HI_ADDR_REG]
ldr r4, =TCON_BASE
ldr r1, =(1 << 31) | (((V_FRONT_PORCH + V_BACK_PORCH + V_SYNC_LEN) & 0x1f) << 4)
str r1, [r4, #TCON0_CTRL_REG]
ldr r1, =(0xf << 28) | (25 << 0)
str r1, [r4, #TCON_CLK_CTRL_REG]
ldr r1, =(YRES - 1) << 0
ldr r2, =(XRES - 1) << 16
orr r1, r2
str r1, [r4, #TCON0_BASIC_TIMING_REG0]
ldr r1, =((H_SYNC_LEN + H_BACK_PORCH) - 1) << 0
ldr r2, =((XRES + H_FRONT_PORCH + H_SYNC_LEN + H_BACK_PORCH) - 1) << 16
orr r1, r2
str r1, [r4, #TCON0_BASIC_TIMING_REG1]
ldr r1, =((V_SYNC_LEN + V_BACK_PORCH) - 1) << 0
ldr r2, =((YRES + V_FRONT_PORCH + V_SYNC_LEN + V_BACK_PORCH) - 1) << 16
orr r1, r2
str r1, [r4, #TCON0_BASIC_TIMING_REG2]
ldr r1, =(V_SYNC_LEN - 1) << 0
ldr r2, =(H_SYNC_LEN - 1) << 16
orr r1, r2
str r1, [r4, #TCON0_BASIC_TIMING_REG3]
ldr r1, =0
str r1, [r4, #TCON0_CPU_IF_REG]
ldr r1, =(1 << 31)
str r1, [r4, #TCON0_HV_TIMING_REG]
ldr r1, =0x11111111
str r1, [r4, #TCON_FRM_SEED0_R_REG]
str r1, [r4, #TCON_FRM_SEED0_G_REG]
str r1, [r4, #TCON_FRM_SEED0_B_REG]
str r1, [r4, #TCON_FRM_SEED1_R_REG]
str r1, [r4, #TCON_FRM_SEED1_G_REG]
str r1, [r4, #TCON_FRM_SEED1_B_REG]
ldr r1, =0x01010000
str r1, [r4, #TCON_FRM_TBL_REG0]
ldr r1, =0x15151111
str r1, [r4, #TCON_FRM_TBL_REG1]
ldr r1, =0x57575555
str r1, [r4, #TCON_FRM_TBL_REG2]
ldr r1, =0x7f7f7777
str r1, [r4, #TCON_FRM_TBL_REG3]
ldr r1, =(1 << 31) | (5 << 4)
str r1, [r4, #TCON_FRM_CTRL_REG]
ldr r1, =(1 << 28) | (1 << 25) | (1 << 24)
str r1, [r4, #TCON0_IO_CTRL_REG0]
ldr r1, =0
str r1, [r4, #TCON0_IO_CTRL_REG1]
ldr r1, =0
str r1, [r4, #TCON_INT_REG0]
ldr r1, [r4, #TCON_CTRL_REG]
orr r1, #(1 << 31)
str r1, [r4, #TCON_CTRL_REG]
pop {r4, pc}
init_pll_module:
push {r4, lr}
ldr r4, =CCU_BASE
ldr r1, =0x80041800
str r1, [r4, #PLL_PERIPH_CTRL_REG]
ldr r1, =0x00003180
str r1, [r4, #AHB_APB_HCLKC_CFG_REG]
pop {r4, pc}
init_uart_module:
push {r4, lr}
ldr r4, =GPIO_BASE
ldr r1, [r4, #(PA + PORT_CFG0)]
bic r1, #0xff00
orr r1, #0x5500
str r1, [r4, #(PA + PORT_CFG0)]
ldr r4, =CCU_BASE
ldr r1, [r4, #BUS_CLK_GATING_REG2]
orr r1, #(1 << 21)
str r1, [r4, #BUS_CLK_GATING_REG2]
ldr r1, [r4, #BUS_SOFT_RST_REG2]
orr r1, #(1 << 21)
str r1, [r4, #BUS_SOFT_RST_REG2]
ldr r4, =UART1_BASE
mov r1, #0x00
str r1, [r4, #UART_IER]
mov r1, #0xf7
str r1, [r4, #UART_IIR]
mov r1, #0x00
str r1, [r4, #UART_MCR]
ldr r1, [r4, #UART_LCR]
orr r1, #(1 << 7)
str r1, [r4, #UART_LCR]
mov r1, #54
str r1, [r4, #UART_DLL]
mov r1, #0x00
str r1, [r4, #UART_DLH]
ldr r1, [r4, #UART_LCR]
bic r1, #(1 << 7)
str r1, [r4, #UART_LCR]
ldr r1, [r4, #UART_LCR]
bic r1, #0x1f
orr r1, #0x03
str r1, [r4, #UART_LCR]
pop {r4, pc}
uart_send_byte:
push {r4, lr}
ldr r4, =UART1_BASE
1:
ldr r1, [r4, #UART_USR]
tst r1, #(1 << 1)
beq 1b
strb r0, [r4, #UART_RBR]
pop {r4, pc}
uart_send_4byte:
push {r4, lr}
mov r4, r0
lsr r0, #24
bl uart_send_byte
mov r0, r4
lsr r0, #16
bl uart_send_byte
mov r0, r4
lsr r0, #8
bl uart_send_byte
mov r0, r4
bl uart_send_byte
pop {r4, pc}
sdelay:
push {lr}
0:
subs r0, #1
bne 0b
pop {pc}
dram_delay:
push {lr}
ldr r1, =2000
mul r0, r1
bl sdelay
pop {pc}
dram_delay_scan:
push {r4, lr}
ldr r4, =DRAM_BASE
ldr r1, [r4, #DRAM_DDLYR]
orr r1, #1
str r1, [r4, #DRAM_DDLYR]
0:
ldr r1, [r4, #DRAM_DDLYR]
tst r1, #1
bne 0b
pop {r4, pc}
dram_para_setup:
push {r4, lr}
ldr r4, =DRAM_BASE
ldr r1, =0x1200a
ldr r2, =dram_row
ldr r2, [r2]
sub r2, #1
lsl r2, #5
orr r1, r2
ldr r2, =dram_col
ldr r2, [r2]
sub r2, #1
lsl r2, #9
orr r1, r2
str r1, [r4, #DRAM_SCONR]
ldr r1, [r4, #DRAM_SCTLR]
orr r1, #(1 << 19)
str r1, [r4, #DRAM_SCTLR]
ldr r1, [r4, #DRAM_SCTLR]
orr r1, #1
str r1, [r4, #DRAM_SCTLR]
0:
ldr r1, [r4, #DRAM_SCTLR]
tst r1, #1
bne 0b
pop {r4, pc}
dram_scan_readpipe:
push {r4, r5, lr}
ldr r4, =DRAM_BASE
mov r5, #0
0:
ldr r1, [r4, #DRAM_SCTLR]
bic r1, #(7 << 6)
orr r1, r5, lsl #6
str r1, [r4, #DRAM_SCTLR]
bl dram_delay_scan
ldr r1, [r4, #DRAM_DDLYR]
lsr r1, #4
ands r1, #3
beq 1f
add r5, #1
cmp r5, #8
bcc 0b
1:
ldr r1, [r4, #DRAM_SCTLR]
bic r1, #(7 << 6)
orr r1, r5, lsl #6
str r1, [r4, #DRAM_SCTLR]
bl dram_delay_scan
pop {r4, r5, pc}
dram_get_dram_size:
push {r4, r5, r6, lr}
ldr r4, =DRAM_BASE
ldr r1, =dram_col
ldr r2, =10
str r2, [r1]
ldr r1, =dram_row
ldr r2, =13
str r2, [r1]
bl dram_para_setup
bl dram_scan_readpipe
mov r1, #0
ldr r2, =0x80000200
ldr r3, =0x80000600
ldr r4, =0x11111111
ldr r5, =0x22222222
0:
add r2, r1
str r4, [r2]
add r3, r1
str r5, [r3]
add r1, #1
cmp r1, #32
bcc 0b
mov r1, #0
ldr r2, =0x80000200
mov r4, #0
0:
add r2, r1
ldr r3, [r2]
cmp r3, r5
addeq r4, #1
add r1, #1
cmp r1, #32
bcc 0b
cmp r4, #32
moveq r5, #9
movne r5, #10
ldr r2, =dram_col
str r5, [r2]
bl dram_para_setup
cmp r5, #10
ldreq r1, =0x80400000
ldreq r2, =0x80c00000
ldrne r1, =0x80200000
ldrne r2, =0x80600000
ldr r3, =0x33333333
ldr r4, =0x44444444
mov r6, r1
mov r0, #0
0:
add r1, r0
str r3, [r1]
add r2, r0
str r4, [r2]
add r0, #1
cmp r0, #32
bcc 0b
mov r0, #0
mov r1, #0
mov r2, r6
0:
add r2, r1
ldr r3, [r2]
cmp r3, r4
addeq r0, #1
add r1, #1
cmp r1, #32
bcc 0b
cmp r0, #32
moveq r1, #12
movne r1, #13
ldr r2, =dram_row
str r1, [r2]
ldr r1, =dram_row
ldr r1, [r1]
cmp r1, #13
beq 0f
mov r2, #16
b 1f
0:
ldr r1, =dram_col
ldr r1, [r1]
cmp r1, #10
bne 0f
mov r2, #64
b 1f
0:
mov r2, #32
1:
ldr r1, =dram_size
str r2, [r1]
ldr r1, =(156 * 499) >> 6
str r1, [r4, #DRAM_SREFR]
bl dram_para_setup
pop {r4, r5, r6, pc}
init_dram_module:
push {r4, r5, r6, lr}
ldr r4, =GPIO_BASE
ldr r5, =CCU_BASE
ldr r6, =DRAM_BASE
ldr r1, [r4, #(PB + PORT_CFG0)]
orr r1, #(7 << 12)
str r1, [r4, #(PB + PORT_CFG0)]
ldr r0, =5
bl dram_delay
ldr r1, =0xaaa
str r1, [r4, #SDR_PAD_DRV]
ldr r1, =(1 << 31) | (1 << 20) | (((156 * 2) / 24 - 1) << 8)
str r1, [r5, #PLL_DDR_CTRL_REG]
0:
ldr r1, [r5, #PLL_DDR_CTRL_REG]
tst r1, #(1 << 28)
beq 0b
ldr r1, [r5, #BUS_CLK_GATING_REG0]
orr r1, #(1 << 14)
str r1, [r5, #BUS_CLK_GATING_REG0]
ldr r1, [r5, #BUS_SOFT_RST_REG0]
orr r1, #(1 << 14)
str r1, [r5, #BUS_SOFT_RST_REG0]
ldr r1, [r4, #SDR_PAD_PUL]
orr r1, #(1 << 16)
str r1, [r4, #SDR_PAD_PUL]
ldr r1, =0xb7ceedc2
str r1, [r6, #DRAM_STMG0R]
ldr r1, =0xa70008
str r1, [r6, #DRAM_STMG1R]
bl dram_para_setup
ldr r1, =(156 * 499) >> 6
str r1, [r6, #DRAM_SREFR]
bl dram_scan_readpipe
bl dram_get_dram_size
pop {r4, r5, r6, pc}
.data
dram_size: .word 32
dram_col: .word 10
dram_row: .word 13
.end
完成