flash.h revision 1.3 1 1.3 ahoka /* $NetBSD: flash.h,v 1.3 2011/04/04 14:25:09 ahoka Exp $ */
2 1.1 ahoka
3 1.1 ahoka /*-
4 1.1 ahoka * Copyright (c) 2011 Department of Software Engineering,
5 1.1 ahoka * University of Szeged, Hungary
6 1.1 ahoka * Copyright (c) 2011 Adam Hoka <ahoka (at) NetBSD.org>
7 1.1 ahoka * Copyright (c) 2010 David Tengeri <dtengeri (at) inf.u-szeged.hu>
8 1.1 ahoka * All rights reserved.
9 1.1 ahoka *
10 1.1 ahoka * This code is derived from software contributed to The NetBSD Foundation
11 1.1 ahoka * by the Department of Software Engineering, University of Szeged, Hungary
12 1.1 ahoka *
13 1.1 ahoka * Redistribution and use in source and binary forms, with or without
14 1.1 ahoka * modification, are permitted provided that the following conditions
15 1.1 ahoka * are met:
16 1.1 ahoka * 1. Redistributions of source code must retain the above copyright
17 1.1 ahoka * notice, this list of conditions and the following disclaimer.
18 1.1 ahoka * 2. Redistributions in binary form must reproduce the above copyright
19 1.1 ahoka * notice, this list of conditions and the following disclaimer in the
20 1.1 ahoka * documentation and/or other materials provided with the distribution.
21 1.1 ahoka *
22 1.1 ahoka * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23 1.1 ahoka * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24 1.1 ahoka * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25 1.1 ahoka * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
26 1.1 ahoka * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27 1.1 ahoka * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28 1.1 ahoka * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
29 1.1 ahoka * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
30 1.1 ahoka * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31 1.1 ahoka * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 1.1 ahoka * SUCH DAMAGE.
33 1.1 ahoka */
34 1.1 ahoka
35 1.1 ahoka #ifndef _FLASH_H_
36 1.1 ahoka #define _FLASH_H_
37 1.1 ahoka
38 1.1 ahoka #include <sys/param.h>
39 1.1 ahoka #include <sys/device.h>
40 1.1 ahoka #include <sys/module.h>
41 1.1 ahoka #include <sys/buf.h>
42 1.1 ahoka #include <sys/flashio.h>
43 1.1 ahoka
44 1.1 ahoka /**
45 1.1 ahoka * flash_softc - private structure for flash layer driver
46 1.1 ahoka */
47 1.1 ahoka
48 1.1 ahoka struct flash_softc {
49 1.1 ahoka device_t sc_dev;
50 1.1 ahoka device_t sc_parent_dev; /* Hardware (parent) device */
51 1.1 ahoka void *hw_softc; /* Hardware device private softc */
52 1.1 ahoka struct flash_interface *flash_if; /* Hardware interface */
53 1.1 ahoka
54 1.1 ahoka bool sc_readonly; /* read only flash device */
55 1.1 ahoka };
56 1.1 ahoka
57 1.1 ahoka struct flash_attach_args {
58 1.1 ahoka struct flash_interface *flash_if; /* Hardware interface */
59 1.1 ahoka };
60 1.1 ahoka
61 1.1 ahoka device_t flash_attach_mi(struct flash_interface *, device_t);
62 1.1 ahoka const struct flash_interface *flash_get_interface(dev_t);
63 1.1 ahoka const struct flash_softc *flash_get_softc(dev_t);
64 1.1 ahoka device_t flash_get_device(dev_t);
65 1.1 ahoka
66 1.1 ahoka /**
67 1.1 ahoka * struct erase_instruction - instructions to erase a flash eraseblock
68 1.1 ahoka * @fd: flash descriptor
69 1.1 ahoka * @addr: start address of the erase operation
70 1.1 ahoka * @len: the erase length
71 1.1 ahoka * @callback: callback operation, called when erase finished
72 1.1 ahoka * @priv: private data
73 1.1 ahoka * @state: the erase operation's result
74 1.1 ahoka */
75 1.1 ahoka struct flash_erase_instruction {
76 1.3 ahoka flash_off_t ei_addr;
77 1.3 ahoka flash_off_t ei_len;
78 1.2 uebayasi void (*ei_callback)(struct flash_erase_instruction *);
79 1.1 ahoka u_long ei_priv;
80 1.1 ahoka u_char ei_state;
81 1.1 ahoka };
82 1.1 ahoka
83 1.1 ahoka enum {
84 1.1 ahoka FLASH_PART_READONLY = (1<<0),
85 1.1 ahoka FLASH_PART_FILESYSTEM = (1<<2)
86 1.1 ahoka };
87 1.1 ahoka
88 1.1 ahoka struct flash_partition {
89 1.3 ahoka flash_off_t part_offset;
90 1.3 ahoka flash_off_t part_size;
91 1.1 ahoka int part_flags;
92 1.1 ahoka };
93 1.1 ahoka
94 1.1 ahoka /**
95 1.1 ahoka * struct flash_interface - interface for flash operations
96 1.1 ahoka * @type: type of flash device
97 1.1 ahoka * @size: size of flash
98 1.1 ahoka * @page_size: page size of flash
99 1.1 ahoka * @erasesize: erase size of flash
100 1.1 ahoka * @writesize: minimum write size of flash
101 1.1 ahoka * @minor: minor number of the character device attached to this driver
102 1.1 ahoka * @erase: erase operation of the flash
103 1.1 ahoka * @read: read operation of the flash
104 1.1 ahoka * @write: write operation of the flash
105 1.1 ahoka * @block_markbad: marks a block as bad on the flash
106 1.1 ahoka * @block_isbad: checks if a block is bad on flash
107 1.1 ahoka */
108 1.1 ahoka struct flash_interface {
109 1.2 uebayasi int (*erase)(device_t, struct flash_erase_instruction *);
110 1.3 ahoka int (*read)(device_t, flash_off_t, size_t, size_t *, uint8_t *);
111 1.3 ahoka int (*write)(device_t, flash_off_t, size_t, size_t *, const uint8_t *);
112 1.3 ahoka int (*block_markbad)(device_t, flash_off_t);
113 1.3 ahoka int (*block_isbad)(device_t, flash_off_t, bool *);
114 1.2 uebayasi int (*sync)(device_t);
115 1.1 ahoka
116 1.1 ahoka int (*submit)(device_t, struct buf *);
117 1.1 ahoka
118 1.1 ahoka /* storage for partition info */
119 1.1 ahoka struct flash_partition partition;
120 1.1 ahoka
121 1.1 ahoka /* total size of mtd */
122 1.3 ahoka flash_size_t size;
123 1.1 ahoka uint32_t page_size;
124 1.1 ahoka uint32_t erasesize;
125 1.1 ahoka uint32_t writesize;
126 1.1 ahoka uint32_t minor;
127 1.1 ahoka uint8_t type;
128 1.1 ahoka };
129 1.1 ahoka
130 1.1 ahoka /**
131 1.1 ahoka * struct cache - for caching writes on block device
132 1.1 ahoka */
133 1.1 ahoka struct flash_cache {
134 1.1 ahoka size_t fc_len;
135 1.3 ahoka flash_off_t fc_block;
136 1.1 ahoka uint8_t *fc_data;
137 1.1 ahoka };
138 1.1 ahoka
139 1.1 ahoka /* flash operations should be used through these */
140 1.1 ahoka int flash_erase(device_t, struct flash_erase_instruction *);
141 1.3 ahoka int flash_read(device_t, flash_off_t, size_t, size_t *, uint8_t *);
142 1.3 ahoka int flash_write(device_t, flash_off_t, size_t, size_t *, const uint8_t *);
143 1.3 ahoka int flash_block_markbad(device_t, flash_off_t);
144 1.3 ahoka int flash_block_isbad(device_t, flash_off_t, bool *);
145 1.1 ahoka int flash_sync(device_t);
146 1.1 ahoka
147 1.1 ahoka /*
148 1.1 ahoka * check_pattern - checks the buffer only contains the byte pattern
149 1.1 ahoka * @buf: the buffer to check
150 1.1 ahoka * @patt: the pattern to match
151 1.1 ahoka * @offset: the starting byte number, the matching starts from here
152 1.1 ahoka * @size: the buffer size
153 1.1 ahoka *
154 1.1 ahoka * This functions checks if the buffer only contains a specified byte pattern.
155 1.1 ahoka * Returns %0 if found something else, %1 otherwise.
156 1.1 ahoka */
157 1.1 ahoka static inline int
158 1.1 ahoka check_pattern(const void *buf, uint8_t patt, size_t offset, size_t size)
159 1.1 ahoka {
160 1.1 ahoka size_t i;
161 1.1 ahoka for (i = offset; i < size; i++) {
162 1.2 uebayasi if (((const uint8_t *)buf)[i] != patt)
163 1.1 ahoka return 0;
164 1.1 ahoka }
165 1.1 ahoka return 1;
166 1.1 ahoka }
167 1.1 ahoka
168 1.1 ahoka #endif /* _FLASH_H_ */
169