diff --git a/bin/rda8810_modem.bin b/bin/rda8810_modem.bin new file mode 100644 index 000000000..61a1c3e6f Binary files /dev/null and b/bin/rda8810_modem.bin differ diff --git a/config/boards/orangepi2g-iot.wip b/config/boards/orangepi2g-iot.wip new file mode 100644 index 000000000..b800ba581 --- /dev/null +++ b/config/boards/orangepi2g-iot.wip @@ -0,0 +1,8 @@ +# RDA8810 Wi-Fi BT 2G headless +BOARD_NAME="Orange Pi 2G-IOT" +LINUXFAMILY="rda8810" +BOOTCONFIG="rda8810_config" +MODULES="" +CLI_TARGET="" +KERNEL_TARGET="default" +BUILD_DESKTOP="no" diff --git a/config/boards/orangepiwin.conf b/config/boards/orangepiwin.conf new file mode 100644 index 000000000..0f40374fb --- /dev/null +++ b/config/boards/orangepiwin.conf @@ -0,0 +1,20 @@ +# A64 1GB RAM +BOARD_NAME="Orange Pi Win" +LINUXFAMILY="sun50iw2" +BOOTCONFIG="orangepi_win_defconfig" +MODULES="" +MODULES_NEXT="" +CPUMIN="480000" +CPUMAX="1296000" +# +CLI_TARGET="" +DESKTOP_TARGET="" +KERNEL_TARGET="dev" +# +CLI_BETA_TARGET="xenial:dev" +DESKTOP_BETA_TARGET="xenial:dev" +# +BOARDRATING="" +CHIP="https://docs.armbian.com/Hardware_Allwinner-H5-A64/" +HARDWARE="https://linux-sunxi.org/Orange_Pi_Win_Plus" +FORUMS="https://forum.armbian.com/index.php/forum/11-other-boards/" \ No newline at end of file diff --git a/config/boards/wandboard-quad.wip b/config/boards/wandboard-quad.wip new file mode 100644 index 000000000..ce9e8d615 --- /dev/null +++ b/config/boards/wandboard-quad.wip @@ -0,0 +1,17 @@ +# Freescale i.MX6 quad core GbE/Wifi/BT +BOARD_NAME="Wandboard Quad" +LINUXFAMILY="cubox" +BOOTCONFIG="wandboard_defconfig" +MODULES="" +MODULES_NEXT="brcmfmac" +CLI_TARGET="jessie,xenial:next" +DESKTOP_TARGET="" +KERNEL_TARGET="next" +# +CLI_BETA_TARGET="" +DESKTOP_BETA_TARGET="" +# +BOARDRATING="" +CHIP="http://docs.armbian.com/Hardware_Freescale-imx6/#cubox-and-hummingboard-boards" +HARDWARE="http://www.wandboard.org" +FORUMS="http://forum.armbian.com/index.php/forum/5-freescale-imx6x" diff --git a/config/bootscripts/boot-rda8810.cmd b/config/bootscripts/boot-rda8810.cmd new file mode 100644 index 000000000..3484f8f1a --- /dev/null +++ b/config/bootscripts/boot-rda8810.cmd @@ -0,0 +1,36 @@ +# DO NOT EDIT THIS FILE +# +# Please edit /boot/armbianEnv.txt to set supported parameters +# + +# default values +setenv verbosity "1" +setenv init_modem "yes" + +if test "${boot_device}" = "mmc"; then + + setenv rootdev "/dev/mmcblk0p2" + setenv rootfstype "ext4" + + if ext2load mmc 0:1 ${load_addr} armbianEnv.txt; then + env import -t ${load_addr} ${filesize} + fi + + setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} console=ttyS0,921600 panic=10 consoleblank=0 loglevel=${verbosity} ${extraargs} ${extraboardargs}" + + ext2load mmc 0:1 ${initrd_addr} uInitrd + ext2load mmc 0:1 ${kernel_addr} zImage + ext2load mmc 0:1 ${modem_addr} modem.bin +else + echo "NAND boot is not implemented yet" +fi + +if test "${init_modem}" = "yes"; then + mdcom_loadm ${modem_addr} + mdcom_check 1 +fi + +bootz ${kernel_addr} ${initrd_addr} + +# Recompile with: +# mkimage -C none -A arm -T script -d /boot/boot.cmd /boot/boot.scr diff --git a/config/sources/cubox.conf b/config/sources/cubox.conf index b7fd850ae..05559dcbb 100644 --- a/config/sources/cubox.conf +++ b/config/sources/cubox.conf @@ -21,6 +21,7 @@ case $BRANCH in KERNELSOURCE=$MAINLINE_KERNEL_SOURCE KERNELBRANCH=$MAINLINE_KERNEL_BRANCH KERNELDIR=$MAINLINE_KERNEL_DIR + BOOTPATCHDIR='u-boot-cubox-next' ;; dev) @@ -42,6 +43,22 @@ write_uboot_platform() dd if=$1/u-boot.img of=$2 bs=1K seek=42 status=noxfer > /dev/null 2>&1 } +if [[ $BOARD == "wandboard-quad" ]]; then + unset UBOOT_NEEDS_GCC && UBOOT_ALT_GCC='> 6.1' + unset KERNEL_NEEDS_GCC && KERNEL_ALT_GCC='> 6.1' + CPUMAX=1008000 + GOVERNOR=ondemand + HAS_UUID_SUPPORT=yes + BOOTSOURCE=$MAINLINE_UBOOT_SOURCE + BOOTDIR=$MAINLINE_UBOOT_DIR + BOOTBRANCH="branch:v2017.03" + write_uboot_platform() + { + dd if=$1/SPL of=$2 bs=512 seek=2 status=noxfer > /dev/null 2>&1 + dd if=$1/u-boot.img of=$2 seek=69 bs=1k status=noxfer > /dev/null 2>&1 + } +fi + family_tweaks() { # default lirc configuration diff --git a/config/sources/rda8810.conf b/config/sources/rda8810.conf new file mode 100644 index 000000000..e5c0ae1cc --- /dev/null +++ b/config/sources/rda8810.conf @@ -0,0 +1,33 @@ +BOOTSOURCE='https://github.com/zador-blood-stained/u-boot-orangepi2g' +BOOTBRANCH='branch:master' +BOOTDIR='u-boot-rda8810' +BOOTPATCHDIR='u-boot-rda8810' +BOOTSCRIPT='boot-rda8810.cmd:boot.cmd' + +BOOTFS_TYPE=ext2 +OFFSET=2 + +UBOOT_TARGET_MAP=';;u-boot.rda' + +UBOOT_NEEDS_GCC='< 5.0' +UBOOT_COMPILER='arm-linux-gnueabi-' + +KERNELSOURCE='https://github.com/zador-blood-stained/linux-orangepi2g' +KERNELBRANCH='branch:master' +KERNELDIR='linux-rda8810' + +KERNEL_NEEDS_GCC='< 5.0' + +CPUMIN=392000 +CPUMAX=996000 +GOVERNOR=interactive + +write_uboot_platform() +{ + dd if=$1/u-boot.rda of=$2 bs=512 seek=256 count=4096 status=noxfer > /dev/null 2>&1 +} + +family_tweaks() +{ + cp $SRC/lib/bin/rda8810_modem.bin $CACHEDIR/$SDCARD/boot/modem.bin +} diff --git a/config/sources/rockchip.conf b/config/sources/rockchip.conf index 935d95285..24de0765d 100644 --- a/config/sources/rockchip.conf +++ b/config/sources/rockchip.conf @@ -1,15 +1,16 @@ BOOTSCRIPT="boot-rockchip.cmd:boot.cmd" BOOTENV_FILE='rockchip-default.txt' -UBOOT_TARGET_MAP=";;$SRC/lib/bin/rk3288_boot.bin u-boot-dtb.img spl/u-boot-spl-dtb.bin" +UBOOT_TARGET_MAP=";;$SRC/lib/bin/rk3288_boot.bin u-boot-dtb.bin spl/u-boot-spl-dtb.bin" UBOOT_ALT_GCC='> 6.1' HAS_UUID_SUPPORT=yes BOOTDELAY=0 -BOOTSOURCE='https://github.com/mqmaker/u-boot-rockchip' -BOOTBRANCH='branch:miqi/devel' -BOOTDIR='u-boot-miqi' +BOOTSOURCE=$MAINLINE_UBOOT_SOURCE +BOOTDIR=$MAINLINE_UBOOT_DIR +BOOTBRANCH="branch:master" + SERIALCON=ttyS2 case $BRANCH in @@ -31,31 +32,15 @@ CPUMIN="600000" CPUMAX="1900000" GOVERNOR="conservative" + write_uboot_platform() { dd if=/dev/zero of=$2 bs=1k count=1023 seek=1 status=noxfer > /dev/null 2>&1 mkimage -n rk3288 -T rksd -d $1/u-boot-spl-dtb.bin $1/out > /dev/null 2>&1 - dd if=$1/out of=$2 seek=64 status=noxfer > /dev/null 2>&1 - dd if=$1/u-boot-dtb.img of=$2 seek=256 status=noxfer > /dev/null 2>&1 + cat $1/u-boot-dtb.bin >> $1/out + dd if=$1/out of=$2 seek=64 conv=notrunc > /dev/null 2>&1 } -if [[ $BOARD == "tinkerboard" ]]; then - - UBOOT_TARGET_MAP=";;$SRC/lib/bin/rk3288_boot.bin u-boot-dtb.bin spl/u-boot-spl-dtb.bin" - - BOOTSOURCE=$MAINLINE_UBOOT_SOURCE - BOOTDIR=$MAINLINE_UBOOT_DIR - BOOTBRANCH="branch:master" - - write_uboot_platform() - { - dd if=/dev/zero of=$2 bs=1k count=1023 seek=1 status=noxfer > /dev/null 2>&1 - mkimage -n rk3288 -T rksd -d $1/u-boot-spl-dtb.bin $1/out > /dev/null 2>&1 - cat $1/u-boot-dtb.bin >> $1/out - dd if=$1/out of=$2 seek=64 conv=notrunc > /dev/null 2>&1 - } -fi - family_tweaks() { diff --git a/patch/kernel/rda8810-default/packaging-3.10-DEFAULT.patch b/patch/kernel/rda8810-default/packaging-3.10-DEFAULT.patch new file mode 100644 index 000000000..7951baf48 --- /dev/null +++ b/patch/kernel/rda8810-default/packaging-3.10-DEFAULT.patch @@ -0,0 +1,349 @@ +diff --git a/scripts/package/builddeb b/scripts/package/builddeb +index 3001ec5a..bcf4cac1 100644 +--- a/scripts/package/builddeb ++++ b/scripts/package/builddeb +@@ -61,8 +63,30 @@ create_package() { + forcearch="-DArchitecture=$debarch" + fi + ++ # Create preinstall and post install script to remove dtb ++ if [[ "$1" == *dtb* ]]; then ++ echo "if [ -d /boot/dtb-$version ]; then mv /boot/dtb-$version /boot/dtb-$version.old; fi" >> $pdir/DEBIAN/preinst ++ echo "if [ -d /boot/dtb.old ]; then rm -rf /boot/dtb.old; fi" >> $pdir/DEBIAN/preinst ++ echo "if [ -d /dtb ]; then mv /dtb /dtb.old; fi" >> $pdir/DEBIAN/preinst ++ echo "if [ -d /boot/dtb ]; then mv /boot/dtb /boot/dtb.old; fi" >> $pdir/DEBIAN/preinst ++ echo "exit 0" >> $pdir/DEBIAN/preinst ++ chmod 775 $pdir/DEBIAN/preinst ++ # ++ echo "if [ -d /boot/dtb.old ]; then rm -rf /boot/dtb.old; fi" >> $pdir/DEBIAN/postinst ++ echo "ln -sf dtb-$version /boot/dtb > /dev/null 2>&1 || mv /boot/dtb-$version /boot/dtb" >> $pdir/DEBIAN/postinst ++ echo "exit 0" >> $pdir/DEBIAN/postinst ++ chmod 775 $pdir/DEBIAN/postinst ++ fi ++ ++ # Create postinstall script for headers ++ if [[ "$1" == *headers* ]]; then ++ echo "cd /usr/src/linux-headers-$version; echo \"Compiling headers - please wait ...\"; make -s scripts >/dev/null 2>&1" >> $pdir/DEBIAN/postinst ++ echo "exit 0" >> $pdir/DEBIAN/postinst ++ chmod 775 $pdir/DEBIAN/postinst ++ fi ++ + # Create the package +- dpkg-gencontrol -isp $forcearch -Vkernel:debarch="${debarch:-$(dpkg --print-architecture)}" -p$pname -P"$pdir" ++ dpkg-gencontrol $forcearch -Vkernel:debarch="${debarch:-$(dpkg --print-architecture)}" -p$pname -P"$pdir" + dpkg --build "$pdir" .. + } + +@@ -78,49 +102,72 @@ tmpdir="$objtree/debian/tmp" + fwdir="$objtree/debian/fwtmp" + kernel_headers_dir="$objtree/debian/hdrtmp" + libc_headers_dir="$objtree/debian/headertmp" +-packagename=linux-image-$version +-fwpackagename=linux-firmware-image +-kernel_headers_packagename=linux-headers-$version +-libc_headers_packagename=linux-libc-dev ++dtb_dir="$objtree/debian/dtbtmp" ++dbg_dir="$objtree/debian/dbgtmp" ++packagename=linux-image"$LOCALVERSION" ++fwpackagename=linux-firmware-image"$LOCALVERSION" ++kernel_headers_packagename=linux-headers"$LOCALVERSION" ++dtb_packagename=linux-dtb"$LOCALVERSION" ++libc_headers_packagename=linux-libc-dev"$LOCALVERSION" ++dbg_packagename=$packagename-dbg + + if [ "$ARCH" = "um" ] ; then + packagename=user-mode-linux-$version + fi + ++# Not all arches have the same installed path in debian ++# XXX: have each arch Makefile export a variable of the canonical image install ++# path instead ++case $ARCH in ++um) ++ installed_image_path="usr/bin/linux-$version" ++ ;; ++parisc|mips|powerpc) ++ installed_image_path="boot/vmlinux-$version" ++ ;; ++*) ++ installed_image_path="boot/zImage-$version" ++esac ++ ++BUILD_DEBUG="$(grep -s '^CONFIG_DEBUG_INFO=y' $KCONFIG_CONFIG || true)" ++ + # Setup the directory structure +-rm -rf "$tmpdir" "$fwdir" "$kernel_headers_dir" "$libc_headers_dir" ++rm -rf "$tmpdir" "$fwdir" "$kernel_headers_dir" "$libc_headers_dir" "$dbg_dir" "$dtb_dir" + mkdir -m 755 -p "$tmpdir/DEBIAN" + mkdir -p "$tmpdir/lib" "$tmpdir/boot" "$tmpdir/usr/share/doc/$packagename" + mkdir -m 755 -p "$fwdir/DEBIAN" + mkdir -p "$fwdir/lib/firmware/$version/" "$fwdir/usr/share/doc/$fwpackagename" + mkdir -m 755 -p "$libc_headers_dir/DEBIAN" + mkdir -p "$libc_headers_dir/usr/share/doc/$libc_headers_packagename" ++ ++mkdir -m 755 -p "$dtb_dir/DEBIAN" ++mkdir -p "$dtb_dir/boot/dtb-$version" "$dtb_dir/usr/share/doc/$dtb_packagename" ++ + mkdir -m 755 -p "$kernel_headers_dir/DEBIAN" + mkdir -p "$kernel_headers_dir/usr/share/doc/$kernel_headers_packagename" + mkdir -p "$kernel_headers_dir/lib/modules/$version/" + if [ "$ARCH" = "um" ] ; then + mkdir -p "$tmpdir/usr/lib/uml/modules/$version" "$tmpdir/usr/bin" + fi ++if [ -n "$BUILD_DEBUG" ] ; then ++ mkdir -p "$dbg_dir/usr/share/doc/$dbg_packagename" ++ mkdir -m 755 -p "$dbg_dir/DEBIAN" ++fi + + # Build and install the kernel + if [ "$ARCH" = "um" ] ; then + $MAKE linux + cp System.map "$tmpdir/usr/lib/uml/modules/$version/System.map" +- cp .config "$tmpdir/usr/share/doc/$packagename/config" ++ cp $KCONFIG_CONFIG "$tmpdir/usr/share/doc/$packagename/config" + gzip "$tmpdir/usr/share/doc/$packagename/config" +- cp $KBUILD_IMAGE "$tmpdir/usr/bin/linux-$version" +-else ++else + cp System.map "$tmpdir/boot/System.map-$version" +- cp .config "$tmpdir/boot/config-$version" +- # Not all arches include the boot path in KBUILD_IMAGE +- if [ -e $KBUILD_IMAGE ]; then +- cp $KBUILD_IMAGE "$tmpdir/boot/vmlinuz-$version" +- else +- cp arch/$ARCH/boot/$KBUILD_IMAGE "$tmpdir/boot/vmlinuz-$version" +- fi ++ cp $KCONFIG_CONFIG "$tmpdir/boot/config-$version" + fi ++# odroid c1 need uimage ++cp arch/$ARCH/boot/zImage "$tmpdir/$installed_image_path" + +-if grep -q '^CONFIG_MODULES=y' .config ; then ++if grep -q '^CONFIG_MODULES=y' $KCONFIG_CONFIG ; then + INSTALL_MOD_PATH="$tmpdir" $MAKE KBUILD_SRC= modules_install + rm -f "$tmpdir/lib/modules/$version/build" + rm -f "$tmpdir/lib/modules/$version/source" +@@ -128,6 +175,24 @@ if grep -q '^CONFIG_MODULES=y' .config ; then + mv "$tmpdir/lib/modules/$version"/* "$tmpdir/usr/lib/uml/modules/$version/" + rmdir "$tmpdir/lib/modules/$version" + fi ++ if [ -n "$BUILD_DEBUG" ] ; then ++ for module in $(find $tmpdir/lib/modules/ -name *.ko -printf '%P\n'); do ++ module=lib/modules/$module ++ mkdir -p $(dirname $dbg_dir/usr/lib/debug/$module) ++ # only keep debug symbols in the debug file ++ $OBJCOPY --only-keep-debug $tmpdir/$module $dbg_dir/usr/lib/debug/$module ++ # strip original module from debug symbols ++ $OBJCOPY --strip-debug $tmpdir/$module ++ # then add a link to those ++ $OBJCOPY --add-gnu-debuglink=$dbg_dir/usr/lib/debug/$module $tmpdir/$module ++ done ++ fi ++fi ++ ++if grep -q '^CONFIG_OF=y' $KCONFIG_CONFIG ; then ++ mkdir -p "$tmpdir/boot/dtb-""$version" ++ cp $objtree/arch/arm/boot/dts/*.dtb $dtb_dir/boot/dtb-$version ++ #INSTALL_DTBS_PATH="$dtb_dir/boot/dtb" $MAKE KBUILD_SRC= dtbs_install + fi + + if [ "$ARCH" != "um" ]; then +@@ -137,24 +202,78 @@ fi + + # Install the maintainer scripts + # Note: hook scripts under /etc/kernel are also executed by official Debian +-# kernel packages, as well as kernel packages built using make-kpkg ++# kernel packages, as well as kernel packages built using make-kpkg. ++# make-kpkg sets $INITRD to indicate whether an initramfs is wanted, and ++# so do we; recent versions of dracut and initramfs-tools will obey this. + debhookdir=${KDEB_HOOKDIR:-/etc/kernel} ++if grep -q '^CONFIG_BLK_DEV_INITRD=y' $KCONFIG_CONFIG; then ++ want_initrd=Yes ++else ++ want_initrd=No ++fi + for script in postinst postrm preinst prerm ; do + mkdir -p "$tmpdir$debhookdir/$script.d" + cat < "$tmpdir/DEBIAN/$script" +-#!/bin/sh ++#!/bin/bash + + set -e + + # Pass maintainer script parameters to hook scripts ++ + export DEB_MAINT_PARAMS="\$*" + +-test -d $debhookdir/$script.d && run-parts --arg="$version" $debhookdir/$script.d ++# Tell initramfs builder whether it's wanted ++ ++export INITRD=$want_initrd ++ ++test -d $debhookdir/$script.d && run-parts --arg="$version" --arg="/$installed_image_path" $debhookdir/$script.d + exit 0 + EOF + chmod 755 "$tmpdir/DEBIAN/$script" + done + ++## ++## Create sym link to kernel image ++## ++kernel_tmp_version="${installed_image_path////\\/}" ++sed -e "s/set -e//g" -i $tmpdir/DEBIAN/postinst ++sed -e "s/exit 0//g" -i $tmpdir/DEBIAN/postinst ++cat >> $tmpdir/DEBIAN/postinst < /dev/null 2>&1 || mv /$kernel_tmp_version /boot/zImage ++ ++ ++exit 0 ++EOT ++## ++## FAT install workaround ++## ++sed -e "s/set -e//g" -i $tmpdir/DEBIAN/preinst ++sed -e "s/exit 0//g" -i $tmpdir/DEBIAN/preinst ++cat >> $tmpdir/DEBIAN/preinst <> $tmpdir/DEBIAN/preinst ++ ++ + # Try to determine maintainer and email values + if [ -n "$DEBEMAIL" ]; then + email=$DEBEMAIL +@@ -172,9 +291,19 @@ else + fi + maintainer="$name <$email>" + ++# Try to determine distribution ++if [ -n "$KDEB_CHANGELOG_DIST" ]; then ++ distribution=$KDEB_CHANGELOG_DIST ++elif distribution=$(lsb_release -cs 2>/dev/null) && [ -n "$distribution" ]; then ++ : # nothing to do in this case ++else ++ distribution="unstable" ++ echo >&2 "Using default distribution of 'unstable' in the changelog" ++ echo >&2 "Install lsb-release or set \$KDEB_CHANGELOG_DIST explicitly" ++fi + # Generate a simple changelog template + cat < debian/changelog +-linux-upstream ($packageversion) unstable; urgency=low ++linux-upstream ($packageversion) $distribution; urgency=low + + * Custom built Linux kernel. + +@@ -242,21 +371,32 @@ EOF + + fi + +-# Build header package +-(cd $srctree; find . -name Makefile\* -o -name Kconfig\* -o -name \*.pl > "$objtree/debian/hdrsrcfiles") +-(cd $srctree; find arch/$SRCARCH/include include scripts -type f >> "$objtree/debian/hdrsrcfiles") +-(cd $objtree; find arch/$SRCARCH/include .config Module.symvers include scripts -type f >> "$objtree/debian/hdrobjfiles") ++# Build kernel header package ++(cd $srctree; find . -name Makefile\* -o -name Kconfig\* -o -name \*.pl) > "$objtree/debian/hdrsrcfiles" ++(cd $srctree; find arch/$SRCARCH/include include scripts -type f) >> "$objtree/debian/hdrsrcfiles" ++(cd $srctree; find arch/$SRCARCH -name module.lds -o -name Kbuild.platforms -o -name Platform) >> "$objtree/debian/hdrsrcfiles" ++(cd $srctree; find $(find arch/$SRCARCH -name include -o -name scripts -type d) -type f) >> "$objtree/debian/hdrsrcfiles" ++(cd $objtree; find arch/$SRCARCH/include Module.symvers include scripts -type f) >> "$objtree/debian/hdrobjfiles" + destdir=$kernel_headers_dir/usr/src/linux-headers-$version + mkdir -p "$destdir" +-(cd $srctree; tar -c -f - -T "$objtree/debian/hdrsrcfiles") | (cd $destdir; tar -xf -) +-(cd $objtree; tar -c -f - -T "$objtree/debian/hdrobjfiles") | (cd $destdir; tar -xf -) ++######################## headers patch ++ZACNI=$(pwd) ++cd $destdir ++patch -p1 < /tmp/headers-debian-byteshift.patch ++cd $ZACNI ++######################## headers patch ++(cd $srctree; tar -c -f - -T -) < "$objtree/debian/hdrsrcfiles" | (cd $destdir; tar -xf -) ++(cd $objtree; tar -c -f - -T -) < "$objtree/debian/hdrobjfiles" | (cd $destdir; tar -xf -) ++(cd $objtree; cp $KCONFIG_CONFIG $destdir/.config) # copy .config manually to be where it's expected to be + ln -sf "/usr/src/linux-headers-$version" "$kernel_headers_dir/lib/modules/$version/build" + rm -f "$objtree/debian/hdrsrcfiles" "$objtree/debian/hdrobjfiles" + ++(cd "$destdir"; make M=scripts clean) ++ + cat <> debian/control + + Package: $kernel_headers_packagename +-Provides: linux-headers, linux-headers-2.6 ++Provides: linux-headers + Architecture: any + Description: Linux kernel headers for $KERNELRELEASE on \${kernel:debarch} + This package provides kernel header files for $KERNELRELEASE on \${kernel:debarch} +@@ -282,6 +422,16 @@ fi + + cat <> debian/control + ++Package: $dtb_packagename ++Architecture: any ++Description: Linux DTB, version $version ++ This package contains device blobs from the Linux kernel, version $version. ++EOF ++ ++#create_package "$dtb_packagename" "$dtb_dir" ++ ++cat <> debian/control ++ + Package: $libc_headers_packagename + Section: devel + Provides: linux-kernel-headers +@@ -293,9 +443,35 @@ EOF + + if [ "$ARCH" != "um" ]; then + create_package "$kernel_headers_packagename" "$kernel_headers_dir" +- create_package "$libc_headers_packagename" "$libc_headers_dir" ++# create_package "$libc_headers_packagename" "$libc_headers_dir" + fi + + create_package "$packagename" "$tmpdir" + +-exit 0 ++if [ -n "$BUILD_DEBUG" ] ; then ++ # Build debug package ++ # Different tools want the image in different locations ++ # perf ++ mkdir -p $dbg_dir/usr/lib/debug/lib/modules/$version/ ++ cp vmlinux $dbg_dir/usr/lib/debug/lib/modules/$version/ ++ # systemtap ++ mkdir -p $dbg_dir/usr/lib/debug/boot/ ++ ln -s ../lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/boot/vmlinux-$version ++ # kdump-tools ++ ln -s lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/vmlinux-$version ++ ++ cat <> debian/control ++ ++Package: $dbg_packagename ++Section: debug ++Provides: linux-debug, linux-debug-$version ++Architecture: any ++Description: Linux kernel debugging symbols for $version ++ This package will come in handy if you need to debug the kernel. It provides ++ all the necessary debug symbols for the kernel and its modules. ++EOF ++ ++ create_package "$dbg_packagename" "$dbg_dir" ++fi ++ ++exit 0 +\ No newline at end of file diff --git a/patch/kernel/sun50iw2-dev/add_orangepiwin_dts.patch b/patch/kernel/sun50iw2-dev/add_orangepiwin_dts.patch new file mode 100644 index 000000000..53a6c10c0 --- /dev/null +++ b/patch/kernel/sun50iw2-dev/add_orangepiwin_dts.patch @@ -0,0 +1,153 @@ +diff --git a/arch/arm64/boot/dts/allwinner/Makefile b/arch/arm64/boot/dts/allwinner/Makefile +index 244e8b7..65dfa1b 100644 +--- a/arch/arm64/boot/dts/allwinner/Makefile ++++ b/arch/arm64/boot/dts/allwinner/Makefile +@@ -1,4 +1,5 @@ + dtb-$(CONFIG_ARCH_SUNXI) += sun50i-a64-bananapi-m64.dtb ++dtb-$(CONFIG_ARCH_SUNXI) += sun50i-a64-orangepiwin.dtb + dtb-$(CONFIG_ARCH_SUNXI) += sun50i-a64-pine64-plus.dtb sun50i-a64-pine64.dtb + dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h5-orangepi-pc2.dtb + +diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-orangepiwin.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-orangepiwin.dts +new file mode 100644 +index 0000000..4fc6ffd +--- /dev/null ++++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-orangepiwin.dts +@@ -0,0 +1,137 @@ ++/* ++ * Copyright (c) 2016 ARM Ltd. ++ * ++ * This file is dual-licensed: you can use it either under the terms ++ * of the GPL or the X11 license, at your option. Note that this dual ++ * licensing only applies to this file, and not this project as a ++ * whole. ++ * ++ * a) This library is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of the ++ * License, or (at your option) any later version. ++ * ++ * This library is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * Or, alternatively, ++ * ++ * b) Permission is hereby granted, free of charge, to any person ++ * obtaining a copy of this software and associated documentation ++ * files (the "Software"), to deal in the Software without ++ * restriction, including without limitation the rights to use, ++ * copy, modify, merge, publish, distribute, sublicense, and/or ++ * sell copies of the Software, and to permit persons to whom the ++ * Software is furnished to do so, subject to the following ++ * conditions: ++ * ++ * The above copyright notice and this permission notice shall be ++ * included in all copies or substantial portions of the Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ++ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES ++ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT ++ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, ++ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING ++ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ * OTHER DEALINGS IN THE SOFTWARE. ++ */ ++ ++#include ++#include ++#include "sun50i-a64-pine64.dts" ++ ++/ { ++ model = "OrangePiWin"; ++ compatible = "orangepiwin", "allwinner,sun50i-a64"; ++ ++ reg_gmac_3v3: gmac-3v3 { ++ compatible = "regulator-fixed"; ++ regulator-name = "gmac-3v3"; ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ startup-delay-us = <100000>; ++ enable-active-high; ++ gpio = <&pio 3 14 GPIO_ACTIVE_HIGH>; ++ }; ++ ++ wifi_pwrseq: wifi_pwrseq { ++ compatible = "mmc-pwrseq-simple"; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&wifi_en_pin>; ++ reset-gpios = <&r_pio 0 8 GPIO_ACTIVE_HIGH>; /* PL8 */ ++ }; ++ ++ reg_usb1_vbus: usb1-vbus { ++ compatible = "regulator-fixed"; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&usb1_vbus_pin_a>; ++ regulator-name = "usb1-vbus"; ++ regulator-min-microvolt = <5000000>; ++ regulator-max-microvolt = <5000000>; ++ regulator-boot-on; ++ enable-active-high; ++ gpio = <&pio 3 7 GPIO_ACTIVE_HIGH>; ++ status = "okay"; ++ }; ++ ++ /* TODO: Camera, touchscreen, etc. */ ++}; ++ ++&emac { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&emac_rgmii_pins>; ++ phy-supply = <®_gmac_3v3>; ++ phy-mode = "rgmii"; ++}; ++ ++&mmc1 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&mmc1_pins>; ++ vmmc-supply = <®_vcc3v3>; ++ vqmmc-supply = <®_vcc3v3>; ++ mmc-pwrseq = <&wifi_pwrseq>; ++ bus-width = <4>; ++ non-removable; ++ status = "okay"; ++ ++ brcmf: bcrmf@1 { ++ reg = <1>; ++ compatible = "brcm,bcm4329-fmac"; ++ interrupt-parent = <&r_pio>; ++ interrupts = <0 7 IRQ_TYPE_LEVEL_LOW>; /* PL7 / EINT7 */ ++ interrupt-names = "host-wake"; ++ }; ++}; ++ ++&pio { ++ usb1_vbus_pin_a: usb1_vbus_pin@0 { ++ allwinner,pins = "PD7"; ++ allwinner,function = "gpio_out"; ++ allwinner,drive = ; ++ allwinner,pull = ; ++ }; ++}; ++ ++&r_pio { ++ wifi_en_pin: wifi_en_pin@0 { ++ allwinner,pins = "PL8"; ++ allwinner,function = "gpio_out"; ++ allwinner,drive = ; ++ allwinner,pull = ; ++ }; ++}; ++ ++&usb_otg { ++ dr_mode = "host"; ++ status = "okay"; ++}; ++ ++&usbphy { ++ usb1_vbus-supply = <®_usb1_vbus>; ++ status = "okay"; ++}; ++ diff --git a/patch/kernel/sun50iw2-dev/add_sun50i_a64_rccu.patch b/patch/kernel/sun50iw2-dev/add_sun50i_a64_rccu.patch new file mode 100644 index 000000000..1ad041f64 --- /dev/null +++ b/patch/kernel/sun50iw2-dev/add_sun50i_a64_rccu.patch @@ -0,0 +1,404 @@ +diff --git a/drivers/clk/sunxi-ng/Kconfig b/drivers/clk/sunxi-ng/Kconfig +index 8af8f4be8e3b..fbd3f8cd5c22 100644 +--- a/drivers/clk/sunxi-ng/Kconfig ++++ b/drivers/clk/sunxi-ng/Kconfig +@@ -151,4 +151,10 @@ config SUN9I_A80_CCU + default MACH_SUN9I + depends on MACH_SUN9I || COMPILE_TEST + ++config SUN8I_R_CCU ++ bool "Support for Allwinner SoCs' PRCM CCUs" ++ select SUNXI_CCU_DIV ++ select SUNXI_CCU_GATE ++ default MACH_SUN8I || (ARCH_SUNXI && ARM64) ++ + endif +diff --git a/drivers/clk/sunxi-ng/Makefile b/drivers/clk/sunxi-ng/Makefile +index 6feaac0c5600..0ec02fe14c50 100644 +--- a/drivers/clk/sunxi-ng/Makefile ++++ b/drivers/clk/sunxi-ng/Makefile +@@ -25,6 +25,7 @@ obj-$(CONFIG_SUN8I_A23_CCU) += ccu-sun8i-a23.o + obj-$(CONFIG_SUN8I_A33_CCU) += ccu-sun8i-a33.o + obj-$(CONFIG_SUN8I_H3_CCU) += ccu-sun8i-h3.o + obj-$(CONFIG_SUN8I_V3S_CCU) += ccu-sun8i-v3s.o ++obj-$(CONFIG_SUN8I_R_CCU) += ccu-sun8i-r.o + obj-$(CONFIG_SUN9I_A80_CCU) += ccu-sun9i-a80.o + obj-$(CONFIG_SUN9I_A80_CCU) += ccu-sun9i-a80-de.o + obj-$(CONFIG_SUN9I_A80_CCU) += ccu-sun9i-a80-usb.o +diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-r.c b/drivers/clk/sunxi-ng/ccu-sun8i-r.c +new file mode 100644 +index 000000000000..0d027d53dbdf +--- /dev/null ++++ b/drivers/clk/sunxi-ng/ccu-sun8i-r.c +@@ -0,0 +1,213 @@ ++/* ++ * Copyright (c) 2016 Icenowy Zheng ++ * ++ * This software is licensed under the terms of the GNU General Public ++ * License version 2, as published by the Free Software Foundation, and ++ * may be copied, distributed, and modified under those terms. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ */ ++ ++#include ++#include ++#include ++ ++#include "ccu_common.h" ++#include "ccu_reset.h" ++ ++#include "ccu_div.h" ++#include "ccu_gate.h" ++#include "ccu_mp.h" ++#include "ccu_nm.h" ++ ++#include "ccu-sun8i-r.h" ++ ++static const char * const ar100_parents[] = { "osc32k", "osc24M", ++ "pll-periph0", "iosc" }; ++ ++static struct ccu_div ar100_clk = { ++ .div = _SUNXI_CCU_DIV_FLAGS(4, 2, CLK_DIVIDER_POWER_OF_TWO), ++ ++ .mux = { ++ .shift = 16, ++ .width = 2, ++ ++ .variable_prediv = { ++ .index = 2, ++ .shift = 8, ++ .width = 5, ++ }, ++ }, ++ ++ .common = { ++ .reg = 0x00, ++ .features = CCU_FEATURE_VARIABLE_PREDIV, ++ .hw.init = CLK_HW_INIT_PARENTS("ar100", ++ ar100_parents, ++ &ccu_div_ops, ++ 0), ++ }, ++}; ++ ++static CLK_FIXED_FACTOR(ahb0_clk, "ahb0", "ar100", 1, 1, 0); ++ ++static struct ccu_div apb0_clk = { ++ .div = _SUNXI_CCU_DIV_FLAGS(0, 2, CLK_DIVIDER_POWER_OF_TWO), ++ ++ .common = { ++ .reg = 0x0c, ++ .hw.init = CLK_HW_INIT("apb0", ++ "ahb0", ++ &ccu_div_ops, ++ 0), ++ }, ++}; ++ ++static SUNXI_CCU_GATE(apb0_pio_clk, "apb0-pio", "apb0", ++ 0x28, BIT(0), 0); ++static SUNXI_CCU_GATE(apb0_ir_clk, "apb0-ir", "apb0", ++ 0x28, BIT(1), 0); ++static SUNXI_CCU_GATE(apb0_timer_clk, "apb0-timer", "apb0", ++ 0x28, BIT(2), 0); ++static SUNXI_CCU_GATE(apb0_rsb_clk, "apb0-rsb", "apb0", ++ 0x28, BIT(3), 0); ++static SUNXI_CCU_GATE(apb0_uart_clk, "apb0-uart", "apb0", ++ 0x28, BIT(4), 0); ++static SUNXI_CCU_GATE(apb0_i2c_clk, "apb0-i2c", "apb0", ++ 0x28, BIT(6), 0); ++static SUNXI_CCU_GATE(apb0_twd_clk, "apb0-twd", "apb0", ++ 0x28, BIT(7), 0); ++ ++static const char * const r_mod0_default_parents[] = { "osc32K", "osc24M" }; ++static SUNXI_CCU_MP_WITH_MUX_GATE(ir_clk, "ir", ++ r_mod0_default_parents, 0x54, ++ 0, 4, /* M */ ++ 16, 2, /* P */ ++ 24, 2, /* mux */ ++ BIT(31), /* gate */ ++ 0); ++ ++static struct ccu_common *sun8i_h3_r_ccu_clks[] = { ++ &ar100_clk.common, ++ &apb0_clk.common, ++ &apb0_pio_clk.common, ++ &apb0_ir_clk.common, ++ &apb0_timer_clk.common, ++ &apb0_uart_clk.common, ++ &apb0_i2c_clk.common, ++ &apb0_twd_clk.common, ++ &ir_clk.common, ++}; ++ ++static struct ccu_common *sun50i_a64_r_ccu_clks[] = { ++ &ar100_clk.common, ++ &apb0_clk.common, ++ &apb0_pio_clk.common, ++ &apb0_ir_clk.common, ++ &apb0_timer_clk.common, ++ &apb0_rsb_clk.common, ++ &apb0_uart_clk.common, ++ &apb0_i2c_clk.common, ++ &apb0_twd_clk.common, ++ &ir_clk.common, ++}; ++ ++static struct clk_hw_onecell_data sun8i_h3_r_hw_clks = { ++ .hws = { ++ [CLK_AR100] = &ar100_clk.common.hw, ++ [CLK_AHB0] = &ahb0_clk.hw, ++ [CLK_APB0] = &apb0_clk.common.hw, ++ [CLK_APB0_PIO] = &apb0_pio_clk.common.hw, ++ [CLK_APB0_IR] = &apb0_ir_clk.common.hw, ++ [CLK_APB0_TIMER] = &apb0_timer_clk.common.hw, ++ [CLK_APB0_UART] = &apb0_uart_clk.common.hw, ++ [CLK_APB0_I2C] = &apb0_i2c_clk.common.hw, ++ [CLK_APB0_TWD] = &apb0_twd_clk.common.hw, ++ [CLK_IR] = &ir_clk.common.hw, ++ }, ++ .num = CLK_NUMBER, ++}; ++ ++static struct clk_hw_onecell_data sun50i_a64_r_hw_clks = { ++ .hws = { ++ [CLK_AR100] = &ar100_clk.common.hw, ++ [CLK_AHB0] = &ahb0_clk.hw, ++ [CLK_APB0] = &apb0_clk.common.hw, ++ [CLK_APB0_PIO] = &apb0_pio_clk.common.hw, ++ [CLK_APB0_IR] = &apb0_ir_clk.common.hw, ++ [CLK_APB0_TIMER] = &apb0_timer_clk.common.hw, ++ [CLK_APB0_RSB] = &apb0_rsb_clk.common.hw, ++ [CLK_APB0_UART] = &apb0_uart_clk.common.hw, ++ [CLK_APB0_I2C] = &apb0_i2c_clk.common.hw, ++ [CLK_APB0_TWD] = &apb0_twd_clk.common.hw, ++ [CLK_IR] = &ir_clk.common.hw, ++ }, ++ .num = CLK_NUMBER, ++}; ++ ++static struct ccu_reset_map sun8i_h3_r_ccu_resets[] = { ++ [RST_APB0_IR] = { 0xb0, BIT(1) }, ++ [RST_APB0_TIMER] = { 0xb0, BIT(2) }, ++ [RST_APB0_UART] = { 0xb0, BIT(4) }, ++ [RST_APB0_I2C] = { 0xb0, BIT(6) }, ++}; ++ ++static struct ccu_reset_map sun50i_a64_r_ccu_resets[] = { ++ [RST_APB0_IR] = { 0xb0, BIT(1) }, ++ [RST_APB0_TIMER] = { 0xb0, BIT(2) }, ++ [RST_APB0_RSB] = { 0xb0, BIT(3) }, ++ [RST_APB0_UART] = { 0xb0, BIT(4) }, ++ [RST_APB0_I2C] = { 0xb0, BIT(6) }, ++}; ++ ++static const struct sunxi_ccu_desc sun8i_h3_r_ccu_desc = { ++ .ccu_clks = sun8i_h3_r_ccu_clks, ++ .num_ccu_clks = ARRAY_SIZE(sun8i_h3_r_ccu_clks), ++ ++ .hw_clks = &sun8i_h3_r_hw_clks, ++ ++ .resets = sun8i_h3_r_ccu_resets, ++ .num_resets = ARRAY_SIZE(sun8i_h3_r_ccu_resets), ++}; ++ ++static const struct sunxi_ccu_desc sun50i_a64_r_ccu_desc = { ++ .ccu_clks = sun50i_a64_r_ccu_clks, ++ .num_ccu_clks = ARRAY_SIZE(sun50i_a64_r_ccu_clks), ++ ++ .hw_clks = &sun50i_a64_r_hw_clks, ++ ++ .resets = sun50i_a64_r_ccu_resets, ++ .num_resets = ARRAY_SIZE(sun50i_a64_r_ccu_resets), ++}; ++ ++static void __init sunxi_r_ccu_init(struct device_node *node, ++ const struct sunxi_ccu_desc *desc) ++{ ++ void __iomem *reg; ++ ++ reg = of_io_request_and_map(node, 0, of_node_full_name(node)); ++ if (IS_ERR(reg)) { ++ pr_err("%s: Could not map the clock registers\n", ++ of_node_full_name(node)); ++ return; ++ } ++ ++ sunxi_ccu_probe(node, reg, desc); ++} ++ ++static void __init sun8i_h3_r_ccu_setup(struct device_node *node) ++{ ++ sunxi_r_ccu_init(node, &sun8i_h3_r_ccu_desc); ++} ++CLK_OF_DECLARE(sun8i_h3_r_ccu, "allwinner,sun8i-h3-r-ccu", ++ sun8i_h3_r_ccu_setup); ++ ++static void __init sun50i_a64_r_ccu_setup(struct device_node *node) ++{ ++ sunxi_r_ccu_init(node, &sun50i_a64_r_ccu_desc); ++} ++CLK_OF_DECLARE(sun50i_a64_r_ccu, "allwinner,sun50i-a64-r-ccu", ++ sun50i_a64_r_ccu_setup); +diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-r.h b/drivers/clk/sunxi-ng/ccu-sun8i-r.h +new file mode 100644 +index 000000000000..eaa431fd1d8f +--- /dev/null ++++ b/drivers/clk/sunxi-ng/ccu-sun8i-r.h +@@ -0,0 +1,27 @@ ++/* ++ * Copyright 2016 Icenowy ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ */ ++ ++#ifndef _CCU_SUN8I_R_H ++#define _CCU_SUN8I_R_H_ ++ ++#include ++#include ++ ++/* AHB/APB bus clocks are not exported */ ++#define CLK_AHB0 1 ++#define CLK_APB0 2 ++ ++#define CLK_NUMBER (CLK_APB0_TWD + 1) ++ ++#endif /* _CCU_SUN8I_R_H */ +diff --git a/include/dt-bindings/clock/sun8i-r-ccu.h b/include/dt-bindings/clock/sun8i-r-ccu.h +new file mode 100644 +index 000000000000..779d20aa0d05 +--- /dev/null ++++ b/include/dt-bindings/clock/sun8i-r-ccu.h +@@ -0,0 +1,59 @@ ++/* ++ * Copyright (c) 2016 Icenowy Zheng ++ * ++ * This file is dual-licensed: you can use it either under the terms ++ * of the GPL or the X11 license, at your option. Note that this dual ++ * licensing only applies to this file, and not this project as a ++ * whole. ++ * ++ * a) This file is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of the ++ * License, or (at your option) any later version. ++ * ++ * This file is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * Or, alternatively, ++ * ++ * b) Permission is hereby granted, free of charge, to any person ++ * obtaining a copy of this software and associated documentation ++ * files (the "Software"), to deal in the Software without ++ * restriction, including without limitation the rights to use, ++ * copy, modify, merge, publish, distribute, sublicense, and/or ++ * sell copies of the Software, and to permit persons to whom the ++ * Software is furnished to do so, subject to the following ++ * conditions: ++ * ++ * The above copyright notice and this permission notice shall be ++ * included in all copies or substantial portions of the Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ++ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES ++ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT ++ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, ++ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING ++ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ * OTHER DEALINGS IN THE SOFTWARE. ++ */ ++ ++#ifndef _DT_BINDINGS_CLK_SUN8I_R_CCU_H_ ++#define _DT_BINDINGS_CLK_SUN8I_R_CCU_H_ ++ ++#define CLK_AR100 0 ++ ++#define CLK_APB0_PIO 3 ++#define CLK_APB0_IR 4 ++#define CLK_APB0_TIMER 5 ++#define CLK_APB0_RSB 6 ++#define CLK_APB0_UART 7 ++/* 8 is reserved for CLK_APB0_W1 on A31 */ ++#define CLK_APB0_I2C 9 ++#define CLK_APB0_TWD 10 ++ ++#define CLK_IR 11 ++ ++#endif /* _DT_BINDINGS_CLK_SUN8I_R_CCU_H_ */ +diff --git a/include/dt-bindings/reset/sun8i-r-ccu.h b/include/dt-bindings/reset/sun8i-r-ccu.h +new file mode 100644 +index 000000000000..4ba64f3d6fc9 +--- /dev/null ++++ b/include/dt-bindings/reset/sun8i-r-ccu.h +@@ -0,0 +1,53 @@ ++/* ++ * Copyright (C) 2016 Icenowy Zheng ++ * ++ * This file is dual-licensed: you can use it either under the terms ++ * of the GPL or the X11 license, at your option. Note that this dual ++ * licensing only applies to this file, and not this project as a ++ * whole. ++ * ++ * a) This file is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of the ++ * License, or (at your option) any later version. ++ * ++ * This file is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * Or, alternatively, ++ * ++ * b) Permission is hereby granted, free of charge, to any person ++ * obtaining a copy of this software and associated documentation ++ * files (the "Software"), to deal in the Software without ++ * restriction, including without limitation the rights to use, ++ * copy, modify, merge, publish, distribute, sublicense, and/or ++ * sell copies of the Software, and to permit persons to whom the ++ * Software is furnished to do so, subject to the following ++ * conditions: ++ * ++ * The above copyright notice and this permission notice shall be ++ * included in all copies or substantial portions of the Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ++ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES ++ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT ++ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, ++ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING ++ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ * OTHER DEALINGS IN THE SOFTWARE. ++ */ ++ ++#ifndef _DT_BINDINGS_RST_SUN8I_R_CCU_H_ ++#define _DT_BINDINGS_RST_SUN8I_R_CCU_H_ ++ ++#define RST_APB0_IR 0 ++#define RST_APB0_TIMER 1 ++#define RST_APB0_RSB 2 ++#define RST_APB0_UART 3 ++/* 4 is reserved for RST_APB0_W1 on A31 */ ++#define RST_APB0_I2C 5 ++ ++#endif /* _DT_BINDINGS_RST_SUN8I_R_CCU_H_ */ + diff --git a/patch/kernel/sun50iw2-dev/add_sun50i_a64_rpio.patch b/patch/kernel/sun50iw2-dev/add_sun50i_a64_rpio.patch new file mode 100644 index 000000000..bb97e7aa6 --- /dev/null +++ b/patch/kernel/sun50iw2-dev/add_sun50i_a64_rpio.patch @@ -0,0 +1,215 @@ +diff --git a/drivers/pinctrl/sunxi/Kconfig b/drivers/pinctrl/sunxi/Kconfig +index a84bfa7f3c05..a0c419ac2a3b 100644 +--- a/drivers/pinctrl/sunxi/Kconfig ++++ b/drivers/pinctrl/sunxi/Kconfig +@@ -68,6 +68,10 @@ config PINCTRL_SUN50I_A64 + def_bool ARM64 && ARCH_SUNXI + select PINCTRL_SUNXI + ++config PINCTRL_SUN50I_A64_R ++ def_bool ARM64 && ARCH_SUNXI ++ select PINCTRL_SUNXI ++ + config PINCTRL_SUN50I_H5 + def_bool ARM64 && ARCH_SUNXI + select PINCTRL_SUNXI +diff --git a/drivers/pinctrl/sunxi/Makefile b/drivers/pinctrl/sunxi/Makefile +index 04ccb88ebd5f..df4ccd6cd44c 100644 +--- a/drivers/pinctrl/sunxi/Makefile ++++ b/drivers/pinctrl/sunxi/Makefile +@@ -11,6 +11,7 @@ obj-$(CONFIG_PINCTRL_SUN8I_A23) += pinctrl-sun8i-a23.o + obj-$(CONFIG_PINCTRL_SUN8I_A23_R) += pinctrl-sun8i-a23-r.o + obj-$(CONFIG_PINCTRL_SUN8I_A33) += pinctrl-sun8i-a33.o + obj-$(CONFIG_PINCTRL_SUN50I_A64) += pinctrl-sun50i-a64.o ++obj-$(CONFIG_PINCTRL_SUN50I_A64_R) += pinctrl-sun50i-a64-r.o + obj-$(CONFIG_PINCTRL_SUN8I_A83T) += pinctrl-sun8i-a83t.o + obj-$(CONFIG_PINCTRL_SUN8I_H3) += pinctrl-sun8i-h3.o + obj-$(CONFIG_PINCTRL_SUN8I_H3_R) += pinctrl-sun8i-h3-r.o +diff --git a/drivers/pinctrl/sunxi/pinctrl-sun50i-a64-r.c b/drivers/pinctrl/sunxi/pinctrl-sun50i-a64-r.c +new file mode 100644 +index 000000000000..415870e82cbf +--- /dev/null ++++ b/drivers/pinctrl/sunxi/pinctrl-sun50i-a64-r.c +@@ -0,0 +1,125 @@ ++/* ++ * Allwinner A64 SoCs special pins pinctrl driver. ++ * ++ * Based on pinctrl-sun8i-a23-r.c ++ * ++ * Copyright (C) 2016 Icenowy Zheng ++ * Icenowy Zheng ++ * ++ * Copyright (C) 2014 Chen-Yu Tsai ++ * Chen-Yu Tsai ++ * ++ * Copyright (C) 2014 Boris Brezillon ++ * Boris Brezillon ++ * ++ * Copyright (C) 2014 Maxime Ripard ++ * Maxime Ripard ++ * ++ * This file is licensed under the terms of the GNU General Public ++ * License version 2. This program is licensed "as is" without any ++ * warranty of any kind, whether express or implied. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++ ++#include "pinctrl-sunxi.h" ++ ++static const struct sunxi_desc_pin sun50i_a64_r_pins[] = { ++ SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 0), ++ SUNXI_FUNCTION(0x0, "gpio_in"), ++ SUNXI_FUNCTION(0x1, "gpio_out"), ++ SUNXI_FUNCTION(0x2, "s_rsb"), /* SCK */ ++ SUNXI_FUNCTION(0x3, "s_i2c"), /* SCK */ ++ SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 0)), /* PL_EINT0 */ ++ SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 1), ++ SUNXI_FUNCTION(0x0, "gpio_in"), ++ SUNXI_FUNCTION(0x1, "gpio_out"), ++ SUNXI_FUNCTION(0x2, "s_rsb"), /* SDA */ ++ SUNXI_FUNCTION(0x3, "s_i2c"), /* SDA */ ++ SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 1)), /* PL_EINT1 */ ++ SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 2), ++ SUNXI_FUNCTION(0x0, "gpio_in"), ++ SUNXI_FUNCTION(0x1, "gpio_out"), ++ SUNXI_FUNCTION(0x2, "s_uart"), /* TX */ ++ SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 2)), /* PL_EINT2 */ ++ SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 3), ++ SUNXI_FUNCTION(0x0, "gpio_in"), ++ SUNXI_FUNCTION(0x1, "gpio_out"), ++ SUNXI_FUNCTION(0x2, "s_uart"), /* RX */ ++ SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 3)), /* PL_EINT3 */ ++ SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 4), ++ SUNXI_FUNCTION(0x0, "gpio_in"), ++ SUNXI_FUNCTION(0x1, "gpio_out"), ++ SUNXI_FUNCTION(0x2, "s_jtag"), /* MS */ ++ SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 4)), /* PL_EINT4 */ ++ SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 5), ++ SUNXI_FUNCTION(0x0, "gpio_in"), ++ SUNXI_FUNCTION(0x1, "gpio_out"), ++ SUNXI_FUNCTION(0x2, "s_jtag"), /* CK */ ++ SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 5)), /* PL_EINT5 */ ++ SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 6), ++ SUNXI_FUNCTION(0x0, "gpio_in"), ++ SUNXI_FUNCTION(0x1, "gpio_out"), ++ SUNXI_FUNCTION(0x2, "s_jtag"), /* DO */ ++ SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 6)), /* PL_EINT6 */ ++ SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 7), ++ SUNXI_FUNCTION(0x0, "gpio_in"), ++ SUNXI_FUNCTION(0x1, "gpio_out"), ++ SUNXI_FUNCTION(0x2, "s_jtag"), /* DI */ ++ SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 7)), /* PL_EINT7 */ ++ SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 8), ++ SUNXI_FUNCTION(0x0, "gpio_in"), ++ SUNXI_FUNCTION(0x1, "gpio_out"), ++ SUNXI_FUNCTION(0x2, "s_i2c"), /* SCK */ ++ SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 8)), /* PL_EINT8 */ ++ SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 9), ++ SUNXI_FUNCTION(0x0, "gpio_in"), ++ SUNXI_FUNCTION(0x1, "gpio_out"), ++ SUNXI_FUNCTION(0x2, "s_i2c"), /* SDA */ ++ SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 9)), /* PL_EINT9 */ ++ SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 10), ++ SUNXI_FUNCTION(0x0, "gpio_in"), ++ SUNXI_FUNCTION(0x1, "gpio_out"), ++ SUNXI_FUNCTION(0x2, "s_pwm"), ++ SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 10)), /* PL_EINT10 */ ++ SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 11), ++ SUNXI_FUNCTION(0x0, "gpio_in"), ++ SUNXI_FUNCTION(0x1, "gpio_out"), ++ SUNXI_FUNCTION(0x2, "s_cir_rx"), ++ SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 11)), /* PL_EINT11 */ ++ SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 12), ++ SUNXI_FUNCTION(0x0, "gpio_in"), ++ SUNXI_FUNCTION(0x1, "gpio_out"), ++ SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 12)), /* PL_EINT12 */ ++}; ++ ++static const struct sunxi_pinctrl_desc sun50i_a64_r_pinctrl_data = { ++ .pins = sun50i_a64_r_pins, ++ .npins = ARRAY_SIZE(sun50i_a64_r_pins), ++ .pin_base = PL_BASE, ++ .irq_banks = 1, ++}; ++ ++static int sun50i_a64_r_pinctrl_probe(struct platform_device *pdev) ++{ ++ return sunxi_pinctrl_init(pdev, ++ &sun50i_a64_r_pinctrl_data); ++} ++ ++static const struct of_device_id sun50i_a64_r_pinctrl_match[] = { ++ { .compatible = "allwinner,sun50i-a64-r-pinctrl", }, ++ {} ++}; ++ ++static struct platform_driver sun50i_a64_r_pinctrl_driver = { ++ .probe = sun50i_a64_r_pinctrl_probe, ++ .driver = { ++ .name = "sun50i-a64-r-pinctrl", ++ .of_match_table = sun50i_a64_r_pinctrl_match, ++ }, ++}; ++builtin_platform_driver(sun50i_a64_r_pinctrl_driver); +diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi +index 02c0385..c0773d8 100644 +--- a/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi ++++ b/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi +@@ -43,8 +43,10 @@ + */ + + #include ++#include + #include + #include ++#include + + / { + interrupt-parent = <&gic>; +@@ -98,6 +100,13 @@ + clock-output-names = "osc32k"; + }; + ++ osc32000: osc32000_clk { ++ #clock-cells = <0>; ++ compatible = "fixed-clock"; ++ clock-frequency = <32000>; ++ clock-output-names = "osc32000"; ++ }; ++ + psci { + compatible = "arm,psci-0.2"; + method = "smc"; +@@ -306,6 +315,27 @@ + }; + }; + ++ r_ccu: clock@1f01400 { ++ compatible = "allwinner,sun50i-a64-r-ccu"; ++ reg = <0x01f01400 0x100>; ++ clocks = <&osc24M>, <&osc32k>, <&osc32000>; ++ clock-names = "hosc", "losc", "iosc"; ++ #clock-cells = <1>; ++ #reset-cells = <1>; ++ }; ++ ++ r_pio: pinctrl@1f02c00 { ++ compatible = "allwinner,sun50i-a64-r-pinctrl"; ++ reg = <0x01f02c00 0x400>; ++ interrupts = ; ++ clocks = <&r_ccu CLK_APB0_PIO>, <&osc24M>, <&osc32k>; ++ clock-names = "apb", "hosc", "losc"; ++ gpio-controller; ++ #gpio-cells = <3>; ++ interrupt-controller; ++ #interrupt-cells = <3>; ++ }; ++ + uart0: serial@1c28000 { + compatible = "snps,dw-apb-uart"; + reg = <0x01c28000 0x400>; diff --git a/patch/kernel/sun50iw2-dev/add_sun50i_a64_spi.patch b/patch/kernel/sun50iw2-dev/add_sun50i_a64_spi.patch new file mode 100644 index 000000000..1b5537207 --- /dev/null +++ b/patch/kernel/sun50iw2-dev/add_sun50i_a64_spi.patch @@ -0,0 +1,109 @@ +diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi +index 02c0385..c0773d8 100644 +--- a/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi ++++ b/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi +@@ -43,8 +43,10 @@ + */ + + #include ++#include + #include + #include ++#include + + / { + interrupt-parent = <&gic>; +@@ -98,6 +100,13 @@ + clock-output-names = "osc32k"; + }; + ++ osc32000: osc32000_clk { ++ #clock-cells = <0>; ++ compatible = "fixed-clock"; ++ clock-frequency = <32000>; ++ clock-output-names = "osc32000"; ++ }; ++ + psci { + compatible = "arm,psci-0.2"; + method = "smc"; +@@ -276,6 +301,16 @@ + bias-pull-up; + }; + ++ spi0_pins: spi0 { ++ pins = "PC0", "PC1", "PC2", "PC3"; ++ function = "spi0"; ++ }; ++ ++ spi1_pins: spi1 { ++ pins = "PA15", "PA16", "PA14", "PA13"; ++ function = "spi1"; ++ }; ++ + uart0_pins_a: uart0@0 { + pins = "PB8", "PB9"; + function = "uart0"; +@@ -306,6 +315,27 @@ + }; + }; + ++ r_ccu: clock@1f01400 { ++ compatible = "allwinner,sun50i-a64-r-ccu"; ++ reg = <0x01f01400 0x100>; ++ clocks = <&osc24M>, <&osc32k>, <&osc32000>; ++ clock-names = "hosc", "losc", "iosc"; ++ #clock-cells = <1>; ++ #reset-cells = <1>; ++ }; ++ ++ r_pio: pinctrl@1f02c00 { ++ compatible = "allwinner,sun50i-a64-r-pinctrl"; ++ reg = <0x01f02c00 0x400>; ++ interrupts = ; ++ clocks = <&r_ccu CLK_APB0_PIO>, <&osc24M>, <&osc32k>; ++ clock-names = "apb", "hosc", "losc"; ++ gpio-controller; ++ #gpio-cells = <3>; ++ interrupt-controller; ++ #interrupt-cells = <3>; ++ }; ++ + uart0: serial@1c28000 { + compatible = "snps,dw-apb-uart"; + reg = <0x01c28000 0x400>; +@@ -431,5 +487,34 @@ + interrupts = , + ; + }; ++ ++ spi0: spi@01c68000 { ++ compatible = "allwinner,sun8i-h3-spi"; ++ reg = <0x01c68000 0x1000>; ++ interrupts = ; ++ clocks = <&ccu CLK_BUS_SPI0>, <&ccu CLK_SPI0>; ++ clock-names = "ahb", "mod"; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&spi0_pins>; ++ resets = <&ccu RST_BUS_SPI0>; ++ status = "disabled"; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ }; ++ ++ spi1: spi@01c69000 { ++ compatible = "allwinner,sun8i-h3-spi"; ++ reg = <0x01c69000 0x1000>; ++ interrupts = ; ++ clocks = <&ccu CLK_BUS_SPI1>, <&ccu CLK_SPI1>; ++ clock-names = "ahb", "mod"; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&spi1_pins>; ++ resets = <&ccu RST_BUS_SPI1>; ++ status = "disabled"; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ }; ++ + }; + }; diff --git a/patch/u-boot/u-boot-cubox-next/0001-wandboard-uEnv.txt-bootz-n-fixes.patch b/patch/u-boot/u-boot-cubox-next/0001-wandboard-uEnv.txt-bootz-n-fixes.patch new file mode 100644 index 000000000..759a31e97 --- /dev/null +++ b/patch/u-boot/u-boot-cubox-next/0001-wandboard-uEnv.txt-bootz-n-fixes.patch @@ -0,0 +1,196 @@ +From 035006342a2951d92d0150e5c44c8a7c48436360 Mon Sep 17 00:00:00 2001 +From: Robert Nelson +Date: Tue, 14 Mar 2017 09:54:27 -0500 +Subject: [PATCH] wandboard: uEnv.txt, bootz, n fixes + +Signed-off-by: Robert Nelson +--- + configs/wandboard_defconfig | 4 ++ + include/configs/wandboard.h | 125 +++++++++++++++++++++++++++++++++++++++++++- + 2 files changed, 127 insertions(+), 2 deletions(-) + +diff --git a/configs/wandboard_defconfig b/configs/wandboard_defconfig +index f4c9b6bc76..b4f81d0a27 100644 +--- a/configs/wandboard_defconfig ++++ b/configs/wandboard_defconfig +@@ -18,6 +18,10 @@ CONFIG_BOARD_EARLY_INIT_F=y + CONFIG_SPL=y + CONFIG_SPL_EXT_SUPPORT=y + CONFIG_SPL_I2C_SUPPORT=y ++CONFIG_AUTOBOOT_KEYED=y ++CONFIG_AUTOBOOT_PROMPT="Press SPACE to abort autoboot in %d seconds\n" ++CONFIG_AUTOBOOT_DELAY_STR="d" ++CONFIG_AUTOBOOT_STOP_STR=" " + # CONFIG_CMD_IMLS is not set + # CONFIG_CMD_FLASH is not set + CONFIG_CMD_MMC=y +diff --git a/include/configs/wandboard.h b/include/configs/wandboard.h +index 7e9757a480..a19b7efe95 100644 +--- a/include/configs/wandboard.h ++++ b/include/configs/wandboard.h +@@ -91,10 +91,16 @@ + "fdtfile=undefined\0" \ + "fdt_high=0xffffffff\0" \ + "initrd_high=0xffffffff\0" \ ++ "rdaddr=0x12A00000\0" \ + "fdt_addr_r=0x18000000\0" \ + "fdt_addr=0x18000000\0" \ + "ip_dyn=yes\0" \ +- "mmcdev=" __stringify(CONFIG_SYS_MMC_ENV_DEV) "\0" \ ++ "optargs=\0" \ ++ "cmdline=\0" \ ++ "mmcdev=0\0" \ ++ "mmcpart=1\0" \ ++ "mmcroot=/dev/mmcblk0p2 ro\0" \ ++ "mmcrootfstype=ext4 rootwait\0" \ + "update_sd_firmware_filename=u-boot.imx\0" \ + "update_sd_firmware=" \ + "if test ${ip_dyn} = yes; then " \ +@@ -109,6 +115,11 @@ + "mmc write ${loadaddr} 0x2 ${fw_sz}; " \ + "fi; " \ + "fi\0" \ ++ "mmcargs=setenv bootargs console=${console} " \ ++ "${optargs} " \ ++ "root=${mmcroot} " \ ++ "rootfstype=${mmcrootfstype} " \ ++ "${cmdline}\0" \ + "findfdt="\ + "if test $board_name = C1 && test $board_rev = MX6Q ; then " \ + "setenv fdtfile imx6q-wandboard.dtb; fi; " \ +@@ -120,6 +131,111 @@ + "setenv fdtfile imx6dl-wandboard-revb1.dtb; fi; " \ + "if test $fdtfile = undefined; then " \ + "echo WARNING: Could not determine dtb to use; fi; \0" \ ++ "loadimage=load ${devtype} ${bootpart} ${loadaddr} ${bootdir}/${bootfile}\0" \ ++ "loadrd=load ${devtype} ${bootpart} ${rdaddr} ${bootdir}/${rdfile}; setenv rdsize ${filesize}\0" \ ++ "loadfdt=echo loading ${fdtdir}/${fdtfile} ...; load ${devtype} ${bootpart} ${fdt_addr} ${fdtdir}/${fdtfile}\0" \ ++ "mmcboot=${devtype} dev ${mmcdev}; " \ ++ "if ${devtype} rescan; then " \ ++ "echo SD/MMC found on device ${mmcdev};" \ ++ "setenv bootpart ${mmcdev}:1; " \ ++ "echo Checking for: /uEnv.txt ...;" \ ++ "if test -e ${devtype} ${bootpart} /uEnv.txt; then " \ ++ "load ${devtype} ${bootpart} ${loadaddr} /uEnv.txt;" \ ++ "env import -t ${loadaddr} ${filesize};" \ ++ "echo Loaded environment from /uEnv.txt;" \ ++ "echo Checking if uenvcmd is set ...;" \ ++ "if test -n ${uenvcmd}; then " \ ++ "echo Running uenvcmd ...;" \ ++ "run uenvcmd;" \ ++ "fi;" \ ++ "fi; " \ ++ "echo Checking for: /boot/uEnv.txt ...;" \ ++ "for i in 1 2 3 4 5 6 7 ; do " \ ++ "setenv mmcpart ${i};" \ ++ "setenv bootpart ${mmcdev}:${mmcpart};" \ ++ "if test -e ${devtype} ${bootpart} /boot/uEnv.txt; then " \ ++ "load ${devtype} ${bootpart} ${loadaddr} /boot/uEnv.txt;" \ ++ "env import -t ${loadaddr} ${filesize};" \ ++ "echo Loaded environment from /boot/uEnv.txt;" \ ++ "if test -n ${dtb}; then " \ ++ "setenv fdtfile ${dtb};" \ ++ "echo Using: dtb=${fdtfile} ...;" \ ++ "fi;" \ ++ "echo Checking if uname_r is set in /boot/uEnv.txt...;" \ ++ "if test -n ${uname_r}; then " \ ++ "echo Running uname_boot ...;" \ ++ "part uuid ${devtype} ${bootpart} partuuid ;" \ ++ "setenv mmcroot PARTUUID=${partuuid} ro;" \ ++ "echo Using: mmcroot=${mmcroot} ...;" \ ++ "run uname_boot;" \ ++ "fi;" \ ++ "fi;" \ ++ "done;" \ ++ "fi;\0" \ ++ "uname_boot="\ ++ "setenv bootdir /boot; " \ ++ "setenv bootfile vmlinuz-${uname_r}; " \ ++ "if test -e ${devtype} ${bootpart} ${bootdir}/${bootfile}; then " \ ++ "echo loading ${bootdir}/${bootfile} ...; "\ ++ "run loadimage;" \ ++ "setenv fdtdir /boot/dtbs/${uname_r}; " \ ++ "if test -e ${devtype} ${bootpart} ${fdtdir}/${fdtfile}; then " \ ++ "run loadfdt;" \ ++ "else " \ ++ "setenv fdtdir /usr/lib/linux-image-${uname_r}; " \ ++ "if test -e ${devtype} ${bootpart} ${fdtdir}/${fdtfile}; then " \ ++ "run loadfdt;" \ ++ "else " \ ++ "setenv fdtdir /lib/firmware/${uname_r}/device-tree; " \ ++ "if test -e ${devtype} ${bootpart} ${fdtdir}/${fdtfile}; then " \ ++ "run loadfdt;" \ ++ "else " \ ++ "setenv fdtdir /boot/dtb-${uname_r}; " \ ++ "if test -e ${devtype} ${bootpart} ${fdtdir}/${fdtfile}; then " \ ++ "run loadfdt;" \ ++ "else " \ ++ "setenv fdtdir /boot/dtbs; " \ ++ "if test -e ${devtype} ${bootpart} ${fdtdir}/${fdtfile}; then " \ ++ "run loadfdt;" \ ++ "else " \ ++ "setenv fdtdir /boot/dtb; " \ ++ "if test -e ${devtype} ${bootpart} ${fdtdir}/${fdtfile}; then " \ ++ "run loadfdt;" \ ++ "else " \ ++ "setenv fdtdir /boot; " \ ++ "if test -e ${devtype} ${bootpart} ${fdtdir}/${fdtfile}; then " \ ++ "run loadfdt;" \ ++ "else " \ ++ "echo; echo unable to find ${fdtfile} ...; echo booting legacy ...;"\ ++ "run mmcargs;" \ ++ "echo debug: [${bootargs}] ... ;" \ ++ "echo debug: [bootz ${loadaddr}] ... ;" \ ++ "bootz ${loadaddr}; " \ ++ "fi;" \ ++ "fi;" \ ++ "fi;" \ ++ "fi;" \ ++ "fi;" \ ++ "fi;" \ ++ "fi; " \ ++ "setenv rdfile initrd.img-${uname_r}; " \ ++ "if test -e ${devtype} ${bootpart} ${bootdir}/${rdfile}; then " \ ++ "echo loading ${bootdir}/${rdfile} ...; "\ ++ "run loadrd;" \ ++ "if test -n ${uuid}; then " \ ++ "setenv mmcroot UUID=${uuid} ro;" \ ++ "fi;" \ ++ "run mmcargs;" \ ++ "echo debug: [${bootargs}] ... ;" \ ++ "echo debug: [bootz ${loadaddr} ${rdaddr}:${rdsize} ${fdt_addr}] ... ;" \ ++ "bootz ${loadaddr} ${rdaddr}:${rdsize} ${fdt_addr}; " \ ++ "else " \ ++ "run mmcargs;" \ ++ "echo debug: [${bootargs}] ... ;" \ ++ "echo debug: [bootz ${loadaddr} - ${fdt_addr}] ... ;" \ ++ "bootz ${loadaddr} - ${fdt_addr}; " \ ++ "fi;" \ ++ "fi;\0" \ + "kernel_addr_r=" __stringify(CONFIG_LOADADDR) "\0" \ + "pxefile_addr_r=" __stringify(CONFIG_LOADADDR) "\0" \ + "ramdisk_addr_r=0x13000000\0" \ +@@ -136,6 +252,11 @@ + + #define CONFIG_BOOTCOMMAND \ + "run findfdt; " \ ++ "setenv devtype mmc;" \ ++ "setenv mmcdev 0;" \ ++ "run mmcboot;" \ ++ "setenv mmcdev 1;" \ ++ "run mmcboot;" \ + "run distro_bootcmd" + + #include +@@ -154,7 +275,7 @@ + (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET) + + /* Environment organization */ +-#define CONFIG_ENV_SIZE (8 * 1024) ++#define CONFIG_ENV_SIZE (10 * 1024) + + #define CONFIG_ENV_IS_IN_MMC + #define CONFIG_ENV_OFFSET (768 * 1024) +-- +2.11.0 + diff --git a/patch/u-boot/u-boot-sun50i-dev/add-opiwinplus-to-u-boot-sun50i-a64.patch b/patch/u-boot/u-boot-sun50i-dev/add-opiwinplus-to-u-boot-sun50i-a64.patch new file mode 100644 index 000000000..a4e20ee1e --- /dev/null +++ b/patch/u-boot/u-boot-sun50i-dev/add-opiwinplus-to-u-boot-sun50i-a64.patch @@ -0,0 +1,243 @@ +diff --git a/u-boot/arch/arm/dts/sun50i-a64-orangepiwin.dts b/u-boot/arch/arm/dts/sun50i-a64-orangepiwin.dts +new file mode 100644 +index 0000000..68f889d +--- /dev/null ++++ b/u-boot/arch/arm/dts/sun50i-a64-orangepiwin.dts +@@ -0,0 +1,158 @@ ++/* ++ * Copyright (c) 2016 ARM Ltd. ++ * ++ * This file is dual-licensed: you can use it either under the terms ++ * of the GPL or the X11 license, at your option. Note that this dual ++ * licensing only applies to this file, and not this project as a ++ * whole. ++ * ++ * a) This library is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of the ++ * License, or (at your option) any later version. ++ * ++ * This library is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * Or, alternatively, ++ * ++ * b) Permission is hereby granted, free of charge, to any person ++ * obtaining a copy of this software and associated documentation ++ * files (the "Software"), to deal in the Software without ++ * restriction, including without limitation the rights to use, ++ * copy, modify, merge, publish, distribute, sublicense, and/or ++ * sell copies of the Software, and to permit persons to whom the ++ * Software is furnished to do so, subject to the following ++ * conditions: ++ * ++ * The above copyright notice and this permission notice shall be ++ * included in all copies or substantial portions of the Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ++ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES ++ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT ++ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, ++ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING ++ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ * OTHER DEALINGS IN THE SOFTWARE. ++ */ ++ ++/dts-v1/; ++ ++#include ++#include ++#include "sun50i-a64.dtsi" ++ ++/ { ++ model = "OrangePiWin"; ++ compatible = "orangepiwin", "allwinner,sun50i-a64"; ++ ++ chosen { ++ stdout-path = "serial0:115200n8"; ++ }; ++ ++ memory { ++ reg = <0x40000000 0x20000000>; ++ }; ++ ++ ++ aliases { ++ serial0 = &uart0; ++ ethernet0 = &emac; ++ }; ++ ++ soc { ++ reg_vcc3v3: vcc3v3 { ++ compatible = "regulator-fixed"; ++ regulator-name = "vcc3v3"; ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ }; ++ }; ++ ++ reg_gmac_3v3: gmac-3v3 { ++ compatible = "regulator-fixed"; ++ regulator-name = "gmac-3v3"; ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ startup-delay-us = <100000>; ++ enable-active-high; ++ gpio = <&pio 3 14 GPIO_ACTIVE_HIGH>; ++ }; ++ ++ reg_usb1_vbus: usb1-vbus { ++ compatible = "regulator-fixed"; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&usb1_vbus_pin_a>; ++ regulator-name = "usb1-vbus"; ++ regulator-min-microvolt = <5000000>; ++ regulator-max-microvolt = <5000000>; ++ regulator-boot-on; ++ enable-active-high; ++ gpio = <&pio 3 7 GPIO_ACTIVE_HIGH>; ++ status = "okay"; ++ }; ++}; ++ ++&mmc0 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&mmc0_pins>, <&mmc0_default_cd_pin>; ++ vmmc-supply = <®_vcc3v3>; ++ cd-gpios = <&pio 5 6 0>; ++ cd-inverted; ++ status = "okay"; ++}; ++ ++&pio { ++ usb1_vbus_pin_a: usb1_vbus_pin@0 { ++ allwinner,pins = "PD7"; ++ allwinner,function = "gpio_out"; ++ allwinner,drive = ; ++ allwinner,pull = ; ++ }; ++}; ++ ++&uart0 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&uart0_pins_a>; ++ status = "okay"; ++}; ++ ++&i2c1 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&i2c1_pins>; ++ status = "okay"; ++}; ++ ++&usbphy { ++ usb1_vbus-supply = <®_usb1_vbus>; ++ status = "okay"; ++}; ++ ++&ohci1 { ++ status = "okay"; ++}; ++ ++&ehci1 { ++ status = "okay"; ++}; ++ ++ ++&emac { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&rgmii_pins>; ++ phy-mode = "rgmii"; ++ phy-supply = <®_gmac_3v3>; ++ phy-handle = <&ext_rgmii_phy>; ++ status = "okay"; ++ ++ mdio { ++ ext_rgmii_phy: ethernet-phy@1 { ++ reg = <0>; ++ }; ++ }; ++}; ++ ++ +diff --git a/u-boot/arch/arm/dts/Makefile b/u-boot/arch/arm/dts/Makefile +index 15f2a76..ad1fb3d 100644 +--- a/u-boot/arch/arm/dts/Makefile ++++ b/u-boot/arch/arm/dts/Makefile +@@ -284,7 +284,8 @@ dtb-$(CONFIG_MACH_SUN50I_H5) += \ + sun50i-h5-orangepi-pc2.dtb + dtb-$(CONFIG_MACH_SUN50I) += \ + sun50i-a64-pine64-plus.dtb \ +- sun50i-a64-pine64.dtb ++ sun50i-a64-pine64.dtb \ ++ sun50i-a64-orangepiwin.dtb + dtb-$(CONFIG_MACH_SUN9I) += \ + sun9i-a80-optimus.dtb \ + sun9i-a80-cubieboard4.dtb +diff --git a/u-boot/configs/orangepiwin_defconfig b/u-boot/configs/orangepiwin_defconfig +new file mode 100644 +index 0000000..68f889d +--- /dev/null ++++ b/u-boot/configs/orangepiwin_defconfig +@@ -0,0 +1,13 @@ ++CONFIG_ARM=y ++CONFIG_RESERVE_ALLWINNER_BOOT0_HEADER=y ++CONFIG_ARCH_SUNXI=y ++CONFIG_MACH_SUN50I_64=y ++CONFIG_DEFAULT_DEVICE_TREE="sun50i-a64-orangepiwin" ++# CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set ++CONFIG_CONSOLE_MUX=y ++CONFIG_SPL=y ++# CONFIG_CMD_IMLS is not set ++# CONFIG_CMD_FLASH is not set ++# CONFIG_CMD_FPGA is not set ++CONFIG_SUN8I_EMAC=y ++CONFIG_USB_EHCI_HCD=y +diff --git a/Makefile b/Makefile +index 5d56b3c..9c049f1 100644 +--- a/Makefile ++++ b/Makefile +@@ -47,6 +47,17 @@ u_boot_a64_so: + $(MAKE) -C u-boot ARCH=arm CROSS_COMPILE="$(ccache) aarch64-linux-gnu-" + @cp u-boot/u-boot.bin u-boot.bin + ++.PHONY: u_boot_a64_opiwin ++u_boot_a64_opiwin: ++ $(MAKE) -C u-boot clean ++ $(MAKE) -C u-boot ARCH=arm CROSS_COMPILE="$(ccache) arm-linux-gnueabihf-" sun50i_spl32_defconfig ++ $(MAKE) -C u-boot ARCH=arm CROSS_COMPILE="$(ccache) arm-linux-gnueabihf-" ++ @cp u-boot/spl/sunxi-spl.bin sunxi-spl.bin ++ $(MAKE) -C u-boot clean ++ $(MAKE) -C u-boot ARCH=arm CROSS_COMPILE="$(ccache) aarch64-linux-gnu-" orangepiwin_defconfig ++ $(MAKE) -C u-boot ARCH=arm CROSS_COMPILE="$(ccache) aarch64-linux-gnu-" ++ @cp u-boot/u-boot.bin u-boot.bin ++ + .PHONY: arm_trusted_firmware + arm_trusted_firmware: + $(MAKE) -C arm-trusted-firmware PLAT=sun50iw1p1 DEBUG=1 CROSS_COMPILE="$(ccache) aarch64-linux-gnu-" bl31 +@@ -72,6 +83,11 @@ pine64so: u_boot_a64_so arm_trusted_firmware + @u-boot/tools/mkimage -E -f config.its u-boot.itb + @aarch64-linux-gnu-objcopy --gap-fill=0xff -j .text -j .rodata -j .data -j .u_boot_list -j .rela.dyn -j .efi_runtime -j .efi_runtime_rel -I binary -O binary --pad-to=32768 --gap-fill=0xff sunxi-spl.bin u-boot-sunxi-with-spl.bin && cat u-boot.itb >> u-boot-sunxi-with-spl.bin + ++.PHONY: orangepiwin ++orangepiwin: u_boot_a64_opiwin arm_trusted_firmware ++ @u-boot/tools/mkimage -E -f config.its u-boot.itb ++ @aarch64-linux-gnu-objcopy --gap-fill=0xff -j .text -j .rodata -j .data -j .u_boot_list -j .rela.dyn -j .efi_runtime -j .efi_runtime_rel -I binary -O binary --pad-to=32768 --gap-fill=0xff sunxi-spl.bin u-boot-sunxi-with-spl.bin && cat u-boot.itb >> u-boot-sunxi-with-spl.bin ++ + .PHONY: clean + clean: + [ -f u-boot/Makefile ] && $(MAKE) -C u-boot ARCH=arm clean +@@ -86,6 +102,10 @@ pine64_plus_defconfig: + pine64_so_defconfig: + @cp blobs/sun50i_a64.its config.its + ++.PHONY: orangepi_win_defconfig ++orangepi_win_defconfig: ++ @cp blobs/sun50i_a64_opiwin.its config.its ++ + .PHONY: orangepi_pc2_defconfig + orangepi_pc2_defconfig: + @cp blobs/sun50i_h5.its config.its diff --git a/scripts/armhwinfo b/scripts/armhwinfo index b44b33961..91946d3c4 100644 --- a/scripts/armhwinfo +++ b/scripts/armhwinfo @@ -41,6 +41,37 @@ set_io_scheduler() { done } # set_io_scheduler +prepare_temp_monitoring() { + # still an ugly hack but better do it just once at startup instead of every login + [ -d /etc/armbianmonitor/datasources ] || mkdir -p -m775 /etc/armbianmonitor/datasources + + # AXP209 PMIC check + if [[ -f /sys/power/axp_pmu/pmu/temp ]]; then + ln -fs /sys/power/axp_pmu/pmu/temp /etc/armbianmonitor/datasources/pmictemp + elif [[ -f /sys/devices/platform/sunxi-i2c.0/i2c-0/0-0034//temp1_input ]]; then + ln -fs /sys/devices/platform/sunxi-i2c.0/i2c-0/0-0034/temp1_input \ + /etc/armbianmonitor/datasources/pmictemp + fi + + # SoC temp: check standard location first + if [[ -d "/sys/devices/virtual/thermal/thermal_zone0" ]]; then + # mainline kernel, Armada 38x, sun50i legacy + ln -fs /sys/devices/virtual/thermal/thermal_zone0/temp /etc/armbianmonitor/datasources/soctemp + elif [[ -d "/sys/class/thermal/thermal_zone1" ]]; then + # sun8i legacy + ln -fs /sys/class/thermal/thermal_zone1/temp /etc/armbianmonitor/datasources/soctemp + elif [[ -d "/sys/devices/virtual/thermal/thermal_zone1" ]]; then + # S500 + ln -fs /sys/devices/virtual/thermal/thermal_zone1/temp /etc/armbianmonitor/datasources/soctemp + elif [[ -d "/sys/class/thermal/thermal_zone2" ]]; then + # RK3288 legacy + ln -fs /sys/class/thermal/thermal_zone2/temp /etc/armbianmonitor/datasources/soctemp + elif [[ -d "/sys/devices/platform/a20-tp-hwmon" ]]; then + # sun7i legacy + ln -fs /sys/devices/platform/a20-tp-hwmon/temp1_input /etc/armbianmonitor/datasources/soctemp + fi +} # prepare_temp_monitoring + prepare_board() { # prevent logrotate from compressing rotated logs when /var/log lives on compressed fs CheckDevice=$(for i in /var/log /var / ; do findmnt -n -o SOURCE $i && break ; done) @@ -52,10 +83,10 @@ prepare_board() { # IRQ distribution based on $HARDWARE and/or $BOARD, probably some sort of user feedback (leds) case ${HARDWARE} in - Freescale) # i.MX6 boards, send Ethernet to cpu1, MMC to cpu2/cpu3 (when available) - echo 2 >/proc/irq/$(awk -F":" "/ethernet/ {print \$1}" /dev/null + Freescale) # i.MX6 boards, send Ethernet to cpu3, MMC to cpu1/cpu2 (when available) + echo 2 >/proc/irq/$(awk -F":" "/mmc0/ {print \$1}" /dev/null echo 4 >/proc/irq/$(awk -F":" "/mmc1/ {print \$1}" /dev/null - echo 8 >/proc/irq/$(awk -F":" "/mmc0/ {print \$1}" /dev/null + echo 8 >/proc/irq/$(awk -F":" "/ethernet/ {print \$1}" /dev/null ;; gs705a) # Roseapple Pi/LeMaker Guitar: send USB IRQs to cpu1/cpu2, DMA0 to cpu2 and Ethernet + SD card to cpu3 echo 2 >/proc/irq/$(awk -F":" "/usb1/ {print \$1}" /proc/irq/$i/smp_affinity done ;; - ODROID-C2) # send eth0 to cpu1, mmc/usb2 to cpu2 and usb1 to cpu3 + ODROID-C2) # send eth0 to cpu3, mmc/usb2 to cpu2 and usb1 to cpu1 # Basics: http://forum.odroid.com/viewtopic.php?f=115&t=8121#p65777 - echo 1 >/proc/irq/$(awk -F":" "/eth0/ {print \$1}" /proc/irq/$(awk -F":" "/eth0/ {print \$1}" /proc/irq/$i/smp_affinity_list done - echo 3 >/proc/irq/$(awk -F":" "/usb1/ {print \$1}" /proc/irq/$(awk -F":" "/usb1/ {print \$1}" /proc/irq/$(awk -F":" "/usb2/ {print \$1}" /proc/irq/$(awk -F":" '/eth0/ {print $1}' /proc/irq/$(awk -F":" '/eth0/ {print $1}' /proc/irq/$i/smp_affinity done for i in $(awk -F':' '/hcd:usb/{print $1}' /proc/interrupts); do - echo 8 >/proc/irq/$i/smp_affinity + echo 2 >/proc/irq/$i/smp_affinity done ;; sun7i) # try to redistribute eth0 irq to dedicated core @@ -261,6 +292,7 @@ case $1 in # hardware preparation prepare_board & + prepare_temp_monitoring & # display message, log hardware id to file, write log echo -e "[\e[0;32m ok \x1B[0m] Starting ARM hardware info: $ID (${VERSION})" diff --git a/scripts/nand-sata-install/usr/lib/nand-sata-install/nand-sata-install.sh b/scripts/nand-sata-install/usr/lib/nand-sata-install/nand-sata-install.sh index b96cb0fa8..912e6f9b3 100644 --- a/scripts/nand-sata-install/usr/lib/nand-sata-install/nand-sata-install.sh +++ b/scripts/nand-sata-install/usr/lib/nand-sata-install/nand-sata-install.sh @@ -104,7 +104,7 @@ create_armbian() # stop running services StopRunningServices "nfs-|smbd|nmbd|winbind|ftpd|netatalk|monit|cron|webmin|rrdcached" >> $logfile - StopRunningServices "log2ram|postgres|mariadb|mysql|postfix|mail|nginx|apache|snmpd" >> $logfile + StopRunningServices "log2ram|folder2ram|postgres|mariadb|mysql|postfix|mail|nginx|apache|snmpd" >> $logfile echo -e "\n" >> $logfile logfile="/mnt/rootfs/var/log/nand-sata-install.log" diff --git a/scripts/update-motd.d/30-sysinfo b/scripts/update-motd.d/30-sysinfo index cf859cc6a..917a8a67f 100644 --- a/scripts/update-motd.d/30-sysinfo +++ b/scripts/update-motd.d/30-sysinfo @@ -1,7 +1,9 @@ #!/bin/bash # # 30-sysinfo - generate the system information -# Copyright (c) 2015 Igor Pecovnik +# Copyright (c) 2015-2017 Igor Pecovnik + +export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin THIS_SCRIPT="sysinfo" MOTD_DISABLE="" @@ -17,24 +19,6 @@ storage=/dev/sda1 # don't edit below here -function displaytime { - # we need dedicated function - local T=$(cat /proc/uptime | awk '{print $1}' | sed 's/[.].*//') - local D=$((T/60/60/24)) - local H=$((T/60/60%24)) - local M=$((T/60%60)) - local S=$((T%60)) - local time=$S - time=$S" sec" - (( $M > 0 )) && time=$M" min" - (( $H > 0 )) && time=$H" hour" - (( $H > 1 )) && time=$H" hours" - (( $D > 0 )) && time=$D" day" - (( $D > 1 )) && time=$D" days" - printf "Up time: " - printf "\x1B[92m%s\x1B[0m\t\t" "$time" -} - function display() { # $1=name $2=value $3=red_limit $4=minimal_show_limit $5=unit $6=after $7=acs/desc{ # battery red color is opposite, lower number @@ -46,122 +30,128 @@ function display() { printf "%-11s%s\t" "$6" return 1 fi -} +} # display -# Battery info for Allwinner -# kernel 4.4+ -axp_dir="/sys/power/axp_pmu" -if [[ -e "$axp_dir" ]]; then - status_battery_connected=$(cat $axp_dir/battery/connected) - if [[ "$status_battery_connected" == "1" ]]; then - status_battery_charging=$(cat $axp_dir/charger/charging) - status_ac_connect=$(cat $axp_dir/ac/connected) - battery_percent=$(cat $axp_dir/battery/capacity) - # dispay charging / percentage - if [[ "$status_ac_connect" == "1" && "$battery_percent" -lt "100" ]]; then - status_battery_text=" charging" - elif [[ "$status_ac_connect" == "1" && "$battery_percent" -eq "100" ]]; then - status_battery_text=" charged" - else - status_battery_text=" discharging" - fi - fi -fi - -# legacy kernel -axp_dir="/sys/class/power_supply" -if [[ -e "$axp_dir" && -e "$axp_dir/battery" ]]; then - if [[ (("$(cat $axp_dir/battery/voltage_now)" -gt "5" )) ]]; then - status_battery_text=" "$(cat $axp_dir/battery/status | awk '{print tolower($0)}') - battery_percent=$(cat $axp_dir/battery/capacity) +function getboardtemp() { + if [ -f /etc/armbianmonitor/datasources/soctemp ]; then + read raw_temp /dev/null -if [[ $? -ne 0 ]]; then - memory_usage=$(LANG=en_US.UTF-8 free | awk '/Mem/ {printf("%.0f",(($2-($4+$6+$7))/$2) * 100)}') -else - memory_usage=$(LANG=en_US.UTF-8 free -w | awk '/Mem/ {printf("%.0f",(($2-($4+$6+$7))/$2) * 100)}') -fi -memory_total=$(LANG=en_US.UTF-8 free -m | awk '/Mem/ {print $(2)}') -users=$(users | wc -w) -swap_usage=$(LANG=en_US.UTF-8 free -m | ( awk '/Swap/ { printf("%3.0f", $3/$2*100) }' 2>/dev/null || echo 0 ) | sed 's/ //g') -swap_usage=${swap_usage//[!0-9]/} # to remove alfanumeric if swap not used -swap_total=$(LANG=en_US.UTF-8 free -m | awk '/Swap/ {print $(2)}') -ip_address=$(hostname -I | tr " " "\n" | grep -E "^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$" | tail -n2 | tr "\n" " ") -ip_address=$(echo $ip_address | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//' | sed 's/ /,/g') -root_usage=$(df -h / | awk '/\// {print $(NF-1)}' | sed 's/%//g') -root_total=$(df -h / | awk '/\// {print $(NF-4)}') -if [ -e "$storage" ]; then - storage_usage=$(df -h $storage | grep $storage | awk '/\// {print $(NF-1)}' | sed 's/%//g') - storage_total=$(df -h $storage | grep $storage | awk '/\// {print $(NF-4)}') - [[ "$storage" == */sd* ]] && hdd_temp=$(hddtemp -u C -nq $storage) -fi - -# read temperature from different locations and create a symlink to a unique location -[ -d /etc/armbianmonitor/datasources ] || mkdir -p -m775 /etc/armbianmonitor/datasources - -# deal with the exceptions first: legacy Allwinner variants (if SoC is not available take PMU) -for tempsource in /sys/devices/platform/sunxi-i2c.0/i2c-0/0-0034 /sys/devices/platform/a20-tp-hwmon ; do - if [ -d ${tempsource} ]; then - board_temp=$(awk '{printf("%d",$1/1000)}' ${tempsource}/temp1_input) - ln -fs ${tempsource}/temp1_input /etc/armbianmonitor/datasources/soctemp +function batteryinfo() { + # Battery info for Allwinner + mainline_dir="/sys/power/axp_pmu" + legacy_dir="/sys/class/power_supply" + if [[ -e "$mainline_dir" ]]; then + read status_battery_connected < $mainline_dir/battery/connected + if [[ "$status_battery_connected" == "1" ]]; then + read status_battery_charging < $mainline_dir/charger/charging + read status_ac_connect < $mainline_dir/ac/connected + read battery_percent< $mainline_dir/battery/capacity + # dispay charging / percentage + if [[ "$status_ac_connect" == "1" && "$battery_percent" -lt "100" ]]; then + status_battery_text=" charging" + elif [[ "$status_ac_connect" == "1" && "$battery_percent" -eq "100" ]]; then + status_battery_text=" charged" + else + status_battery_text=" discharging" + fi + fi + elif [[ -e "$legacy_dir/battery" ]]; then + if [[ (("$(read < $legacy_dir/battery/voltage_now)" -gt "5" )) ]]; then + status_battery_text=" "$(awk '{print tolower($0)}' < $legacy_dir/battery/status) + read battery_percent <$legacy_dir/battery/capacity + fi fi -done +} # batteryinfo -# S500 and RK3288 legacy kernels -for tempsource in /sys/devices/virtual/thermal/thermal_zone1 /sys/class/thermal/thermal_zone2 ; do - if [ -d ${tempsource} ]; then - board_temp=$(awk '{printf("%d",$1/1000)}' ${tempsource}/temp) - ln -fs ${tempsource}/temp /etc/armbianmonitor/datasources/soctemp - fi -done - -# where it should be -if [[ -d "/sys/devices/virtual/thermal/thermal_zone0/" ]]; then - ln -fs /sys/devices/virtual/thermal/thermal_zone0/temp /etc/armbianmonitor/datasources/soctemp - case $(cat /sys/devices/virtual/thermal/thermal_zone0/type) in - cpu_thermal|armada_thermal) # mainline or Armada LTS kernel - board_temp=$(awk '{printf("%d",$1/1000)}' /dev/null) + case ${amb_temp} in + *"find the USB device"*) + echo "" ;; + *) + amb_temp=$(awk '{print $NF}' <<<$amb_temp | sed 's/C//g') + echo -n "scale=1;${amb_temp}/1" | grep -oE "\-?[[:digit:]]+.[[:digit:]]" esac -fi +} # ambienttemp -# H3 based boards, legacy kernel -source /etc/armbian-release -if [[ -d "/sys/class/thermal/thermal_zone1" && ${LINUXFAMILY} == "sun8i" ]]; then - read board_temp /dev/null | grep "^Mem" || LANG=en_US.UTF-8 free | grep "^Mem") +memory_usage=$(awk '{printf("%.0f",(($2-($4+$6+$7))/$2) * 100)}' <<<${mem_info}) +memory_total=$(awk '{printf("%d",$2/1024)}' <<<${mem_info}) +swap_info=$(LANG=en_US.UTF-8 free -m | grep "^Swap") +swap_usage=$( (awk '/Swap/ { printf("%3.0f", $3/$2*100) }' <<<${swap_info} 2>/dev/null || echo 0) | tr -c -d '[:digit:]') +swap_total=$(awk '{print $(2)}' <<<${swap_info}) + +# display info +display "System load" "${load%% *}" "${critical_load}" "0" "" "${load#* }" +printf "Up time: \x1B[92m%s\x1B[0m\t\t" "$time" +display "Local users" "${users##* }" "3" "2" "" echo "" # fixed newline -display "Memory usage" "$memory_usage" "70" "0" " %" " of $memory_total""Mb" +display "Memory usage" "$memory_usage" "70" "0" " %" " of ${memory_total}MB" display "Swap usage" "$swap_usage" "10" "0" " %" " of $swap_total""Mb" printf "IP: " printf "\x1B[92m%s\x1B[0m" "$ip_address" echo "" # fixed newline a=0;b=0;c=0 -# adjustment for marvell armada. Readings were done on heatsink -[[ "$(cat /proc/cpuinfo | grep Marvell)" != "" && $board_temp -gt "60" ]] && board_temp=$(($board_temp-30)) display "CPU temp" "$board_temp" "45" "0" "°C" "" ; a=$? display "HDD temp" "$hdd_temp" "45" "0" "°C" "" ; b=$? display "Ambient temp" "$amb_temp" "40" "0" "°C" "" ; c=$? @@ -171,3 +161,4 @@ display "storage/" "$storage_usage" "90" "1" "%" " of $storage_total" display "Battery" "$battery_percent" "20" "1" "%" "$status_battery_text" echo "" echo "" + diff --git a/scripts/update-motd.d/41-armbian-config b/scripts/update-motd.d/41-armbian-config new file mode 100644 index 000000000..428ea3026 --- /dev/null +++ b/scripts/update-motd.d/41-armbian-config @@ -0,0 +1,3 @@ +#!/bin/bash + +echo -e "[\e[31m General system configuration\e[0m: \e[1marmbian-config\e[0m ]\n" \ No newline at end of file diff --git a/scripts/update-motd.d/99-point-to-faq b/scripts/update-motd.d/99-point-to-faq index 9c6e2336e..7808946ee 100644 --- a/scripts/update-motd.d/99-point-to-faq +++ b/scripts/update-motd.d/99-point-to-faq @@ -4,8 +4,4 @@ printf "New to Armbian? Check the documentation first: \e[0;92mhttps://docs.armbian.com\x1B[0m\n\n" -if [ -f "/usr/bin/armbian-config" ]; then - printf "General system configuration: \e[1marmbian-config\e[0m\n\n" -fi - (sleep 1 && rm "$0") & \ No newline at end of file