diff options
author | Waldemar Brodkorb <wbx@openadk.org> | 2010-06-26 17:10:02 +0200 |
---|---|---|
committer | Waldemar Brodkorb <wbx@openadk.org> | 2010-06-26 17:10:02 +0200 |
commit | 7fe6a59dfd76c9b6902b748b2db8d63d70ee8525 (patch) | |
tree | f98c8d8f14c8be0c24ccf18f71fa8d0f4acf077d /package | |
parent | 47e110abbf0d3142d737e753833d0d6239965b2a (diff) |
finetune kernel configuration, enable initramfs rootfs and enable reset button
alix2d has a reset button, which might be used to startup a rescue
system or anything you think about. add a small daemon from ipcop
forum to implement this. See:
http://www.ipcop-forum.de/forum/viewtopic.php?f=7&t=19183&hilit=alixswitch&start=30
finetune kernel configuration, enable MFGPT timers. Disable unsupported
MTRR. Enable watchdog.
Enable initramfs and initramfs+piggyback for alix targets.
Diffstat (limited to 'package')
-rw-r--r-- | package/Config.in | 1 | ||||
-rw-r--r-- | package/alix-switch/Makefile | 35 | ||||
-rw-r--r-- | package/alix-switch/files/alix-switch | 15 | ||||
-rw-r--r-- | package/alix-switch/files/alix-switch.init | 27 | ||||
-rw-r--r-- | package/alix-switch/files/alix-switch.postinst | 3 | ||||
-rw-r--r-- | package/alix-switch/src/alix-switchd.c | 111 | ||||
-rw-r--r-- | package/cfgfs/Makefile | 2 | ||||
-rw-r--r-- | package/grub-bin/Makefile | 2 |
8 files changed, 194 insertions, 2 deletions
diff --git a/package/Config.in b/package/Config.in index 8922d7900..3c477c70e 100644 --- a/package/Config.in +++ b/package/Config.in @@ -16,6 +16,7 @@ config ADK_ENABLE_IPV6 exception proves the rule. ;) menu "Basesystem" +source "package/alix-switch/Config.in" source "package/adkinstall/Config.in" source "package/base-files/Config.in" source "package/base-files/Config.in.manual" diff --git a/package/alix-switch/Makefile b/package/alix-switch/Makefile new file mode 100644 index 000000000..442d2d3af --- /dev/null +++ b/package/alix-switch/Makefile @@ -0,0 +1,35 @@ +# This file is part of the OpenADK project. OpenADK is copyrighted +# material, please see the LICENCE file in the top-level directory. + +include ${TOPDIR}/rules.mk + +PKG_NAME:= alix-switch +PKG_VERSION:= 1.0 +PKG_RELEASE:= 1 +PKG_DESCR:= simple daemon listening on button events +PKG_SECTION:= base + +PKG_TARGET_DEPENDS:= alix + +NO_DISTFILES:= 1 + +include ${TOPDIR}/mk/package.mk + +$(eval $(call PKG_template,ALIX_SWITCH,${PKG_NAME},${PKG_VERSION}-${PKG_RELEASE},${PKG_DEPENDS},${PKG_DESCR},${PKG_SECTION})) + +PKGDFLT_ALIX_SWITCH= y + +CONFIG_STYLE:= manual +BUILD_STYLE:= manual +INSTALL_STYLE:= manual + +do-build: + ${TARGET_CC} -Wall ${TCPPFLAGS} ${TCFLAGS} \ + -o ${WRKBUILD}/alix-switchd ${WRKBUILD}/alix-switchd.c + +do-install: + ${INSTALL_DIR} ${IDIR_ALIX_SWITCH}/usr/sbin ${IDIR_ALIX_SWITCH}/etc + ${INSTALL_BIN} ${WRKBUILD}/alix-switchd ${IDIR_ALIX_SWITCH}/usr/sbin + ${INSTALL_BIN} ./files/alix-switch ${IDIR_ALIX_SWITCH}/etc + +include ${TOPDIR}/mk/pkg-bottom.mk diff --git a/package/alix-switch/files/alix-switch b/package/alix-switch/files/alix-switch new file mode 100644 index 000000000..ad439a221 --- /dev/null +++ b/package/alix-switch/files/alix-switch @@ -0,0 +1,15 @@ +#!/bin/sh +# launched by alix-switchd in case of button event + +case "$1" in + on) + echo "alix-switch: on" + ;; + off) + echo "alix-switch: off" + ;; + *) + echo "Usage: $0 {on|off}" + ;; +esac +exit 0 diff --git a/package/alix-switch/files/alix-switch.init b/package/alix-switch/files/alix-switch.init new file mode 100644 index 000000000..c783a1be5 --- /dev/null +++ b/package/alix-switch/files/alix-switch.init @@ -0,0 +1,27 @@ +#!/bin/sh +#PKG alix-switch +#INIT 10 + +. /etc/rc.conf + +case $1 in +autostop) ;; +autostart) + test x"${alix_switch:-NO}" = x"NO" && exit 0 + exec sh $0 start + ;; +start) + alix-switchd -d + ;; +stop) + pkill alix-switchd + ;; +restart) + sh $0 stop + sh $0 start + ;; +*) + echo "usage: $0 (start|stop|restart)" + exit 1 +esac +exit $? diff --git a/package/alix-switch/files/alix-switch.postinst b/package/alix-switch/files/alix-switch.postinst new file mode 100644 index 000000000..6e0e60f12 --- /dev/null +++ b/package/alix-switch/files/alix-switch.postinst @@ -0,0 +1,3 @@ +#!/bin/sh +. $IPKG_INSTROOT/etc/functions.sh +add_rcconf alix_switchd alix_switchd NO diff --git a/package/alix-switch/src/alix-switchd.c b/package/alix-switch/src/alix-switchd.c new file mode 100644 index 000000000..d98748fa1 --- /dev/null +++ b/package/alix-switch/src/alix-switchd.c @@ -0,0 +1,111 @@ +/* +* alix-switchd.c +* +* 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. +*/ + +#include <signal.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <syslog.h> +#include <time.h> +#include <unistd.h> +#include <sys/io.h> +#include <sys/stat.h> +#include <sys/types.h> + +#define SCRIPT "/etc/alix-switch" +#define GPIOBASE 0x6100 + +typedef void (*sighandler_t)(int); + +static sighandler_t handle_signal (int sig_nr, sighandler_t signalhandler) { + + struct sigaction neu_sig, alt_sig; + + neu_sig.sa_handler = signalhandler; + sigemptyset(&neu_sig.sa_mask); + neu_sig.sa_flags = SA_RESTART; + if (sigaction (sig_nr, &neu_sig, &alt_sig) < 0) + return SIG_ERR; + + return alt_sig.sa_handler; +} + +static void start_daemon (void) { + + int i; + pid_t pid; + + if (setsid() > 0) + exit(EXIT_FAILURE); + + handle_signal(SIGHUP, SIG_IGN); + + if ((pid = fork ()) != 0) + exit(EXIT_FAILURE); + + chdir("/"); + umask(0); + for (i = sysconf(_SC_OPEN_MAX); i > 0; i--) + close(i); +} + + +int main(int argc, char *argv[]) { + + int i; + unsigned long bPort = 0; + struct timespec sleep; + int bDaemon = 0, bSwitch = 0, bState = 0; + + for(i = 1; i < argc; i++) { + if (!strcasecmp(argv[i], "-d") || !strcasecmp(argv[i], "--daemon")) { + bDaemon = 1; + } else { + printf( "\nusage: %s [-d | --daemon]\n", argv[0]); + exit(EXIT_FAILURE); + } + } + + if (iopl(3)) { + fprintf( stderr, "Could not set I/O permissions to level 3\n"); + exit(EXIT_FAILURE); + } + + if (bDaemon) + start_daemon(); + + sleep.tv_sec = 0; + sleep.tv_nsec = 50000000; + + while(1) { + bPort = inl(GPIOBASE + 0xB0); + if ((bPort & 0x100) == 0) + bState = 1; + else + bState = 0; + + if (bState && !bSwitch) + system(SCRIPT " on"); + + bSwitch = bState; + nanosleep(&sleep, NULL); + } + + if (iopl(0)) { + fprintf(stderr, "Could not set I/O permissions to level 0"); + exit(EXIT_FAILURE); + } + + return EXIT_SUCCESS; +} diff --git a/package/cfgfs/Makefile b/package/cfgfs/Makefile index b7ca8a67c..96e297cfb 100644 --- a/package/cfgfs/Makefile +++ b/package/cfgfs/Makefile @@ -14,7 +14,7 @@ PKG_TARGET_DEPENDS:= alix wrap foxboard ag241 foxg20 routerboard WRKDIST= ${WRKDIR}/${PKG_NAME}-${PKG_VERSION} NO_DISTFILES:= 1 -CFLINE_CFGFS:= select BUSYBOX_COMM\n\tselect BUSYBOX_MD5SUM\n\tselect BUSYBOX_XARGS\n\tselect BUSYBOX_FEATURE_SORT_BIG\n\tselect BUSYBOX_DIFF\n\tdepends on !ADK_TARGET_ROOTFS_NFSROOT +CFLINE_CFGFS:= select BUSYBOX_COMM\n\tselect BUSYBOX_MD5SUM\n\tselect BUSYBOX_XARGS\n\tselect BUSYBOX_FEATURE_SORT_BIG\n\tselect BUSYBOX_DIFF\n\tdepends on !ADK_TARGET_ROOTFS_NFSROOT && !ADK_TARGET_ROOTFS_INITRAMFS_PIGGYBACK && !ADK_TARGET_ROOTFS_INITRAMFS include ${TOPDIR}/mk/package.mk diff --git a/package/grub-bin/Makefile b/package/grub-bin/Makefile index df8a0d9d3..d4ec32554 100644 --- a/package/grub-bin/Makefile +++ b/package/grub-bin/Makefile @@ -14,7 +14,7 @@ PKG_SECTION:= base PKG_SITES:= http://openadk.org/distfiles/ PKG_TARGET_DEPENDS:= x86 x86_64 -CFLINE_GRUB_BIN:= select BUSYBOX_FEATURE_STAT_FORMAT +CFLINE_GRUB_BIN:= select BUSYBOX_FEATURE_STAT_FORMAT\n\tdepends on !ADK_TARGET_ROOTFS_INITRAMFS_PIGGYBACK && !ADK_TARGET_ROOTFS_INITRAMFS include ${TOPDIR}/mk/package.mk |