Update SD version and start working on DMA
This commit is contained in:
@@ -9,6 +9,7 @@ INCLUDE=include/sdram_controller_define.vh
|
|||||||
TB_NAME=sim_top
|
TB_NAME=sim_top
|
||||||
|
|
||||||
COPY_FILES=addr_map.mem init_hex.mem
|
COPY_FILES=addr_map.mem init_hex.mem
|
||||||
|
SD_IMAGE=sd_image.bin
|
||||||
|
|
||||||
FLAGS=-DSIM -DRTL_SIM -DVERILATOR -DSDIO_AXI
|
FLAGS=-DSIM -DRTL_SIM -DVERILATOR -DSDIO_AXI
|
||||||
|
|
||||||
@@ -17,9 +18,12 @@ all: waves
|
|||||||
waves: $(TB_NAME)
|
waves: $(TB_NAME)
|
||||||
./$(TB_NAME) -fst
|
./$(TB_NAME) -fst
|
||||||
|
|
||||||
$(TB_NAME): $(SUPER6502_FPGA_SOURCES) $(SIM_SOURCES) $(COPY_FILES)
|
$(TB_NAME): $(SUPER6502_FPGA_SOURCES) $(SIM_SOURCES) $(COPY_FILES) $(SD_IMAGE)
|
||||||
iverilog -g2005-sv $(FLAGS) -s $@ -o $@ $(INCLUDE) $(SUPER6502_FPGA_SOURCES) $(SIM_SOURCES) -I ../../
|
iverilog -g2005-sv $(FLAGS) -s $@ -o $@ $(INCLUDE) $(SUPER6502_FPGA_SOURCES) $(SIM_SOURCES) -I ../../
|
||||||
|
|
||||||
|
$(SD_IMAGE):
|
||||||
|
dd if=/dev/urandom bs=1 count=65536 of=$(SD_IMAGE)
|
||||||
|
|
||||||
# I feel like this should also realize that the outside files are newer...
|
# I feel like this should also realize that the outside files are newer...
|
||||||
.PHONY: $(COPY_FILES)
|
.PHONY: $(COPY_FILES)
|
||||||
$(COPY_FILES): ../../$@
|
$(COPY_FILES): ../../$@
|
||||||
|
|||||||
@@ -180,7 +180,8 @@ IOBUF dat_buf (
|
|||||||
);
|
);
|
||||||
|
|
||||||
mdl_sdio #(
|
mdl_sdio #(
|
||||||
.LGMEMSZ(16)
|
.LGMEMSZ(16),
|
||||||
|
.MEMFILE("sd_image.bin")
|
||||||
) u_sd_card_emu (
|
) u_sd_card_emu (
|
||||||
.sd_clk(o_sd_clk),
|
.sd_clk(o_sd_clk),
|
||||||
.sd_cmd(w_sd_cmd),
|
.sd_cmd(w_sd_cmd),
|
||||||
|
|||||||
Submodule hw/super6502_fpga/src/sub/sd_controller_wrapper/sdspi updated: f10a377dce...d91f6a77fa
@@ -1,6 +1,7 @@
|
|||||||
MEMORY
|
MEMORY
|
||||||
{
|
{
|
||||||
RAM: start = $0000, size = $200;
|
RAM: start = $0000, size = $200;
|
||||||
|
SDRAM: start = $200, size = $de00;
|
||||||
ROM: start = $F000, size = $1000, file = %O;
|
ROM: start = $F000, size = $1000, file = %O;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ SD_CMD = SD_CONTROLLER
|
|||||||
SD_ARG = SD_CONTROLLER + $4
|
SD_ARG = SD_CONTROLLER + $4
|
||||||
SD_DATA = SD_ARG
|
SD_DATA = SD_ARG
|
||||||
SD_FIFO_0 = SD_CONTROLLER + $8
|
SD_FIFO_0 = SD_CONTROLLER + $8
|
||||||
SD_FIFO_2 = SD_CONTROLLER + $C
|
SD_FIFO_1 = SD_CONTROLLER + $C
|
||||||
|
|
||||||
|
|
||||||
SD_PHY = SD_CONTROLLER + $10
|
SD_PHY = SD_CONTROLLER + $10
|
||||||
@@ -25,12 +25,12 @@ SD_PHY_CLKCTRL = SD_PHY + $1
|
|||||||
SD_PHY_SAMP_VOLT = SD_PHY + $2
|
SD_PHY_SAMP_VOLT = SD_PHY + $2
|
||||||
SD_PHY_BLKSIZ = SD_PHY + $3
|
SD_PHY_BLKSIZ = SD_PHY + $3
|
||||||
|
|
||||||
|
SD_DMA_BASE = SD_CONTROLLER + $14
|
||||||
|
SD_DMA_BASE2 = SD_CONTROLLER + $18
|
||||||
SD_DMA_BASE = SD_CONTROLLER + $28
|
SD_DMA_LEN = SD_CONTROLLER + $1C
|
||||||
SD_DMA_STAT_CTRL = SD_CONTROLLER + $2C
|
|
||||||
|
|
||||||
SDIOCLK_100KHZ = $FC
|
SDIOCLK_100KHZ = $FC
|
||||||
|
SDIOCLK_25MHZ = $03
|
||||||
SPEED_512B = $09
|
SPEED_512B = $09
|
||||||
|
|
||||||
.zeropage
|
.zeropage
|
||||||
@@ -102,9 +102,94 @@ _init:
|
|||||||
lda sreg+1
|
lda sreg+1
|
||||||
bpl @acmd41
|
bpl @acmd41
|
||||||
|
|
||||||
; cmd 11
|
; send_r2(2, 0x00);
|
||||||
; cmd 2
|
stz sreg+1
|
||||||
; cmd 3
|
stz sreg
|
||||||
|
ldx #$00
|
||||||
|
lda #$00
|
||||||
|
jsr pusheax
|
||||||
|
lda #2
|
||||||
|
jsr send_r2
|
||||||
|
|
||||||
|
lda SD_FIFO_0
|
||||||
|
lda SD_FIFO_0
|
||||||
|
lda SD_FIFO_0
|
||||||
|
lda SD_FIFO_0
|
||||||
|
|
||||||
|
; send_r1(3, 0x00);
|
||||||
|
stz sreg+1
|
||||||
|
stz sreg
|
||||||
|
ldx #$00
|
||||||
|
lda #$00
|
||||||
|
jsr pusheax
|
||||||
|
lda #3
|
||||||
|
jsr send_r1
|
||||||
|
|
||||||
|
lda #$30
|
||||||
|
sta SD_PHY_CLKCTRL
|
||||||
|
stz SD_PHY_SAMP_VOLT
|
||||||
|
lda #SPEED_512B
|
||||||
|
sta SD_PHY_BLKSIZ
|
||||||
|
lda #SDIOCLK_25MHZ
|
||||||
|
sta SD_PHY_CLKDIV
|
||||||
|
|
||||||
|
@wait_clk2: lda SD_PHY_CLKDIV
|
||||||
|
cmp #SDIOCLK_25MHZ
|
||||||
|
bne @wait_clk2
|
||||||
|
|
||||||
|
; The upper 16 bits are the RCA, but they are already in sreg
|
||||||
|
; The lower 16 are don't cares, so we can leave them.
|
||||||
|
|
||||||
|
jsr pusheax
|
||||||
|
lda #7
|
||||||
|
jsr send_r1b
|
||||||
|
|
||||||
|
; Now we need to DMA the first sector into memory, say at $1000
|
||||||
|
; The example code reads multiple, but we can probably just read 1 (cmd17)
|
||||||
|
; write to address $1000
|
||||||
|
; dma length is 1
|
||||||
|
stz SD_DMA_BASE+$3
|
||||||
|
stz SD_DMA_BASE+$2
|
||||||
|
lda #$10
|
||||||
|
sta SD_DMA_BASE+$1
|
||||||
|
stz SD_DMA_BASE
|
||||||
|
|
||||||
|
stz SD_DMA_LEN + $3
|
||||||
|
stz SD_DMA_LEN + $2
|
||||||
|
stz SD_DMA_LEN + $1
|
||||||
|
lda #$01
|
||||||
|
sta SD_DMA_LEN
|
||||||
|
|
||||||
|
; address 0
|
||||||
|
stz sreg+1
|
||||||
|
stz sreg
|
||||||
|
ldx #$00
|
||||||
|
lda #$00
|
||||||
|
jsr pusheax
|
||||||
|
lda #18
|
||||||
|
jsr send_dma
|
||||||
|
|
||||||
|
; Try reading again just to make sure it works.
|
||||||
|
stz SD_DMA_BASE+$3
|
||||||
|
stz SD_DMA_BASE+$2
|
||||||
|
lda #$12
|
||||||
|
sta SD_DMA_BASE+$1
|
||||||
|
stz SD_DMA_BASE
|
||||||
|
|
||||||
|
stz SD_DMA_LEN + $3
|
||||||
|
stz SD_DMA_LEN + $2
|
||||||
|
stz SD_DMA_LEN + $1
|
||||||
|
lda #$01
|
||||||
|
sta SD_DMA_LEN
|
||||||
|
|
||||||
|
; address 0
|
||||||
|
stz sreg+1
|
||||||
|
stz sreg
|
||||||
|
ldx #$00
|
||||||
|
lda #$02
|
||||||
|
jsr pusheax
|
||||||
|
lda #18
|
||||||
|
jsr send_dma
|
||||||
|
|
||||||
|
|
||||||
@end:
|
@end:
|
||||||
@@ -142,8 +227,23 @@ send_goidle:
|
|||||||
; Arg on stack as 32 bits
|
; Arg on stack as 32 bits
|
||||||
; returns the response in eax
|
; returns the response in eax
|
||||||
; (How can we signal a failure then?)
|
; (How can we signal a failure then?)
|
||||||
send_r1:
|
send_r1: stz tmp1
|
||||||
pha ; push command to stack
|
inc tmp1
|
||||||
|
bra send
|
||||||
|
|
||||||
|
send_r1b: stz tmp1
|
||||||
|
inc tmp1
|
||||||
|
inc tmp1
|
||||||
|
inc tmp1
|
||||||
|
bra send
|
||||||
|
|
||||||
|
send_dma: pha
|
||||||
|
lda #$20
|
||||||
|
sta tmp1
|
||||||
|
pla
|
||||||
|
bra send
|
||||||
|
|
||||||
|
send: pha ; push command to stack
|
||||||
jsr popeax
|
jsr popeax
|
||||||
PHA
|
PHA
|
||||||
stx SD_ARG+$1
|
stx SD_ARG+$1
|
||||||
@@ -153,7 +253,8 @@ send_r1:
|
|||||||
sta SD_ARG+$3
|
sta SD_ARG+$3
|
||||||
pla
|
pla
|
||||||
sta SD_ARG ; lsb has to be the last written.
|
sta SD_ARG ; lsb has to be the last written.
|
||||||
lda #$81 ; This also clears error flag (only for acmd41?)
|
lda #$80 ; This also clears error flag (only for acmd41?)
|
||||||
|
ora tmp1
|
||||||
sta SD_CMD+$1
|
sta SD_CMD+$1
|
||||||
pla
|
pla
|
||||||
ora #$40
|
ora #$40
|
||||||
@@ -168,4 +269,29 @@ send_r1:
|
|||||||
ldx SD_DATA + $1
|
ldx SD_DATA + $1
|
||||||
lda SD_DATA
|
lda SD_DATA
|
||||||
|
|
||||||
|
rts
|
||||||
|
|
||||||
|
; Command in A
|
||||||
|
; Arg on stack as 32 bits
|
||||||
|
; returns the response in eax
|
||||||
|
; (How can we signal a failure then?)
|
||||||
|
send_r2:
|
||||||
|
pha ; push command to stack
|
||||||
|
jsr popeax
|
||||||
|
PHA
|
||||||
|
stx SD_ARG+$1
|
||||||
|
lda sreg
|
||||||
|
sta SD_ARG+$2
|
||||||
|
lda sreg+1
|
||||||
|
sta SD_ARG+$3
|
||||||
|
pla
|
||||||
|
sta SD_ARG ; lsb has to be the last written.
|
||||||
|
lda #$82 ; This also clears error flag (only for acmd41?)
|
||||||
|
sta SD_CMD+$1
|
||||||
|
pla
|
||||||
|
ora #$40
|
||||||
|
sta SD_CMD
|
||||||
|
|
||||||
|
jsr wait_busy
|
||||||
|
|
||||||
rts
|
rts
|
||||||
Reference in New Issue
Block a user