2021-11-05 03:01:54 -04:00
#!/usr/bin/env python3
#
# This file is part of LiteX-Boards.
#
# Copyright (c) 2021 Florent Kermarrec <florent@enjoy-digital.fr>
# SPDX-License-Identifier: BSD-2-Clause
# Build/Use ----------------------------------------------------------------------------------------
# Build/Flash bitstream:
# ./fairwaves_xtrx.py --uart-name=crossover --with-pcie --build --driver --flash
#
#.Build the kernel and load it:
# cd build/<platform>/driver/kernel
# make
# sudo ./init.sh
#
# Test userspace utilities:
# cd build/<platform>/driver/user
# make
# ./litepcie_util info
# ./litepcie_util scratch_test
# ./litepcie_util dma_test
# ./litepcie_util uart_test
import os
import argparse
import sys
from migen import *
from litex_boards . platforms import fairwaves_xtrx
from litex . soc . interconnect . csr import *
from litex . soc . integration . soc_core import *
from litex . soc . integration . builder import *
from litex . soc . cores . led import LedChaser
from litex . soc . cores . clock import *
from litepcie . phy . s7pciephy import S7PCIEPHY
from litepcie . software import generate_litepcie_software
# CRG ----------------------------------------------------------------------------------------------
class CRG ( Module ) :
def __init__ ( self , platform , sys_clk_freq , with_pcie = False ) :
self . clock_domains . cd_sys = ClockDomain ( )
# # #
2021-11-05 10:15:15 -04:00
if with_pcie :
assert sys_clk_freq == int ( 125e6 )
self . comb + = [
self . cd_sys . clk . eq ( ClockSignal ( " pcie " ) ) ,
self . cd_sys . rst . eq ( ResetSignal ( " pcie " ) ) ,
]
else :
self . submodules . pll = pll = S7PLL ( speedgrade = - 2 )
pll . register_clkin ( platform . request ( " clk60 " ) , 60e6 )
pll . create_clkout ( self . cd_sys , sys_clk_freq )
2021-11-05 03:01:54 -04:00
# BaseSoC -----------------------------------------------------------------------------------------
class BaseSoC ( SoCCore ) :
def __init__ ( self , sys_clk_freq = int ( 125e6 ) , with_pcie = False , with_led_chaser = True , * * kwargs ) :
platform = fairwaves_xtrx . Platform ( )
# SoCCore ----------------------------------------------------------------------------------
2021-11-05 10:15:15 -04:00
if kwargs [ " uart_name " ] == " serial " :
kwargs [ " uart_name " ] = " crossover "
2021-11-05 03:01:54 -04:00
SoCCore . __init__ ( self , platform , sys_clk_freq ,
ident = " LiteX SoC on Fairwaves XTRX " ,
ident_version = True ,
* * kwargs )
# CRG --------------------------------------------------------------------------------------
2021-11-05 10:15:15 -04:00
self . submodules . crg = CRG ( platform , sys_clk_freq , with_pcie )
2021-11-05 03:01:54 -04:00
# PCIe -------------------------------------------------------------------------------------
if with_pcie :
2021-12-07 09:27:55 -05:00
self . submodules . pcie_phy = S7PCIEPHY ( platform , platform . request ( " pcie_x2 " ) ,
2021-11-05 03:01:54 -04:00
data_width = 64 ,
bar0_size = 0x20000 )
self . add_pcie ( phy = self . pcie_phy , ndmas = 1 )
2021-11-26 10:18:52 -05:00
# ICAP (For FPGA reload over PCIe).
from litex . soc . cores . icap import ICAP
self . submodules . icap = ICAP ( )
self . icap . add_reload ( )
self . icap . add_timing_constraints ( platform , sys_clk_freq , self . crg . cd_sys . clk )
# Flash (For SPIFlash update over PCIe). FIXME: Should probably be updated to use SpiFlashSingle/SpiFlashDualQuad (so MMAPed and do the update with bit-banging)
from litex . soc . cores . gpio import GPIOOut
from litex . soc . cores . spi_flash import S7SPIFlash
self . submodules . flash_cs_n = GPIOOut ( platform . request ( " flash_cs_n " ) )
self . submodules . flash = S7SPIFlash ( platform . request ( " flash " ) , sys_clk_freq , 25e6 )
2021-11-05 03:01:54 -04:00
# Leds -------------------------------------------------------------------------------------
if with_led_chaser :
self . submodules . leds = LedChaser (
pads = platform . request_all ( " user_led " ) ,
sys_clk_freq = sys_clk_freq )
# Build --------------------------------------------------------------------------------------------
def main ( ) :
parser = argparse . ArgumentParser ( description = " LiteX SoC on Fairwaves XTRX " )
parser . add_argument ( " --build " , action = " store_true " , help = " Build bitstream " )
parser . add_argument ( " --load " , action = " store_true " , help = " Load bitstream " )
parser . add_argument ( " --flash " , action = " store_true " , help = " Flash bitstream " )
parser . add_argument ( " --sys-clk-freq " , default = 125e6 , help = " System clock frequency (default: 125MHz) " )
parser . add_argument ( " --with-pcie " , action = " store_true " , help = " Enable PCIe support " )
parser . add_argument ( " --driver " , action = " store_true " , help = " Generate PCIe driver " )
builder_args ( parser )
soc_core_args ( parser )
args = parser . parse_args ( )
soc = BaseSoC (
sys_clk_freq = int ( float ( args . sys_clk_freq ) ) ,
with_pcie = args . with_pcie ,
* * soc_core_argdict ( args )
)
builder = Builder ( soc , * * builder_argdict ( args ) )
builder . build ( run = args . build )
if args . driver :
generate_litepcie_software ( soc , os . path . join ( builder . output_dir , " driver " ) )
if args . load :
prog = soc . platform . create_programmer ( )
prog . load_bitstream ( os . path . join ( builder . gateware_dir , soc . build_name + " .bit " ) )
if args . flash :
prog = soc . platform . create_programmer ( )
prog . flash ( 0 , os . path . join ( builder . gateware_dir , soc . build_name + " .bin " ) )
if __name__ == " __main__ " :
main ( )