diff --git a/.gitignore b/.gitignore index 836ef17..8fb7a0e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +*/dl */dl/* */output/* *~ diff --git a/FunKey/board/funkey/genimage.cfg b/FunKey/board/funkey/genimage.cfg index a40faa2..f771e9f 100644 --- a/FunKey/board/funkey/genimage.cfg +++ b/FunKey/board/funkey/genimage.cfg @@ -16,11 +16,18 @@ image sdcard.img { partition u-boot { in-partition-table = "no" image = "u-boot-sunxi-with-spl.bin" - offset = 8192 - size = 516096 # 512KB - 8192 + offset = 8K + size = 504K # 512KB - 8KB } +# partition u-boot-env { +# in-partition-table = "no" +# offset = 544K +# size = 128K +# } + partition boot { + offset = 1M partition-type = 0xC bootable = "true" image = "boot.vfat" diff --git a/FunKey/board/funkey/post-build.sh b/FunKey/board/funkey/post-build.sh index 1de16c9..74fe6fa 100755 --- a/FunKey/board/funkey/post-build.sh +++ b/FunKey/board/funkey/post-build.sh @@ -1,5 +1,12 @@ #!/bin/sh -# Swap +# Add swap partition to fstab sed -i '/^\/swap/d' "${TARGET_DIR}/etc/fstab" echo "/swap none swap defaults 0 0" >> "${TARGET_DIR}/etc/fstab" + +# Add local path to init scripts +sed -i '3iexport PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin' ${TARGET_DIR}/etc/init.d/rcK +sed -i '3iexport PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin' ${TARGET_DIR}/etc/init.d/rcS + +# Remove log daemon init scripts since they are loaded from inittab +rm -f ${TARGET_DIR}/etc/init.d/S01syslogd ${TARGET_DIR}/etc/init.d/S02klogd diff --git a/FunKey/board/funkey/rootfs-overlay/etc/fstab b/FunKey/board/funkey/rootfs-overlay/etc/fstab new file mode 100644 index 0000000..e42e70c --- /dev/null +++ b/FunKey/board/funkey/rootfs-overlay/etc/fstab @@ -0,0 +1,11 @@ +# +/dev/root / ext2 rw,noauto 0 1 +proc /proc proc defaults 0 0 +devpts /dev/pts devpts defaults,gid=5,mode=620,ptmxmode=0666 0 0 +tmpfs /dev/shm tmpfs mode=0777 0 0 +tmpfs /tmp tmpfs mode=1777 0 0 +tmpfs /run tmpfs mode=0755,nosuid,nodev 0 0 +sysfs /sys sysfs defaults 0 0 +/swap none swap defaults 0 0 +configfs /sys/kernel/config configfs rw,relatime 0 0 +/dev/mmcblk0p3 /mnt vfat rw,relatime,fmask=0022,dmask=0022,iocharset=iso8859-1,shortname=mixed,errors=remount-ro 0 0 diff --git a/FunKey/board/funkey/rootfs-overlay/etc/init.d/S01first_boot b/FunKey/board/funkey/rootfs-overlay/etc/init.d/S01first_boot new file mode 100755 index 0000000..7b52e9a --- /dev/null +++ b/FunKey/board/funkey/rootfs-overlay/etc/init.d/S01first_boot @@ -0,0 +1,17 @@ +#!/bin/sh + +THIS=$(basename $0) + +case "$1" in + start) + if [ ! -f /swap ]; then + first_boot + fi + ;; + stop) + ;; + *) + echo "Usage: $0 {start|stop}" >&2 + exit 1 + ;; +esac diff --git a/FunKey/board/funkey/rootfs-overlay/etc/init.d/S02resize_rootfs b/FunKey/board/funkey/rootfs-overlay/etc/init.d/S02resize_rootfs deleted file mode 100755 index 2d02647..0000000 --- a/FunKey/board/funkey/rootfs-overlay/etc/init.d/S02resize_rootfs +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh - -THIS=$(basename $0) - -case "$1" in - start) - sleep 1 - echo "$THIS: starting resizing the root partition" | tee /dev/kmsg && - resize_rootfs && - rm /etc/init.d/S02resize_rootfs - if [ $? -eq 0 ]; then - echo "$THIS: finished resizing the root partition, rebooting to enlarge the root filesystem" | tee /dev/kmsg - reboot - exit 0 - else - echo "$THIS: cannot resize the root partition, aborting" | tee /dev/kmsg - exit 1 - fi - ;; - *) - echo "Usage: $0 start" >&2 - exit 2 - ;; -esac diff --git a/FunKey/board/funkey/rootfs-overlay/etc/init.d/S02share b/FunKey/board/funkey/rootfs-overlay/etc/init.d/S02share new file mode 100755 index 0000000..ec37c3d --- /dev/null +++ b/FunKey/board/funkey/rootfs-overlay/etc/init.d/S02share @@ -0,0 +1,28 @@ +#!/bin/sh + +THIS=$(basename $0) + +case "$1" in + start) + if share init; then + echo "Starting share: OK" + exit 0 + else + echo "Starting share: ERROR" + exit 1 + fi + ;; + stop) + if share stop; then + echo "Stopping share: OK" + exit 0 + else + echo "Stopping share: ERROR" + exit 2 + fi + ;; + *) + echo "Usage: $0 {start|stop}" >&2 + exit 3 + ;; +esac diff --git a/FunKey/board/funkey/rootfs-overlay/etc/init.d/S03rclocal b/FunKey/board/funkey/rootfs-overlay/etc/init.d/S03rclocal new file mode 100755 index 0000000..c30451f --- /dev/null +++ b/FunKey/board/funkey/rootfs-overlay/etc/init.d/S03rclocal @@ -0,0 +1,21 @@ +#!/bin/sh + +THIS=$(basename $0) + +case "$1" in + start) + if /etc/rc.local; then + echo "Starting rc.local: OK" + exit 0 + else + echo "Starting rc.local: ERROR" + exit 1 + fi + ;; + stop) + ;; + *) + echo "Usage: $0 {start|stop}" >&2 + exit 2 + ;; +esac diff --git a/FunKey/board/funkey/rootfs-overlay/etc/init.d/S03swap b/FunKey/board/funkey/rootfs-overlay/etc/init.d/S03swap deleted file mode 100755 index 538d770..0000000 --- a/FunKey/board/funkey/rootfs-overlay/etc/init.d/S03swap +++ /dev/null @@ -1,54 +0,0 @@ -#!/bin/sh - -THIS=$(basename $0) - -case "$1" in - start) - if [ ! -f /swap ]; then - ROOT_PART=$(df | grep /dev/root) - set $ROOT_PART - let LEFT="$4 * 1024" - if [ $LEFT -lt 134217728 ]; then - echo "$THIS: not enough free space for swap file found, aborting" | tee /dev/kmsg - exit 1 - fi - echo "$THIS: no swap file found, creating it" | tee /dev/kmsg && - dd if=/dev/zero of=/swap bs=1M count=128 && - mkswap /swap && - chmod 0600 /swap - if [ $? -eq 0 ]; then - echo "$THIS: created swap file" | tee /dev/kmsg - else - echo "$THIS: cannot create swap file, aborting" | tee /dev/kmsg - rm /swap - exit 2 - fi - fi - echo "$THIS: enabling swap file" | tee /dev/kmsg && - swapon -a - if [ $? -eq 0 ]; then - echo "$THIS: swap file enabled" | tee /dev/kmsg - else - echo "$THIS: cannot enable swap file, aborting" | tee /dev/kmsg - exit 3 - fi - ;; - stop) - echo "$THIS: disabling swap file" | tee /dev/kmsg && - swapoff -a - if [ $? -eq 0 ]; then - echo "$THIS: swap file disabled" | tee /dev/kmsg - else - echo "$THIS: cannot disable swap file, aborting" | tee /dev/kmsg - exit 4 - fi - ;; - restart|reload) - "$0" stop - "$0" start - ;; - *) - echo "Usage: $0 {start|stop|restart|reload}" >&2 - exit 5 - ;; -esac diff --git a/FunKey/board/funkey/rootfs-overlay/etc/init.d/S04modules b/FunKey/board/funkey/rootfs-overlay/etc/init.d/S04modules index 8d0aff7..3bca198 100755 --- a/FunKey/board/funkey/rootfs-overlay/etc/init.d/S04modules +++ b/FunKey/board/funkey/rootfs-overlay/etc/init.d/S04modules @@ -12,13 +12,10 @@ case "${1}" in if [ -r /etc/sysconfig/modules ]; then egrep -qv '^($|#)' /etc/sysconfig/modules if [ $? -ne 0 ]; then - echo "$THIS: no module found in /etc/sysconfig/modules" | tee/dev/kmsg exit 0 fi fi - echo "$THIS: loading modules from /etc/sysconfig/modules:" | tee/dev/kmsg - # Only try to load modules if the user has actually given us # some modules to load. while read MODULE ARGS; do @@ -35,18 +32,16 @@ case "${1}" in # Print the module name if successful, # otherwise take note. if [ $? -eq 0 ]; then - echo "$THIS: loaded module ${MODULE}" | tee /dev/kmsg + echo "Loading module ${MODULE}: OK" else - echo "$THIS: failed to load module ${MODULE}" | tee /dev/kmsg + echo "Loading module ${MODULE}: ERROR" fi done < /etc/sysconfig/modules - - # Print a message about successfully loaded - # modules on the correct line. - echo "$THIS: finished loading modules" | tee /dev/kmsg ;; + stop) + ;; *) - echo "Usage: ${0} {start}" + echo "Usage: ${0} {start|stop}" exit 1 ;; esac diff --git a/FunKey/board/funkey/rootfs-overlay/etc/inittab b/FunKey/board/funkey/rootfs-overlay/etc/inittab new file mode 100644 index 0000000..ef6cc78 --- /dev/null +++ b/FunKey/board/funkey/rootfs-overlay/etc/inittab @@ -0,0 +1,44 @@ +# /etc/inittab +# +# Copyright (C) 2001 Erik Andersen +# +# Note: BusyBox init doesn't support runlevels. The runlevels field is +# completely ignored by BusyBox init. If you want runlevels, use +# sysvinit. +# +# Format for each entry: ::: +# +# id == tty to run on, or empty for /dev/console +# runlevels == ignored +# action == one of sysinit, respawn, askfirst, wait, and once +# process == program to run + +# Startup the system +::sysinit:/bin/sh -c 'echo "Starting FunKey-OS ..."' +::sysinit:/bin/mount -t proc proc /proc +::sysinit:/bin/mount -o remount,rw / +::sysinit:/bin/mkdir -p /dev/pts /dev/shm +::sysinit:/bin/mount -a +::sysinit:/sbin/swapon -a +null::sysinit:/bin/ln -sf /proc/self/fd /dev/fd +null::sysinit:/bin/ln -sf /proc/self/fd/0 /dev/stdin +null::sysinit:/bin/ln -sf /proc/self/fd/1 /dev/stdout +null::sysinit:/bin/ln -sf /proc/self/fd/2 /dev/stderr +::sysinit:/bin/hostname -F /etc/hostname +::sysinit:/sbin/syslogd +::sysinit:/sbin/klogd +# now run any rc scripts +::sysinit:/etc/init.d/rcS + +# Put a getty on the serial port +#ttyS0::respawn:/sbin/getty -L ttyS0 115200 vt100 # GENERIC_SERIAL +#ttyS0::respawn:/sbin/getty -L -n -l /loginroot.sh ttyS0 115200 vt100 # GENERIC_SERIAL +::respawn:-/bin/sh + +# Stuff to do for the 3-finger salute +#::ctrlaltdel:/sbin/reboot + +# Stuff to do before rebooting +::shutdown:/etc/init.d/rcK +::shutdown:/sbin/swapoff -a +::shutdown:/bin/umount -a -r diff --git a/FunKey/board/funkey/rootfs-overlay/etc/issue b/FunKey/board/funkey/rootfs-overlay/etc/issue index e23056a..5ef3412 100644 --- a/FunKey/board/funkey/rootfs-overlay/etc/issue +++ b/FunKey/board/funkey/rootfs-overlay/etc/issue @@ -5,6 +5,6 @@ |___| |_____|__|__||__|\\__||_____|___ | FUN ON A KEYCHAIN |_____| ----------------------------------------------------- - Version 0.2 + Version 0.3 ----------------------------------------------------- diff --git a/FunKey/board/funkey/rootfs-overlay/etc/network/interfaces.d/usb0 b/FunKey/board/funkey/rootfs-overlay/etc/network/interfaces.d/usb0 new file mode 100644 index 0000000..4e5810d --- /dev/null +++ b/FunKey/board/funkey/rootfs-overlay/etc/network/interfaces.d/usb0 @@ -0,0 +1,7 @@ +allow-hotplug usb0 + +iface usb0 inet static +address 192.168.137.2/24 +gateway 192.168.137.1 +pre-up ip addr flush usb0 || true +up echo "nameserver 8.8.8.8" > /etc/resolv.conf diff --git a/FunKey/board/funkey/rootfs-overlay/etc/profile b/FunKey/board/funkey/rootfs-overlay/etc/profile new file mode 100755 index 0000000..831311f --- /dev/null +++ b/FunKey/board/funkey/rootfs-overlay/etc/profile @@ -0,0 +1,21 @@ +export PATH="/usr/local/games:/usr/games:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" + +if [ "$PS1" ]; then + if [ "`id -u`" -eq 0 ]; then + export PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\# ' + else + export PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ' + fi +fi + +export PAGER='/bin/more' +export EDITOR='/usr/bin/nano' +export SDL_NOMOUSE=1 + +# Source configuration files from /etc/profile.d +for i in /etc/profile.d/*.sh ; do + if [ -r "$i" ]; then + . $i + fi +done +unset i diff --git a/FunKey/board/funkey/rootfs-overlay/etc/rc.local b/FunKey/board/funkey/rootfs-overlay/etc/rc.local new file mode 100755 index 0000000..1d96541 --- /dev/null +++ b/FunKey/board/funkey/rootfs-overlay/etc/rc.local @@ -0,0 +1,24 @@ +#!/bin/sh -e +# +# rc.local +# +# This script is executed at the end of each multiuser runlevel. +# Make sure that the script will "exit 0" on success or any other +# value on error. +# +# In order to enable or disable this script just change the execution +# bits. +# +# By default this script does nothing. + +# Incremental upgrades, blocking process # +#notif_set 0 "upgrade" +#upgrade_fk_incremental + +# Low bat check # +low_bat_check >/dev/null 2>&1 & + +# System stats # +system_stats >/dev/null 2>&1 & + +exit 0 diff --git a/FunKey/board/funkey/rootfs-overlay/root/.bashrc b/FunKey/board/funkey/rootfs-overlay/root/.bashrc new file mode 100755 index 0000000..b3e270c --- /dev/null +++ b/FunKey/board/funkey/rootfs-overlay/root/.bashrc @@ -0,0 +1,74 @@ +# ~/.bashrc: executed by bash(1) for non-login shells. + +# Note: PS1 and umask are already set in /etc/profile. You should not +# need this unless you want different defaults for root. +# PS1='${debian_chroot:+($debian_chroot)}\h:\w\$ ' +# umask 022 + +# You may uncomment the following lines if you want `ls' to be colorized: +export TERM=xterm +export LS_OPTIONS='--color=auto' +eval "`dircolors`" +alias ls='ls $LS_OPTIONS' +alias ll='ls $LS_OPTIONS -l' +alias l='ls $LS_OPTIONS -lA' +# +# Some more alias to avoid making mistakes: +# alias rm='rm -i' +# alias cp='cp -i' +# alias mv='mv -i' + +# Resize the console to the terminal dimensions +resize() { + if [[ -t 0 && $# -eq 0 ]]; then + local IFS='[;' escape geometry x y + echo -ne '\e7\e[r\e[999;999H\e[6n\e8' + read -sd R escape geometry + x=${geometry##*;} y=${geometry%%;*} + if [[ ${COLUMNS} -eq ${x} && ${LINES} -eq ${y} ]]; then + echo "${TERM} ${x}x${y}" + else + echo "${COLUMNS}x${LINES} -> ${x}x${y}" + stty cols ${x} rows ${y} + fi + else + print 'Usage: resize' + fi +} + +# Mount /dev/mmcblk0p1 in /boot +echo "Mount /dev/mmcblk0p1 in /boot" +mount /dev/mmcblk0p1 /boot/ >/dev/null 2>&1 + +# Start ampli if necessary +echo "Start ampli if necessary" +if [[ "$(volume_get)" -ne "0" ]]; then + start_audio_amp 1 >/dev/null 2>&1 +fi + +# Force unmute sound card and reset volume +echo "Force unmute sound card and reset volume" +volume_set $(volume_get) >/dev/null 2>&1 + +# Reset saved brightness +echo "Reset saved brightness" +brightness_set $(brightness_get) >/dev/null 2>&1 + +# Enable USB gadget share and internet forwarding over USB +share init& + +# Start launcher +echo "Start launcher" +start_launcher >/dev/null 2>&1 & + +# Init GPIO manager +echo "Init GPIO manager" +PREVENT_GPIOMNG_FILE=/mnt/prevent_gpiomanager +PREVENT_GPIOMNG_FILE2=/boot/prevent_gpiomanager +if [ -f $PREVENT_GPIOMNG_FILE ]; then + echo "Found file: $PREVENT_GPIOMNG_FILE, not launching gpio manager" +elif [ -f $PREVENT_GPIOMNG_FILE2 ]; then + echo "Found file: $PREVENT_GPIOMNG_FILE2, not launching gpio manager" +else + start_gpio_manager >/dev/null 2>&1 & +fi diff --git a/FunKey/board/funkey/rootfs-overlay/root/.profile b/FunKey/board/funkey/rootfs-overlay/root/.profile new file mode 100755 index 0000000..1a79163 --- /dev/null +++ b/FunKey/board/funkey/rootfs-overlay/root/.profile @@ -0,0 +1,74 @@ +# ~/.bashrc: executed by bash(1) for non-login shells. + +# Note: PS1 and umask are already set in /etc/profile. You should not +# need this unless you want different defaults for root. +# PS1='${debian_chroot:+($debian_chroot)}\h:\w\$ ' +# umask 022 + +# You may uncomment the following lines if you want `ls' to be colorized: +export TERM=xterm +export LS_OPTIONS='--color=auto' +#eval "`dircolors`" +alias ls='ls $LS_OPTIONS' +alias ll='ls $LS_OPTIONS -l' +alias l='ls $LS_OPTIONS -lA' +# +# Some more alias to avoid making mistakes: +# alias rm='rm -i' +# alias cp='cp -i' +# alias mv='mv -i' + +# Resize the console to the terminal dimensions +resize() { + if [[ -t 0 && $# -eq 0 ]]; then + local IFS='[;' escape geometry x y + echo -ne '\e7\e[r\e[999;999H\e[6n\e8' + read -sd R escape geometry + x=${geometry##*;} y=${geometry%%;*} + if [[ ${COLUMNS} -eq ${x} && ${LINES} -eq ${y} ]]; then + echo "${TERM} ${x}x${y}" + else + echo "${COLUMNS}x${LINES} -> ${x}x${y}" + stty cols ${x} rows ${y} + fi + else + print 'Usage: resize' + fi +} + +# Mount /dev/mmcblk0p1 in /boot +#echo "Mount /dev/mmcblk0p1 in /boot" +#mount /dev/mmcblk0p1 /boot/ >/dev/null 2>&1 + +# Start ampli if necessary +#echo "Start ampli if necessary" +if [[ "$(volume_get)" -ne "0" ]]; then + start_audio_amp 1 >/dev/null 2>&1 +fi + +# Force unmute sound card and reset volume +#echo "Force unmute sound card and reset volume" +volume_set $(volume_get) >/dev/null 2>&1 + +# Reset saved brightness +#echo "Reset saved brightness" +brightness_set $(brightness_get) >/dev/null 2>&1 + +# Enable USB gadget share and internet forwarding over USB +share init& + +# Start launcher +#echo "Start launcher" +start_launcher >/dev/null 2>&1 & + +# Init GPIO manager +#echo "Init GPIO manager" +PREVENT_GPIOMNG_FILE=/mnt/prevent_gpiomanager +PREVENT_GPIOMNG_FILE2=/boot/prevent_gpiomanager +if [ -f $PREVENT_GPIOMNG_FILE ]; then + echo "Found file: $PREVENT_GPIOMNG_FILE, not launching gpio manager" +elif [ -f $PREVENT_GPIOMNG_FILE2 ]; then + echo "Found file: $PREVENT_GPIOMNG_FILE2, not launching gpio manager" +else + start_gpio_manager >/dev/null 2>&1 & +fi diff --git a/FunKey/board/funkey/rootfs-overlay/usr/local/lib/utils b/FunKey/board/funkey/rootfs-overlay/usr/local/lib/utils new file mode 100755 index 0000000..7a68128 --- /dev/null +++ b/FunKey/board/funkey/rootfs-overlay/usr/local/lib/utils @@ -0,0 +1,20 @@ +#!/bin/sh + +# Define log functions if they do not exist yet +type -t info >/dev/null 2>&1 +if [ $? -ne 0 ]; then + info () { + echo "$SELF:" "$@" | tee /dev/kmsg + } + + warn () { + echo "$SELF:" "$@" >&2 | tee /dev/kmsg + } + + die () { + local return_code=$1 + shift + warn "$@" + exit $return_code + } +fi diff --git a/FunKey/board/funkey/rootfs-overlay/usr/local/sbin/first_boot b/FunKey/board/funkey/rootfs-overlay/usr/local/sbin/first_boot new file mode 100755 index 0000000..3ec6736 --- /dev/null +++ b/FunKey/board/funkey/rootfs-overlay/usr/local/sbin/first_boot @@ -0,0 +1,176 @@ +#!/bin/sh + +# Uncomment the following line to get debug info +#set -x + +SELF=$(basename $0) + +source /usr/local/lib/utils + +check_swap () { + [ -f /swap ] && die 0 "nothing to do" + return 0 +} + +check_root_id () { + [ $(id -u) -ne 0 ] && die 1 "this script must be run as root, aborting" + return 0 +} + +resize_rootfs_partition () { + local root_part=$(cat /proc/cmdline | sed -n 's|^.*root=/dev/\([^ ]*\).*|\1|p') + local part_num=${root_part#mmcblk0p} + if [ "${part_num}" = "{$root_part}" ]; then + die 2 "${root_part} is not an SD card. Don't know how to expand it, aborting" + fi + if [ "${part_num}" -ne 2 ]; then + die 3 "your partition layout is not currently supported by this tool, aborting" + fi + local last_part_line=$(fdisk /dev/mmcblk0 -l | grep '^/' | tail -n 1) + set ${last_part_line} + local last_part=${1#/dev/} + local part_start=${2} + if [ "${last_part}" != "${root_part}" ]; then + die 4 "${root_part} is not the last partition. Don't know how to expand, aborting" + fi + + # Return value will likely be error for fdisk as it fails to reload the + # partition table because the root fs is mounted + # NOTE: This script only works the genuine fdisk, NOT with the busybox one!!! + fdisk /dev/mmcblk0 >/dev/null 2>&1 </dev/null 2>&1 || die 6 "cannot reload the partition table, aborting" + return 0 +} + +resize_rootfs_filesystem () { + local root_part=$(cat /proc/cmdline | sed -n 's|^.*root=/dev/\([^ ]*\).*|\1|p') + resize2fs /dev/${root_part} >/dev/null 2>&1 || die 7 "cannot resize the root filesystem, aborting" + return 0 +} + +write_bootloader_env () { + fw_saveenv /etc/u-boot.env || die 8 "cannot write bootloader inevrionment, aborting" + return 0 +} + +create_swap_file () { + local root_part_line=$(df | grep /dev/root) + set ${root_part_line} + local space_left=${4} + if [ ${space_left} -lt 131072 ]; then + die 9 "not enough free space for swap file found, aborting" + fi + dd if=/dev/zero of=/swap bs=1M count=128 >/dev/null 2>&1 && + chmod 0600 /swap >/dev/null 2>&1 && + mkswap /swap >/dev/null 2>&1 + if [ $? -ne 0 ]; then + rm /swap + die 10 "cannot create swap file, aborting" + fi + return 0 +} + +enable_swap_file () { + swapon -a >/dev/null 2>&1 || die 11 "cannot enable swap file, aborting" + return 0 +} + +create_backing_store_partition () { + mount | grep -q /dev/mmcblk0p3 + if [ $? -ne 0 ]; then + + # Find out the root partition number from kernel command line + local root_part=$(cat /proc/cmdline | sed -n 's|^.*root=/dev/\([^ ]*\).*|\1|p') + local part_num=${root_part#mmcblk0p} + if [ "$part_num" = "$root_part" ]; then + die 5 "$root_part is not an SD card. Don't know how to create the backing store partition" + fi + if [ "$part_num" -ne 2 ]; then + die 6 "your partition layout is not currently supported" + fi + + # Check that the last partition is the root partition + local last_part_line=$(fdisk /dev/mmcblk0 -l 2>/dev/null | grep '^/' | tail -n 1) + set $last_part_line + local last_part=${1#/dev/} + if [ "$last_part" != "$root_part" ]; then + die 7 "$root_part is not the last partition. Don't know how to create the backing store partition" + fi + + # The return value will likely be error for fdisk as it fails + # to reload the partition table because the root fs is mounted + # NOTE: This script only works the genuine fdisk, NOT with the + # busybox one!!! + # Create a third FAT32 partition that filsl the disk + fdisk /dev/mmcblk0 >/dev/null 2>&1 </dev/null 2>&1 || die 9 "cannot format the backing store partition" + return 0 +} + +info "First boot detected!" +check_swap +check_root_id + +info "Step 1/9 - Resize the rootfs partition" +resize_rootfs_partition + +info "Step 2/9 - Reload the partition table" +reload_partition_table + +info "Step 3/9 - Resize the root filesystem" +resize_rootfs_filesystem + +info "Step 4/9 - Write the bootloader environment" +write_bootloader_env + +info "Step 5/9 - Create the swap file" +create_swap_file + +info "Step 6/9 - Enable the swap file" +enable_swap_file + +info "Step 7/9 - Create the backing store partition" +create_backing_store_partition + +info "Step 8/9 - Reload the partition table" +reload_partition_table + +info "Step 9/9 - Format the backing store partition" +format_backing_store_partition + +info "First boot setup finished!" diff --git a/FunKey/board/funkey/rootfs-overlay/usr/local/sbin/fw_saveenv b/FunKey/board/funkey/rootfs-overlay/usr/local/sbin/fw_saveenv new file mode 100755 index 0000000..8c51727 --- /dev/null +++ b/FunKey/board/funkey/rootfs-overlay/usr/local/sbin/fw_saveenv @@ -0,0 +1,57 @@ +#!/bin/sh + +# Uncomment the following line to get debug info +#set -xv + +source /usr/local/lib/utils + +fw_saveenv () { + + # Check arguments + if [ $# -ne 1 ]; then + die 1 "usage: fw_saveenv filename" + fi + + # Save the input file name + local input_file="${1}" + + # Read the fw_env config file + local config=$(sed -e 's/#.*$//' -e '/^$/d' /etc/fw_env.config) + set ${config} + local of=${1} + local seek=$((${2} / 1024)) + local count=$((${3} / 1024)) + + # Create 2 temporary files + local blob_file=$(mktemp /tmp/fw_saveenv.XXXXXX) + local env_file=$(mktemp /tmp/fw_saveenv.XXXXXX) + + # Convert the provided file to a null-terminated string blob + cat "${input_file}" | tr '\n' '\0' > ${blob_file} + + # Compute the blob length in bytes + set -- $(ls -l ${blob_file}) + local length=${5} + + # Compute the padding size in bytes + let padding=${count}*1024-4-${length} + + # Pad the blob file with zeros up to the total size + dd if=/dev/zero bs=1 count=${padding} >>${blob_file} 2>/dev/null + + # Compute the CRC32 for the padded blob and store it at the beginning of the env file + set $(cat ${blob_file} | gzip -1 | tail -c 8 | head -c 4 | hexdump -e '4/1 "%02X "') + printf "\\x$1\\x$2\\x$3\\x$4" > ${env_file} + + # Append the binary blob file to the env file + cat ${blob_file} >> ${env_file} + + # Write the final env file to the raw device + dd if=${env_file} of=${of} bs=1k count=${count} seek=${seek} 2>/dev/null + + # Remove the temporay files + rm ${blob_file} ${env_file} + return 0 +} + +fw_saveenv $* diff --git a/FunKey/board/funkey/rootfs-overlay/usr/local/sbin/share b/FunKey/board/funkey/rootfs-overlay/usr/local/sbin/share new file mode 100755 index 0000000..d79a257 --- /dev/null +++ b/FunKey/board/funkey/rootfs-overlay/usr/local/sbin/share @@ -0,0 +1,147 @@ +#!/bin/sh + +# Uncomment the following line to get debug info +#set -x + +SELF=${SELF:-$(basename $0)} +LOCK_FILE=/var/lock/share.lock + +source /usr/local/lib/utils +source usb_gadget + +# The USB network interface file +USB_IF=/etc/network/interfaces.d/usb0 + +# The USB mass storag ebacking store file or partition +BACKING_STORE_FILE=/sys/kernel/config/usb_gadget/funkey/functions/mass_storage.funkey/lun.0/file + +# Unmount a local share +unmount_share () { + + umount /mnt || die 1 "cannot unmount the backing store partition" + return 0 +} + +# Mount a share locally +mount_share () { + + mount | grep -q /dev/mmcblk0p3 + if [ $? -ne 0 ]; then + + # Check if the FAT32 partition has been unmounted cleanly + fsck.fat -n /dev/mmcblk0p3 2>/dev/null | egrep -q "Dirty bit" + if [ $? -eq 0 ]; then + + # The FAT32 partition was not cleanly unmounted, try to + # clean it + warn "the backing store partition was not properly unmounted" + #warn "the backing store partition was not properly + #unmounted, clean it" + # fsck.fat -a -t -w /dev/loop0 >/dev/null 2>&1 + # if [ $? -gt 1 ]; then + # die 3 "cannot clean backing store file" + # fi + fi + + # Mount the backing store file locally + mount /mnt/ || die 4 "cannot mount backing store partition" + fi + + # Create the directory structure if required + (cd /mnt; mkdir -p atari_lynx gb gba megadrive neo_geo_pocket nes ps1 snes wonderswan) + return 0 +} + +# Initialize the backing store if needed and mount it locally +init_share () { + if [ -f ${LOCK_FILE} ]; then + return 0 + fi + touch ${LOCK_FILE} + + # Initialize the USB gadget + init_usb_gadget + + # Mount the backing store partition locally + mount_share + return 0 +} + +# Stop sharing the backing store partition +stop_share () { + + # Stop sharing the backing store partition + echo > $BACKING_STORE_FILE || die 11 "the backing store partition is still mounted on host" + + # 3) Mount the backing store partition locally + mount_share + + info "stopped sharing the backing store partition" + + return 0 +} + +# Start sharing the backing store partition +start_share () { + + # 1) Check if the backing store partition is already shared + cat $BACKING_STORE_FILE | egrep -q ^/dev/mmcblk0p3 && die 12 "the backing store partition is already shared" + + # 2) Unmount the backing store partition if it is locally mounted + unmount_share + + # Everything is now clear to start sharing the backing store partition + info "start sharing the backing store partition" + echo /dev/mmcblk0p3 > $BACKING_STORE_FILE || die 13 "cannot share the backing store partition" + + # Check if we are connected to an USB host + local trials=0 + local not_ready=1 + while [ ${trials} -lt 5 -a ${not_ready} -eq 1 ]; do + + # Get connection state + local udc_state=$(cat /sys/class/udc/musb-hdrc.1.auto/state) + sleep 1 + let trial=$trial+1 + + # Check if USB is mounted + if [ x"$udc_state" == "xconfigured" ]; then + + # Connected succesfully to a host + info "backing store file shared" + return 0 + elif [ x"$udc_state" == "xdefault" ]; then + + # Connected succesfully to a host + info "USB sharing in progress" + else + # Connection failed + not_ready=0 + fi + done + + # No USB host connected + warn "no host, stop USB sharing" + stop_share + die 14 "not connected to a host" +} + +case "$1" in + + init) + init_share + ;; + + start) + start_share + ;; + + stop) + stop_share + ;; + + *) + die 15 "Usage $0 {init|start|stop}" + ;; +esac +exit $? diff --git a/FunKey/board/funkey/rootfs-overlay/usr/local/sbin/usb_gadget b/FunKey/board/funkey/rootfs-overlay/usr/local/sbin/usb_gadget new file mode 100755 index 0000000..0316a55 --- /dev/null +++ b/FunKey/board/funkey/rootfs-overlay/usr/local/sbin/usb_gadget @@ -0,0 +1,169 @@ +#!/bin/sh + +#set -xv + +SELF=${SELF:-$(basename $0)} + +source /usr/local/lib/utils + +# The composite gadget directory +GADGET=/sys/kernel/config/usb_gadget/funkey + +# Check if Ethernet over USB network is requested +[ ! -f /mnt/usbnet ] +USBNET=$? + +# USB VID for Linux Foundation +ID_VENDOR="0x1d6b" + +# USB PID for Multifunction Composite Gadget +ID_PRODUCT="0x0104" + +# Get the CPU serial number +SERIAL="$(grep Serial /proc/cpuinfo | sed 's/Serial\s*: \(\w*\)/\1/')" + +# Build a MAC address from it +MAC="$(echo ${SERIAL} | sed 's/\(\w\w\)/:\1/g' | cut -b 2-)" + +# Derive host and device MAC addresses +MAC_HOST="12$(echo ${MAC} | cut -b 3-)" +MAC_DEV="02$(echo ${MAC} | cut -b 3-)" + +# Initialize the USB gadget +init_usb_gadget() { + + # Don't proceed if existing gadget is present + if [ -e ${GADGET} ]; then + return 0 + fi + + # Get the legacy drivers out of the way + modprobe -r g_ether + modprobe -r g_mass_storage + + # Load the libcomposite USB driver + modprobe libcomposite + + # USB Device Controller Driver + local udc_driver=$(ls /sys/class/udc | cut -f1 | head -n 1) + + # Create our gadget directory + mkdir ${GADGET} + mkdir ${GADGET}/strings/0x409 + mkdir ${GADGET}/configs/c.1 + mkdir ${GADGET}/configs/c.1/strings/0x409 + test $USBNET -eq 1 && mkdir ${GADGET}/functions/rndis.usb0 + mkdir ${GADGET}/functions/mass_storage.funkey + + # USB2 + echo "0x0200" > ${GADGET}/bcdUSB + + # Communication Device Class + if [ $USBNET -eq 1 ]; then + echo "0x02" > ${GADGET}/bDeviceClass + echo "0x00" > ${GADGET}/bDeviceSubClass + fi + + # USB VID and PID + echo ${ID_VENDOR} > ${GADGET}/idVendor + echo ${ID_PRODUCT} > ${GADGET}/idProduct + + # Device Release Number + echo "0x0100" > ${GADGET}/bcdDevice + + # Device String Descriptiors + echo "FunKey" > ${GADGET}/strings/0x409/manufacturer + echo "FunKey S" > ${GADGET}/strings/0x409/product + echo ${SERIAL} > ${GADGET}/strings/0x409/serialnumber + + # Turn on "OS Descriptors" support for RNDIS + if [ $USBNET -eq 1 ]; then + echo 1 > ${GADGET}/os_desc/use + echo "0xcd" > ${GADGET}/os_desc/b_vendor_code + echo "MSFT100" > ${GADGET}/os_desc/qw_sign + fi + + # Configuration + + # Maximum power is 500 mA + echo 500 > ${GADGET}/configs/c.1/MaxPower + + # Configruation String Descriptors + if [ $USBNET -eq 1 ]; then + echo "Mass Storage + RNDIS" > ${GADGET}/configs/c.1/strings/0x409/configuration + else + echo "Mass Storage" > ${GADGET}/configs/c.1/strings/0x409/configuration + fi + + if [ $USBNET -eq 1 ]; then + + # Make c.1 the one associated with OS Descriptors + ln -s ${GADGET}/configs/c.1 ${GADGET}/os_desc + + # RNDIS Function + + # Host & Device MAC Addresses + echo ${MAC_HOST} > ${GADGET}/functions/rndis.usb0/host_addr + echo ${MAC_DEV} > ${GADGET}/functions/rndis.usb0/dev_addr + + # Compatible ID & Sub-Compatible ID + echo "RNDIS" > ${GADGET}/functions/rndis.usb0/os_desc/interface.rndis/compatible_id + echo "5162001" > ${GADGET}/functions/rndis.usb0/os_desc/interface.rndis/sub_compatible_id + + # Add the "Icons" Extended Property + mkdir ${GADGET}/functions/rndis.usb0/os_desc/interface.rndis/Icons + echo 2 > ${GADGET}/functions/rndis.usb0/os_desc/interface.rndis/Icons/type + echo "%SystemRoot%\\system32\\shell32.dll,-233" > ${GADGET}/functions/rndis.usb0/os_desc/interface.rndis/Icons/data + + # Add the "Label" Extended Property + mkdir ${GADGET}/functions/rndis.usb0/os_desc/interface.rndis/Label + echo 1 > ${GADGET}/functions/rndis.usb0/os_desc/interface.rndis/Label/type + echo "FunKey S Device" > ${GADGET}/functions/rndis.usb0/os_desc/interface.rndis/Label/data + fi + + # Mass Storage Function + + # Backing Store file + #echo "/dev/mmcblk0p3" > ${GADGET}/functions/mass_storage.funkey/lun.0/file + + # Gadget is not allowed to halt bulk endpoints + echo 0 > ${GADGET}/functions/mass_storage.funkey/stall + + # Do not simulate a CDROM + echo 0 > ${GADGET}/functions/mass_storage.funkey/lun.0/cdrom + + # No SCSI Force Unit Access (FUA) to work in synchronous mode ?!? + echo 0 > ${GADGET}/functions/mass_storage.funkey/lun.0/nofua + + # LUN is removable + echo 1 > ${GADGET}/functions/mass_storage.funkey/lun.0/removable + + # Inquiry String + echo "FunKey S Shared Disk" > ${GADGET}/functions/mass_storage.funkey/lun.0/inquiry_string + + if [ $USBNET -eq 1 ]; then + + # Add the RNDIS function to the c.1 configuration + ln -s ${GADGET}/functions/rndis.usb0 ${GADGET}/configs/c.1 + + # Bind the USB Gadget as RNDIS device + echo ${udc_driver} > ${GADGET}/UDC + sleep 5 + + # Start network services + systemctl start networking ntp dropbear > /dev/null 2>&1 + + # Unbind the device + echo > ${GADGET}/UDC + fi + + # Add the Mass Storage function to the c.1 configuration + ln -s ${GADGET}/functions/mass_storage.funkey ${GADGET}/configs/c.1 + + # Each interface specifies its own class code + echo "0x00" > ${GADGET}/bDeviceClass + + # Bind the USB Gadget as a Mass Storage device + echo ${udc_driver} > ${GADGET}/UDC + return 0 +} diff --git a/FunKey/board/funkey/rootfs-overlay/usr/sbin/fw_saveenv b/FunKey/board/funkey/rootfs-overlay/usr/sbin/fw_saveenv deleted file mode 100755 index 1c1669a..0000000 --- a/FunKey/board/funkey/rootfs-overlay/usr/sbin/fw_saveenv +++ /dev/null @@ -1,59 +0,0 @@ -#!/bin/bash - -# Uncomment the following line to get debug info -#set -xv - -fw_saveenv () { - - # Check arguments - if [ $# -ne 1 ]; then - echo "usage: fw_saveenv filename" >&2 | tee /dev/kmsg - exit 1 - fi - - # Save the input file name - local input_file=${1} - - # Read the fw_env config file - local config=$(sed -e 's/#.*$//' -e '/^$/d' /etc/fw_env.config) - set ${config} - local of=${1} - local seek=$((${2} / 1024)) - local count=$((${3} / 1024)) - - # Create 2 temporary files - local tmp_file=$(mktemp /tmp/fw_saveenv.XXXXXX) - local raw_file=$(mktemp /tmp/fw_saveenv.XXXXXX) - local raw2_file=$(mktemp /tmp/fw_saveenv.XXXXXX) - - # Convert provided file to null-terminated string blob - cat ${input_file} | tr '\n' '\0' > ${tmp_file} - - # Compute blob length in bytes - local length=$(stat --printf="%s" ${tmp_file}) - - # Compute the padding size - let length=${count}*1024-4-${length} - - # Pad blob with zeros up to the total size - dd if=/dev/zero bs=1 count=${length} >>${tmp_file} 2>/dev/null - - # Compute the CRC32 for the padded blob and store it into the final file - cat ${tmp_file} | gzip -1 | tail -c 8 | head -c 4 | \ - hexdump -e '1/4 "%08x" "\n"' | xxd -r -p > ${raw_file} - - # Convert CRC32 to little endian - tac -rs '.' ${raw_file} > ${raw2_file} - - # Append the binary blob to the final file - cat ${tmp_file} >> ${raw2_file} - - # Write the final file to the raw device - dd if=${raw2_file} of=${1} bs=1k count=$((${3} / 1024)) seek=$((${2} / 1024)) 2>/dev/null - - # Remove the temporay files - rm ${tmp_file} ${raw_file} ${raw2_file} - return 0 -} - -fw_saveenv $* diff --git a/FunKey/board/funkey/rootfs-overlay/usr/sbin/resize_rootfs b/FunKey/board/funkey/rootfs-overlay/usr/sbin/resize_rootfs deleted file mode 100755 index 708945c..0000000 --- a/FunKey/board/funkey/rootfs-overlay/usr/sbin/resize_rootfs +++ /dev/null @@ -1,80 +0,0 @@ -#!/bin/sh - -#set -x - -THIS=$(basename $0) - -echo "$THIS: resizing rootfs" | tee /dev/kmsg - -if [ $(id -u) -ne 0 ]; then - echo "$THIS: this script must be run as root. Try 'sudo resize_rootfs'\n" | tee /dev/kmsg - exit 1 -fi - -ROOT_PART=$(cat /proc/cmdline | sed -n 's|^.*root=/dev/\([^ ]*\).*|\1|p') - -PART_NUM=${ROOT_PART#mmcblk0p} -if [ "$PART_NUM" = "$ROOT_PART" ]; then - echo "$THIS: $ROOT_PART is not an SD card. Don't know how to expand" | tee /dev/kmsg - exit 2 -fi - -if [ "$PART_NUM" -ne 2 ]; then - echo "$THIS: your partition layout is not currently supported by this tool" | tee /dev/kmsg - exit 3 -fi - -LAST_PART_LINE=$(fdisk /dev/mmcblk0 -l | grep '^/' | tail -n 1) -set $LAST_PART_LINE -LAST_PART=${1#/dev/} -PART_START=${2} -if [ "$LAST_PART" != "$ROOT_PART" ]; then - echo "$THIS: $ROOT_PART is not the last partition. Don't know how to expand" | tee /dev/kmsg - exit 4 -fi - -# Return value will likely be error for fdisk as it fails to reload the -# partition table because the root fs is mounted -# NOTE: This script only works the genuine fdisk, NOT with the busybox one!!! -fdisk /dev/mmcblk0 < /etc/init.d/S02resize2fs && -#!/bin/sh - -THIS=\$(basename \$0) - -case "\$1" in - start) - sleep 1 - echo "\$THIS: starting resizing the root filesystem" | tee /dev/kmsg && - resize2fs /dev/$ROOT_PART && - rm /etc/init.d/S02resize2fs - if [ \$? -eq 0 ]; then - echo "\$THIS: finished resizing the root filesystem" | tee /dev/kmsg - else - echo "\$THIS: cannot resize the root filesystem, aborting" | tee /dev/kmsg - fi - ;; - *) - echo "Usage: \$0 start" >&2 - exit 3 - ;; -esac -EOF -chmod +x /etc/init.d/S02resize2fs -echo "$THIS: the root partition has been resized" | tee /dev/kmsg -echo "$THIS: the system must reboot to enlarge the root filesystem" | tee /dev/kmsg diff --git a/FunKey/board/funkey/rootfs-overlay/usr/sbin/share b/FunKey/board/funkey/rootfs-overlay/usr/sbin/share deleted file mode 100755 index 8398a89..0000000 --- a/FunKey/board/funkey/rootfs-overlay/usr/sbin/share +++ /dev/null @@ -1,126 +0,0 @@ -#!/bin/sh - -#set -x - -THIS=$(basename $0) - -case "${1}" in - start) - - if [ ! -f /mass_storage ]; then - echo "$THIS: no shared storage file, create it" | tee /dev/kmsg - dd if=/dev/zero of=/mass_storage bs=1M seek=1024 count=0 && - cat </dev/null | egrep -q "Dirty bit" - if [ $? -eq 0 ]; then - echo "$THIS: filesystem was not properly unmounted, clean it" | tee /dev/kmsg - fsck.fat -a -t -w /dev/loop0 >/dev/null 2>&1 - if [ $? -gt 1 ]; then - echo "$THIS: cannot clean shared storage file" | tee /dev/kmsg - exit 11 - fi - fi - mount -t vfat /dev/loop0 /mnt/ - if [ $? -ne 0 ]; then - echo "$THIS: cannot mount shared storage file" | tee /dev/kmsg - exit 12 - fi - echo "$THIS: shared storage mounted" | tee /dev/kmsg - ;; - - umount) - losetup -a | egrep -q /mass_storage - if [ $? -ne 0 ]; then - echo "$THIS: no mounted shared storage file" | tee /dev/kmsg - exit 13 - fi - echo "unmounting shared storage" - umount /mnt & - losetup -d /dev/loop0 - if [ $? -ne 0 ]; then - echo "$THIS: cannot unmount shared storage" | tee /dev/kmsg - exit 14 - fi - echo "$THIS: shared storage unmounted" | tee //dev/kmsg - ;; - - *) - echo "Usage ${0} {start|stop|mount|umount}" - exit 15 - ;; -esac - - diff --git a/FunKey/board/funkey/rootfs-overlay/usr/sbin/usbnet b/FunKey/board/funkey/rootfs-overlay/usr/sbin/usbnet deleted file mode 100755 index b872c16..0000000 --- a/FunKey/board/funkey/rootfs-overlay/usr/sbin/usbnet +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh -modprobe g_ether -HOST_USB_IP=10.0.1.1 -TARGET_USB_IP=10.0.1.2 -ifconfig usb0 $TARGET_USB_IP netmask 255.255.255.0 -route add default dev usb0 -route add default gw $HOST_USB_IP -echo "nameserver 8.8.8.8" >> /etc/resolv.conf -RSA_KEYFILE=/etc/dropbear/dropbear_rsa_host_key -dropbearkey -t rsa -f $RSA_KEYFILE diff --git a/FunKey/configs/funkey_defconfig b/FunKey/configs/funkey_defconfig index 71e3ac1..7f0b535 100644 --- a/FunKey/configs/funkey_defconfig +++ b/FunKey/configs/funkey_defconfig @@ -4,7 +4,7 @@ BR2_DL_DIR="$(BR2_EXTERNAL_FUNKEY_PATH)/dl" BR2_CCACHE=y BR2_GLOBAL_PATCH_DIR="$(BR2_EXTERNAL_FUNKEY_PATH)/board/funkey/patches" BR2_TOOLCHAIN_EXTERNAL=y -BR2_TARGET_GENERIC_HOSTNAME="funkey" +BR2_TARGET_GENERIC_HOSTNAME="FunKey" BR2_TARGET_GENERIC_ISSUE="Welcome to Buildroot for the FunKey" BR2_ROOTFS_DEVICE_TABLE="$(BR2_EXTERNAL_FUNKEY_PATH)/board/funkey/device_table.txt" BR2_TARGET_GENERIC_ROOT_PASSWD="funkey"