summaryrefslogtreecommitdiff
path: root/recipes/slutils
diff options
context:
space:
mode:
authorDenys Dmytriyenko <denis@denix.org>2009-03-17 14:32:59 -0400
committerDenys Dmytriyenko <denis@denix.org>2009-03-17 14:32:59 -0400
commit709c4d66e0b107ca606941b988bad717c0b45d9b (patch)
tree37ee08b1eb308f3b2b6426d5793545c38396b838 /recipes/slutils
parentfa6cd5a3b993f16c27de4ff82b42684516d433ba (diff)
rename packages/ to recipes/ per earlier agreement
See links below for more details: http://thread.gmane.org/gmane.comp.handhelds.openembedded/21326 http://thread.gmane.org/gmane.comp.handhelds.openembedded/21816 Signed-off-by: Denys Dmytriyenko <denis@denix.org> Acked-by: Mike Westerhof <mwester@dls.net> Acked-by: Philip Balister <philip@balister.org> Acked-by: Khem Raj <raj.khem@gmail.com> Acked-by: Marcin Juszkiewicz <hrw@openembedded.org> Acked-by: Koen Kooi <koen@openembedded.org> Acked-by: Frans Meulenbroeks <fransmeulenbroeks@gmail.com>
Diffstat (limited to 'recipes/slutils')
-rw-r--r--recipes/slutils/files/sltime.sh13
-rw-r--r--recipes/slutils/slutils-0.1.0/slbl/slbl.c77
-rw-r--r--recipes/slutils/slutils-0.1.0/slbl/slbl.pro5
-rw-r--r--recipes/slutils/slutils-0.1.0/slfb/slfb.c34
-rw-r--r--recipes/slutils/slutils-0.1.0/slfb/slfb.pro5
-rw-r--r--recipes/slutils/slutils-0.1.0/sltime/mtduser.h344
-rw-r--r--recipes/slutils/slutils-0.1.0/sltime/sltime.c108
-rw-r--r--recipes/slutils/slutils-0.1.0/sltime/sltime.pro6
-rw-r--r--recipes/slutils/slutils_0.1.0.bb45
9 files changed, 637 insertions, 0 deletions
diff --git a/recipes/slutils/files/sltime.sh b/recipes/slutils/files/sltime.sh
new file mode 100644
index 0000000000..98bc89c800
--- /dev/null
+++ b/recipes/slutils/files/sltime.sh
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+case $1 in
+
+'start')
+/usr/sbin/sltime
+;;
+
+'stop')
+/usr/sbin/sltime -set
+;;
+
+esac
diff --git a/recipes/slutils/slutils-0.1.0/slbl/slbl.c b/recipes/slutils/slutils-0.1.0/slbl/slbl.c
new file mode 100644
index 0000000000..fea68b8c0a
--- /dev/null
+++ b/recipes/slutils/slutils-0.1.0/slbl/slbl.c
@@ -0,0 +1,77 @@
+/*
+ slbl backlight utility for Sharp Zaurus
+ version 1.0
+ Copyright 2004 Michael 'Mickey' Lauer <mickey@Vanille.de>
+
+ 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, 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 <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/ioctl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <time.h>
+#include <string.h>
+
+#define SHARP_FL_IOCTL_DEVICE "/dev/sharp_fl"
+#define SHARP_FL_IOCTL_ON 1
+#define SHARP_FL_IOCTL_OFF 2
+#define SHARP_FL_IOCTL_STEP_CONTRAST 100
+#define SHARP_FL_IOCTL_GET_STEP_CONTRAST 101
+#define SHARP_FL_IOCTL_GET_STEP 102
+
+int main(int argc, char *argv[])
+{
+ int fd;
+ int steps;
+ int current;
+ int new;
+
+ fd = open( SHARP_FL_IOCTL_DEVICE, O_RDWR );
+ steps = ioctl( fd, SHARP_FL_IOCTL_GET_STEP, 0 );
+
+ if ( steps < 1 )
+ {
+ perror( "SHARP_FL_IOCTL_GET_STEP: ");
+ close( fd );
+ exit( 1 );
+ }
+ current = ioctl( fd, SHARP_FL_IOCTL_GET_STEP_CONTRAST, 0 );
+
+ if (argc < 2)
+ {
+ printf( "Current backlight setting = %d / %d\n", current, steps-1 );
+ }
+ else if (strcmp(argv[1], "on") == 0)
+ {
+ ioctl( fd, SHARP_FL_IOCTL_ON, 0 );
+ }
+ else if (strcmp(argv[1], "off") == 0)
+ {
+ ioctl( fd, SHARP_FL_IOCTL_OFF, 0 );
+ }
+ else if (sscanf(argv[1], "%d", &new) == 1)
+ {
+ printf( "Setting backlight to %d\n", new );
+ ioctl( fd, SHARP_FL_IOCTL_STEP_CONTRAST, new );
+ }
+ else
+ {
+ printf( "Usage:\n%s [on|off|<num>]\n", argv[0]);
+ exit(1);
+ }
+ close( fd );
+ return 0;
+}
+
diff --git a/recipes/slutils/slutils-0.1.0/slbl/slbl.pro b/recipes/slutils/slutils-0.1.0/slbl/slbl.pro
new file mode 100644
index 0000000000..cc8b947dad
--- /dev/null
+++ b/recipes/slutils/slutils-0.1.0/slbl/slbl.pro
@@ -0,0 +1,5 @@
+CONFIG = console
+TEMPLATE = app
+INCLUDEPATH += .
+
+SOURCES += slbl.c
diff --git a/recipes/slutils/slutils-0.1.0/slfb/slfb.c b/recipes/slutils/slutils-0.1.0/slfb/slfb.c
new file mode 100644
index 0000000000..9cb72d12d2
--- /dev/null
+++ b/recipes/slutils/slutils-0.1.0/slfb/slfb.c
@@ -0,0 +1,34 @@
+#include <stdio.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <sys/ioctl.h>
+
+int main(int argc, char ** argv) {
+ int fd = open("/dev/fb0", O_WRONLY|O_NONBLOCK );
+ int on;
+ int res = 0;
+
+ if (argc != 2) {
+ printf("You must specify on or off\n");
+ return 0;
+ }
+
+ on = !strncmp(argv[1], "on", (strlen(argv[1]) > 1 ? 2 : 1));
+
+ printf((on ? "on\n" : "off\n"));
+
+ if ( fd )
+ {
+ int ioctlnum = 0x4611;
+ int vesaMode = on ? 0 : 3;
+ res = ioctl ( fd, ioctlnum, vesaMode );
+ printf("%i\n", res);
+ close ( fd );
+ }
+ else
+ {
+ printf("failed\n");
+ }
+ return res;
+}
+
diff --git a/recipes/slutils/slutils-0.1.0/slfb/slfb.pro b/recipes/slutils/slutils-0.1.0/slfb/slfb.pro
new file mode 100644
index 0000000000..35db7f20b9
--- /dev/null
+++ b/recipes/slutils/slutils-0.1.0/slfb/slfb.pro
@@ -0,0 +1,5 @@
+CONFIG = console
+TEMPLATE = app
+INCLUDEPATH += .
+
+SOURCES += slfb.c
diff --git a/recipes/slutils/slutils-0.1.0/sltime/mtduser.h b/recipes/slutils/slutils-0.1.0/sltime/mtduser.h
new file mode 100644
index 0000000000..86f2e9d27f
--- /dev/null
+++ b/recipes/slutils/slutils-0.1.0/sltime/mtduser.h
@@ -0,0 +1,344 @@
+
+/* $Id: mtd.h,v 1.35 2002/08/29 21:41:42 gleixner Exp $ */
+
+/*
+ * ChangeLog:
+ * 19-Sep-2002 Lineo Japan, Inc. add erase-by-force mode
+ *
+ */
+
+/*
+ * ChangeLog:
+ * 19-Sep-2002 Lineo Japan, Inc. add erase-by-force mode
+ * 23-Oct-2002 SHARP add definitions for CONFIG_MTD_NAND_LOGICAL_ADDRESS_ACCESS
+ *
+ */
+
+#ifndef __MTD_MTD_H__
+#define __MTD_MTD_H__
+
+#ifdef __KERNEL__
+
+#include <linux/config.h>
+#include <linux/version.h>
+#include <linux/types.h>
+#include <linux/mtd/compatmac.h>
+#include <linux/module.h>
+#include <linux/uio.h>
+
+#endif /* __KERNEL__ */
+
+struct erase_info_user {
+ u_int32_t start;
+ u_int32_t length;
+};
+
+struct mtd_oob_buf {
+ u_int32_t start;
+ u_int32_t length;
+ unsigned char *ptr;
+};
+
+
+#define MTD_CHAR_MAJOR 90
+#define MTD_BLOCK_MAJOR 31
+#define MAX_MTD_DEVICES 16
+
+
+
+#define MTD_ABSENT 0
+#define MTD_RAM 1
+#define MTD_ROM 2
+#define MTD_NORFLASH 3
+#define MTD_NANDFLASH 4
+#define MTD_PEROM 5
+#define MTD_OTHER 14
+#define MTD_UNKNOWN 15
+
+
+
+#define MTD_CLEAR_BITS 1 // Bits can be cleared (flash)
+#define MTD_SET_BITS 2 // Bits can be set
+#define MTD_ERASEABLE 4 // Has an erase function
+#define MTD_WRITEB_WRITEABLE 8 // Direct IO is possible
+#define MTD_VOLATILE 16 // Set for RAMs
+#define MTD_XIP 32 // eXecute-In-Place possible
+#define MTD_OOB 64 // Out-of-band data (NAND flash)
+#define MTD_ECC 128 // Device capable of automatic ECC
+
+// Some common devices / combinations of capabilities
+#define MTD_CAP_ROM 0
+#define MTD_CAP_RAM (MTD_CLEAR_BITS|MTD_SET_BITS|MTD_WRITEB_WRITEABLE)
+#define MTD_CAP_NORFLASH (MTD_CLEAR_BITS|MTD_ERASEABLE)
+#define MTD_CAP_NANDFLASH (MTD_CLEAR_BITS|MTD_ERASEABLE|MTD_OOB)
+#define MTD_WRITEABLE (MTD_CLEAR_BITS|MTD_SET_BITS)
+
+
+// Types of automatic ECC/Checksum available
+#define MTD_ECC_NONE 0 // No automatic ECC available
+#define MTD_ECC_RS_DiskOnChip 1 // Automatic ECC on DiskOnChip
+#define MTD_ECC_SW 2 // SW ECC for Toshiba & Samsung devices
+
+struct mtd_info_user {
+ u_char type;
+ u_int32_t flags;
+ u_int32_t size; // Total size of the MTD
+ u_int32_t erasesize;
+ u_int32_t oobblock; // Size of OOB blocks (e.g. 512)
+ u_int32_t oobsize; // Amount of OOB data per block (e.g. 16)
+ u_int32_t ecctype;
+ u_int32_t eccsize;
+};
+
+struct region_info_user {
+ u_int32_t offset; /* At which this region starts,
+ * from the beginning of the MTD */
+ u_int32_t erasesize; /* For this region */
+ u_int32_t numblocks; /* Number of blocks in this region */
+ u_int32_t regionindex;
+};
+
+#ifdef CONFIG_MTD_NAND_LOGICAL_ADDRESS_ACCESS
+struct read_laddr_info_user {
+ loff_t from;
+ size_t len;
+ u_char* buf;
+};
+
+struct write_laddr_info_user {
+ loff_t to;
+ size_t len;
+ u_char* buf;
+};
+#endif
+
+#define MEMGETINFO _IOR('M', 1, struct mtd_info_user)
+#define MEMERASE _IOW('M', 2, struct erase_info_user)
+#define MEMWRITEOOB _IOWR('M', 3, struct mtd_oob_buf)
+#define MEMREADOOB _IOWR('M', 4, struct mtd_oob_buf)
+#define MEMLOCK _IOW('M', 5, struct erase_info_user)
+#define MEMUNLOCK _IOW('M', 6, struct erase_info_user)
+#define MEMGETREGIONCOUNT _IOR('M', 7, int)
+#define MEMGETREGIONINFO _IOWR('M', 8, struct region_info_user)
+#ifdef CONFIG_MTD_NAND_ERASE_BY_FORCE
+#define MEMERASEBYFORCE _IOW('M', 9, struct erase_info_user)
+#else
+#define MEMIOCTLRSV9 _IO('M', 9)
+#endif
+#ifdef CONFIG_MTD_NAND_LOGICAL_ADDRESS_ACCESS
+#define MEMCLEANUPLADDR _IO('M', 10)
+#define MEMREADLADDR _IOR('M', 11, struct read_laddr_info_user)
+#define MEMWRITELADDR _IOW('M', 12, struct write_laddr_info_user)
+#else
+#define MEMIOCTLRSV10 _IO('M', 10)
+#define MEMIOCTLRSV11 _IO('M', 11)
+#define MEMIOCTLRSV12 _IO('M', 12)
+#endif
+
+#ifndef __KERNEL__
+
+typedef struct mtd_info_user mtd_info_t;
+typedef struct erase_info_user erase_info_t;
+typedef struct region_info_user region_info_t;
+
+ /* User-space ioctl definitions */
+
+
+#else /* __KERNEL__ */
+
+
+#define MTD_ERASE_PENDING 0x01
+#define MTD_ERASING 0x02
+#define MTD_ERASE_SUSPEND 0x04
+#define MTD_ERASE_DONE 0x08
+#define MTD_ERASE_FAILED 0x10
+
+struct erase_info {
+ struct mtd_info *mtd;
+ u_int32_t addr;
+ u_int32_t len;
+ u_long time;
+ u_long retries;
+ u_int dev;
+ u_int cell;
+ void (*callback) (struct erase_info *self);
+ u_long priv;
+ u_char state;
+ struct erase_info *next;
+#ifdef CONFIG_MTD_NAND_ERASE_BY_FORCE
+ int by_force;
+#endif
+};
+
+struct mtd_erase_region_info {
+ u_int32_t offset; /* At which this region starts, from the beginning of the MTD */
+ u_int32_t erasesize; /* For this region */
+ u_int32_t numblocks; /* Number of blocks of erasesize in this region */
+};
+
+struct mtd_info {
+ u_char type;
+ u_int32_t flags;
+ u_int32_t size; // Total size of the MTD
+
+ /* "Major" erase size for the device. Naïve users may take this
+ * to be the only erase size available, or may use the more detailed
+ * information below if they desire
+ */
+ u_int32_t erasesize;
+
+ u_int32_t oobblock; // Size of OOB blocks (e.g. 512)
+ u_int32_t oobsize; // Amount of OOB data per block (e.g. 16)
+ u_int32_t ecctype;
+ u_int32_t eccsize;
+
+ // Kernel-only stuff starts here.
+ char *name;
+ int index;
+
+ /* Data for variable erase regions. If numeraseregions is zero,
+ * it means that the whole device has erasesize as given above.
+ */
+ int numeraseregions;
+ struct mtd_erase_region_info *eraseregions;
+
+ /* This really shouldn't be here. It can go away in 2.5 */
+ u_int32_t bank_size;
+
+ struct module *module;
+ int (*erase) (struct mtd_info *mtd, struct erase_info *instr);
+
+ /* This stuff for eXecute-In-Place */
+ int (*point) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char **mtdbuf);
+
+ /* We probably shouldn't allow XIP if the unpoint isn't a NULL */
+ void (*unpoint) (struct mtd_info *mtd, u_char * addr);
+
+
+ int (*read) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf);
+ int (*write) (struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf);
+
+ int (*read_ecc) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf, u_char *eccbuf, int oobsel);
+ int (*write_ecc) (struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf, u_char *eccbuf, int oobsel);
+
+ int (*read_oob) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf);
+ int (*write_oob) (struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf);
+
+ /*
+ * Methods to access the protection register area, present in some
+ * flash devices. The user data is one time programmable but the
+ * factory data is read only.
+ */
+ int (*read_user_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf);
+
+ int (*read_fact_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf);
+
+ /* This function is not yet implemented */
+ int (*write_user_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf);
+
+ /* iovec-based read/write methods. We need these especially for NAND flash,
+ with its limited number of write cycles per erase.
+ NB: The 'count' parameter is the number of _vectors_, each of
+ which contains an (ofs, len) tuple.
+ */
+ int (*readv) (struct mtd_info *mtd, struct iovec *vecs, unsigned long count, loff_t from, size_t *retlen);
+ int (*readv_ecc) (struct mtd_info *mtd, struct iovec *vecs, unsigned long count, loff_t from,
+ size_t *retlen, u_char *eccbuf, int oobsel);
+ int (*writev) (struct mtd_info *mtd, const struct iovec *vecs, unsigned long count, loff_t to, size_t *retlen);
+ int (*writev_ecc) (struct mtd_info *mtd, const struct iovec *vecs, unsigned long count, loff_t to,
+ size_t *retlen, u_char *eccbuf, int oobsel);
+
+ /* Sync */
+ void (*sync) (struct mtd_info *mtd);
+
+ /* Chip-supported device locking */
+ int (*lock) (struct mtd_info *mtd, loff_t ofs, size_t len);
+ int (*unlock) (struct mtd_info *mtd, loff_t ofs, size_t len);
+
+ /* Power Management functions */
+ int (*suspend) (struct mtd_info *mtd);
+ void (*resume) (struct mtd_info *mtd);
+
+#ifdef CONFIG_MTD_NAND_LOGICAL_ADDRESS_ACCESS
+ /* Logical Address Access functions */
+ int (*cleanup_laddr)(struct mtd_info *mtd);
+ int (*read_laddr)(struct mtd_info *mtd, loff_t from, size_t len, u_char *buf);
+ int (*write_laddr)(struct mtd_info *mtd, loff_t to, size_t len, u_char *buf, int (*eraseproc)(struct mtd_info *mtd, u_int32_t addr));
+#endif
+
+ void *priv;
+};
+
+
+ /* Kernel-side ioctl definitions */
+
+extern int add_mtd_device(struct mtd_info *mtd);
+extern int del_mtd_device (struct mtd_info *mtd);
+
+extern struct mtd_info *__get_mtd_device(struct mtd_info *mtd, int num);
+
+static inline struct mtd_info *get_mtd_device(struct mtd_info *mtd, int num)
+{
+ struct mtd_info *ret;
+
+ ret = __get_mtd_device(mtd, num);
+
+ if (ret && ret->module && !try_inc_mod_count(ret->module))
+ return NULL;
+
+ return ret;
+}
+
+static inline void put_mtd_device(struct mtd_info *mtd)
+{
+ if (mtd->module)
+ __MOD_DEC_USE_COUNT(mtd->module);
+}
+
+
+struct mtd_notifier {
+ void (*add)(struct mtd_info *mtd);
+ void (*remove)(struct mtd_info *mtd);
+ struct mtd_notifier *next;
+};
+
+
+extern void register_mtd_user (struct mtd_notifier *new);
+extern int unregister_mtd_user (struct mtd_notifier *old);
+
+
+#ifndef MTDC
+#define MTD_ERASE(mtd, args...) (*(mtd->erase))(mtd, args)
+#define MTD_POINT(mtd, a,b,c,d) (*(mtd->point))(mtd, a,b,c, (u_char **)(d))
+#define MTD_UNPOINT(mtd, arg) (*(mtd->unpoint))(mtd, (u_char *)arg)
+#define MTD_READ(mtd, args...) (*(mtd->read))(mtd, args)
+#define MTD_WRITE(mtd, args...) (*(mtd->write))(mtd, args)
+#define MTD_READV(mtd, args...) (*(mtd->readv))(mtd, args)
+#define MTD_WRITEV(mtd, args...) (*(mtd->writev))(mtd, args)
+#define MTD_READECC(mtd, args...) (*(mtd->read_ecc))(mtd, args)
+#define MTD_WRITEECC(mtd, args...) (*(mtd->write_ecc))(mtd, args)
+#define MTD_READOOB(mtd, args...) (*(mtd->read_oob))(mtd, args)
+#define MTD_WRITEOOB(mtd, args...) (*(mtd->write_oob))(mtd, args)
+#define MTD_SYNC(mtd) do { if (mtd->sync) (*(mtd->sync))(mtd); } while (0)
+#endif /* MTDC */
+
+/*
+ * Debugging macro and defines
+ */
+#define MTD_DEBUG_LEVEL0 (0) /* Quiet */
+#define MTD_DEBUG_LEVEL1 (1) /* Audible */
+#define MTD_DEBUG_LEVEL2 (2) /* Loud */
+#define MTD_DEBUG_LEVEL3 (3) /* Noisy */
+
+#ifdef CONFIG_MTD_DEBUG
+#define DEBUG(n, args...) \
+ if (n <= CONFIG_MTD_DEBUG_VERBOSE) { \
+ printk(KERN_INFO args); \
+ }
+#else /* CONFIG_MTD_DEBUG */
+#define DEBUG(n, args...)
+#endif /* CONFIG_MTD_DEBUG */
+
+#endif /* __KERNEL__ */
+
+#endif /* __MTD_MTD_H__ */
diff --git a/recipes/slutils/slutils-0.1.0/sltime/sltime.c b/recipes/slutils/slutils-0.1.0/sltime/sltime.c
new file mode 100644
index 0000000000..6129df4467
--- /dev/null
+++ b/recipes/slutils/slutils-0.1.0/sltime/sltime.c
@@ -0,0 +1,108 @@
+/*
+ sltime utility replacement for Sharp Zaurus SL-C7x0/860
+ version 1.0
+ Copyright 2004 Alexander Chukov <sash@cacko.biz>
+
+ 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, 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 <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/ioctl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <time.h>
+#include <string.h>
+
+#define CONFIG_MTD_NAND_LOGICAL_ADDRESS_ACCESS
+#include "mtduser.h"
+
+#define APM_IOC_SETRTC 0x4146
+#define APM_IOC_GETRTC 0x4147
+
+static int open_mtd(void)
+{
+ int fd;
+ mtd_info_t meminfo;
+
+ /* Open the device */
+ if((fd = open("/dev/mtd1", O_RDWR)) == -1) {
+ perror("open flash");
+ exit(1);
+ }
+
+ /* Fill in MTD device capability structure */
+ if(ioctl(fd, MEMGETINFO, &meminfo) != 0) {
+ perror("MEMGETINFO");
+ close(fd);
+ exit(1);
+ }
+
+ /* Make sure device page sizes are valid */
+ if( !(meminfo.oobsize == 16 && meminfo.oobblock == 512) &&
+ !(meminfo.oobsize == 8 && meminfo.oobblock == 256) ) {
+ printf("Unknown flash (not normal NAND)\n");
+ close(fd);
+ exit(1);
+ }
+
+ return fd;
+}
+
+int main(int argc, char *argv[])
+{
+ int fd, mfd;
+ struct timeval tv;
+ unsigned int setime;
+ struct read_laddr_info_user rinfo = {0x4C004, 4, (unsigned char *) &setime};
+
+ if (argc < 2) {
+ mfd = open_mtd();
+ if (ioctl(mfd, MEMREADLADDR, &rinfo) != 0) {
+ perror("ioctl(MEMREADLADDR)");
+ close(mfd);
+ exit(1);
+ }
+ close(mfd);
+ fd = open("/dev/apm_bios", O_RDWR);
+ //setime += ioctl(fd, APM_IOC_GETRTC, 0);
+ ioctl(fd, APM_IOC_SETRTC, &setime);
+ tv.tv_usec = 0;
+ tv.tv_sec = setime;
+ settimeofday(&tv, 0);
+ close(fd);
+ } else if (strcmp(argv[1], "-clear") == 0) {
+ fd = open("/dev/apm_bios", O_RDWR);
+ tv.tv_usec = 0;
+ tv.tv_sec = 1075658510;
+ settimeofday(&tv, 0);
+ setime = tv.tv_sec;
+ ioctl(fd, APM_IOC_SETRTC, (void*)&setime);
+ close(fd);
+ } else if (strcmp(argv[1], "-set") == 0) {
+ gettimeofday(&tv, 0);
+ setime = tv.tv_sec;
+ mfd = open_mtd();
+ if (ioctl(mfd, MEMWRITELADDR, &rinfo) != 0) {
+ perror("ioctl(MEMWRITELADDR)");
+ close(mfd);
+ exit(1);
+ }
+ close(mfd);
+ } else {
+ fprintf(stderr, "Usage:\n%s [-set|-clear]\n", argv[0]);
+ exit(1);
+ }
+ return 0;
+}
+
diff --git a/recipes/slutils/slutils-0.1.0/sltime/sltime.pro b/recipes/slutils/slutils-0.1.0/sltime/sltime.pro
new file mode 100644
index 0000000000..9e12fde398
--- /dev/null
+++ b/recipes/slutils/slutils-0.1.0/sltime/sltime.pro
@@ -0,0 +1,6 @@
+CONFIG = console
+TEMPLATE = app
+INCLUDEPATH += .
+
+HEADERS += mtduser.h
+SOURCES += sltime.c
diff --git a/recipes/slutils/slutils_0.1.0.bb b/recipes/slutils/slutils_0.1.0.bb
new file mode 100644
index 0000000000..8b7d6f6ce9
--- /dev/null
+++ b/recipes/slutils/slutils_0.1.0.bb
@@ -0,0 +1,45 @@
+DESCRIPTION = "Console utilities for certain hardware aspects of Sharp Linux based Zaurii"
+DESCRIPTION_slfb = "A command-line utility to turn on/off the FrameBuffer on Linux 2.4-based Zaurii"
+DESCRIPTION_slbl = "A command-line utility to control the BackLight on Linux 2.4-based Zaurii"
+DESCRIPTION_sltime = "A ustility to save and restore the time on Sharp Linux based Zaurii"
+SECTION = "console/utils"
+PRIORITY = "optional"
+LICENSE = "GPL"
+PR = "r4"
+
+inherit qmake update-rc.d
+
+SRC_URI = "file://sltime.sh"
+
+INITSCRIPT_NAME = "sltime"
+INITSCRIPT_PARAMS = "defaults 5"
+
+export UTILS = "sltime slbl slfb"
+
+do_fetch() {
+ for u in ${UTILS}
+ do
+ install -d ${S}/$u
+ cp -PfR `ls -dp ${FILESDIR}/$u/*|grep -v SCCS` ${S}/$u/
+ done
+}
+
+do_configure_prepend() {
+ cd ${S}/
+ printf "TEMPLATE=subdirs\nSUBDIRS=${UTILS}\n" >slutils.pro
+}
+
+do_install() {
+ install -d ${D}${sbindir}
+ for u in ${UTILS}
+ do
+ install -m 0755 ${S}/${u}/${u} ${D}${sbindir}/
+ done
+ install -d ${D}${sysconfdir}/init.d/
+ install -m 0755 ${WORKDIR}/sltime.sh ${D}${sysconfdir}/init.d/sltime
+}
+
+PACKAGES =+ "slbl slfb"
+FILES_slbl = "${sbindir}/slbl"
+FILES_slfb = "${sbindir}/slfb"
+