[Buildroot] [PATCH v3 3/3] Add defconfig for MIPS Creator ci40
Abhimanyu V
abhimanyu.v at imgtec.com
Wed Mar 15 07:06:58 UTC 2017
Thankyou again for review Arnout!
On Tuesday 14 March 2017 02:27 PM, Arnout Vandecappelle wrote:
>
> On 27-02-17 14:38, Abhimanyu V wrote:
>> From: Abhimanyu Vishwakarma <Abhimanyu.Vishwakarma at imgtec.com>
>>
>> Also add post-build script to create fitImage which is used
>> by u-boot to boot the device. It also add post-image script
>> to generate sdcard.img for preparing sdcard/usb device
>>
>> Signed-off-by: Abhimanyu Vishwakarma <Abhimanyu.Vishwakarma at imgtec.com>
>> Reviewed-by: Rahul Bedarkar <Rahul.Bedarkar at imgtec.com>
>> ---
>> Changes v1->v2
>> - No change
>> Changes v2->v3 (Suggested by Arnout)
>> - Remove uImage and add fitImage generation
>> - Tidy readme.txt
>> - Tidy ci40_defconfig, remove custom toolchain and add wifi helper packages
>> Some changes are not done:
>> - Using git-helper:
>> - Custom kernel doesnt provide tar file, so it didnt work for me
> Works for me:
> https://github.com/CreatorDev/linux/archive/openwrt-4.4.14/linux-openwrt-4.4.14.tar.gz
Oh, i must be doing something wrong, thankyou for suggestion.
>
>
>> board/ci40/create_fitImage.sh | 29 ++++++++++++++++++++++
>> board/ci40/fitImage.its | 52 +++++++++++++++++++++++++++++++++++++++
>> board/ci40/genimage.cfg | 13 ++++++++++
>> board/ci40/post-image.sh | 15 ++++++++++++
>> board/ci40/readme.txt | 57 +++++++++++++++++++++++++++++++++++++++++++
>> configs/ci40_defconfig | 47 +++++++++++++++++++++++++++++++++++
>> 6 files changed, 213 insertions(+)
>> create mode 100755 board/ci40/create_fitImage.sh
>> create mode 100644 board/ci40/fitImage.its
>> create mode 100644 board/ci40/genimage.cfg
>> create mode 100755 board/ci40/post-image.sh
>> create mode 100644 board/ci40/readme.txt
>> create mode 100644 configs/ci40_defconfig
>>
>> diff --git a/board/ci40/create_fitImage.sh b/board/ci40/create_fitImage.sh
>> new file mode 100755
>> index 0000000..6ad9b3a
>> --- /dev/null
>> +++ b/board/ci40/create_fitImage.sh
>> @@ -0,0 +1,29 @@
>> +#!/bin/sh
>> +
>> +# inputs
>> +BOARD_DIR="$(dirname $0)"
>> +FIT_ITS_FILE=$BOARD_DIR/fitImage.its
> Since this is a template file, call it fitImage.its.in
Thanks
>
>> +MKIMAGE=$HOST_DIR/usr/bin/mkimage
>> +UIMAGE=$BINARIES_DIR/uImage
>> +
>> +#output
>> +MODIFIED_FIT_ITS=$BINARIES_DIR/fitImage.its
>> +FITIMAGE=$BINARIES_DIR/fitImage
>> +
>> +# Extract kernel load address and entry address from uImage
>> +load=0x$($MKIMAGE -l $UIMAGE | grep "Load Address: " | sed 's/Load Address: //g')
>> +entry=0x$($MKIMAGE -l $UIMAGE | grep "Entry Point: " | sed 's/Entry Point: //g')
>> +
>> +# Create a copy of fitImage.its file and replace these address in that file
>> +cp $FIT_ITS_FILE $MODIFIED_FIT_ITS
>> +sed -i "s/load = <0>;/load = <$load>;/1" $MODIFIED_FIT_ITS
> The /1 is a little useless, there is only one such statement in a line.
> Instead, I would anchor the expression at the end of the line.
>
> Also, it's nicer to use something clearly invalid in the template, e.g.
> load = <@load@>;
> This would also allow to make the substitution more generic, just replacing all
> occurences of @load@ instead of matching the specific line.
>
>> +sed -i "s/entry = <0>;/entry = <$entry>;/1" $MODIFIED_FIT_ITS
> Small nit: we generally prefer to do the manipulations while copying, i.e.
>
> sed -e "s/@load@/$load/g" \
> -e "s/@entry@/$entry/g \
> $FIT_ITS_FILE > $MODIFIED_FIT_ITS
Thanks!
>> +
>> +# copy vmlinux.bin.gz to output/images, it is used in .its file
>> +cp -a $LINUX_DIR/arch/mips/boot/vmlinux.bin.gz $BINARIES_DIR
> I could be mistaken, but isn't it possible to select
> BR2_LINUX_KERNEL_VMLINUX_BIN, then gzip the image which is already in
> $BINARIES_DIR? Of course it's not a perfect solution either because you can't
> extract $load and $entry from it... So forget about that idea.
>
> Another option is to ask your kernel developers to use a FIT image as the
> uImage in linux arch/mips/boot/Makefile. For now, however, your current solution
> is OK for Buildroot.
Yes this is something i also had in my mind, i will start the discussion
with the team which manage this
repo. Once we have this solution in place i will update it in follow up
patch.
>
>> +
>> +# create fitImage
>> +$MKIMAGE -f $MODIFIED_FIT_ITS $FITIMAGE
>> +
>> +# copy to target
>> +cp -a $FITIMAGE $TARGET_DIR/fitImage
> Just to be sure I understand this correctly: U-Boot will look for a file called
> fitImage in the root directory of an ext2 filesystem on MMC/USB? I'm asking
> because usually it is either a FAT partition, or it looks in the /boot directory.
Ci40 bootloader is coded to boot from either ubi volume "kernel" or from
the rootfs.
Since i have not added ubi volume support yet, i copied the fitImage to
rootfs root. to support
booting from /boot, u-boot change will require.
>
>> diff --git a/board/ci40/fitImage.its b/board/ci40/fitImage.its
>> new file mode 100644
>> index 0000000..0812eb3
>> --- /dev/null
>> +++ b/board/ci40/fitImage.its
>> @@ -0,0 +1,52 @@
>> +/*
>> + * Description file for fitImage
>> + */
>> +
>> +/dts-v1/;
>> +
>> +/ {
>> + description = "Buildroot CI40 FTD Image";
>> + #address-cells = <1>;
>> +
>> + images {
>> + kernel at 1 {
>> + description = "Linux kernel";
>> + data = /incbin/("./vmlinux.bin.gz");
>> + type = "kernel";
>> + arch = "mips";
>> + os = "linux";
>> + compression = "gzip";
>> + load = <0>;
>> + entry = <0>;
>> + hash at 1 {
>> + algo = "crc32";
>> + };
>> + hash at 2 {
>> + algo = "sha1";
>> + };
>> + };
>> + marduk-fdt at 1 {
>> + description = "CI40 Flattened Device Tree blob";
>> + data = /incbin/("./pistachio_marduk.dtb");
> Just an idea: perhaps the create_fitImage script could take the DTB as an
> argument as well, or use the first DTB found in $BINARIES_DIR.
Passing dtb as argument is nice idea i will update this.
>
>> + type = "flat_dt";
>> + arch = "mips";
>> + compression = "none";
>> + hash at 1 {
>> + algo = "crc32";
>> + };
>> + hash at 2 {
>> + algo = "sha1";
>> + };
>> + };
>> + };
>> +
>> + configurations {
>> + default = "config at 1";
>> + config at 1 {
>> + description = "CI40 dtb";
>> + kernel = "kernel at 1";
>> + fdt = "marduk-fdt at 1";
>> + };
>> + };
>> +};
>> +
>> diff --git a/board/ci40/genimage.cfg b/board/ci40/genimage.cfg
>> new file mode 100644
>> index 0000000..8b4303a
>> --- /dev/null
>> +++ b/board/ci40/genimage.cfg
>> @@ -0,0 +1,13 @@
>> +# Minimal SD card image
>> +#
>> +
>> +image sdcard.img {
>> + hdimage {
>> + }
>> +
>> + partition rootfs {
>> + partition-type = 0x83
>> + image = "rootfs.ext4"
>> + size = 256M # Maximum firmware size in partition is 268M
> There is no need to specify the size. The filesystem size will anyway be
> whatever it was created as. The size you specify here is the partition size. But
> the difference between filesystem size and partition size will anyway not be
> useable until you do a resize2fs. So I think it's easier to leave the size open.
Ok
>> + }
>> +}
>> diff --git a/board/ci40/post-image.sh b/board/ci40/post-image.sh
>> new file mode 100755
>> index 0000000..18e76aa
>> --- /dev/null
>> +++ b/board/ci40/post-image.sh
>> @@ -0,0 +1,15 @@
>> +#!/usr/bin/env bash
>> +
>> +BOARD_DIR="$(dirname $0)"
>> +GENIMAGE_CFG="${BOARD_DIR}/genimage.cfg"
>> +GENIMAGE_TMP="${BUILD_DIR}/genimage.tmp"
>> +
>> +rm -rf "${GENIMAGE_TMP}"
>> +
>> +genimage \
>> + --rootpath "${TARGET_DIR}" \
>> + --tmppath "${GENIMAGE_TMP}" \
>> + --inputpath "${BINARIES_DIR}" \
>> + --outputpath "${BINARIES_DIR}" \
>> + --config "${GENIMAGE_CFG}"
>> +
>> diff --git a/board/ci40/readme.txt b/board/ci40/readme.txt
>> new file mode 100644
>> index 0000000..252c19d
>> --- /dev/null
>> +++ b/board/ci40/readme.txt
>> @@ -0,0 +1,57 @@
>> +*********************
>> +* MIPS Creator CI40 *
>> +*********************
>> +
>> +The 'ci40_defconfig' will create a root filesystem and a fitImage
>> +under the 'output/images/' directory. This document will try to explain how
> ^^^^^^^^^^^^^^^^^^^
> just "explains"
Thanks
>
>> +to use them in order to run Buildroot in the MIPS Creator CI40 board.
>> +
>> +Prepare USB/MMC for boot
>> +------------------------
>> +It can be done 2 ways:
>> +
>> +1. Using "sdcard.img" file created in output/images folder
>> +
>> +Use following command to write image to bootable device
>> +
>> +# dd if=./output/images/sdcard.img of=/dev/<your-microsd-or-usb-device>
>> +
>> +2. Manually preparing USB/MMC device
>> +
>> +Extract the generated root filesystem "rootfs.tar" into a ext4 formatted
>> +USB drive or SD-Card.
>> +
>> +Booting from USB/MMC
>> +--------------------
>> +Here you have the instructions to boot from the two of them. You have to
>> +choose the one you prefer:
>> +
>> +From USB
>> + pistachio # run usbboot
> I guess these are U-Boot commands? Perhaps that should be clarified as well.
>
> I would also start with something like
>
> The boot loader is already present in NOR flash. To boot your newly generated
> Linux and root filesystem, you need to interrupt U-Boot. <Explain how to
> interrupt U-Boot>.
>
> Perhaps also explain how to make it persistent:
>
> # setenv bootcmd run usbboot
> # saveenv
>
Shall update this in next patch.
>> +
>> +From SD-Card
>> + pistachio # run mmcboot
>> +
>> +Booting from network (nfsboot)
>> +------------------------------
>> +Prepare nfs root and extract rootfs.tar file into it.
> ^(See Buildroot manual)
>
>> +
>> + pistachio # setenv serverip <server-ip-address>
>> + pistachio # setenv rootpath <nfs root path>
>> + pistachio # run netboot
>> +
>> +Flash new bootloader
>> +--------------------
>> +After booting with above method. Copy file u-boot-pistachio_marduk-2015.10-v1.0.4.img
>> +to /tmp. Use following command to flash new bootloader:
>> +
>> +# flashcp -v /tmp/u-boot-pistachio_marduk-2015.10-v1.0.4.img /dev/mtd0
> I never used flashcp. It doesn't need a preceding flash_erase like nandwrite?
>
Yes, flashcp run erase first, example output is:
# flashcp -v u-boot-pistachio_marduk-2015.10-v1.0.4.img /dev/mtd0
Erasing blocks: 384/384 (100%)
Writing data: 1536k/0k (100%))
Verifying data: 1536k/0k (100%))
>> +
>> +Online docs
>> +-----------
>> +mostly for openwrt but it also applicable on buildroot
> Mostly for OpenWRT ^is to
>
>> +https://docs.creatordev.io/ci40/guides/openwrt-platform/#overview
>> +
>> +Prebuilt uboot
>> +--------------
>> +http://downloads.creatordev.io/?q=u-boot/
> In general a very clear explanation!
>
>
>> diff --git a/configs/ci40_defconfig b/configs/ci40_defconfig
>> new file mode 100644
>> index 0000000..cf5972e
>> --- /dev/null
>> +++ b/configs/ci40_defconfig
>> @@ -0,0 +1,47 @@
>> +# architecture
>> +BR2_mipsel=y
>> +BR2_mips_32r2=y
>> +
>> +# linux header same as custom kernel ie 4.4.x
>> +BR2_PACKAGE_HOST_LINUX_HEADERS_CUSTOM_4_4=y
>> +
>> +# kernel
>> +BR2_LINUX_KERNEL=y
>> +BR2_LINUX_KERNEL_CUSTOM_GIT=y
>> +BR2_LINUX_KERNEL_CUSTOM_REPO_URL="https://github.com/CreatorDev/linux.git"
>> +BR2_LINUX_KERNEL_CUSTOM_REPO_VERSION="openwrt-4.4.14"
>> +BR2_LINUX_KERNEL_DEFCONFIG="pistachio"
>> +BR2_LINUX_KERNEL_DTS_SUPPORT=y
>> +BR2_LINUX_KERNEL_INTREE_DTS_NAME="img/pistachio_marduk"
>> +
>> +# bootloader flash support
>> +BR2_PACKAGE_MTD=y
>> +
>> +# wireless firmware
>> +BR2_PACKAGE_UCCP420WLAN=y
>> +
>> +# wireless package
>> +BR2_PACKAGE_WIRELESS_TOOLS=y
>> +BR2_PACKAGE_WPA_SUPPLICANT=y
>> +BR2_PACKAGE_WPA_SUPPLICANT_PASSPHRASE=y
>> +
>> +# bootloader
>> +BR2_TARGET_UBOOT=y
>> +BR2_TARGET_UBOOT_BOARDNAME="pistachio_marduk"
>> +BR2_TARGET_UBOOT_CUSTOM_TARBALL=y
>> +BR2_TARGET_UBOOT_CUSTOM_TARBALL_LOCATION="https://github.com/CreatorDev/u-boot/archive/v1.0.4.tar.gz"
> You can use archive/v1.0.4/u-boot-CreatorDev-v1.0.4.tar.gz to have a reasonable
> name for the tarball.
Thanks, i didnt know these tricks with github :)
>
> Regards,
> Arnout
>
>> +BR2_TARGET_UBOOT_FORMAT_CUSTOM=y
>> +BR2_TARGET_UBOOT_FORMAT_CUSTOM_NAME="u-boot-pistachio_marduk-2015.10-v1.0.4.img"
>> +
>> +# fitimage / image generation
>> +BR2_PACKAGE_HOST_UBOOT_TOOLS=y
>> +BR2_PACKAGE_HOST_UBOOT_TOOLS_FIT_SUPPORT=y
>> +BR2_PACKAGE_HOST_UBOOT_TOOLS_FIT_SIGNATURE_SUPPORT=y
>> +BR2_ROOTFS_POST_BUILD_SCRIPT="board/ci40/create_fitImage.sh"
>> +
>> +# image generation
>> +BR2_TARGET_ROOTFS_EXT2=y
>> +BR2_TARGET_ROOTFS_EXT2_4=y
>> +BR2_PACKAGE_HOST_GENIMAGE=y
>> +BR2_ROOTFS_POST_IMAGE_SCRIPT="board/ci40/post-image.sh"
>> +
>>
Thanks again!
Regards,
Abhimanyu V
More information about the buildroot
mailing list