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