Merge pull request #1234 from curliph/master

for windows/(powershell and WSL) support
This commit is contained in:
enjoy-digital 2022-03-08 17:23:05 +01:00 committed by GitHub
commit 72576c87fc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 111 additions and 2 deletions

View File

@ -6,6 +6,7 @@
# SPDX-License-Identifier: BSD-2-Clause # SPDX-License-Identifier: BSD-2-Clause
import os import os
import sys
import math import math
import subprocess import subprocess
from shutil import which from shutil import which
@ -67,6 +68,9 @@ def _build_tcl(name, partnumber, files, options):
# Add Sources. # Add Sources.
for f, typ, lib in files: for f, typ, lib in files:
# Support windows/powershell
if sys.platform == "win32":
f = f.replace("\\", "\\\\")
tcl.append(f"add_file {f}") tcl.append(f"add_file {f}")
# Set Options. # Set Options.
@ -161,12 +165,19 @@ class GowinToolchain:
# Run # Run
if run: if run:
if which("gw_sh") is None: # Support Powershell/WSL platform
# Some python distros for windows (e.g, oss-cad-suite)
# which does not have 'os.uname' support, we should check 'sys.platform' firstly.
gw_sh = "gw_sh"
if sys.platform.find("linux") >= 0:
if os.uname().release.find("WSL") > 0:
gw_sh += ".exe"
if which(gw_sh) is None:
msg = "Unable to find Gowin toolchain, please:\n" msg = "Unable to find Gowin toolchain, please:\n"
msg += "- Add Gowin toolchain to your $PATH." msg += "- Add Gowin toolchain to your $PATH."
raise OSError(msg) raise OSError(msg)
if subprocess.call(["gw_sh", "run.tcl"]) != 0: if subprocess.call([gw_sh, "run.tcl"]) != 0:
raise OSError("Error occured during Gowin's script execution.") raise OSError("Error occured during Gowin's script execution.")
os.chdir(cwd) os.chdir(cwd)

98
litex/build/gowin/programmer.py Executable file
View File

@ -0,0 +1,98 @@
#
# This file is part of LiteX.
#
# Copyright (c) 2022-2023 Franz Zhou <curliph@gmail.com>
# SPDX-License-Identifier: BSD-2-Clause
import os
import sys
from shutil import which
from litex.build.generic_programmer import GenericProgrammer
from litex.build import tools
# GowinProgrammer --------------------------------------------------------------------------------
GOWIN_PMODE_SRAM = 4
GOWIN_PMODE_EMBFLASH = 5
GOWIN_PMODE_EXTFLASH = 31 # for bin
GOWIN_CABLE_GWU2X = 0
GOWIN_CABLE_FT2CH = 1
# for all other options, please run 'programmer_cli -h' for details
# feel free to add any options for your purpose.
class GowinProgrammer(GenericProgrammer):
needs_bitreverse = False
def __init__(self, devname):
self.device = str(devname)
# windows/powershell or msys2
self.is_win32 = True if sys.platform == "win32" else False
self.is_wsl = False
if sys.platform.find("linux") >= 0:
self.is_wsl = os.uname().release.find("WSL") > 0
self.programmer = "programmer_cli"
# note for WSL:
# gowin programmer_cli not working out of it's directory
if self.is_wsl or self.is_win32:
self.programmer += ".exe"
gw_dir = which(self.programmer)
if gw_dir is not None:
gw_dir = os.path.dirname(gw_dir)
os.chdir(gw_dir)
# follow the help information:
# 1. Gowin programmer does not support start address for embflash!
# 2. External SPI FLASH programming is also not detailed (for programmer_cli)
# 3. Verify usually got stuck, so we disable it by now. patch is welcome!
def flash(self, address = 0, data_file = None, external = False, fifile = None, verify = False, cable = GOWIN_CABLE_FT2CH):
pmode = (GOWIN_PMODE_EMBFLASH + 1) if verify else GOWIN_PMODE_EMBFLASH
if external is True:
pmode = (GOWIN_PMODE_EXTFLASH + 1) if verify else GOWIN_PMODE_EXTFLASH
if data_file is None and fifile is None:
print("GowinProgrammer: fsFile or fiFile should be given!");
exit(1)
if self.is_wsl is True and data_file is not None:
data_file = os.popen("wslpath -w {}".format(data_file)).read().strip("\n")
if self.is_wsl is True and fifile is not None:
fifile = os.popen("wslpath -w {}".format(fifile)).read().strip("\n")
cmd_line = [self.programmer,
"--spiaddr", str(address),
"--device", str(self.device)]
if data_file is not None:
if external is True:
cmd_line += ["--mcuFile", str(data_file)]
else:
cmd_line += ["--fsFile", str(data_file)]
if fifile is not None:
cmd_line += ["--fiFile", str(fifile)]
cmd_line += ["--cable-index", str(cable), "--operation_index", str(pmode)]
self.call(cmd_line)
def load_bitstream(self, bitstream_file, verify = False, cable = GOWIN_CABLE_FT2CH):
pmode = 4 if verify else 2
bitfile = bitstream_file
if self.is_wsl is True:
bitfile = os.popen("wslpath -w {}".format(bitstream_file)).read().strip("\n")
cmd_line = [self.programmer,
"--device", str(self.device),
"--fsFile", str(bitfile),
"--cable-index", str(cable),
"--operation_index", str(pmode)]
self.call(cmd_line)