Packages
nerves_system_br
0.4.1
1.34.0
1.33.9
1.33.8
1.33.7
1.33.6
1.33.5
1.33.4
1.33.3
1.33.2
1.33.1
1.33.0
1.32.5
1.32.4
1.32.3
1.32.2
1.32.1
1.32.0
1.31.7
1.31.6
1.31.5
1.31.4
1.31.3
1.31.2
1.31.1
1.31.0
1.30.1
1.30.0
1.29.3
1.29.2
1.29.1
1.29.0
1.28.3
1.28.2
1.28.1
1.28.0
1.27.3
1.27.2
1.27.1
1.27.0
1.26.1
1.26.0
1.25.3
1.25.2
1.25.1
1.25.0
1.24.1
1.24.0
1.23.3
1.23.2
1.23.1
1.23.0
1.22.8
1.22.7
1.22.6
1.22.5
1.22.4
1.22.3
1.22.2
1.22.1
1.22.0
1.21.6
1.21.5
1.21.4
1.21.3
1.21.2
1.21.1
1.21.0
1.20.6
1.20.5
1.20.4
1.20.3
1.20.2
1.20.1
1.20.0
1.19.1
1.19.0
1.18.6
1.18.5
1.18.4
1.18.3
1.18.2
1.18.1
1.18.0
1.17.4
1.17.3
1.17.2
1.17.1
1.17.0
1.16.5
1.16.4
1.16.3
1.16.2
1.16.1
1.16.0
1.15.2
1.15.1
1.15.0
1.14.5
1.14.4
1.14.3
1.14.2
1.14.1
1.14.0
1.13.8
1.13.7
1.13.6
1.13.5
1.13.4
1.13.3
1.13.2
1.13.1
1.13.0
1.12.4
1.12.3
1.12.2
1.12.1
1.12.0
1.12.0-rc.0
1.11.4
1.11.3
1.11.2
1.11.1
1.11.0
1.10.3
1.10.2
1.10.1
1.10.0
1.9.5
1.9.4
1.9.3
1.9.2
1.9.1
1.9.0
1.8.6
1.8.5
1.8.4
1.8.3
1.8.2
1.8.1
1.8.0
1.7.3
1.7.2
1.7.1
1.7.0
1.6.8
1.6.7
1.6.6
1.6.5
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.5.6
1.5.5
1.5.4
1.5.3
1.5.2
1.5.1
1.5.0
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.2
1.3.1
1.3.0
1.2.2
1.2.1
1.2.0
1.1.0
1.0.1
1.0.0
1.0.0-rc.4
1.0.0-rc.3
1.0.0-rc.2
1.0.0-rc.1
1.0.0-rc.0
0.17.0
0.16.4
0.16.3
0.16.2
0.16.1-2017-11
0.16.0-2017-11
0.15.1
0.15.0
0.14.1
0.14.0
0.13.9
0.13.8
0.13.7
0.13.6
0.13.5
0.13.4
retired
0.13.3
0.13.2
0.13.0
0.12.1
0.12.0
0.11.1
0.11.0
0.10.1
0.10.0
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.2
0.8.1
0.8.0
0.7.0
0.6.1
0.6.0
0.5.2
0.5.1
0.5.0
0.4.2
0.4.1
Nerves System BR - Buildroot based build platform for Nerves Systems
Current section
Files
Jump to
Current section
Files
board/raspberrypi/rpi-fwup.conf
# Firmware configuration file for the Raspberry Pi
define(FINALIZE_FW, "/tmp/finalize.fw")
# Default paths if not specified via the commandline
define(ROOTFS, "${NERVES_SYSTEM}/images/rootfs.squashfs")
# This configuration file will create an image that
# has an MBR and the following 3 partitions:
#
# +----------------------------+
# | MBR |
# +----------------------------+
# | p0: Boot partition (FAT32) |
# | zImage, bootcode.bin, |
# | config.txt, etc. |
# +----------------------------+
# | p1*: Rootfs A (squashfs) |
# +----------------------------+
# | p1*: Rootfs B (squashfs) |
# +----------------------------+
# | p2: Application (FAT32) |
# +----------------------------+
#
# The p1 partition points to whichever of Rootfs A or B that
# is active.
#
# The image is sized to be less than 1 GB so that it fits on
# nearly any SDCard around. If you have a larger SDCard and
# need more space, feel free to bump the partition sizes
# below.
# The Raspberry Pi is incredibly picky on the partition sizes
# and in ways that I don't understand. Test changes one at a
# time to make sure that they boot. (Sizes are in 512 byte
# blocks)
define(BOOT_PART_OFFSET, 63)
define(BOOT_PART_COUNT, 77261)
# Let the rootfs have room to grow up to 128 MiB and align
# it to the nearest 1 MB boundary
define(ROOTFS_A_PART_OFFSET, 77324)
define(ROOTFS_A_PART_COUNT, 289044)
define(ROOTFS_B_PART_OFFSET, 366368)
define(ROOTFS_B_PART_COUNT, 289044)
# Application partition. This partition can occupy all of the
# remaining space. Size it to fit the destination.
define(APP_PART_OFFSET, 655412)
define(APP_PART_COUNT, 1048576)
# Firmware metadata
meta-product = "Nerves Firmware"
meta-description = ""
meta-version = ${NERVES_SDK_VERSION}
meta-platform = "rpi"
meta-architecture = "arm"
meta-author = "Frank Hunleth"
# File resources are listed in the order that they are included in the .fw file
# This is important, since this is the order that they're written on a firmware
# update due to the event driven nature of the update system.
file-resource bootcode.bin {
host-path = "${NERVES_SYSTEM}/images/rpi-firmware/bootcode.bin"
}
file-resource fixup.dat {
host-path = "${NERVES_SYSTEM}/images/rpi-firmware/fixup.dat"
}
file-resource start.elf {
host-path = "${NERVES_SYSTEM}/images/rpi-firmware/start.elf"
}
file-resource config.txt {
host-path = "${NERVES_SYSTEM}/images/config.txt"
}
file-resource cmdline.txt {
host-path = "${NERVES_SYSTEM}/images/cmdline.txt"
}
file-resource zImage {
# All Nerves configs use the DT kernel, but if you don't want it, remove
# the .mkknlimg part of the next line.
host-path = "${NERVES_SYSTEM}/images/zImage.mkknlimg"
}
file-resource bcm2708-rpi-b.dtb {
host-path = "${NERVES_SYSTEM}/images/bcm2708-rpi-b.dtb"
}
file-resource bcm2708-rpi-b-plus.dtb {
host-path = "${NERVES_SYSTEM}/images/bcm2708-rpi-b-plus.dtb"
}
file-resource w1-gpio-pullup-overlay.dtb {
host-path = "${NERVES_SYSTEM}/images/rpi-firmware/overlays/w1-gpio-pullup-overlay.dtb"
}
file-resource rootfs.img {
host-path = ${ROOTFS}
}
mbr mbr-a {
partition 0 {
block-offset = ${BOOT_PART_OFFSET}
block-count = ${BOOT_PART_COUNT}
type = 0xc # FAT32
boot = true
}
partition 1 {
block-offset = ${ROOTFS_A_PART_OFFSET}
block-count = ${ROOTFS_A_PART_COUNT}
type = 0x83 # Linux
}
partition 2 {
block-offset = ${APP_PART_OFFSET}
block-count = ${APP_PART_COUNT}
type = 0xc # FAT32
}
# partition 3 is unused
}
mbr mbr-b {
partition 0 {
block-offset = ${BOOT_PART_OFFSET}
block-count = ${BOOT_PART_COUNT}
type = 0xc # FAT32
boot = true
}
partition 1 {
block-offset = ${ROOTFS_B_PART_OFFSET}
block-count = ${ROOTFS_B_PART_COUNT}
type = 0x83 # Linux
}
partition 2 {
block-offset = ${APP_PART_OFFSET}
block-count = ${APP_PART_COUNT}
type = 0xc # FAT32
}
# partition 3 is unused
}
# This firmware task writes everything to the destination media
task complete {
# Only match if not mounted
require-unmounted-destination = true
# Everything that gets written can be verified on the fly.
# This speeds things up, since we don't care about detecting
# errors before data gets written.
verify-on-the-fly = true
on-init {
mbr_write(mbr-a)
fat_mkfs(${BOOT_PART_OFFSET}, ${BOOT_PART_COUNT})
fat_setlabel(${BOOT_PART_OFFSET}, "BOOT")
fat_mkdir(${BOOT_PART_OFFSET}, "overlays")
}
on-resource config.txt { fat_write(${BOOT_PART_OFFSET}, "config.txt") }
on-resource cmdline.txt { fat_write(${BOOT_PART_OFFSET}, "cmdline.txt") }
on-resource bootcode.bin { fat_write(${BOOT_PART_OFFSET}, "bootcode.bin") }
on-resource start.elf { fat_write(${BOOT_PART_OFFSET}, "start.elf") }
on-resource fixup.dat { fat_write(${BOOT_PART_OFFSET}, "fixup.dat") }
on-resource zImage { fat_write(${BOOT_PART_OFFSET}, "zImage") }
on-resource bcm2708-rpi-b.dtb { fat_write(${BOOT_PART_OFFSET}, "bcm2708-rpi-b.dtb") }
on-resource bcm2708-rpi-b-plus.dtb { fat_write(${BOOT_PART_OFFSET}, "bcm2708-rpi-b-plus.dtb") }
on-resource w1-gpio-pullup-overlay.dtb { fat_write(${BOOT_PART_OFFSET}, "overlays/w1-gpio-pullup-overlay.dtb") }
on-resource rootfs.img {
# write to the first rootfs partition
raw_write(${ROOTFS_A_PART_OFFSET})
}
on-finish {
# Initialize a big partition for application data
# This is done last so that the boot partition can be written to completely
# before the first write to this partition. Not skipping back and forth between
# FAT filesystems saves a little time when programming the Flash.
fat_mkfs(${APP_PART_OFFSET}, ${APP_PART_COUNT})
fat_setlabel(${APP_PART_OFFSET}, "APPDATA")
}
}
task upgrade.a {
# This task upgrades the A partition
require-partition1-offset = ${ROOTFS_B_PART_OFFSET}
# Since the upgrade won't run until it has been finalized, it's ok
# to write data as it is read.
verify-on-the-fly = true
on-init {
# Erase any old saved files from previous upgrades
fat_rm(${BOOT_PART_OFFSET}, "zImage.pre")
fat_rm(${BOOT_PART_OFFSET}, "config.txt.pre")
fat_rm(${BOOT_PART_OFFSET}, "cmdline.txt.pre")
fat_rm(${BOOT_PART_OFFSET}, "bootcode.bin.pre")
fat_rm(${BOOT_PART_OFFSET}, "start.elf.pre")
fat_rm(${BOOT_PART_OFFSET}, "fixup.dat.pre")
fat_rm(${BOOT_PART_OFFSET}, "bcm2708-rpi-b.dtb.pre")
fat_rm(${BOOT_PART_OFFSET}, "bcm2708-rpi-b-plus.dtb.pre")
# Make the overlays directory in case it isn't already there.
fat_mkdir(${BOOT_PART_OFFSET}, "overlays")
}
# Write the new firmware and Linux images, but don't
# commit them. That way if the user aborts midway, we
# still are using the original firmware.
on-resource config.txt { fat_write(${BOOT_PART_OFFSET}, "config.txt.new") }
on-resource cmdline.txt { fat_write(${BOOT_PART_OFFSET}, "cmdline.txt.new") }
on-resource bootcode.bin { fat_write(${BOOT_PART_OFFSET}, "bootcode.bin.new") }
on-resource start.elf { fat_write(${BOOT_PART_OFFSET}, "start.elf.new") }
on-resource fixup.dat { fat_write(${BOOT_PART_OFFSET}, "fixup.dat.new") }
on-resource zImage { fat_write(${BOOT_PART_OFFSET}, "zImage.new") }
on-resource bcm2708-rpi-b.dtb { fat_write(${BOOT_PART_OFFSET}, "bcm2708-rpi-b.dtb.new") }
on-resource bcm2708-rpi-b-plus.dtb { fat_write(${BOOT_PART_OFFSET}, "bcm2708-rpi-b-plus.dtb.new") }
on-resource w1-gpio-pullup-overlay.dtb { fat_write(${BOOT_PART_OFFSET}, "overlays/w1-gpio-pullup-overlay.dtb.new") }
on-resource rootfs.img {
# write to the first rootfs partition
raw_write(${ROOTFS_A_PART_OFFSET})
}
on-finish {
# Until this .fw is run, the system will still boot to the old firmware
fw_create(${FINALIZE_FW})
# Add an empty file to flag mbr-a to be written
fw_add_local_file(${FINALIZE_FW}, "write.mbr-a", "/dev/null")
}
on-error {
# Clean up in case something goes wrong
fat_rm(${BOOT_PART_OFFSET}, "zImage.new")
fat_rm(${BOOT_PART_OFFSET}, "config.txt.new")
fat_rm(${BOOT_PART_OFFSET}, "cmdline.txt.new")
fat_rm(${BOOT_PART_OFFSET}, "bootcode.bin.new")
fat_rm(${BOOT_PART_OFFSET}, "start.elf.new")
fat_rm(${BOOT_PART_OFFSET}, "fixup.dat.new")
fat_rm(${BOOT_PART_OFFSET}, "bcm2708-rpi-b.dtb.new")
fat_rm(${BOOT_PART_OFFSET}, "bcm2708-rpi-b-plus.dtb.new")
fat_rm(${BOOT_PART_OFFSET}, "overlays/w1-gpio-pullup-overlay.dtb.new")
fat_rm(${BOOT_PART_OFFSET}, ${FINALIZE_FW})
}
}
task upgrade.b {
# This task upgrades the B partition
require-partition1-offset = ${ROOTFS_A_PART_OFFSET}
# Since the upgrade won't run until it has been finalized, it's ok
# to write data as it is read.
verify-on-the-fly = true
on-init {
fat_rm(${BOOT_PART_OFFSET}, "zImage.pre")
fat_rm(${BOOT_PART_OFFSET}, "config.txt.pre")
fat_rm(${BOOT_PART_OFFSET}, "cmdline.txt.pre")
fat_rm(${BOOT_PART_OFFSET}, "bootcode.bin.pre")
fat_rm(${BOOT_PART_OFFSET}, "start.elf.pre")
fat_rm(${BOOT_PART_OFFSET}, "fixup.dat.pre")
fat_rm(${BOOT_PART_OFFSET}, "bcm2708-rpi-b.dtb.pre")
fat_rm(${BOOT_PART_OFFSET}, "bcm2708-rpi-b-plus.dtb.pre")
fat_mkdir(${BOOT_PART_OFFSET}, "overlays")
}
on-resource config.txt { fat_write(${BOOT_PART_OFFSET}, "config.txt.new") }
on-resource cmdline.txt { fat_write(${BOOT_PART_OFFSET}, "cmdline.txt.new") }
on-resource bootcode.bin { fat_write(${BOOT_PART_OFFSET}, "bootcode.bin.new") }
on-resource start.elf { fat_write(${BOOT_PART_OFFSET}, "start.elf.new") }
on-resource fixup.dat { fat_write(${BOOT_PART_OFFSET}, "fixup.dat.new") }
on-resource zImage { fat_write(${BOOT_PART_OFFSET}, "zImage.new") }
on-resource bcm2708-rpi-b.dtb { fat_write(${BOOT_PART_OFFSET}, "bcm2708-rpi-b.dtb.new") }
on-resource bcm2708-rpi-b-plus.dtb { fat_write(${BOOT_PART_OFFSET}, "bcm2708-rpi-b-plus.dtb.new") }
on-resource w1-gpio-pullup-overlay.dtb { fat_write(${BOOT_PART_OFFSET}, "overlays/w1-gpio-pullup-overlay.dtb.new") }
on-resource rootfs.img {
# write to the first rootfs partition
raw_write(${ROOTFS_B_PART_OFFSET})
}
on-finish {
# Until this .fw is run, the system will still boot to the old firmware
fw_create(${FINALIZE_FW})
# Add an empty file to flag mbr-b to be written
fw_add_local_file(${FINALIZE_FW}, "write.mbr-b", "/dev/null")
}
on-error {
# Clean up in case something goes wrong
fat_rm(${BOOT_PART_OFFSET}, "zImage.new")
fat_rm(${BOOT_PART_OFFSET}, "config.txt.new")
fat_rm(${BOOT_PART_OFFSET}, "cmdline.txt.new")
fat_rm(${BOOT_PART_OFFSET}, "bootcode.bin.new")
fat_rm(${BOOT_PART_OFFSET}, "start.elf.new")
fat_rm(${BOOT_PART_OFFSET}, "fixup.dat.new")
fat_rm(${BOOT_PART_OFFSET}, "bcm2708-rpi-b.dtb.new")
fat_rm(${BOOT_PART_OFFSET}, "bcm2708-rpi-b-plus.dtb.new")
fat_rm(${BOOT_PART_OFFSET}, "overlays/w1-gpio-pullup-overlay.dtb.new")
fat_rm(${BOOT_PART_OFFSET}, ${FINALIZE_FW})
}
}
# This action is intended to be called from ${FINALIZE_FW} after the "upgrade" task
# has been run. It requires the "write.mbr-a" or "write.mbr-b" resources to exist
# and those don't exist until the "upgrade" task makes them.
#
# The idea here is to be as atomic as possible for switching over from the old
# firmware release to the new one. As you can see, files need to be renamed,
# so it's not atomic. Ideally we'd just perform one write to switch the active
# root filesystem and be done, but the RPi requires more work due to the kernel,
# device tree blobs, and config files being stored in the first FAT file system.
task on-reboot {
on-resource write.mbr-a {
mbr_write(mbr-a)
}
on-resource write.mbr-b {
mbr_write(mbr-b)
}
on-finish {
fat_mv(${BOOT_PART_OFFSET}, "zImage", "zImage.pre")
fat_mv(${BOOT_PART_OFFSET}, "config.txt", "config.txt.pre")
fat_mv(${BOOT_PART_OFFSET}, "cmdline.txt", "cmdline.txt.pre")
fat_mv(${BOOT_PART_OFFSET}, "bootcode.bin", "bootcode.bin.pre")
fat_mv(${BOOT_PART_OFFSET}, "start.elf", "start.elf.pre")
fat_mv(${BOOT_PART_OFFSET}, "fixup.dat", "fixup.dat.pre")
fat_mv(${BOOT_PART_OFFSET}, "bcm2708-rpi-b.dtb", "bcm2708-rpi-b.dtb.pre")
fat_mv(${BOOT_PART_OFFSET}, "bcm2708-rpi-b-plus.dtb", "bcm2708-rpi-b-plus.dtb.pre")
fat_mv(${BOOT_PART_OFFSET}, "zImage.new", "zImage")
fat_mv(${BOOT_PART_OFFSET}, "config.txt.new", "config.txt")
fat_mv(${BOOT_PART_OFFSET}, "cmdline.txt.new", "cmdline.txt")
fat_mv(${BOOT_PART_OFFSET}, "bootcode.bin.new", "bootcode.bin")
fat_mv(${BOOT_PART_OFFSET}, "start.elf.new", "start.elf")
fat_mv(${BOOT_PART_OFFSET}, "fixup.dat.new", "fixup.dat")
fat_mv(${BOOT_PART_OFFSET}, "bcm2708-rpi-b.dtb.new", "bcm2708-rpi-b.dtb")
fat_mv(${BOOT_PART_OFFSET}, "bcm2708-rpi-b-plus.dtb.new", "bcm2708-rpi-b-plus.dtb")
fat_mv(${BOOT_PART_OFFSET}, "overlays/w1-gpio-pullup-overlay.dtb.new", "overlays/w1-gpio-pullup-overlay.dtb")
}
}