Enable crash detection. Sway a little with Banana Pi M3

This commit is contained in:
Thomas Kaiser 2016-03-03 00:45:46 +01:00
parent e5c1088124
commit ced9ca0c91
2 changed files with 260 additions and 285 deletions

View file

@ -1,73 +0,0 @@
From 0d0c1ff54f2f61282d6f1e66e2f27eb3a4f31595 Mon Sep 17 00:00:00 2001
From: Siarhei Siamashka <siarhei.siamashka@gmail.com>
Date: Wed, 23 Dec 2015 11:49:42 +0200
Subject: [PATCH] ARM: sun8i: Add SMP support for the Allwinner H3
The H3 is a quad Cortex-A7. Add the logic to use the IPs used to
control the CPU configuration and the CPU power so that we can
bring up secondary CPUs at boot.
CPUCFG in H3 is similar to CPUCFG in A31, but not exactly the
same. H3 PRCM is not documented at all. The SMP code in the
Allwinner SDK is guarded by the same ifdefs for A31 and H3, so
at least bringing up secondary CPU cores is likely compatible
between these two SoC variants.
Signed-off-by: Siarhei Siamashka <siarhei.siamashka@gmail.com>
---
arch/arm/boot/dts/sun8i-h3.dtsi | 11 +++++++++++
arch/arm/mach-sunxi/platsmp.c | 6 ++++++
2 files changed, 17 insertions(+)
diff --git a/arch/arm/boot/dts/sun8i-h3.dtsi b/arch/arm/boot/dts/sun8i-h3.dtsi
index 0faa38a..d23ed84 100644
--- a/arch/arm/boot/dts/sun8i-h3.dtsi
+++ b/arch/arm/boot/dts/sun8i-h3.dtsi
@@ -51,6 +51,7 @@
cpus {
#address-cells = <1>;
#size-cells = <0>;
+ enable-method = "allwinner,sun6i-a31";
cpu@0 {
compatible = "arm,cortex-a7";
@@ -591,5 +592,15 @@
interrupts = <GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>;
};
+
+ prcm@01f01400 {
+ compatible = "allwinner,sun8i-h3-prcm";
+ reg = <0x01f01400 0x200>;
+ };
+
+ cpucfg@01f01c00 {
+ compatible = "allwinner,sun8i-h3-cpuconfig";
+ reg = <0x01f01c00 0x300>;
+ };
};
};
diff --git a/arch/arm/mach-sunxi/platsmp.c b/arch/arm/mach-sunxi/platsmp.c
index e8483ec7..8ca4064 100644
--- a/arch/arm/mach-sunxi/platsmp.c
+++ b/arch/arm/mach-sunxi/platsmp.c
@@ -44,6 +44,9 @@ static void __init sun6i_smp_prepare_cpus(unsigned int max_cpus)
struct device_node *node;
node = of_find_compatible_node(NULL, NULL, "allwinner,sun6i-a31-prcm");
+ if (!node)
+ node = of_find_compatible_node(NULL, NULL,
+ "allwinner,sun8i-h3-prcm");
if (!node) {
pr_err("Missing A31 PRCM node in the device tree\n");
return;
@@ -57,6 +60,9 @@ static void __init sun6i_smp_prepare_cpus(unsigned int max_cpus)
node = of_find_compatible_node(NULL, NULL,
"allwinner,sun6i-a31-cpuconfig");
+ if (!node)
+ node = of_find_compatible_node(NULL, NULL,
+ "allwinner,sun8i-h3-cpuconfig");
if (!node) {
pr_err("Missing A31 CPU config node in the device tree\n");
return;

View file

@ -1,231 +1,279 @@
#! /bin/bash
#!/bin/bash
### BEGIN INIT INFO
# Provides: armhwinfo
# Required-Start:
# Required-Stop: glibc
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Get some info about hardware for some ARM single board computers and set some basic things
# Short-Description: Armbian gathering informations about hardware
### END INIT INFO
# Immediately exit if not called from init system at startup
if [ "X$1" != "Xstart" ]; then
exit 1
fi
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
create_motd_warning() {
collect_informations() {
TMPFILE=$(mktemp /tmp/${0##*/}.XXXXXX)
trap "rm \"${TMPFILE}\" ; exit 0" 0 1 2 3 15
dmesg >"${TMPFILE}"
SERVER_IP=$(hostname -I)
CORES=$(grep -c ^processor /proc/cpuinfo)
MEMTOTAL=$(( $(awk -F" " '/^MemTotal/ {print $2}' </proc/meminfo) / 1024 ))
ARCH=$(lscpu | awk '/Architecture/ {print $2}')
RTC=$(awk '/rtc0/ {print $(NF)}' <"${TMPFILE}")
HB_PCI=$(grep '16c3:abcd' "${TMPFILE}")
HARDWARE=$(awk '/Hardware/ {print $3}' </proc/cpuinfo)
GMAC=$(grep "sun6i_gmac" "${TMPFILE}")$(grep "gmac0-" "${TMPFILE}")
SUN8IPHY="$(awk -F"PHY ID " '/PHY ID / {print $2}' <"${TMPFILE}")"
LEDS=$(grep "green:ph02:led1" "${TMPFILE}")
TERMINUS=$(lsusb | grep -i "1a40:0101")
GL830=$(lsusb | grep -i "05e3:0718")
SWITCH=$(grep "BCM53125" "${TMPFILE}")
INTERUPT=$(grep "eth0" /proc/interrupts)
WIFI8189ES=$(lsmod | grep 8189es | grep -v "0 $" | grep -v "0$") # ignore when not loaded
WIFIAP6211=$(lsmod | grep ap6211)
read VERSION </proc/version
} # collect_informations
set_io_scheduler() {
for i in $( lsblk -idn -o NAME ); do
read ROTATE </sys/block/$i/queue/rotational
# mechanical drives
if [ "$ROTATE" = 1 ]; then echo cfq >/sys/block/$i/queue/scheduler;
echo -e "[\e[0;32m ok \x1B[0m] Setting cfg I/O scheduler for $i"
# solid state drives
elif [ "$ROTATE" = 0 ]; then echo noop >/sys/block/$i/queue/scheduler;
echo -e "[\e[0;32m ok \x1B[0m] Setting noop I/O scheduler for $i"
fi
done
} # set_io_scheduler
do_initialisation() {
# parse /etc/armbian-boards.conf and adjust everything
:
} # do_initialisation
detect_board() {
if [ "$ARCH" = "armv7l" ]; then
if [ $HARDWARE = "ODROID-XU3" ]; then
ID="Odroid XU4"
fi
if [ $HARDWARE = "Marvell" ]; then
ID="Clearfog"
fi
if [ $HARDWARE = "gs705a" ]; then
ID="Guitar"
fi
if [ $HARDWARE = "sun4i" ] || [ $HARDWARE = "Allwinner" ]; then
ID="Cubieboard"
fi
if [ $HARDWARE = "sun7i" ] || [ $HARDWARE = "Allwinner" ]; then
# redistribute irq to dedicated core
if [ "$INTERUPT" != "" ] && [ "$CORES" -gt 1 ]; then
echo 2 >/proc/irq/$(awk -F":" '/eth0/ {print $1}' </proc/interrupts | sed 's/\ //g')/smp_affinity
fi
if [ $MEMTOTAL -gt 1500 ]; then
ID="Cubietruck"
elif [ -n "$GMAC" ]; then
if [ "$TERMINUS" != "" ]; then
ID="Orange"
elif [ "$SWITCH" != "" ]; then
ID="Lamobo R1"
elif [ "$LEDS" != "" ]; then
ID="Lime 2"
elif [ "$WIFIAP6211" != "" ]; then
ID="Banana PRO"
else
ID="Banana"
fi
elif [ "$LEDS" != "" ]; then
ID="Lime"
elif [ $MEMTOTAL -lt 1500 ]; then
ID="Micro"
else
ID="Cubieboard"
fi
elif [ "$HARDWARE" = "Freescale" ]; then
if [ $MEMTOTAL -gt 1500 ]; then
ID="Cubox i4"
elif [ "$HB_PCI" != "" ]; then
ID="HB i2eX"
elif [ "$RTC" = "rtc0" ]; then
ID="Cubox i2eX"
elif [ "$CORES" = 1 ]; then
ID="HB i1"
else
ID="HB i2"
fi
[ -f /proc/asound/imxvt1613audio/id ] && ID="Udoo"
fi
if [ -f /proc/device-tree/model ]; then
# mainline kernel, parsing cpuinfo is different
HARDWARE=$(awk '/Hardware/ {print $4}' </proc/cpuinfo)
GbE="eth0"; WiFi="wlan0"; USB1="usb1"; USB2="usb2"; USB3="usb3"
else
# kernel 3.4.x
GbE="gmac0"; WiFi="wlan0"; USB1="usb2"; USB2="usb3"; USB3="usb4"
fi
if [ $HARDWARE = "sun8i" ]; then
ID="Orange H3"
# 3 or 30 sec user feedback that the board is ready after 1st login with 3.4 kernel
# TODO: BPi M3 uses different led colors
SwapState="$(grep swap /etc/fstab)"
if [ -f /sys/class/leds/green_led/trigger -a "X${SwapState}" != "X" ]; then
echo timer >/sys/class/leds/green_led/trigger
echo 200 >/sys/class/leds/green_led/delay_off
echo 200 >/sys/class/leds/green_led/delay_on
[ -f "/root/.not_logged_in_yet" ] && BlinkTime=30 || BlinkTime=3
(sleep ${BlinkTime} && echo none >/sys/class/leds/green_led/trigger) &
fi
# redistribute USB irqs to dedicated cores
echo 2 >/proc/irq/$(awk -F":" "/${USB1}/ {print \$1}" </proc/interrupts | sed 's/\ //g')/smp_affinity
echo 4 >/proc/irq/$(awk -F":" "/${USB2}/ {print \$1}" </proc/interrupts | sed 's/\ //g')/smp_affinity 2>/dev/null # OPi One
if [ "$TERMINUS" != "" ]; then
# Ethernet irqs on cpu3
echo 8 >/proc/irq/$(awk -F":" "/${GbE}/ {print \$1}" </proc/interrupts | sed 's/\ //g')/smp_affinity
ID="Orange Pi+"
if [ $MEMTOTAL -gt 1500 ]; then
if [ ${CORES} -eq 4 ]; then
ID="Orange Pi+ 2"
else
ID="Banana Pi M3"
fi
fi
case ${SUN8IPHY} in
00441400*)
if [ "$WIFI8189ES" != "" ]; then
ID="Orange Pi 2"
else
ID="Orange Pi 2 mini"
fi
;;
esac
elif [ "$WIFI8189ES" != "" ]; then
ID="Orange Pi Lite"
echo 8 >/proc/irq/$(awk -F":" "/${WiFi}/ {print \$1}" </proc/interrupts | sed 's/\ //g')/smp_affinity
elif [ $MEMTOTAL -gt 600 ]; then
case ${SUN8IPHY} in
00441400*)
ID="Orange Pi PC"
echo 8 >/proc/irq/$(awk -F":" "/${USB3}/ {print \$1}" </proc/interrupts | sed 's/\ //g')/smp_affinity
;;
*)
ID="Banana Pi M2+"
echo 8 >/proc/irq/$(awk -F":" "/${GbE}/ {print \$1}" </proc/interrupts | sed 's/\ //g')/smp_affinity
;;
esac
else
ID="Orange Pi One"
fi
# prepare board/settings mismatch detection. If we cleanup board/config names then this
# might work for all boards later and can be moved from sun8i section further down to support
# all $HARDWARE variants. Only check board after 1st login already happened to be not in
# conflict with our board auto detection mechanisms
ScriptBinName="$(echo "${ID}" | tr '[:upper:]' '[:lower:]' | sed -e 's/+/plus/' -e 's/\ //g' -e 's/2mini$/2/g' -e 's/plus2$/plus/g').bin"
ScriptBinUsed="$(readlink -f "/boot/script.bin")"
if [ "X${ScriptBinName}" != "X${ScriptBinUsed##*/}" -a ! -f "/root/.not_logged_in_yet" ]; then
show_motd_warning "It seems the image is running on ${ID} but you're using wrong settings: ${ScriptBinUsed##*/}"
fi
fi
elif [ "$ARCH" = "aarch64" ]; then
if [ $HARDWARE = "sun50iw1p1" ]; then
if [ $MEMTOTAL -gt 600 ]; then
ID="Pine64+"
else
ID="Pine64"
fi
fi
fi
[ -f /proc/device-tree/model ] && read MACHINE </proc/device-tree/model
if [[ $MACHINE == *LIME2 ]]; then ID="Lime 2"; fi
if [[ $MACHINE == *LIME ]]; then ID="Lime"; fi
if [[ $MACHINE == *Micro ]]; then ID="Micro"; fi
if [[ $MACHINE == *Banana* ]]; then ID="Banana"; fi
if [[ $MACHINE == *Udoo* ]]; then ID="udoo"; fi
if [[ $MACHINE == *Lamobo* ]]; then ID="Lamobo R1"; fi
if [[ $MACHINE == *Neo* ]]; then ID="Udoo Neo"; fi
if [[ $MACHINE == *Cubietruck* ]]; then ID="Cubietruck"; fi
if [[ $MACHINE == *Cubieboard* ]]; then ID="Cubieboard"; fi
if [[ $MACHINE == *Pro* ]]; then ID="Banana Pro"; fi
if [[ $MACHINE == *M2* ]]; then ID="Banana M2"; fi
} # detect_board
log_hardware_info() {
Log=${Log}
if [ -f ${Log} ]; then
echo -e "\n\n\n$(date) $HARDWARE $ARCH $KERNELID $MACHINE $ID" >>${Log}
else
echo "$(date) $HARDWARE $ARCH $KERNELID $MACHINE $ID" >>${Log}
chmod 755 ${Log}
fi
echo "${VERSION}" >>${Log}
echo -e "\n### dmesg:\n" >>${Log}
cat "${TMPFILE}" >>${Log}
echo -e "\n### lsusb:" >>${Log}
lsusb -v 2>/dev/null >>${Log}
echo -e "\n### lscpu:\n" >>${Log}
lscpu >>${Log}
echo -e "\n### cpuinfo:\n" >>${Log}
cat /proc/cpuinfo >>${Log}
echo -e "\n### meminfo:\n" >>${Log}
cat /proc/meminfo >>${Log}
echo -e "\n### interrupts:\n" >>${Log}
cat /proc/interrupts >>${Log}
echo -e "\n### ifconfig:\n" >>${Log}
ifconfig >>${Log}
echo -e "\n### df:\n" >>${Log}
df -h >>${Log}
# TODO: logrotate is missing
} # log_hardware_info
show_motd_warning() {
cat > /etc/update-motd.d/90-warning <<EOT
#!/bin/bash
echo -e "\e[0;91mAttention:\x1B[0m $1\n"
rm "\$0"
EOT
chmod +x /etc/update-motd.d/90-warning
} # create_motd_warning
} # show_motd_warning
TMPFILE=$(mktemp /tmp/${0##*/}.XXXXXX)
trap "rm \"${TMPFILE}\" ; exit 0" 0 1 2 3 15
dmesg >"${TMPFILE}"
SERVER_IP=$(hostname -I)
CORES=$(grep -c ^processor /proc/cpuinfo)
MEMTOTAL=$(( $(awk -F" " '/^MemTotal/ {print $2}' </proc/meminfo) / 1024 ))
ARCH=$(lscpu | awk '/Architecture/ {print $2}')
RTC=$(awk '/rtc0/ {print $(NF)}' <"${TMPFILE}")
HB_PCI=$(grep '16c3:abcd' "${TMPFILE}")
HARDWARE=$(awk '/Hardware/ {print $3}' </proc/cpuinfo)
GMAC=$(grep "sun6i_gmac" "${TMPFILE}")$(grep "gmac0-" "${TMPFILE}")
SUN8IPHY="$(awk -F"PHY ID " '/PHY ID / {print $2}' <"${TMPFILE}")"
LEDS=$(grep "green:ph02:led1" "${TMPFILE}")
TERMINUS=$(lsusb | grep "1a40:0101")
SWITCH=$(grep "BCM53125" "${TMPFILE}")
INTERUPT=$(grep "eth0" /proc/interrupts)
WIFI8189ES=$(lsmod | grep 8189es | grep -v "0 $" | grep -v "0$") # ignore when not loaded
WIFIAP6211=$(lsmod | grep ap6211)
case $1 in
*start*)
# get hardware informations
collect_informations
for i in $( lsblk -idn -o NAME ); do
read ROTATE </sys/block/$i/queue/rotational
# set optimal disk scheduler settings
set_io_scheduler
# mechanical drives
if [ "$ROTATE" = 1 ]; then echo cfq > /sys/block/$i/queue/scheduler;
echo -e "[\e[0;32m ok \x1B[0m] Setting cfg I/O scheduler for $i"
# hardware detection
detect_board
# solid state drives
elif [ "$ROTATE" = 0 ]; then echo noop > /sys/block/$i/queue/scheduler;
echo -e "[\e[0;32m ok \x1B[0m] Setting noop I/O scheduler for $i"
fi
done
# display message, log hardware id to file, write log
echo -e "[\e[0;32m ok \x1B[0m] Starting ARM hardware info: $ID"
echo $ID > /var/run/machine.id
log_hardware_info
if [ "$ARCH" = "armv7l" ]; then
if [ $HARDWARE = "ODROID-XU3" ]; then
ID="Odroid XU4"
fi
if [ $HARDWARE = "Marvell" ]; then
ID="Clearfog"
fi
if [ $HARDWARE = "gs705a" ]; then
ID="Guitar"
fi
if [ $HARDWARE = "sun4i" ] || [ $HARDWARE = "Allwinner" ]; then
ID="Cubieboard"
fi
if [ $HARDWARE = "sun7i" ] || [ $HARDWARE = "Allwinner" ]; then
# redistribute irq to dedicated core
if [ "$INTERUPT" != "" ] && [ "$CORES" -gt 1 ]; then
echo 2 >/proc/irq/$(awk -F":" '/eth0/ {print $1}' </proc/interrupts | sed 's/\ //g')/smp_affinity
fi
if [ $MEMTOTAL -gt 1500 ]; then
ID="Cubietruck"
elif [ -n "$GMAC" ]; then
if [ "$TERMINUS" != "" ]; then
ID="Orange"
elif [ "$SWITCH" != "" ]; then
ID="Lamobo R1"
elif [ "$LEDS" != "" ]; then
ID="Lime 2"
elif [ "$WIFIAP6211" != "" ]; then
ID="Banana PRO"
else
ID="Banana"
fi
elif [ "$LEDS" != "" ]; then
ID="Lime"
elif [ $MEMTOTAL -lt 1500 ]; then
ID="Micro"
else
ID="Cubieboard"
fi
elif [ "$HARDWARE" = "Freescale" ]; then
if [ $MEMTOTAL -gt 1500 ]; then
ID="Cubox i4"
elif [ "$HB_PCI" != "" ]; then
ID="HB i2eX"
elif [ "$RTC" = "rtc0" ]; then
ID="Cubox i2eX"
elif [ "$CORES" = 1 ]; then
ID="HB i1"
else
ID="HB i2"
fi
[ -f /proc/asound/imxvt1613audio/id ] && ID="Udoo"
fi
if [ -f /proc/device-tree/model ]; then
# mainline kernel, parsing cpuinfo is different
HARDWARE=$(awk '/Hardware/ {print $4}' </proc/cpuinfo)
GbE="eth0"; WiFi="wlan0"; USB1="usb1"; USB2="usb2"; USB3="usb3"
else
# kernel 3.4.x
GbE="gmac0"; WiFi="wlan0"; USB1="usb2"; USB2="usb3"; USB3="usb4"
fi
if [ $HARDWARE = "sun8i" ]; then
ID="Orange H3"
# 3 or 30 sec user feedback that the board is ready after 1st login with 3.4 kernel
SwapState="$(grep swap /etc/fstab)"
if [ -f /sys/class/leds/green_led/trigger -a "X${SwapState}" != "X" ]; then
echo timer >/sys/class/leds/green_led/trigger
echo 200 >/sys/class/leds/green_led/delay_off
echo 200 >/sys/class/leds/green_led/delay_on
[ -f "/root/.not_logged_in_yet" ] && BlinkTime=30 || BlinkTime=3
(sleep ${BlinkTime} && echo none >/sys/class/leds/green_led/trigger) &
# crash detection, enable verbose logging and disable it at clean shutdown
echo "$(date "+%s") $HARDWARE $ARCH $KERNELID $MACHINE $ID $VERSION" >/boot/.verbose
sync
;;
query)
# armbianmonitor mode -- only interested in hardware info
collect_informations >/dev/null
detect_board >/dev/null
export HARDWARE ARCH KERNELID MACHINE ID VERSION
;;
*stop*)
# remove /boot/.verbose only if /boot/.force-verbose doesn't exist.
# If our users demand verbose messages they get them
if [ -f /boot/.verbose ! -a -f /boot/.force-verbose ]; then
rm /boot/.verbose
fi
# redistribute USB irqs to dedicated cores
echo 2 >/proc/irq/$(awk -F":" "/${USB1}/ {print \$1}" </proc/interrupts | sed 's/\ //g')/smp_affinity
echo 4 >/proc/irq/$(awk -F":" "/${USB2}/ {print \$1}" </proc/interrupts | sed 's/\ //g')/smp_affinity 2>/dev/null # OPi One
if [ "$TERMINUS" != "" ]; then
# Ethernet irqs on cpu3
echo 8 >/proc/irq/$(awk -F":" "/${GbE}/ {print \$1}" </proc/interrupts | sed 's/\ //g')/smp_affinity
ID="Orange Pi+"
if [ $MEMTOTAL -gt 1500 ]; then
ID="Orange Pi+ 2"
fi
case ${SUN8IPHY} in
00441400*)
if [ "$WIFI8189ES" != "" ]; then
ID="Orange Pi 2"
else
ID="Orange Pi 2 mini"
fi
;;
esac
elif [ "$WIFI8189ES" != "" ]; then
ID="Orange Pi Lite"
echo 8 >/proc/irq/$(awk -F":" "/${WiFi}/ {print \$1}" </proc/interrupts | sed 's/\ //g')/smp_affinity
elif [ $MEMTOTAL -gt 600 ]; then
case ${SUN8IPHY} in
00441400*)
ID="Orange Pi PC"
echo 8 >/proc/irq/$(awk -F":" "/${USB3}/ {print \$1}" </proc/interrupts | sed 's/\ //g')/smp_affinity
;;
*)
ID="Banana Pi M2+"
echo 8 >/proc/irq/$(awk -F":" "/${GbE}/ {print \$1}" </proc/interrupts | sed 's/\ //g')/smp_affinity
;;
esac
else
ID="Orange Pi One"
fi
# prepare board/settings mismatch detection. If we cleanup board/config names then this
# might work for all boards later and can be moved from sun8i section further down to support
# all $HARDWARE variants. Only check board after 1st login already happened to be not in
# conflict with our board auto detection mechanisms
ScriptBinName="$(echo "${ID}" | tr '[:upper:]' '[:lower:]' | sed -e 's/+/plus/' -e 's/\ //g' -e 's/2mini$/2/g' -e 's/plus2$/plus/g').bin"
ScriptBinUsed="$(readlink -f "/boot/script.bin")"
if [ "X${ScriptBinName}" != "X${ScriptBinUsed##*/}" -a ! -f "/root/.not_logged_in_yet" ]; then
create_motd_warning "It seems the image is running on ${ID} but you're using wrong settings: ${ScriptBinUsed##*/}"
fi
fi
elif [ "$ARCH" = "aarch64" ]; then
if [ $HARDWARE = "sun50iw1p1" ]; then
if [ $MEMTOTAL -gt 600 ]; then
ID="Pine64+"
else
ID="Pine64"
fi
fi
fi
[ -f /proc/device-tree/model ] && read MACHINE </proc/device-tree/model
if [[ $MACHINE == *LIME2 ]]; then ID="Lime 2"; fi
if [[ $MACHINE == *LIME ]]; then ID="Lime"; fi
if [[ $MACHINE == *Micro ]]; then ID="Micro"; fi
if [[ $MACHINE == *Banana* ]]; then ID="Banana"; fi
if [[ $MACHINE == *Udoo* ]]; then ID="udoo"; fi
if [[ $MACHINE == *Lamobo* ]]; then ID="Lamobo R1"; fi
if [[ $MACHINE == *Neo* ]]; then ID="Udoo Neo"; fi
if [[ $MACHINE == *Cubietruck* ]]; then ID="Cubietruck"; fi
if [[ $MACHINE == *Cubieboard* ]]; then ID="Cubieboard"; fi
if [[ $MACHINE == *Pro* ]]; then ID="Banana Pro"; fi
if [[ $MACHINE == *M2* ]]; then ID="Banana M2"; fi
echo -e "[\e[0;32m ok \x1B[0m] Starting ARM hardware info: $ID"
echo $ID > /var/run/machine.id
export HARDWARE DISTROID DISTROCODE ARCH KERNELID MACHINE ID
if [ -f /var/log/armhwinfo.log ]; then
echo -e "\n\n\n$(date) $HARDWARE $DISTROID $DISTROCODE $ARCH $KERNELID $MACHINE $ID" >>/var/log/armhwinfo.log
else
echo "$(date) $HARDWARE $DISTROID $DISTROCODE $ARCH $KERNELID $MACHINE $ID" >>/var/log/armhwinfo.log
chmod 755 /var/log/armhwinfo.log
fi
cat /proc/version >>/var/log/armhwinfo.log
echo -e "\n### dmesg:\n" >>/var/log/armhwinfo.log
cat "${TMPFILE}" >>/var/log/armhwinfo.log
echo -e "\n### lsusb:" >>/var/log/armhwinfo.log
lsusb -v >>/var/log/armhwinfo.log
echo -e "\n### lscpu:\n" >>/var/log/armhwinfo.log
lscpu >>/var/log/armhwinfo.log
echo -e "\n### cpuinfo:\n" >>/var/log/armhwinfo.log
cat /proc/cpuinfo >>/var/log/armhwinfo.log
echo -e "\n### meminfo:\n" >>/var/log/armhwinfo.log
cat /proc/meminfo >>/var/log/armhwinfo.log
echo -e "\n### interrupts:\n" >>/var/log/armhwinfo.log
cat /proc/interrupts >>/var/log/armhwinfo.log
echo -e "\n### ifconfig:\n" >>/var/log/armhwinfo.log
ifconfig >>/var/log/armhwinfo.log
echo -e "\n### df:\n" >>/var/log/armhwinfo.log
df -h >>/var/log/armhwinfo.log
;;
esac