From 2b490826965eb5b6027181fe8212863bfef53d5e Mon Sep 17 00:00:00 2001 From: Joel Stanley Date: Sun, 31 Jan 2021 23:50:43 +1030 Subject: [PATCH 1/3] platforms/arty: Add numato sd card pmod It has a different layout. Thanks to David for documenting the pinout in this issue: https://github.com/enjoy-digital/litex/issues/817 Expansion Pin SD SPI SD Artix Arty-A7 PMOD PIN PMOD Index 2 DATA_2 D4 JD1 1 0 4 CMD MOSI D3 JD2 2 1 6 DATA_0 MISO F4 JD3 3 2 CD F3 JD4 4 3 1 DATA_3 CS_N E2 JD7 7 4 3 CLK CLK D2 JD8 8 5 5 DATA_1 H2 JD9 9 6 G2 JD10 Signed-off-by: Joel Stanley --- litex_boards/platforms/arty.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/litex_boards/platforms/arty.py b/litex_boards/platforms/arty.py index e0d9a90..88b4c39 100644 --- a/litex_boards/platforms/arty.py +++ b/litex_boards/platforms/arty.py @@ -306,6 +306,29 @@ def sdcard_pmod_io(pmod): ] _sdcard_pmod_io = sdcard_pmod_io("pmodd") # SDCARD PMOD on JD. +def numato_sdcard_pmod_io(pmod): + return [ + # SDCard PMOD: + # https://numato.com/product/micro-sd-expansion-module/ + # This adaptor does not have the card detect (CD) pin connected + ("spisdcard", 0, + Subsignal("clk", Pins(f"{pmod}:5")), + Subsignal("mosi", Pins(f"{pmod}:1"), Misc("PULLUP True")), + Subsignal("cs_n", Pins(f"{pmod}:4"), Misc("PULLUP True")), + Subsignal("miso", Pins(f"{pmod}:2"), Misc("PULLUP True")), + Misc("SLEW=FAST"), + IOStandard("LVCMOS33"), + ), + ("sdcard", 0, + Subsignal("data", Pins(f"{pmod}:2 {pmod}:6 {pmod}:0 {pmod}:4"), Misc("PULLUP True")), + Subsignal("cmd", Pins(f"{pmod}:1"), Misc("PULLUP True")), + Subsignal("clk", Pins(f"{pmod}:5")), + Misc("SLEW=FAST"), + IOStandard("LVCMOS33"), + ), +] +_numato_sdcard_pmod_io = numato_sdcard_pmod_io("pmodd") # SDCARD PMOD on JD. + # Platform ----------------------------------------------------------------------------------------- class Platform(XilinxPlatform): From 08ccf384aad32161da1dc7eb16e03a595dcb4107 Mon Sep 17 00:00:00 2001 From: Joel Stanley Date: Wed, 24 Feb 2021 14:52:43 +1030 Subject: [PATCH 2/3] targets/arty: Allow selection of sdcard mod adaptor The default stays with the Digilent/Antmicro layout, but the user can optionally provide --sdcard-adaptor numato to use the Numato layout. Signed-off-by: Joel Stanley --- litex_boards/targets/arty.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/litex_boards/targets/arty.py b/litex_boards/targets/arty.py index 78be95a..270d0e8 100755 --- a/litex_boards/targets/arty.py +++ b/litex_boards/targets/arty.py @@ -118,6 +118,7 @@ def main(): sdopts = parser.add_mutually_exclusive_group() sdopts.add_argument("--with-spi-sdcard", action="store_true", help="Enable SPI-mode SDCard support") sdopts.add_argument("--with-sdcard", action="store_true", help="Enable SDCard support") + parser.add_argument("--sdcard-adaptor", type=str, help="SDCard PMOD adaptor: digilent (default) or numato") parser.add_argument("--no-ident-version", action="store_false", help="Disable build time output") builder_args(parser) soc_sdram_args(parser) @@ -134,7 +135,10 @@ def main(): ident_version = args.no_ident_version, **soc_sdram_argdict(args) ) - soc.platform.add_extension(arty._sdcard_pmod_io) + if args.sdcard_adaptor == "numato": + soc.platform.add_extension(arty._numato_sdcard_pmod_io) + else: + soc.platform.add_extension(arty._sdcard_pmod_io) if args.with_spi_sdcard: soc.add_spi_sdcard() if args.with_sdcard: From 768c10c63006b81b52a3021da0df19fb21bf3ae0 Mon Sep 17 00:00:00 2001 From: Florent Kermarrec Date: Thu, 25 Feb 2021 09:33:27 +0100 Subject: [PATCH 3/3] targets/arty: rebase/merge PR179, rename adaptor to adapter. --- litex_boards/targets/arty.py | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/litex_boards/targets/arty.py b/litex_boards/targets/arty.py index 270d0e8..70a56b8 100755 --- a/litex_boards/targets/arty.py +++ b/litex_boards/targets/arty.py @@ -56,7 +56,7 @@ class _CRG(Module): # BaseSoC ------------------------------------------------------------------------------------------ class BaseSoC(SoCCore): - def __init__(self, variant="a7-35", toolchain="vivado", sys_clk_freq=int(100e6), with_ethernet=False, with_etherbone=False, eth_ip="192.168.1.50", ident_version=True, **kwargs): + def __init__(self, variant="a7-35", toolchain="vivado", sys_clk_freq=int(100e6), with_ethernet=False, with_etherbone=False, eth_ip="192.168.1.50", eth_dynamic_ip=False, ident_version=True, **kwargs): platform = arty.Platform(variant=variant, toolchain=toolchain) # SoCCore ---------------------------------------------------------------------------------- @@ -92,7 +92,7 @@ class BaseSoC(SoCCore): pads = self.platform.request("eth")) self.add_csr("ethphy") if with_ethernet: - self.add_ethernet(phy=self.ethphy) + self.add_ethernet(phy=self.ethphy, dynamic_ip=eth_dynamic_ip) if with_etherbone: self.add_etherbone(phy=self.ethphy, ip_address=eth_ip) @@ -106,25 +106,28 @@ class BaseSoC(SoCCore): def main(): parser = argparse.ArgumentParser(description="LiteX SoC on Arty A7") - parser.add_argument("--toolchain", default="vivado", help="Toolchain use to build (default: vivado)") - parser.add_argument("--build", action="store_true", help="Build bitstream") - parser.add_argument("--load", action="store_true", help="Load bitstream") - parser.add_argument("--variant", default="a7-35", help="Board variant: a7-35 (default) or a7-100") - parser.add_argument("--sys-clk-freq", default=100e6, help="System clock frequency (default: 100MHz)") + parser.add_argument("--toolchain", default="vivado", help="Toolchain use to build (default: vivado)") + parser.add_argument("--build", action="store_true", help="Build bitstream") + parser.add_argument("--load", action="store_true", help="Load bitstream") + parser.add_argument("--variant", default="a7-35", help="Board variant: a7-35 (default) or a7-100") + parser.add_argument("--sys-clk-freq", default=100e6, help="System clock frequency (default: 100MHz)") ethopts = parser.add_mutually_exclusive_group() - ethopts.add_argument("--with-ethernet", action="store_true", help="Enable Ethernet support") - ethopts.add_argument("--with-etherbone", action="store_true", help="Enable Etherbone support") - parser.add_argument("--eth-ip", default="192.168.1.50", type=str, help="Ethernet/Etherbone IP address") + ethopts.add_argument("--with-ethernet", action="store_true", help="Enable Ethernet support") + ethopts.add_argument("--with-etherbone", action="store_true", help="Enable Etherbone support") + parser.add_argument("--eth-ip", default="192.168.1.50", type=str, help="Ethernet/Etherbone IP address") + parser.add_argument("--eth-dynamic-ip", action="store_true", help="Enable dynamic Ethernet IP addresses setting") sdopts = parser.add_mutually_exclusive_group() - sdopts.add_argument("--with-spi-sdcard", action="store_true", help="Enable SPI-mode SDCard support") - sdopts.add_argument("--with-sdcard", action="store_true", help="Enable SDCard support") - parser.add_argument("--sdcard-adaptor", type=str, help="SDCard PMOD adaptor: digilent (default) or numato") - parser.add_argument("--no-ident-version", action="store_false", help="Disable build time output") + sdopts.add_argument("--with-spi-sdcard", action="store_true", help="Enable SPI-mode SDCard support") + sdopts.add_argument("--with-sdcard", action="store_true", help="Enable SDCard support") + parser.add_argument("--sdcard-adapter", type=str, help="SDCard PMOD adapter: digilent (default) or numato") + parser.add_argument("--no-ident-version", action="store_false", help="Disable build time output") builder_args(parser) soc_sdram_args(parser) vivado_build_args(parser) args = parser.parse_args() + assert not (args.with_etherbone and args.eth_dynamic_ip) + soc = BaseSoC( variant = args.variant, toolchain = args.toolchain, @@ -132,10 +135,11 @@ def main(): with_ethernet = args.with_ethernet, with_etherbone = args.with_etherbone, eth_ip = args.eth_ip, + eth_dynamic_ip = args.eth_dynamic_ip, ident_version = args.no_ident_version, **soc_sdram_argdict(args) ) - if args.sdcard_adaptor == "numato": + if args.sdcard_adapter == "numato": soc.platform.add_extension(arty._numato_sdcard_pmod_io) else: soc.platform.add_extension(arty._sdcard_pmod_io)