Dr Andrew Scott G7VAV

My photo
 
June 2025
Mo Tu We Th Fr Sa Su
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 1 2 3 4 5 6


mtd-abi.h
001: /*
002:  * Copyright © 1999-2010 David Woodhouse <dwmw2@infradead.org> et al.
003:  *
004:  * This program is free software; you can redistribute it and/or modify
005:  * it under the terms of the GNU General Public License as published by
006:  * the Free Software Foundation; either version 2 of the License, or
007:  * (at your option) any later version.
008:  *
009:  * This program is distributed in the hope that it will be useful,
010:  * but WITHOUT ANY WARRANTY; without even the implied warranty of
011:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
012:  * GNU General Public License for more details.
013:  *
014:  * You should have received a copy of the GNU General Public License
015:  * along with this program; if not, write to the Free Software
016:  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
017:  *
018:  */
019: 
020: #ifndef __MTD_ABI_H__
021: #define __MTD_ABI_H__
022: 
023: #include <linux/types.h>
024: 
025: struct erase_info_user {
026:         __u32 start;
027:         __u32 length;
028: };
029: 
030: struct erase_info_user64 {
031:         __u64 start;
032:         __u64 length;
033: };
034: 
035: struct mtd_oob_buf {
036:         __u32 start;
037:         __u32 length;
038:         unsigned char *ptr;
039: };
040: 
041: struct mtd_oob_buf64 {
042:         __u64 start;
043:         __u32 pad;
044:         __u32 length;
045:         __u64 usr_ptr;
046: };
047: 
048: /**
049:  * MTD operation modes
050:  *
051:  * @MTD_OPS_PLACE_OOB:  OOB data are placed at the given offset (default)
052:  * @MTD_OPS_AUTO_OOB:   OOB data are automatically placed at the free areas
053:  *                      which are defined by the internal ecclayout
054:  * @MTD_OPS_RAW:        data are transferred as-is, with no error correction;
055:  *                      this mode implies %MTD_OPS_PLACE_OOB
056:  *
057:  * These modes can be passed to ioctl(MEMWRITE) and are also used internally.
058:  * See notes on "MTD file modes" for discussion on %MTD_OPS_RAW vs.
059:  * %MTD_FILE_MODE_RAW.
060:  */
061: enum {
062:         MTD_OPS_PLACE_OOB = 0,
063:         MTD_OPS_AUTO_OOB = 1,
064:         MTD_OPS_RAW = 2,
065: };
066: 
067: /**
068:  * struct mtd_write_req - data structure for requesting a write operation
069:  *
070:  * @start:      start address
071:  * @len:        length of data buffer
072:  * @ooblen:     length of OOB buffer
073:  * @usr_data:   user-provided data buffer
074:  * @usr_oob:    user-provided OOB buffer
075:  * @mode:       MTD mode (see "MTD operation modes")
076:  * @padding:    reserved, must be set to 0
077:  *
078:  * This structure supports ioctl(MEMWRITE) operations, allowing data and/or OOB
079:  * writes in various modes. To write to OOB-only, set @usr_data == NULL, and to
080:  * write data-only, set @usr_oob == NULL. However, setting both @usr_data and
081:  * @usr_oob to NULL is not allowed.
082:  */
083: struct mtd_write_req {
084:         __u64 start;
085:         __u64 len;
086:         __u64 ooblen;
087:         __u64 usr_data;
088:         __u64 usr_oob;
089:         __u8 mode;
090:         __u8 padding[7];
091: };
092: 
093: #define MTD_ABSENT              0
094: #define MTD_RAM                 1
095: #define MTD_ROM                 2
096: #define MTD_NORFLASH            3
097: #define MTD_NANDFLASH           4
098: #define MTD_DATAFLASH           6
099: #define MTD_UBIVOLUME           7
100: #define MTD_MLCNANDFLASH        8
101: 
102: #define MTD_WRITEABLE           0x400   /* Device is writeable */
103: #define MTD_BIT_WRITEABLE       0x800   /* Single bits can be flipped */
104: #define MTD_NO_ERASE            0x1000  /* No erase necessary */
105: #define MTD_POWERUP_LOCK        0x2000  /* Always locked after reset */
106: 
107: /* Some common devices / combinations of capabilities */
108: #define MTD_CAP_ROM             0
109: #define MTD_CAP_RAM             (MTD_WRITEABLE | MTD_BIT_WRITEABLE | MTD_NO_ERASE)
110: #define MTD_CAP_NORFLASH        (MTD_WRITEABLE | MTD_BIT_WRITEABLE)
111: #define MTD_CAP_NANDFLASH       (MTD_WRITEABLE)
112: 
113: /* Obsolete ECC byte placement modes (used with obsolete MEMGETOOBSEL) */
114: #define MTD_NANDECC_OFF         0       // Switch off ECC (Not recommended)
115: #define MTD_NANDECC_PLACE       1       // Use the given placement in the structure (YAFFS1 legacy mode)
116: #define MTD_NANDECC_AUTOPLACE   2       // Use the default placement scheme
117: #define MTD_NANDECC_PLACEONLY   3       // Use the given placement in the structure (Do not store ecc result on read)
118: #define MTD_NANDECC_AUTOPL_USR  4       // Use the given autoplacement scheme rather than using the default
119: 
120: /* OTP mode selection */
121: #define MTD_OTP_OFF             0
122: #define MTD_OTP_FACTORY         1
123: #define MTD_OTP_USER            2
124: 
125: struct mtd_info_user {
126:         __u8 type;
127:         __u32 flags;
128:         __u32 size;     /* Total size of the MTD */
129:         __u32 erasesize;
130:         __u32 writesize;
131:         __u32 oobsize;  /* Amount of OOB data per block (e.g. 16) */
132:         __u64 padding;  /* Old obsolete field; do not use */
133: };
134: 
135: struct region_info_user {
136:         __u32 offset;           /* At which this region starts,
137:                                  * from the beginning of the MTD */
138:         __u32 erasesize;        /* For this region */
139:         __u32 numblocks;        /* Number of blocks in this region */
140:         __u32 regionindex;
141: };
142: 
143: struct otp_info {
144:         __u32 start;
145:         __u32 length;
146:         __u32 locked;
147: };
148: 
149: /*
150:  * Note, the following ioctl existed in the past and was removed:
151:  * #define MEMSETOOBSEL           _IOW('M', 9, struct nand_oobinfo)
152:  * Try to avoid adding a new ioctl with the same ioctl number.
153:  */
154: 
155: /* Get basic MTD characteristics info (better to use sysfs) */
156: #define MEMGETINFO              _IOR('M', 1, struct mtd_info_user)
157: /* Erase segment of MTD */
158: #define MEMERASE                _IOW('M', 2, struct erase_info_user)
159: /* Write out-of-band data from MTD */
160: #define MEMWRITEOOB             _IOWR('M', 3, struct mtd_oob_buf)
161: /* Read out-of-band data from MTD */
162: #define MEMREADOOB              _IOWR('M', 4, struct mtd_oob_buf)
163: /* Lock a chip (for MTD that supports it) */
164: #define MEMLOCK                 _IOW('M', 5, struct erase_info_user)
165: /* Unlock a chip (for MTD that supports it) */
166: #define MEMUNLOCK               _IOW('M', 6, struct erase_info_user)
167: /* Get the number of different erase regions */
168: #define MEMGETREGIONCOUNT       _IOR('M', 7, int)
169: /* Get information about the erase region for a specific index */
170: #define MEMGETREGIONINFO        _IOWR('M', 8, struct region_info_user)
171: /* Get info about OOB modes (e.g., RAW, PLACE, AUTO) - legacy interface */
172: #define MEMGETOOBSEL            _IOR('M', 10, struct nand_oobinfo)
173: /* Check if an eraseblock is bad */
174: #define MEMGETBADBLOCK          _IOW('M', 11, __kernel_loff_t)
175: /* Mark an eraseblock as bad */
176: #define MEMSETBADBLOCK          _IOW('M', 12, __kernel_loff_t)
177: /* Set OTP (One-Time Programmable) mode (factory vs. user) */
178: #define OTPSELECT               _IOR('M', 13, int)
179: /* Get number of OTP (One-Time Programmable) regions */
180: #define OTPGETREGIONCOUNT       _IOW('M', 14, int)
181: /* Get all OTP (One-Time Programmable) info about MTD */
182: #define OTPGETREGIONINFO        _IOW('M', 15, struct otp_info)
183: /* Lock a given range of user data (must be in mode %MTD_FILE_MODE_OTP_USER) */
184: #define OTPLOCK                 _IOR('M', 16, struct otp_info)
185: /* Get ECC layout (deprecated) */
186: #define ECCGETLAYOUT            _IOR('M', 17, struct nand_ecclayout_user)
187: /* Get statistics about corrected/uncorrected errors */
188: #define ECCGETSTATS             _IOR('M', 18, struct mtd_ecc_stats)
189: /* Set MTD mode on a per-file-descriptor basis (see "MTD file modes") */
190: #define MTDFILEMODE             _IO('M', 19)
191: /* Erase segment of MTD (supports 64-bit address) */
192: #define MEMERASE64              _IOW('M', 20, struct erase_info_user64)
193: /* Write data to OOB (64-bit version) */
194: #define MEMWRITEOOB64           _IOWR('M', 21, struct mtd_oob_buf64)
195: /* Read data from OOB (64-bit version) */
196: #define MEMREADOOB64            _IOWR('M', 22, struct mtd_oob_buf64)
197: /* Check if chip is locked (for MTD that supports it) */
198: #define MEMISLOCKED             _IOR('M', 23, struct erase_info_user)
199: /*
200:  * Most generic write interface; can write in-band and/or out-of-band in various
201:  * modes (see "struct mtd_write_req")
202:  */
203: #define MEMWRITE                _IOWR('M', 24, struct mtd_write_req)
204: 
205: /*
206:  * Obsolete legacy interface. Keep it in order not to break userspace
207:  * interfaces
208:  */
209: struct nand_oobinfo {
210:         __u32 useecc;
211:         __u32 eccbytes;
212:         __u32 oobfree[8][2];
213:         __u32 eccpos[32];
214: };
215: 
216: struct nand_oobfree {
217:         __u32 offset;
218:         __u32 length;
219: };
220: 
221: #define MTD_MAX_OOBFREE_ENTRIES 8
222: #define MTD_MAX_ECCPOS_ENTRIES  64
223: /*
224:  * OBSOLETE: ECC layout control structure. Exported to user-space via ioctl
225:  * ECCGETLAYOUT for backwards compatbility and should not be mistaken as a
226:  * complete set of ECC information. The ioctl truncates the larger internal
227:  * structure to retain binary compatibility with the static declaration of the
228:  * ioctl. Note that the "MTD_MAX_..._ENTRIES" macros represent the max size of
229:  * the user struct, not the MAX size of the internal struct nand_ecclayout.
230:  */
231: struct nand_ecclayout_user {
232:         __u32 eccbytes;
233:         __u32 eccpos[MTD_MAX_ECCPOS_ENTRIES];
234:         __u32 oobavail;
235:         struct nand_oobfree oobfree[MTD_MAX_OOBFREE_ENTRIES];
236: };
237: 
238: /**
239:  * struct mtd_ecc_stats - error correction stats
240:  *
241:  * @corrected:  number of corrected bits
242:  * @failed:     number of uncorrectable errors
243:  * @badblocks:  number of bad blocks in this partition
244:  * @bbtblocks:  number of blocks reserved for bad block tables
245:  */
246: struct mtd_ecc_stats {
247:         __u32 corrected;
248:         __u32 failed;
249:         __u32 badblocks;
250:         __u32 bbtblocks;
251: };
252: 
253: /*
254:  * MTD file modes - for read/write access to MTD
255:  *
256:  * @MTD_FILE_MODE_NORMAL:       OTP disabled, ECC enabled
257:  * @MTD_FILE_MODE_OTP_FACTORY:  OTP enabled in factory mode
258:  * @MTD_FILE_MODE_OTP_USER:     OTP enabled in user mode
259:  * @MTD_FILE_MODE_RAW:          OTP disabled, ECC disabled
260:  *
261:  * These modes can be set via ioctl(MTDFILEMODE). The mode mode will be retained
262:  * separately for each open file descriptor.
263:  *
264:  * Note: %MTD_FILE_MODE_RAW provides the same functionality as %MTD_OPS_RAW -
265:  * raw access to the flash, without error correction or autoplacement schemes.
266:  * Wherever possible, the MTD_OPS_* mode will override the MTD_FILE_MODE_* mode
267:  * (e.g., when using ioctl(MEMWRITE)), but in some cases, the MTD_FILE_MODE is
268:  * used out of necessity (e.g., `write()', ioctl(MEMWRITEOOB64)).
269:  */
270: enum mtd_file_modes {
271:         MTD_FILE_MODE_NORMAL = MTD_OTP_OFF,
272:         MTD_FILE_MODE_OTP_FACTORY = MTD_OTP_FACTORY,
273:         MTD_FILE_MODE_OTP_USER = MTD_OTP_USER,
274:         MTD_FILE_MODE_RAW,
275: };
276: 
277: #endif /* __MTD_ABI_H__ */
278: 


for client (none)
© Andrew Scott 2006 - 2025,
All Rights Reserved
http://www.andrew-scott.uk/
Andrew Scott
http://www.andrew-scott.co.uk/