Update fpgactl tool
This commit is contained in:
parent
409d2caecc
commit
bd2b8b1bc5
65
fpga/fpgactl
65
fpga/fpgactl
@ -101,27 +101,59 @@ function create_qdma_queue() # {{{
|
|||||||
function do_system_reset() # {{{
|
function do_system_reset() # {{{
|
||||||
{
|
{
|
||||||
# UartBootEn (bit2) + system reset (bit0)
|
# UartBootEn (bit2) + system reset (bit0)
|
||||||
dma-ctl qdma08000 reg write bar 2 0x0 0x0
|
dma-ctl qdma08000 reg write bar 2 0x0 0x0 > /dev/null
|
||||||
sleep 0.2
|
sleep 0.2
|
||||||
# Release system reset, we must wait until the memory is filled with 0s
|
# Release system reset, we must wait until the memory is filled with 0s
|
||||||
dma-ctl qdma08000 reg write bar 2 0x0 0x1
|
dma-ctl qdma08000 reg write bar 2 0x0 0x1 > /dev/null
|
||||||
#sleep 5
|
#sleep 5
|
||||||
} # }}}
|
} # }}}
|
||||||
|
|
||||||
function do_system_release() # {{{
|
function do_system_release() # {{{
|
||||||
{
|
{
|
||||||
# Release Ariane's reset
|
# Release Ariane's reset
|
||||||
dma-ctl qdma08000 reg write bar 2 0x0 0x3
|
dma-ctl qdma08000 reg write bar 2 0x0 0x3 > /dev/null
|
||||||
|
} # }}}
|
||||||
|
|
||||||
|
function copy_by_dma() # {{{
|
||||||
|
{
|
||||||
|
ifile="$1"
|
||||||
|
address="$2"
|
||||||
|
|
||||||
|
ofile="/dev/qdma08000-MM-1"
|
||||||
|
bs=$((8*1024*1024)) # 8 MiB
|
||||||
|
|
||||||
|
total_size=$(stat --format "%s" "$ifile")
|
||||||
|
|
||||||
|
nblocks=$(( ($total_size + $bs - 1) / $bs ))
|
||||||
|
skip=0
|
||||||
|
|
||||||
|
# Using just a single dd command doesn't seem to work. My hypothesis is that
|
||||||
|
# the driver doesn't allow multiple writes without setting the fseek position.
|
||||||
|
# So we keep copying blocks until the end of the file, one at a time.
|
||||||
|
|
||||||
|
while [ "$skip" -lt "$nblocks" ]; do
|
||||||
|
dst=$(($address + $skip * $bs))
|
||||||
|
dd if="$ifile" skip=$skip count=1 bs=$bs of="$ofile" seek=$dst oflag=seek_bytes
|
||||||
|
let skip=$skip+1
|
||||||
|
done
|
||||||
|
|
||||||
} # }}}
|
} # }}}
|
||||||
|
|
||||||
function load_file_in_memory() # {{{
|
function load_file_in_memory() # {{{
|
||||||
{
|
{
|
||||||
file="$1"
|
file="$1"
|
||||||
address="$2"
|
address="$2"
|
||||||
|
|
||||||
|
# Previous tests...
|
||||||
#strace -f dma-to-device -d /dev/qdma08000-MM-1 -a "$address" -s $((8*1024*1024)) -f "$file"
|
#strace -f dma-to-device -d /dev/qdma08000-MM-1 -a "$address" -s $((8*1024*1024)) -f "$file"
|
||||||
#strace -f dd if="$file" bs=16M seek="${address}" oflag=seek_bytes of=/dev/qdma08000-MM-1 status=progress conv=sync
|
#strace -f dd if="$file" bs=16M seek="${address}" oflag=seek_bytes of=/dev/qdma08000-MM-1 status=progress conv=sync
|
||||||
#strace -f fpgakit/fpgadd -i "$file" -a "$address" -d /dev/qdma08000-MM-1 -c 1024 -s 1024
|
#strace -f fpgakit/fpgadd -i "$file" -a "$address" -d /dev/qdma08000-MM-1 -c 1024 -s 1024
|
||||||
ID=08 ./load_image.sh "$file" "$address"
|
#ID=08 ./load_image.sh "$file" "$address"
|
||||||
|
|
||||||
|
# Now dd seems to work fine, but I will leave this as fallback:
|
||||||
|
#copy_by_dma "$file" "$address"
|
||||||
|
|
||||||
|
dd if="$file" bs=8M seek="${address}" oflag=seek_bytes of=/dev/qdma08000-MM-1 status=none
|
||||||
} # }}}
|
} # }}}
|
||||||
|
|
||||||
function do_boot_only() # {{{
|
function do_boot_only() # {{{
|
||||||
@ -190,9 +222,22 @@ function upload_bitstream_file() # {{{
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
vivado -nolog -nojournal -mode batch -source load-bitstream.tcl -tclargs "$bitfile" "$fpgajtag"
|
script=$(mktemp vivado-XXXXXXXXXX.tcl)
|
||||||
|
cat > "$script" <<EOF
|
||||||
|
open_hw_manager
|
||||||
|
connect_hw_server -url localhost:3121
|
||||||
|
current_hw_target "localhost:3121/xilinx_tcf/Xilinx/${fpgajtag}A"
|
||||||
|
open_hw_target
|
||||||
|
set dev [lindex [get_hw_devices] 0]
|
||||||
|
current_hw_device \$dev
|
||||||
|
set_property PROGRAM.FILE ${bitfile} \$dev
|
||||||
|
program_hw_devices \$dev
|
||||||
|
exit
|
||||||
|
EOF
|
||||||
|
|
||||||
|
vivado -nolog -nojournal -mode batch -source "$script"
|
||||||
|
rm "$script"
|
||||||
|
|
||||||
echo "Bitstream $bitfile loaded."
|
|
||||||
killall hw_server
|
killall hw_server
|
||||||
} # }}}
|
} # }}}
|
||||||
|
|
||||||
@ -256,25 +301,25 @@ function load_bitstream() # {{{
|
|||||||
create_qdma_queue
|
create_qdma_queue
|
||||||
} # }}}
|
} # }}}
|
||||||
|
|
||||||
slotid="8"
|
|
||||||
bitstream=
|
bitstream=
|
||||||
bootloader=
|
bootloader=
|
||||||
kernelfile=
|
kernelfile=
|
||||||
reloadfs=
|
reloadfs=
|
||||||
resetcpu=
|
resetcpu=
|
||||||
|
verbose=
|
||||||
|
|
||||||
while getopts "s:w:k:r:b:" opt; do
|
while getopts "s:w:k:r:b:v" opt; do
|
||||||
case "${opt}" in
|
case "${opt}" in
|
||||||
s) slotid="${OPTARG}" ;;
|
|
||||||
w) bitstream="${OPTARG}" ;;
|
w) bitstream="${OPTARG}" ;;
|
||||||
b) bootloader="${OPTARG}"; resetcpu=1 ;;
|
b) bootloader="${OPTARG}"; resetcpu=1 ;;
|
||||||
k) kernelfile="${OPTARG}"; resetcpu=1 ;;
|
k) kernelfile="${OPTARG}"; resetcpu=1 ;;
|
||||||
r) rootfs="${OPTARG}"; resetcpu=1 ;;
|
r) rootfs="${OPTARG}"; resetcpu=1 ;;
|
||||||
|
v) verbose=1 ;;
|
||||||
*) usage ;;
|
*) usage ;;
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
|
|
||||||
set -x
|
test "$verbose" && set -x
|
||||||
|
|
||||||
check_environment
|
check_environment
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user