| #!/usr/bin/env python3 |
| # Copyright lowRISC contributors. |
| # Licensed under the Apache License, Version 2.0, see LICENSE for details. |
| # SPDX-License-Identifier: Apache-2.0 |
| |
| import argparse |
| |
| import cw_spiflash |
| |
| import chipwhisperer as cw |
| from chipwhisperer.capture.targets.CW310 import CW310 |
| |
| |
| def main(): |
| |
| parser = argparse.ArgumentParser( |
| description= |
| 'Load OpenTitan Bitstream & Software to ChipWhisperer CW310 FPGA Board' |
| ) |
| |
| parser.add_argument('--bitstream', |
| '-b', |
| metavar='bitstream', |
| type=str, |
| help='Path to the FPGA .bit file to load', |
| default=None) |
| |
| parser.add_argument('--firmware', |
| '-f', |
| metavar='firmware', |
| type=str, |
| help='Path to the software .bin file to load', |
| default=None) |
| |
| parser.add_argument('--set-pll-defaults', |
| action='store_true', |
| help='Program on-board PLL with defaults', |
| default=False) |
| |
| args = parser.parse_args() |
| |
| print("CW310 Loader: Attemping to find CW310 FPGA Board:") |
| if args.bitstream: |
| print(" Using bitstream :{}".format(args.bitstream)) |
| else: |
| print(" No bitstream specified") |
| target = cw.target(None, CW310, bsfile=args.bitstream, slurp=False) |
| |
| print("CW310 Board Found:") |
| |
| if args.set_pll_defaults: |
| print("Configuring PLL, setting as default") |
| target.pll.pll_enable_set(True) |
| target.pll.pll_outenable_set(False, 0) |
| # Note: 1 and 2 seem to be reversed. |
| target.pll.pll_outenable_set(True, 1) |
| target.pll.pll_outenable_set(False, 2) |
| |
| # Note: both 1 and 2 need to be set, even if only 1 is enabled. |
| target.pll.pll_outfreq_set(100E6, 1) |
| target.pll.pll_outfreq_set(100E6, 2) |
| |
| target.pll.pll_writedefaults() |
| |
| if args.firmware: |
| print("INFO: Programming firmware file: {}".format(args.firmware)) |
| prog = cw_spiflash.SPIProgrammer(args.firmware, "CW310") |
| prog.run(target) |
| |
| print("Loading done.") |
| |
| |
| if __name__ == "__main__": |
| main() |