#!/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: Armbian gathering hardware information ### END INIT INFO export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin collect_information() { ifconfig | grep -q eth0 || (ifconfig eth0 up ; sleep 2) TMPFILE=$(mktemp /tmp/${0##*/}.XXXXXX) trap "rm \"${TMPFILE}\" ; exit 0" 0 1 2 3 15 dmesg >"${TMPFILE}" CORES=$(grep -c ^processor /proc/cpuinfo) MEMTOTAL=$(( $(awk -F" " '/^MemTotal/ {print $2}' /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 prepare_board() { #### Start soon obsolete auto detection stuff if [ "$ARCH" = "armv7l" ]; then if [ $HARDWARE = "ODROID-XU3" ]; then ID="Odroid XU4" fi if [ $HARDWARE = "Marvell" ]; then ID="Clearfog" fi if [ $HARDWARE = "gs705a" ]; then if [ $MEMTOTAL -gt 1800 ]; then ID="Roseapple Pi" else ID="Guitar" fi fi if [ $HARDWARE = "sun4i" ]; then ID="Cubieboard" fi if [ $HARDWARE = "sun7i" ]; then 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 Pi Pro" else ID="Banana Pi" 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 [ "$HARDWARE" = "sun8i" ]; then ID="Orange H3" if [ -f /sys/class/leds/*blue*/trigger ] ; then ID="NanoPi M1" elif [ "$TERMINUS" != "" ]; then ID="Orange Pi+" if [ $MEMTOTAL -gt 1500 ]; then if [ ${CORES} -eq 4 ]; then ID="Orange Pi+ 2" else ID="Unsupported Hardware" # 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 [ "$SPDIF" != "" ]; then ID="Beelink X2" elif [ "$WIFI8189FS" != "" ]; then if [ $MEMTOTAL -gt 1200 ]; then ID="Orange Pi+ 2E" elif [ $MEMTOTAL -gt 600 ]; then ID="Orange Pi PC Plus" else ID="Orange Pi Lite" fi elif [ $MEMTOTAL -gt 600 ]; then case ${SUN8IPHY} in 00441400*) ID="Orange Pi PC" ;; *) ID="Banana Pi M2+" ;; esac else ID="Orange Pi One" fi fi elif [ "$ARCH" = "aarch64" ]; then if [ $HARDWARE = "ODROID-C2" ]; then ID="Odroid C2" fi 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/irq/$(awk -F":" "/usb1/ {print \$1}" /proc/irq/$(awk -F":" "/usb2/ {print \$1}" /dev/null echo 4 >/proc/irq/$(awk -F":" "/usb3/ {print \$1}" /dev/null echo 4 >/proc/irq/$(awk -F":" "/owl_dma0/ {print \$1}" /proc/irq/$(awk -F":" "/ethernet_mac/ {print \$1}" /proc/irq/$(awk -F":" "/sdcard/ {print \$1}" /proc/irq/$i/smp_affinity done ;; ODROID-C2) # ODROID-C2, IRQs might be handled by c2_init.sh : ;; ODROID-XU3) # ODROID XU4 : ;; sun4i|sun5i) # only one core, nothing to do : ;; sun6i) # A31/A31s boards (Banana Pi M2) : ;; sun7i) # try to redistribute eth0 irq to dedicated core echo 2 >/proc/irq/$(awk -F":" '/eth0/ {print $1}' /dev/null ;; sun8i) # 10 or 120 sec user feedback that the board is ready after 1st login with 3.4 kernel SwapState="$(grep swap /etc/fstab)" if [ "X${SwapState}" != "X" ]; then (echo heartbeat >/sys/class/leds/*green*/trigger) 2>/dev/null [ -f "/root/.not_logged_in_yet" ] && BlinkTime=120 || BlinkTime=10 (sleep ${BlinkTime} && (echo default-on >/sys/class/leds/*green*/trigger) 2>/dev/null) & fi # check kernel version for IRQ/module names case ${KERNELID} in 3*) # BSP kernel GbE="gmac0"; WiFi="wlan0"; USB1="usb2"; USB2="usb3"; USB3="usb4" ;; *) # Mainline kernel GbE="1c30000.ethernet"; WiFi="wlan0"; USB1="usb1"; USB2="usb2"; USB3="usb3" ;; esac # Assign 1st and 2nd USB port to cpu1 and cpu2 on every sun8i board echo 2 >/proc/irq/$(awk -F":" "/${USB1}/ {print \$1}" /proc/irq/$(awk -F":" "/${USB2}/ {print \$1}" /proc/irq/$(awk -F":" "/${GbE}/ {print \$1}" /proc/irq/$(awk -F":" "/${USB3}/ {print \$1}" /proc/irq/$(awk -F":" "/${WiFi}/ {print \$1}" /proc/irq/$(awk -F":" "/usb1/ {print \$1}" /proc/irq/$(awk -F":" "/usb2/ {print \$1}" /proc/irq/$(awk -F":" "/1c30000.eth/ {print \$1}" /proc/irq/$(awk -F":" "/sunxi-mmc/ {print \$1}" "/etc/logrotate.d/${0##*/}" ; chmod 644 "/etc/logrotate.d/${0##*/}" if [ -f ${Log} ]; then echo -e "\n\n\n$(date) $HARDWARE $ARCH $KERNELID $MACHINE $ID $VERSION" >>${Log} else echo "$(date) $HARDWARE $ARCH $KERNELID $MACHINE $ID $VERSION" >>${Log} chmod 755 ${Log} fi echo -e "\n### dmesg:\n" >>${Log} cat "${TMPFILE}" >>${Log} echo -e "\n### lsusb:" >>${Log} [ -f /boot/.verbose ] && USBVERBOSE="-v" || echo "" >>${Log} lsusb ${USBVERBOSE} 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### ifconfig:\n" >>${Log} ifconfig >>${Log} echo -e "### df:\n" >>${Log} df -h >>${Log} [[ -e /boot/script.bin ]] && echo -e "\n### /boot/script.bin --> $(readlink /boot/script.bin)" >>${Log} get_flash_information >>${Log} & (sleep 20 && echo -e "\n### interrupts:\n$(cat /proc/interrupts)" >>${Log}) & } # log_hardware_info get_flash_information() { # http://www.bunniestudios.com/blog/?page_id=1022 find /sys -name oemid | while read Device ; do DeviceNode="${Device%/*}" DeviceName="${DeviceNode##*/}" echo -e "\n### ${DeviceName} info:\n" find "${DeviceNode}" -maxdepth 1 -type f | while read ; do NodeName="${REPLY##*/}" echo -e "$(printf "%20s" ${NodeName}): $(cat "${DeviceNode}/${NodeName}" | tr '\n' " ")" done done } # get_flash_information show_motd_warning() { cat > /etc/update-motd.d/90-warning </var/run/machine.id if [ $? -ne 0 ]; then # most probably readonly fs. We'll try to warn the user. show_motd_warning "It seems the rootfs is readonly at the moment. Please check your SD card for errors" fi # check whether auto detection override exists and if true use this for machine.id [ -f /root/.machine.id ] && cat /root/.machine.id >/var/run/machine.id log_hardware_info # 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_information >/dev/null prepare_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 collect_information if [ $HARDWARE = "sun8i" ]; then # redefine green led to blink until shutdown (echo heartbeat >/sys/class/leds/*green*/trigger) 2>/dev/null fi ;; esac