diff options
| author | nbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2006-11-12 01:45:59 +0000 | 
|---|---|---|
| committer | nbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2006-11-12 01:45:59 +0000 | 
| commit | 91244ebf6b83c3e461b987b2f69f8dc4a3df0078 (patch) | |
| tree | 2a052c70a610c9dd3774a0d0c2df50d16e1b4229 | |
| parent | 3caab973533fa2775fa5dca7975c1d6d8141b934 (diff) | |
fix mtd compile
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@5505 3c298f89-4303-0410-b956-a3cf2f4a3e73
| -rw-r--r-- | package/mtd/src/Makefile | 2 | ||||
| -rw-r--r-- | package/mtd/src/mtd.c | 2 | ||||
| -rw-r--r-- | package/mtd/src/mtd.h | 304 | 
3 files changed, 306 insertions, 2 deletions
diff --git a/package/mtd/src/Makefile b/package/mtd/src/Makefile index b9f256ad0..99e3ad792 100644 --- a/package/mtd/src/Makefile +++ b/package/mtd/src/Makefile @@ -3,7 +3,7 @@  all: mtd  %.o: %.c -	$(CC) $(CFLAGS) $(EXTRA_CFLAGS) -c -o $@ $^ +	$(CC) -I. $(CFLAGS) $(EXTRA_CFLAGS) -c -o $@ $^  mtd: mtd.o  	$(CC) -o $@ $^ diff --git a/package/mtd/src/mtd.c b/package/mtd/src/mtd.c index f5acb1eff..80d09abd2 100644 --- a/package/mtd/src/mtd.c +++ b/package/mtd/src/mtd.c @@ -40,7 +40,7 @@  #include <sys/reboot.h>  #include <string.h> -#include <linux/mtd/mtd.h> +#include "mtd.h"  #define TRX_MAGIC       0x30524448      /* "HDR0" */  #define BUFSIZE (16 * 1024) diff --git a/package/mtd/src/mtd.h b/package/mtd/src/mtd.h new file mode 100644 index 000000000..8b83afd57 --- /dev/null +++ b/package/mtd/src/mtd.h @@ -0,0 +1,304 @@ + +/* $Id: mtd.h,v 1.38 2003/01/12 16:30:19 spse Exp $ */ + +#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/notifier.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; +}; + +#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) +#define	MEMREADDATA             _IOWR('M', 9, struct mtd_oob_buf) +#define	MEMWRITEDATA            _IOWR('M', 10, struct mtd_oob_buf) + +#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; +}; + +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, loff_t from, size_t len); + + +	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); + +	struct notifier_block reboot_notifier; + +	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); + +int default_mtd_writev(struct mtd_info *mtd, const struct iovec *vecs, +		       unsigned long count, loff_t to, size_t *retlen); + +int default_mtd_readv(struct mtd_info *mtd, struct iovec *vecs, +		      unsigned long count, loff_t from, size_t *retlen); + +#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...)				\ + 	do {						\ +		if (n <= CONFIG_MTD_DEBUG_VERBOSE)	\ +			printk(KERN_INFO args);		\ +	} while(0) +#else /* CONFIG_MTD_DEBUG */ +#define DEBUG(n, args...) +#endif /* CONFIG_MTD_DEBUG */ + +#endif /* __KERNEL__ */ + +#endif /* __MTD_MTD_H__ */  | 
