root/dev/flashvar.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


    1 /*      $OpenBSD: flashvar.h,v 1.2 2007/06/20 18:15:46 deraadt Exp $    */
    2 
    3 /*
    4  * Copyright (c) 2005 Uwe Stuehler <uwe@openbsd.org>
    5  *
    6  * Permission to use, copy, modify, and distribute this software for any
    7  * purpose with or without fee is hereby granted, provided that the above
    8  * copyright notice and this permission notice appear in all copies.
    9  *
   10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
   11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
   12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
   13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
   14  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
   15  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
   16  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
   17  */
   18 
   19 #ifndef _FLASHVAR_H_
   20 #define _FLASHVAR_H_
   21 
   22 #ifdef _KERNEL
   23 
   24 /* Flash controller descriptor structure */
   25 struct flash_ctl_tag {
   26         u_int8_t (*reg8_read)(void *, int);
   27         int      (*regx_read_page)(void *, caddr_t, caddr_t);
   28         void     (*reg8_write)(void *, int, u_int8_t);
   29         int      (*regx_write_page)(void *, caddr_t, caddr_t);
   30         void     (*default_disklabel)(void *, dev_t, struct disklabel *);
   31         int      (*safe_strategy)(void *, struct buf *);
   32 };
   33 
   34 /*
   35  * Pseudo-registers for a fictitious flash controller
   36  *
   37  * Note that logical levels are assumed for CE and WP bits.
   38  * Signals corresponding to these bits are usually negated.
   39  */
   40 #define FLASH_REG_DATA          0x00
   41 #define FLASH_REG_COL           0x01
   42 #define FLASH_REG_ROW           0x02
   43 #define FLASH_REG_CMD           0x03
   44 #define FLASH_REG_ALE           0x04
   45 #define FLASH_REG_CLE           0x05
   46 #define FLASH_REG_CE            0x06
   47 #define FLASH_REG_WP            0x07
   48 #define FLASH_REG_READY         0x0f
   49 
   50 /* Flash device descriptor structure */
   51 struct flashdev {
   52         u_int16_t        id;
   53         const char      *longname;
   54         u_long           pagesize;      /* bytes per page */
   55         u_long           oobsize;       /* OOB bytes per page */
   56         u_long           blkpages;      /* pages per erasable block */
   57         u_long           capacity;      /* pages per device */
   58 };
   59 
   60 #define FLASH_DEVICE(v,d)               ((FLASH_VENDOR_##v << 8) | (d))
   61 
   62 /* Flash device vendors */
   63 #define FLASH_VENDOR_SAMSUNG            0xec
   64 
   65 /* Flash devices */
   66 #define FLASH_DEVICE_SAMSUNG_K9F2808U0C FLASH_DEVICE(SAMSUNG, 0x73)
   67 #define FLASH_DEVICE_SAMSUNG_K9F1G08U0A FLASH_DEVICE(SAMSUNG, 0xf1)
   68 
   69 /* Maximum sizes for all devices */
   70 #define FLASH_MAXPAGESIZE       2048
   71 #define FLASH_MAXOOBSIZE        64
   72 
   73 /*
   74  * Should-be private softc structure for the generic flash driver.
   75  */
   76 struct flash_softc {
   77         struct device            sc_dev;
   78         /* Disk device information */
   79         struct disk              sc_dk;
   80         struct buf               sc_q;
   81         struct buf              *sc_bp;
   82         int                      sc_flags;
   83         /* Flash controller tag */
   84         struct flash_ctl_tag    *sc_tag;
   85         void                    *sc_cookie;
   86         /* Flash device characteristics */
   87         const struct flashdev   *sc_flashdev;
   88         int                      sc_maxwaitready;
   89         int                      sc_maxwaitcomplete;
   90 };
   91 
   92 /* Values for sc_flags */
   93 #define FDK_LOADED               0x00000001
   94 #define FDK_SAFE                 0x00000002
   95 
   96 /*
   97  * Similar to vnd(4) devices there are two kinds of flash devices.
   98  * Both device kinds share the same disklabel.
   99  *
  100  * ``Safe'' devices have bit 11 set in the minor number and use the
  101  * out-of-band page data to implement wear-leveling and transparent
  102  * management of bad block information. Block erasing and rewriting
  103  * is also handled transparently; arbitrary pages can be modified.
  104  *
  105  * ``Unsafe'' devices provide raw access to the flash pages. Access
  106  * to OOB page data is possible via ioctl()s only with these devices.
  107  * Erasing the containing flash block may be necessary before a page
  108  * can be writting successfully, but the block erase command is only
  109  * provided as an ioctl().
  110  */
  111 #define flashsafe(x)    (minor(x) & 0x800)
  112 #define flashunit(x)    DISKUNIT(makedev(major(x), minor(x) & 0x7ff))
  113 #define flashpart(x)    DISKPART(makedev(major(x), minor(x) & 0x7ff))
  114 #define flashlabeldev(x) (MAKEDISKDEV(major(x), flashunit(x), RAW_PART)\
  115                          |flashsafe(x))
  116 
  117 void     flashattach(struct flash_softc *, struct flash_ctl_tag *, void *);
  118 int      flashdetach(struct device *, int);
  119 int      flashactivate(struct device *, enum devact);
  120 
  121 u_int8_t flash_reg8_read(struct flash_softc *, int);
  122 void     flash_reg8_read_page(struct flash_softc *, caddr_t, caddr_t);
  123 void     flash_reg8_write(struct flash_softc *, int, u_int8_t);
  124 void     flash_reg8_write_page(struct flash_softc *, caddr_t, caddr_t);
  125 void     flash_chip_enable(struct flash_softc *);
  126 void     flash_chip_disable(struct flash_softc *);
  127 int      flash_chip_reset(struct flash_softc *);
  128 int      flash_chip_identify(struct flash_softc *, u_int8_t *, u_int8_t *);
  129 int      flash_chip_erase_block(struct flash_softc *, long);
  130 int      flash_chip_read_block(struct flash_softc *, long, caddr_t);
  131 int      flash_chip_read_page(struct flash_softc *, long, caddr_t, caddr_t);
  132 int      flash_chip_read_oob(struct flash_softc *, long, caddr_t);
  133 int      flash_chip_write_block(struct flash_softc *, long, caddr_t, caddr_t);
  134 int      flash_chip_write_page(struct flash_softc *, long, caddr_t, caddr_t);
  135 int      flash_chip_verify_block(struct flash_softc *, long, caddr_t, caddr_t);
  136 int      flash_chip_verify_page(struct flash_softc *, long, caddr_t, caddr_t);
  137 
  138 #endif /* _KERNEL */
  139 
  140 /* XXX: define ioctl commands for OOB page data access and block erase. */
  141 
  142 #endif /* _FLASHVAR_H_ */

/* [<][>][^][v][top][bottom][index][help] */