gateware: add basic gateware scripts
Signed-off-by: Robert Nelson <robertcnelson@gmail.com>default-cape-symlinks
parent
3b747549b8
commit
00c88a1678
@ -0,0 +1,21 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ -d $1 ]
|
||||||
|
then
|
||||||
|
echo "Changing gateware."
|
||||||
|
if [ -e $1/mpfs_bitstream.spi ]
|
||||||
|
then
|
||||||
|
if [ -e $1/mpfs_dtbo.spi ]
|
||||||
|
then
|
||||||
|
cp $1/mpfs_dtbo.spi /lib/firmware/mpfs_dtbo.spi
|
||||||
|
cp $1/mpfs_bitstream.spi /lib/firmware/mpfs_bitstream.spi
|
||||||
|
. /etc/microchip/update-gateware.sh
|
||||||
|
else
|
||||||
|
echo "No device tree overlay file found."
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "No gateware file found."
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "No directory found for this requested gateware."
|
||||||
|
fi
|
@ -0,0 +1,322 @@
|
|||||||
|
#!/bin/env python3
|
||||||
|
|
||||||
|
#
|
||||||
|
# This script is intended to be run with python 3
|
||||||
|
#
|
||||||
|
|
||||||
|
import time
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import subprocess
|
||||||
|
import functools
|
||||||
|
|
||||||
|
voltage_raws = []
|
||||||
|
|
||||||
|
voltage_differential_raws = []
|
||||||
|
|
||||||
|
voltage_scales = [ "in_voltage-voltage_scale" ]
|
||||||
|
|
||||||
|
hw_gain = [ "hardwaregain" ]
|
||||||
|
|
||||||
|
hw_gain_available = [ hw_gain[0] + "_available" ]
|
||||||
|
|
||||||
|
calib_bias = [ "calibbias" ]
|
||||||
|
|
||||||
|
calib_bias_available = [ calib_bias[0] + "_available" ]
|
||||||
|
|
||||||
|
calib_scale = [ "calibscale" ]
|
||||||
|
|
||||||
|
calib_scale_available = [ calib_scale[0] + "_available" ]
|
||||||
|
|
||||||
|
oversampling_ratio = [ "oversampling_ratio" ]
|
||||||
|
|
||||||
|
oversampling_ratio_available = [ oversampling_ratio[0] + "_available" ]
|
||||||
|
temperature_raws = [ "in_temp_raw" ]
|
||||||
|
|
||||||
|
temperature_scale = [ "in_temp_scale" ]
|
||||||
|
|
||||||
|
DIR_PATH="/sys/bus/iio/devices/"
|
||||||
|
device = []
|
||||||
|
mcp_devices = []
|
||||||
|
|
||||||
|
device2channels ={}
|
||||||
|
|
||||||
|
|
||||||
|
new_line = '\n'
|
||||||
|
|
||||||
|
def mult(file1_name, file2_name):
|
||||||
|
global ABS_PATH
|
||||||
|
file1 = open(ABS_PATH+file1_name,'r')
|
||||||
|
val1 = int(file1.read())
|
||||||
|
file1.close()
|
||||||
|
file2 = open(ABS_PATH+file2_name,'r')
|
||||||
|
val2 = float(file2.read())
|
||||||
|
file2.close()
|
||||||
|
return (val1 * val2)
|
||||||
|
|
||||||
|
|
||||||
|
def print_attribute(file_name):
|
||||||
|
global ABS_PATH
|
||||||
|
attr_file = open(ABS_PATH + file_name,'r')
|
||||||
|
string = attr_file.read()
|
||||||
|
attr_file.close()
|
||||||
|
# clean the string for printing
|
||||||
|
string = string.replace("0000000", "")
|
||||||
|
return string
|
||||||
|
|
||||||
|
def calculate_temperature(file1_name):
|
||||||
|
global ABS_PATH
|
||||||
|
|
||||||
|
name_file = open(ABS_PATH + "name",'r')
|
||||||
|
device_name_string = name_file.read()
|
||||||
|
name_file.close()
|
||||||
|
|
||||||
|
temperature = open(ABS_PATH+file1_name,'r')
|
||||||
|
temperature_val = int(temperature.read())
|
||||||
|
temperature.close()
|
||||||
|
|
||||||
|
if ( 'mcp3564\n' == device_name_string ):
|
||||||
|
return temperature_val * 4.0096 * 0.0001 * 2.4 - 269.13
|
||||||
|
else:
|
||||||
|
return 0
|
||||||
|
|
||||||
|
def write_attribute(file_name, value):
|
||||||
|
global ABS_PATH
|
||||||
|
attr_file = open(ABS_PATH + file_name,'w')
|
||||||
|
attr_file.write(value)
|
||||||
|
attr_file.close()
|
||||||
|
return 0
|
||||||
|
|
||||||
|
def get_name(file_name):
|
||||||
|
global ABS_PATH
|
||||||
|
attr_file = open(file_name,'r')
|
||||||
|
string = attr_file.read()
|
||||||
|
attr_file.close()
|
||||||
|
return string
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if not os.path.isdir(DIR_PATH):
|
||||||
|
print('IIO is not enabled')
|
||||||
|
exit()
|
||||||
|
|
||||||
|
proc = subprocess.Popen("ls -1 " + DIR_PATH + "| grep device", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||||
|
stdout, stderr = proc.communicate()
|
||||||
|
|
||||||
|
lines = stdout.decode('utf-8').split('\n')
|
||||||
|
|
||||||
|
print('Search for devices:')
|
||||||
|
for line in lines:
|
||||||
|
path=DIR_PATH + line
|
||||||
|
if os.path.exists(path):
|
||||||
|
if os.path.exists(path + "/name"):
|
||||||
|
device_name= get_name(path + "/name")
|
||||||
|
|
||||||
|
print('------------->', device_name)
|
||||||
|
|
||||||
|
if re.search(r"mcp3[45]6[124][rR]", device_name):
|
||||||
|
device_index = re.findall(r'\d+', line)
|
||||||
|
if device_index:
|
||||||
|
mcp_devices.append(device_index[0])
|
||||||
|
|
||||||
|
# get voltage_raws*
|
||||||
|
proc_channels = subprocess.Popen("ls -1 " + path + "/ | grep in_voltage* | grep -v scale | grep -v \"-\"", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||||
|
stdout_channels, stderr_channels = proc_channels.communicate()
|
||||||
|
voltage_raws = stdout_channels.decode('utf-8').split('\n')
|
||||||
|
voltage_raws = voltage_raws[:-1]
|
||||||
|
|
||||||
|
# get voltage_differential_raws
|
||||||
|
proc_channels = subprocess.Popen("ls -1 " + path + "/ | grep in_voltage* | grep -v scale | grep \"-\"", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||||
|
stdout_channels, stderr_channels = proc_channels.communicate()
|
||||||
|
voltage_differential_raws = stdout_channels.decode('utf-8').split('\n')
|
||||||
|
voltage_differential_raws = voltage_differential_raws[:-1]
|
||||||
|
|
||||||
|
|
||||||
|
for mcp_device in mcp_devices:
|
||||||
|
ABS_PATH = f'{DIR_PATH}iio:device{mcp_device}/'
|
||||||
|
|
||||||
|
print('--------------------------------')
|
||||||
|
print('--------------------------------')
|
||||||
|
print('--------------------------------')
|
||||||
|
print(f'Device: {print_attribute("name")}')
|
||||||
|
print('--------------------------------')
|
||||||
|
|
||||||
|
print(f'Available Voltage Oversampling Ratio:')
|
||||||
|
oversampling_ratio_string = print_attribute(oversampling_ratio_available[0])
|
||||||
|
oversampling_ratio_list = oversampling_ratio_string.split()
|
||||||
|
print(f' {oversampling_ratio_string}')
|
||||||
|
|
||||||
|
print('--------------------------------')
|
||||||
|
print(f'Current Voltage Oversampling Ratio: %s' % (print_attribute(oversampling_ratio[0])))
|
||||||
|
print('--------------------------------')
|
||||||
|
|
||||||
|
print(f'Available Voltage Hardware Gain:')
|
||||||
|
hw_gain_string = print_attribute(hw_gain_available[0])
|
||||||
|
hw_gain_list = hw_gain_string.split()
|
||||||
|
print(f' {hw_gain_string}')
|
||||||
|
|
||||||
|
print('--------------------------------')
|
||||||
|
print(f'Current Voltage Hardware Gain: %s' % (print_attribute(hw_gain[0])))
|
||||||
|
print('--------------------------------')
|
||||||
|
|
||||||
|
print(f'Available Voltage Calibration Bias {new_line} [ Low, Step, High ] {new_line} %s' % (print_attribute(calib_bias_available[0]).replace(" ", " ")))
|
||||||
|
|
||||||
|
print('--------------------------------')
|
||||||
|
print(f'Current Voltage Calibration Bias: %s' % (print_attribute(calib_bias[0])))
|
||||||
|
print('--------------------------------')
|
||||||
|
|
||||||
|
print(f'Available Voltage Calibration Scale {new_line} [ Low, Step, High ] {new_line} %s' % (print_attribute(calib_scale_available[0]).replace(" ", " ")))
|
||||||
|
|
||||||
|
print('--------------------------------')
|
||||||
|
print(f'Current Voltage Calibration Scale: %s' % (print_attribute(calib_scale[0])))
|
||||||
|
print('--------------------------------')
|
||||||
|
|
||||||
|
print('--------------------------------')
|
||||||
|
# Measured voltage in millivolts
|
||||||
|
# U = in2_raw * in_scale
|
||||||
|
|
||||||
|
print('\n Voltage')
|
||||||
|
print('=========')
|
||||||
|
|
||||||
|
print(f' Channel V mV')
|
||||||
|
for raw in voltage_raws:
|
||||||
|
# Voltage Scale is in mV
|
||||||
|
voltage_mv = mult(raw,voltage_scales[0])
|
||||||
|
voltage = voltage_mv/1000
|
||||||
|
print('---------------------------------------------------------------------')
|
||||||
|
print(f' {raw}: %2.4f | %5.6f' % (voltage, voltage_mv))
|
||||||
|
|
||||||
|
print('\n\n--------------------------------')
|
||||||
|
|
||||||
|
|
||||||
|
print('\n Differential Voltage')
|
||||||
|
print('======================')
|
||||||
|
|
||||||
|
print(f' Channel V mV')
|
||||||
|
for raw in voltage_differential_raws:
|
||||||
|
# Voltage Scale is in mV
|
||||||
|
voltage_mv = mult(raw,voltage_scales[0])
|
||||||
|
voltage = voltage_mv/1000
|
||||||
|
print('---------------------------------------------------------------------')
|
||||||
|
print(f' {raw}: %8.4f | %15.6f' % (voltage, voltage_mv))
|
||||||
|
|
||||||
|
print('\n\n--------------------------------')
|
||||||
|
print('\n\n Temperature(',u'\xb0\x43','): %8.4f' % calculate_temperature(temperature_raws[0]))
|
||||||
|
print('\n\n--------------------------------')
|
||||||
|
|
||||||
|
if os.geteuid()==0:
|
||||||
|
print('\n\n================================')
|
||||||
|
print ('Running as root.')
|
||||||
|
print('================================\n\n')
|
||||||
|
|
||||||
|
# Testing Hardware Gain
|
||||||
|
current_hw_gain = print_attribute(hw_gain[0])
|
||||||
|
print(f' Current Voltage Hardware Gain: x{current_hw_gain}')
|
||||||
|
|
||||||
|
|
||||||
|
print('\n================================')
|
||||||
|
print(f' Testing Hardware gain settings: {hw_gain_string}')
|
||||||
|
print('================================\n')
|
||||||
|
print('--------------------------------')
|
||||||
|
|
||||||
|
for hw_gain_value in hw_gain_list:
|
||||||
|
print(f' {new_line} Set Voltage Hardware Gain: x{hw_gain_value}')
|
||||||
|
|
||||||
|
write_attribute(hw_gain[0], hw_gain_value)
|
||||||
|
|
||||||
|
print(f' Channel V mV')
|
||||||
|
voltage_mv = mult(voltage_differential_raws[0], voltage_scales[0])
|
||||||
|
voltage = voltage_mv/1000
|
||||||
|
print('---------------------------------------------------------------------')
|
||||||
|
print(f' {voltage_differential_raws[0]}: %2.4f | %5.6f -> Hw Gain: x%s' % (voltage, voltage_mv, print_attribute(hw_gain[0])))
|
||||||
|
print('---------------------------------------------------------------------------------------------------------------------')
|
||||||
|
|
||||||
|
# set back the Hardware Gain
|
||||||
|
write_attribute(hw_gain[0], current_hw_gain)
|
||||||
|
print('--------------------------------')
|
||||||
|
|
||||||
|
# Testing Oversampling Ratio
|
||||||
|
current_oversampling_ratio = print_attribute(oversampling_ratio[0])
|
||||||
|
print(f' Current Oversampling Ratio: x{current_oversampling_ratio}')
|
||||||
|
|
||||||
|
print(f' {new_line}')
|
||||||
|
print('\n================================')
|
||||||
|
print(f' Testing Oversampling Ratio settings: {oversampling_ratio_string}')
|
||||||
|
print('================================\n')
|
||||||
|
print('--------------------------------')
|
||||||
|
|
||||||
|
for oversampling_ratio_value in oversampling_ratio_list:
|
||||||
|
print(f' {new_line} Set Oversampling Ratio: x{oversampling_ratio_value}')
|
||||||
|
|
||||||
|
write_attribute(oversampling_ratio[0], oversampling_ratio_value)
|
||||||
|
|
||||||
|
print(f' Channel V mV')
|
||||||
|
voltage_mv = mult(voltage_differential_raws[0], voltage_scales[0])
|
||||||
|
voltage = voltage_mv/1000
|
||||||
|
print('---------------------------------------------------------------------')
|
||||||
|
print(f' {voltage_differential_raws[0]}: %2.4f | %5.6f -> Oversampling Ratio: x%s' % (voltage, voltage_mv, print_attribute(oversampling_ratio[0])))
|
||||||
|
print('---------------------------------------------------------------------------------------------------------------------')
|
||||||
|
|
||||||
|
# set back the Oversampling Ratio
|
||||||
|
write_attribute(oversampling_ratio[0], current_oversampling_ratio)
|
||||||
|
print('\n--------------------------------')
|
||||||
|
|
||||||
|
# Testing Calibration BIAS
|
||||||
|
current_calib_bias = print_attribute(calib_bias[0])
|
||||||
|
print(f'{new_line} Current Calibration BIAS: {current_calib_bias}')
|
||||||
|
|
||||||
|
print('\n\n================================')
|
||||||
|
print(f' Testing Calibration Bias settings')
|
||||||
|
print('================================\n')
|
||||||
|
print('--------------------------------\n')
|
||||||
|
|
||||||
|
calib_bias_value = "50000"
|
||||||
|
print(f' {new_line} Set Calibration BIAS: {calib_bias_value}')
|
||||||
|
|
||||||
|
write_attribute(calib_bias[0], calib_bias_value)
|
||||||
|
|
||||||
|
print(f' Channel V mV')
|
||||||
|
voltage_mv = mult(voltage_differential_raws[0], voltage_scales[0])
|
||||||
|
voltage = voltage_mv/1000
|
||||||
|
print('---------------------------------------------------------------------')
|
||||||
|
print(f' {voltage_differential_raws[0]}: %2.4f | %5.6f -> Calibration BIAS: %s' % (voltage, voltage_mv, print_attribute(calib_bias[0])))
|
||||||
|
print('---------------------------------------------------------------------------------------------------------------------')
|
||||||
|
|
||||||
|
# set back the Calibration Bias
|
||||||
|
write_attribute(calib_bias[0], "0")
|
||||||
|
print('\n--------------------------------')
|
||||||
|
|
||||||
|
# Testing Calibration Scale
|
||||||
|
calib_scale_x1_gain = 8388608
|
||||||
|
|
||||||
|
current_calib_scale = print_attribute(calib_scale[0])
|
||||||
|
print(f'{new_line} Current Calibration Scale: {int(current_calib_scale)/calib_scale_x1_gain}')
|
||||||
|
|
||||||
|
print('\n\n================================')
|
||||||
|
print(f' Testing Calibration Scale settings')
|
||||||
|
print('================================\n')
|
||||||
|
print('--------------------------------')
|
||||||
|
|
||||||
|
calib_scale_value = 4194304;
|
||||||
|
print(f' {new_line} Set Calibration Scale: {calib_scale_value/calib_scale_x1_gain}')
|
||||||
|
|
||||||
|
write_attribute(calib_scale[0], str(calib_scale_value))
|
||||||
|
|
||||||
|
print(f' Channel V mV')
|
||||||
|
voltage_mv = mult(voltage_differential_raws[0], voltage_scales[0])
|
||||||
|
voltage = voltage_mv/1000
|
||||||
|
print('---------------------------------------------------------------------')
|
||||||
|
calib_scale_string = print_attribute(calib_scale[0])
|
||||||
|
calib_scale_int = int(calib_scale_string)
|
||||||
|
print(f' {voltage_differential_raws[0]}: %2.4f | %5.6f -> Calibration Scale: x%2.6f' % (voltage, voltage_mv, calib_scale_int/calib_scale_x1_gain))
|
||||||
|
print('*********************************************************************************************************************')
|
||||||
|
print('*********************************************************************************************************************')
|
||||||
|
print('*********************************************************************************************************************')
|
||||||
|
|
||||||
|
# set back the Calibration Scale
|
||||||
|
write_attribute(calib_scale[0], str(calib_scale_x1_gain))
|
||||||
|
|
||||||
|
else:
|
||||||
|
print ('User is not root.\n')
|
||||||
|
print ('Changing the user configurable settings must by done by root user.\n')
|
@ -0,0 +1,36 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
echo "================================================================================"
|
||||||
|
echo "| FPGA Gateware Update |"
|
||||||
|
echo "| |"
|
||||||
|
echo "| Please ensure that the mpfs_bitstream.spi file containing the gateware |"
|
||||||
|
echo "| update has been copied to directory /lib/firmware. |"
|
||||||
|
echo "| |"
|
||||||
|
echo "| !!! This will take a couple of minutes. !!! |"
|
||||||
|
echo "| |"
|
||||||
|
echo "| Give the system a few minutes to reboot itself |"
|
||||||
|
echo "| after Linux has shutdown. |"
|
||||||
|
echo "| |"
|
||||||
|
echo "================================================================================"
|
||||||
|
|
||||||
|
read -rsp $'Press any key to continue...\n' -n1 key
|
||||||
|
|
||||||
|
mount -t debugfs none /sys/kernel/debug
|
||||||
|
|
||||||
|
# Trash exisitng device tree overlay in case the rest of the process fails:
|
||||||
|
mtd_debug erase /dev/mtd0 0x0 0x10000
|
||||||
|
|
||||||
|
# Write device tree overlay
|
||||||
|
dtbo_ls=$(ls -l /lib/firmware/mpfs_dtbo.spi)
|
||||||
|
dtbo_size=$(echo $dtbo_ls | cut -d " " -f 5)
|
||||||
|
|
||||||
|
mtd_debug write /dev/mtd0 0x400 $dtbo_size /lib/firmware/mpfs_dtbo.spi > /dev/zero
|
||||||
|
|
||||||
|
# Fake the presence of a golden image for now.
|
||||||
|
mtd_debug write /dev/mtd0 0 4 /dev/zero > /dev/zero
|
||||||
|
|
||||||
|
# Initiate FPGA update.
|
||||||
|
echo 1 > /sys/kernel/debug/fpga/microchip_exec_update
|
||||||
|
|
||||||
|
# Reboot Linux for the gateware update to take effect.
|
||||||
|
# FPGA reprogramming takes places between Linux shut-down and HSS restarting the board.
|
||||||
|
reboot
|
Loading…
Reference in New Issue