Add bitstream loading and run init scripts at boot time #52

Merged
sb10q merged 2 commits from fsagbuya/nix-servo:fast-servo-init into master 2024-04-24 18:03:18 +08:00
6 changed files with 47 additions and 11 deletions

View File

@ -21,7 +21,7 @@ import mmap
import os import os
import spidev import spidev
from common import ( from pyfastservo.common import (
ADC_AFE_CTRL_ADDR, ADC_AFE_CTRL_ADDR,
ADC_BITSLIP_ADDR, ADC_BITSLIP_ADDR,
ADC_CH0_HIGH_ADDR, ADC_CH0_HIGH_ADDR,

View File

@ -22,8 +22,8 @@ MAP_SIZE = 0x1000
MAP_MASK = 0xFFF MAP_MASK = 0xFFF
PAGESIZE = 0x1000 PAGESIZE = 0x1000
LINIEN_OFFSET = 0x0 # LINIEN_OFFSET = 0x0
# LINIEN_OFFSET = 0x300000 LINIEN_OFFSET = 0x300000
# ---------------------------------------------------------------- # ----------------------------------------------------------------
# FRONT PANEL LEDS REGISTER ADDRESSES # FRONT PANEL LEDS REGISTER ADDRESSES

View File

@ -21,7 +21,7 @@ import mmap
import os import os
import spidev import spidev
from common import ( from pyfastservo.common import (
CH0_HIGH_WORD_ADDR, CH0_HIGH_WORD_ADDR,
CH0_LOW_WORD_ADDR, CH0_LOW_WORD_ADDR,
CH1_HIGH_WORD_ADDR, CH1_HIGH_WORD_ADDR,

View File

@ -21,7 +21,7 @@ import mmap
import os import os
import time import time
from common import ( from pyfastservo.common import (
LED0_BASE_ADDR, LED0_BASE_ADDR,
LED1_BASE_ADDR, LED1_BASE_ADDR,
LED2_BASE_ADDR, LED2_BASE_ADDR,

View File

@ -17,9 +17,7 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>. # along with this program. If not, see <https://www.gnu.org/licenses/>.
import adc from pyfastservo import adc, si5340, dac
import si5340
import dac
def main(): def main():
si5340.configure_si5340() si5340.configure_si5340()

View File

@ -180,6 +180,27 @@
''; '';
}; };
pyfastservo = pkgs-armv7l.python3Packages.buildPythonPackage rec {
name = "pyfastservo";
src = ./fast-servo;
preBuild = ''
cat > setup.py << EOF
from setuptools import setup
setup(
name="pyfastservo",
packages=["pyfastservo"],
install_requires=["spidev", "smbus2"],
entry_points = {"console_scripts": ["fp_leds=pyfastservo.fp_leds:main"]},
)
EOF
'';
propagatedBuildInputs = with pkgs-armv7l.python3Packages; [
spidev
smbus2
];
};
mkbootimage = pkgs.stdenv.mkDerivation { mkbootimage = pkgs.stdenv.mkDerivation {
pname = "mkbootimage"; pname = "mkbootimage";
version = "2.3dev"; version = "2.3dev";
@ -209,8 +230,25 @@
extraModules = [ extraModules = [
"${patched-not-os}/zynq_image.nix" "${patched-not-os}/zynq_image.nix"
] ++ pkgs.lib.optionals (board == "fast-servo") [ ] ++ pkgs.lib.optionals (board == "fast-servo") [
({ config, pkgs, ... }: { ({ config, pkgs, lib, ... }: {
environment.systemPackages = [ linien-server ]; environment.systemPackages = [
linien-server
(pkgs.python3.withPackages(ps: [ pyfastservo ]))
];
boot.postBootCommands = lib.mkAfter ''
# Program the FPGA
set +x
echo "Flashing bitstream..."
Review

It's not flashing, just loading into SRAM. Please send another PR addressing this incorrect terminology.

It's not flashing, just loading into SRAM. Please send another PR addressing this incorrect terminology.
echo 0 > /sys/class/fpga_manager/fpga0/flags
mkdir -p /lib/firmware
cp ${fast-servo-gateware}/gateware.bin /lib/firmware/
echo gateware.bin > /sys/class/fpga_manager/fpga0/firmware
# Run device init scripts
echo "Initializing clock generator, ADC, and DAC..."
python3 -m pyfastservo.initialize
'';
})]; })];
system = "x86_64-linux"; system = "x86_64-linux";
inherit crossSystem; inherit crossSystem;
@ -387,7 +425,7 @@
BASE=$(realpath $(dirname $0)) BASE=$(realpath $(dirname $0))
qemu-img convert -O qcow2 -f raw -o preallocation=metadata $BASE/sd-image.img $IMGDIR/sd-sparse.qcow2 qemu-img convert -O qcow2 -f raw -o preallocation=metadata $BASE/sd-image.img $IMGDIR/sd-sparse.qcow2
qemu-img create -F qcow2 -f qcow2 -b $IMGDIR/sd-sparse.qcow2 $IMGDIR/sd-overlay.qcow2 1G qemu-img create -F qcow2 -f qcow2 -b $IMGDIR/sd-sparse.qcow2 $IMGDIR/sd-overlay.qcow2 2G
# Some command arguments are based from samples in Xilinx QEMU User Documentation # Some command arguments are based from samples in Xilinx QEMU User Documentation
# See: https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/821854273/Running+Bare+Metal+Applications+on+QEMU # See: https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/821854273/Running+Bare+Metal+Applications+on+QEMU