[yocto] [meta-chip][RFC PATCH 3/3] chip: Add chip-u-boot-scr recipe and flash script

drew.moseley at mender.io drew.moseley at mender.io
Fri Jun 16 14:15:40 PDT 2017


From: Drew Moseley <drew.moseley at mender.io>

Add a U-Boot script to handle flashing the SPL, U-Boot
and UBI root filesystem images into the onboard flash.
Also generate a script showing how to execute the flash
steps.

Signed-off-by: Drew Moseley <drew.moseley at mender.io>
---
 README                                          | 26 ++++++++-
 recipes-bsp/chip-u-boot-scr/chip-u-boot-scr.bb  | 70 +++++++++++++++++++++++++
 recipes-bsp/chip-u-boot-scr/files/boot.cmd.full | 32 +++++++++++
 recipes-bsp/chip-u-boot-scr/files/boot.cmd.in   | 43 +++++++++++++++
 recipes-bsp/u-boot/u-boot-chip_git.bb           |  1 +
 5 files changed, 171 insertions(+), 1 deletion(-)
 create mode 100644 recipes-bsp/chip-u-boot-scr/chip-u-boot-scr.bb
 create mode 100644 recipes-bsp/chip-u-boot-scr/files/boot.cmd.full
 create mode 100644 recipes-bsp/chip-u-boot-scr/files/boot.cmd.in

diff --git a/README b/README
index cccf59e..cf52e05 100644
--- a/README
+++ b/README
@@ -59,4 +59,28 @@ To build a machine supported by this BSP layer follow the next steps:
 II. Flashing a C.H.I.P. board
 ========================================
 
-<TODO>
+As part of the build including this BSP layer, a U-Boot script and a shell script
+are created to assist in flashing your images to the CHIP board.  Note that this
+script assumes a maximum size for your UBI image of 0x0A000000 bytes.  If your UBI
+image exceeds that, then you will need to adapt this to your environment.
+
+To successfully run this script you will first need to set your board into FEL mode.
+chip. https://docs.getchip.com/chip.html#flash-chip-with-an-os
+Insert a wire into the U14 header between pin 7 (FEL) and GND.  Then connect the
+board with a USB cable to your build system.
+
+You need to specify the base filename of your UBI image using the UBI_IMAGE shell
+variable before invoking the generated script as follows:
+
+$ UBI_IMAGE=core-image-full-cmdline-chip.ubi ./tmp/deploy/images/chip/flash_CHIP_board.sh
+
+This script will take some time to execute.  If you have a serial console connected to
+your board, you will see the progress and a message on the console will indicate when
+the flashing is completed. Additionally, once the image is properly flashed, the status
+LED on the CHIP board will flash 30 times per second indicating that it is safe to power
+down your board and disable FEL mode.
+
+WARNING: This will erase the entire contents of your CHIP board.
+
+NOTE: This setup is still compatible with the CHIP flashing utility available
+at http://flash.getchip.com if you choose to reinstall the stock images.
diff --git a/recipes-bsp/chip-u-boot-scr/chip-u-boot-scr.bb b/recipes-bsp/chip-u-boot-scr/chip-u-boot-scr.bb
new file mode 100644
index 0000000..726fca3
--- /dev/null
+++ b/recipes-bsp/chip-u-boot-scr/chip-u-boot-scr.bb
@@ -0,0 +1,70 @@
+SUMMARY = "U-boot boot scripts for CHIP boards"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420"
+COMPATIBLE_MACHINE = "chip"
+
+inherit deploy
+
+DEPENDS = "u-boot-mkimage-native"
+
+SRC_URI = "file://boot.cmd.in"
+
+NAND_FLASH_START_ADDR = "0x00000000"
+SPL_MEMIMG_ADDR = "0x44000000"
+UBOOT_MEMIMG_ADDR = "0x4a000000"
+SPL_FLASH_UPPER_ADDR = "0x400000"
+LED_I2C_CHIP = "0x34"
+LED_I2C_ADDR = "0x93"
+UBOOT_FLASH_ADDR = "0x800000"
+UBI_MEMIMG_ADDR = "0x4b000000"
+UBI_FLASH_ADDR = "0x1000000"
+PAGE_SIZE = "16384"
+OOB_SIZE = "1664"
+SCRIPTADDR = "0x43100000"
+
+do_compile[depends] += "u-boot-chip:do_deploy"
+do_compile() {
+    PADDED_SPL_SIZE_BLOCKS=$(stat --dereference --printf="%s" "${DEPLOY_DIR_IMAGE}/${SPL_ECC_BINARY}")
+    PADDED_SPL_SIZE_BLOCKS=$(expr $PADDED_SPL_SIZE_BLOCKS / \( ${PAGE_SIZE} + ${OOB_SIZE} \))
+    PADDED_SPL_SIZE_BLOCKS=$(echo $PADDED_SPL_SIZE_BLOCKS | xargs printf "0x%08x")
+    PADDED_UBOOT_SIZE=$(stat --dereference  --printf="%s" "${DEPLOY_DIR_IMAGE}/${UBOOT_BINARY}" | xargs printf "0x%08x")
+    UBI_SIZE="0x0A000000"
+
+    sed -e "s, at NAND_FLASH_START_ADDR@,${NAND_FLASH_START_ADDR},g" \
+        -e "s, at SPL_MEMIMG_ADDR@,${SPL_MEMIMG_ADDR},g" \
+        -e "s, at UBOOT_MEMIMG_ADDR@,${UBOOT_MEMIMG_ADDR},g" \
+        -e "s, at SPL_FLASH_UPPER_ADDR@,${SPL_FLASH_UPPER_ADDR},g" \
+        -e "s, at LED_I2C_CHIP@,${LED_I2C_CHIP},g" \
+        -e "s, at LED_I2C_ADDR@,${LED_I2C_ADDR},g" \
+        -e "s, at PADDED_SPL_SIZE_BLOCKS@,${PADDED_SPL_SIZE_BLOCKS},g" \
+        -e "s, at PADDED_UBOOT_SIZE@,${PADDED_UBOOT_SIZE},g" \
+        -e "s, at UBOOT_FLASH_ADDR@,${UBOOT_FLASH_ADDR},g" \
+        -e "s, at UBI_FLASH_ADDR@,${UBI_FLASH_ADDR},g" \
+        -e "s, at UBI_MEMIMG_ADDR@,${UBI_MEMIMG_ADDR},g" \
+        -e "s, at UBI_SIZE@,${UBI_SIZE},g" \
+        < "${WORKDIR}/boot.cmd.in" > "${WORKDIR}/boot.cmd"
+    mkimage -A arm -T script -C none -n "Boot script" -d "${WORKDIR}/boot.cmd" "${WORKDIR}/boot.scr"
+}
+
+do_deploy() {
+    install -d ${DEPLOYDIR}
+    install -m 0644 ${WORKDIR}/boot.scr ${DEPLOYDIR}/boot.scr-${PV}-${PR}
+    ln -sf boot.scr-${PV}-${PR} ${DEPLOYDIR}/boot.scr
+
+    cat > ${DEPLOYDIR}/flash_CHIP_board.sh-${PV}-${PR} <<-EOF
+	#!/bin/sh
+	#
+	
+	${COMPONENTS_DIR}/x86_64/sunxi-tools-native/usr/bin/sunxi-fel spl ${DEPLOY_DIR_IMAGE}/${SPL_BINARY}
+	${COMPONENTS_DIR}/x86_64/sunxi-tools-native/usr/bin/sunxi-fel --progress write ${SPL_MEMIMG_ADDR} ${DEPLOY_DIR_IMAGE}/${SPL_ECC_BINARY}
+	${COMPONENTS_DIR}/x86_64/sunxi-tools-native/usr/bin/sunxi-fel --progress write ${UBOOT_MEMIMG_ADDR} ${DEPLOY_DIR_IMAGE}/${UBOOT_BINARY}
+	${COMPONENTS_DIR}/x86_64/sunxi-tools-native/usr/bin/sunxi-fel --progress write ${SCRIPTADDR} ${DEPLOY_DIR_IMAGE}/boot.scr
+	${COMPONENTS_DIR}/x86_64/sunxi-tools-native/usr/bin/sunxi-fel --progress write ${UBI_MEMIMG_ADDR} ${DEPLOY_DIR_IMAGE}/\${UBI_IMAGE}
+	${COMPONENTS_DIR}/x86_64/sunxi-tools-native/usr/bin/sunxi-fel exe ${UBOOT_MEMIMG_ADDR}
+	EOF
+    chmod +x ${DEPLOYDIR}/flash_CHIP_board.sh-${PV}-${PR}
+
+    ln -sf flash_CHIP_board.sh-${PV}-${PR} ${DEPLOYDIR}/flash_CHIP_board.sh
+}
+
+addtask do_deploy after do_compile before do_build
diff --git a/recipes-bsp/chip-u-boot-scr/files/boot.cmd.full b/recipes-bsp/chip-u-boot-scr/files/boot.cmd.full
new file mode 100644
index 0000000..9589c87
--- /dev/null
+++ b/recipes-bsp/chip-u-boot-scr/files/boot.cmd.full
@@ -0,0 +1,32 @@
+echo Scrubbing NAND
+nand scrub -y 0x0 0x200000000
+echo Writing SPL (with ECC) to NAND address 0x0
+nand write.raw.noverify $SPL_MEM_ADDR 0x0 $PADDED_SPL_SIZE
+echo Writing SPL (with ECC) to NAND address 0x400000
+nand write.raw.noverify $SPL_MEM_ADDR 0x400000 $PADDED_SPL_SIZE
+echo Writing UBoot image to address 0x800000
+nand write $UBOOT_MEM_ADDR 0x800000 $PADDED_UBOOT_SIZE
+
+# Setup the default environment
+setenv bootargs root=ubi0:rootfs rootfstype=ubifs rw earlyprintk ubi.mtd=4
+setenv bootcmd 'mtdparts; ubi part UBI; ubifsmount ubi0:rootfs; ubifsload \$fdt_addr_r /boot/sun5i-r8-chip.dtb; ubifsload \$kernel_addr_r /boot/zImage; bootz \$kernel_addr_r - \$fdt_addr_r'
+setenv fel_booted 0
+
+echo Enabling Splash
+setenv stdout serial
+setenv stderr serial
+setenv splashpos m,m
+
+echo Setting Video Mode
+setenv video-mode sunxi:640x480-24 at 60,monitor=composite-ntsc,overscan_x=40,overscan_y=20
+
+echo Saving default environment
+saveenv
+
+echo Writing UBI rootfs to NAND address 0x1000000
+nand write.slc-mode.trimffs $UBI_MEM_ADDR 0x1000000 $UBI_SIZE
+
+echo ===========================================================
+echo Flashing Complete.  Please power down and disable FEL mode.
+echo ===========================================================
+
diff --git a/recipes-bsp/chip-u-boot-scr/files/boot.cmd.in b/recipes-bsp/chip-u-boot-scr/files/boot.cmd.in
new file mode 100644
index 0000000..dc060be
--- /dev/null
+++ b/recipes-bsp/chip-u-boot-scr/files/boot.cmd.in
@@ -0,0 +1,43 @@
+echo Erasing NAND
+nand erase.chip
+echo Writing SPL (with ECC) to NAND address @NAND_FLASH_START_ADDR@
+nand write.raw.noverify @SPL_MEMIMG_ADDR@ @NAND_FLASH_START_ADDR@ @PADDED_SPL_SIZE_BLOCKS@
+echo Writing SPL (with ECC) to NAND address @SPL_FLASH_UPPER_ADDR@
+nand write.raw.noverify @SPL_MEMIMG_ADDR@ @SPL_FLASH_UPPER_ADDR@ @PADDED_SPL_SIZE_BLOCKS@
+echo Writing UBoot image to address 0x800000
+nand write @UBOOT_MEMIMG_ADDR@ @UBOOT_FLASH_ADDR@ @PADDED_UBOOT_SIZE@
+
+# Setup the default environment
+setenv bootargs root=ubi0:rootfs rootfstype=ubifs rw earlyprintk ubi.mtd=4
+setenv bootcmd_ubi 'mtdparts; ubi part UBI; ubifsmount ubi0:rootfs; ubifsload \$fdt_addr_r /boot/sun5i-r8-chip.dtb; ubifsload \$kernel_addr_r /boot/zImage; bootz \$kernel_addr_r - \$fdt_addr_r'
+setenv boot_targets fel ubi usb0 pxe dhcp 
+setenv fel_booted 0
+
+echo Enabling Splash
+setenv stdout serial
+setenv stderr serial
+setenv splashpos m,m
+
+echo Setting Video Mode
+setenv video-mode sunxi:640x480-24 at 60,monitor=composite-ntsc,overscan_x=40,overscan_y=20
+
+echo Saving default environment
+saveenv
+
+echo Writing UBI rootfs to NAND address 0x1000000
+nand write.slc-mode.trimffs @UBI_MEMIMG_ADDR@ @UBI_FLASH_ADDR@ @UBI_SIZE@
+
+
+echo ===========================================================
+echo Flashing Complete.  Please power down and disable FEL mode.
+echo ===========================================================
+
+# Loop continually flashing the status LED
+while true ; do
+    mw.l @SPL_MEMIMG_ADDR@ 0x00000000 1
+    i2c write @SPL_MEMIMG_ADDR@ @LED_I2C_CHIP@ @LED_I2C_ADDR@ 4
+    sleep 1
+    mw.l @SPL_MEMIMG_ADDR@ 0xffffffff 1
+    i2c write @SPL_MEMIMG_ADDR@ @LED_I2C_CHIP@ @LED_I2C_ADDR@ 4
+    sleep 1
+done
diff --git a/recipes-bsp/u-boot/u-boot-chip_git.bb b/recipes-bsp/u-boot/u-boot-chip_git.bb
index f12fae6..008f346 100644
--- a/recipes-bsp/u-boot/u-boot-chip_git.bb
+++ b/recipes-bsp/u-boot/u-boot-chip_git.bb
@@ -6,6 +6,7 @@ LIC_FILES_CHKSUM = "file://Licenses/README;md5=0507cd7da8e7ad6d6701926ec9b84c95"
 
 DEPENDS += "dtc-native"
 PROVIDES += "u-boot"
+RDEPENDS_${PN}_append_chip = " chip-u-boot-scr"
 
 UBOOT_VERSION ?= "2016.01"
 PV = "${UBOOT_VERSION}+git${SRCPV}"
-- 
2.7.4




More information about the yocto mailing list