diff options
Diffstat (limited to 'recipes/slutils/slutils-0.1.0/sltime')
-rw-r--r-- | recipes/slutils/slutils-0.1.0/sltime/mtduser.h | 344 | ||||
-rw-r--r-- | recipes/slutils/slutils-0.1.0/sltime/sltime.c | 108 | ||||
-rw-r--r-- | recipes/slutils/slutils-0.1.0/sltime/sltime.pro | 6 |
3 files changed, 458 insertions, 0 deletions
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 |