File: [local] / sys / dev / flashvar.h (download)
Revision 1.1.1.1 (vendor branch), Tue Mar 4 16:09:35 2008 UTC (16 years, 6 months ago) by nbrk
Branch: OPENBSD_4_2_BASE, MAIN
CVS Tags: jornada-partial-support-wip, HEAD Changes since 1.1: +0 -0 lines
Import of OpenBSD 4.2 release kernel tree with initial code to support
Jornada 720/728, StrongARM 1110-based handheld PC.
At this point kernel roots on NFS and boots into vfs_mountroot() and traps.
What is supported:
- glass console, Jornada framebuffer (jfb) works in 16bpp direct color mode
(needs some palette tweaks for non black/white/blue colors, i think)
- saic, SA11x0 interrupt controller (needs cleanup)
- sacom, SA11x0 UART (supported only as boot console for now)
- SA11x0 GPIO controller fully supported (but can't handle multiple interrupt
handlers on one gpio pin)
- sassp, SSP port on SA11x0 that attaches spibus
- Jornada microcontroller (jmcu) to control kbd, battery, etc throught
the SPI bus (wskbd attaches on jmcu, but not tested)
- tod functions seem work
- initial code for SA-1111 (chip companion) : this is TODO
Next important steps, i think:
- gpio and intc on sa1111
- pcmcia support for sa11x0 (and sa1111 help logic)
- REAL root on nfs when we have PCMCIA support (we may use any of supported pccard NICs)
- root on wd0! (using already supported PCMCIA-ATA)
|
/* $OpenBSD: flashvar.h,v 1.2 2007/06/20 18:15:46 deraadt Exp $ */
/*
* Copyright (c) 2005 Uwe Stuehler <uwe@openbsd.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#ifndef _FLASHVAR_H_
#define _FLASHVAR_H_
#ifdef _KERNEL
/* Flash controller descriptor structure */
struct flash_ctl_tag {
u_int8_t (*reg8_read)(void *, int);
int (*regx_read_page)(void *, caddr_t, caddr_t);
void (*reg8_write)(void *, int, u_int8_t);
int (*regx_write_page)(void *, caddr_t, caddr_t);
void (*default_disklabel)(void *, dev_t, struct disklabel *);
int (*safe_strategy)(void *, struct buf *);
};
/*
* Pseudo-registers for a fictitious flash controller
*
* Note that logical levels are assumed for CE and WP bits.
* Signals corresponding to these bits are usually negated.
*/
#define FLASH_REG_DATA 0x00
#define FLASH_REG_COL 0x01
#define FLASH_REG_ROW 0x02
#define FLASH_REG_CMD 0x03
#define FLASH_REG_ALE 0x04
#define FLASH_REG_CLE 0x05
#define FLASH_REG_CE 0x06
#define FLASH_REG_WP 0x07
#define FLASH_REG_READY 0x0f
/* Flash device descriptor structure */
struct flashdev {
u_int16_t id;
const char *longname;
u_long pagesize; /* bytes per page */
u_long oobsize; /* OOB bytes per page */
u_long blkpages; /* pages per erasable block */
u_long capacity; /* pages per device */
};
#define FLASH_DEVICE(v,d) ((FLASH_VENDOR_##v << 8) | (d))
/* Flash device vendors */
#define FLASH_VENDOR_SAMSUNG 0xec
/* Flash devices */
#define FLASH_DEVICE_SAMSUNG_K9F2808U0C FLASH_DEVICE(SAMSUNG, 0x73)
#define FLASH_DEVICE_SAMSUNG_K9F1G08U0A FLASH_DEVICE(SAMSUNG, 0xf1)
/* Maximum sizes for all devices */
#define FLASH_MAXPAGESIZE 2048
#define FLASH_MAXOOBSIZE 64
/*
* Should-be private softc structure for the generic flash driver.
*/
struct flash_softc {
struct device sc_dev;
/* Disk device information */
struct disk sc_dk;
struct buf sc_q;
struct buf *sc_bp;
int sc_flags;
/* Flash controller tag */
struct flash_ctl_tag *sc_tag;
void *sc_cookie;
/* Flash device characteristics */
const struct flashdev *sc_flashdev;
int sc_maxwaitready;
int sc_maxwaitcomplete;
};
/* Values for sc_flags */
#define FDK_LOADED 0x00000001
#define FDK_SAFE 0x00000002
/*
* Similar to vnd(4) devices there are two kinds of flash devices.
* Both device kinds share the same disklabel.
*
* ``Safe'' devices have bit 11 set in the minor number and use the
* out-of-band page data to implement wear-leveling and transparent
* management of bad block information. Block erasing and rewriting
* is also handled transparently; arbitrary pages can be modified.
*
* ``Unsafe'' devices provide raw access to the flash pages. Access
* to OOB page data is possible via ioctl()s only with these devices.
* Erasing the containing flash block may be necessary before a page
* can be writting successfully, but the block erase command is only
* provided as an ioctl().
*/
#define flashsafe(x) (minor(x) & 0x800)
#define flashunit(x) DISKUNIT(makedev(major(x), minor(x) & 0x7ff))
#define flashpart(x) DISKPART(makedev(major(x), minor(x) & 0x7ff))
#define flashlabeldev(x) (MAKEDISKDEV(major(x), flashunit(x), RAW_PART)\
|flashsafe(x))
void flashattach(struct flash_softc *, struct flash_ctl_tag *, void *);
int flashdetach(struct device *, int);
int flashactivate(struct device *, enum devact);
u_int8_t flash_reg8_read(struct flash_softc *, int);
void flash_reg8_read_page(struct flash_softc *, caddr_t, caddr_t);
void flash_reg8_write(struct flash_softc *, int, u_int8_t);
void flash_reg8_write_page(struct flash_softc *, caddr_t, caddr_t);
void flash_chip_enable(struct flash_softc *);
void flash_chip_disable(struct flash_softc *);
int flash_chip_reset(struct flash_softc *);
int flash_chip_identify(struct flash_softc *, u_int8_t *, u_int8_t *);
int flash_chip_erase_block(struct flash_softc *, long);
int flash_chip_read_block(struct flash_softc *, long, caddr_t);
int flash_chip_read_page(struct flash_softc *, long, caddr_t, caddr_t);
int flash_chip_read_oob(struct flash_softc *, long, caddr_t);
int flash_chip_write_block(struct flash_softc *, long, caddr_t, caddr_t);
int flash_chip_write_page(struct flash_softc *, long, caddr_t, caddr_t);
int flash_chip_verify_block(struct flash_softc *, long, caddr_t, caddr_t);
int flash_chip_verify_page(struct flash_softc *, long, caddr_t, caddr_t);
#endif /* _KERNEL */
/* XXX: define ioctl commands for OOB page data access and block erase. */
#endif /* _FLASHVAR_H_ */