Skip to content

Commit

Permalink
Add SDCard support
Browse files Browse the repository at this point in the history
  • Loading branch information
kamilrakoczy committed Apr 3, 2020
1 parent 6043108 commit 179b725
Show file tree
Hide file tree
Showing 5 changed files with 455 additions and 93 deletions.
82 changes: 82 additions & 0 deletions litex/boards/targets/arty.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
#!/usr/bin/env python3

# This file is Copyright (c) 2015-2019 Florent Kermarrec <[email protected]>
# This file is Copyright (c) 2020 Antmicro <www.antmicro.com>
# License: BSD

import argparse

from migen import *

from migen.build.generic_platform import Pins, IOStandard, Subsignal
from litex.build.generic_platform import *

from litex.boards.platforms import arty
from litex.build.xilinx.vivado import vivado_build_args, vivado_build_argdict

Expand All @@ -20,6 +24,22 @@

from liteeth.phy.mii import LiteEthPHYMII

from litesdcard.phy import SDPHY
from litesdcard.clocker import SDClockerS7
from litesdcard.core import SDCore
from litesdcard.data import SDDataReader, SDDataWriter
from litex.soc.cores.timer import Timer
from litex.soc.interconnect import wishbone

_sd_io = [
("sdcard", 0,
Subsignal("data", Pins("D15 J17 J18 E15")),
Subsignal("cmd", Pins("E16")),
Subsignal("clk", Pins("C15")),
IOStandard("LVCMOS33"), Misc("SLEW=FAST")
)
]

# CRG ----------------------------------------------------------------------------------------------

class _CRG(Module):
Expand Down Expand Up @@ -53,6 +73,10 @@ class BaseSoC(SoCCore):
def __init__(self, sys_clk_freq=int(100e6), with_ethernet=False, with_etherbone=False, **kwargs):
platform = arty.Platform()

platform.add_extension(_sd_io)
clk_freq = int(100e6)
sd_freq = int(25e6)

# SoCCore ----------------------------------------------------------------------------------
SoCCore.__init__(self, platform, clk_freq=sys_clk_freq, **kwargs)

Expand Down Expand Up @@ -93,6 +117,64 @@ def __init__(self, sys_clk_freq=int(100e6), with_ethernet=False, with_etherbone=
self.add_csr("ethphy")
self.add_etherbone(phy=self.ethphy)

# SDCard -----------------------------------------------------------------------------------
sdcard_pads = platform.request('sdcard')

self.submodules.sdclk = SDClockerS7(sd_clk_freq=sd_freq)
self.add_csr("sdclk")
self.submodules.sdphy = SDPHY(sdcard_pads, platform.device)
self.add_csr("sdphy")
self.submodules.sdcore = SDCore(self.sdphy, csr_data_width=8)
self.add_csr("sdcore")
self.submodules.sdtimer = Timer()
self.add_csr("sdtimer")

# SD Card data reader

memory_size = 512;
memory_width = 32;

sdread_mem = Memory(memory_width, memory_size//4)
sdread_sram = FullMemoryWE()(wishbone.SRAM(sdread_mem, read_only=True))
self.submodules += sdread_sram

self.add_wb_slave(self.mem_map["sdread"], sdread_sram.bus, memory_size)
self.add_memory_region("sdread", self.mem_map["sdread"], memory_size)

sdread_port = sdread_sram.mem.get_port(write_capable=True);
self.specials += sdread_port
self.submodules.sddatareader = SDDataReader(port=sdread_port, endianness=self.cpu.endianness)
self.add_csr("sddatareader")
self.comb += self.sdcore.source.connect(self.sddatareader.sink),

# SD Card data writer

sdwrite_mem = Memory(memory_width, memory_size//4)
sdwrite_sram = FullMemoryWE()(wishbone.SRAM(sdwrite_mem, read_only=False))
self.submodules += sdwrite_sram

self.add_wb_slave(self.mem_map["sdwrite"], sdwrite_sram.bus, memory_size)
self.add_memory_region("sdwrite", self.mem_map["sdwrite"], memory_size)

sdwrite_port = sdwrite_sram.mem.get_port(write_capable=False, async_read=True, mode=READ_FIRST);
self.specials += sdwrite_port
self.submodules.sddatawriter = SDDataWriter(port=sdwrite_port, endianness=self.cpu.endianness)
self.add_csr("sddatawriter")
self.comb += self.sddatawriter.source.connect(self.sdcore.sink),


self.platform.add_period_constraint(self.crg.cd_sys.clk, 1e9/clk_freq)
self.platform.add_period_constraint(self.sdclk.cd_sd.clk, 1e9/sd_freq)
self.platform.add_period_constraint(self.sdclk.cd_sd_fb.clk, 1e9/sd_freq)

self.crg.cd_sys.clk.attr.add("keep")
self.sdclk.cd_sd.clk.attr.add("keep")
self.sdclk.cd_sd_fb.clk.attr.add("keep")
self.platform.add_false_path_constraints(
self.crg.cd_sys.clk,
self.sdclk.cd_sd.clk,
self.sdclk.cd_sd_fb.clk)

# Build --------------------------------------------------------------------------------------------

def main():
Expand Down
1 change: 0 additions & 1 deletion litex/soc/software/bios/boot.c
Original file line number Diff line number Diff line change
Expand Up @@ -306,7 +306,6 @@ static int try_get_kernel_rootfs_dtb_emulator(unsigned int ip, unsigned short tf
size = tftp_get_v(ip, tftp_port, "rootfs.cpio", (void *)tftp_dst_addr);
if(size <= 0) {
printf("No rootfs.cpio found\n");
return 0;
}

tftp_dst_addr = MAIN_RAM_BASE + DEVICE_TREE_IMAGE_RAM_OFFSET;
Expand Down
5 changes: 5 additions & 0 deletions litex/soc/software/bios/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
// This file is Copyright (c) 2018 Jean-François Nguyen <[email protected]>
// This file is Copyright (c) 2018 Sergiusz Bazanski <[email protected]>
// This file is Copyright (c) 2016 Tim 'mithro' Ansell <[email protected]>
// This file is Copyright (c) 2020 Antmicro <www.antmicro.com>

// License: BSD

Expand Down Expand Up @@ -386,6 +387,8 @@ static void help(void)
#ifdef CSR_SDCORE_BASE
puts("sdclk <freq> - SDCard set clk frequency (Mhz)");
puts("sdinit - SDCard initialization");
puts("sdtestread <blk> - SDCard read data from <blk>");
puts("sdtestwrite <blk> <data> - SDCard write <data> to <blk>");
puts("sdtest <loops> - SDCard test");
#endif
#ifdef USDDRPHY_DEBUG
Expand Down Expand Up @@ -487,6 +490,8 @@ static void do_command(char *c)
#ifdef CSR_SDCORE_BASE
else if(strcmp(token, "sdclk") == 0) sdclk_set_clk(atoi(get_token(&c)));
else if(strcmp(token, "sdinit") == 0) sdcard_init();
else if(strcmp(token, "sdtestread") == 0) sdcard_test_read(atoi(get_token(&c)));
else if(strcmp(token, "sdtestwrite") == 0) sdcard_test_write(atoi(get_token(&c)), c);
else if(strcmp(token, "sdtest") == 0) sdcard_test(atoi(get_token(&c)));
#endif
#ifdef USDDRPHY_DEBUG
Expand Down
Loading

0 comments on commit 179b725

Please sign in to comment.