('entity_view:node:369:full:[languages:language_interface]=en:[theme]=yaffs:[timezone]=Europe/London:[url.path.is_front]=is_front.0:[user.permissions]=aa7fc4c8fb40c7a8665ccd12fea07926dff0f59b9ee3346bc513c6399bee5b0zo04bScdszpuzXTCTVkcBeQAYIVaMt3a6_6VAPI1p4U','a:5:{s:7:\"#markup\";O:25:\"Drupal\\Core\\Render\\Markup\":1:{s:9:\"\0*\0string\";s:34024:\"<article role=\"article\" about=\"/yaffs-porting-guide\" typeof=\"schema:WebPage\" class=\"page full clearfix\">\n\n  \n      <span property=\"schema:name\" content=\"Yaffs Porting Guide\" class=\"hidden\"></span>\n\n\n  \n  <div class=\"content\">\n    \n            <div property=\"schema:text\" class=\"field field--name-body field--type-text-with-summary field--label-hidden field--item\"><p>version 2.0</p>\n\n<p>Last changed: rrw@kynesim.co.uk, 2009-03-20<br />\n </p>\n\n<h3>Purpose</h3>\n\n<p>The purpose of this document is to describe how to bring up Yaffs2 on a board previously unsupported using the Yaffs Direct Interface, with an example using eCos on a Balloon board.</p>\n\n<p>Before we start you probably want to have the data sheet for the NAND chips you are using in front you so that you can refer to it as we go along.</p>\n\n<h3>Background and NAND Flash Properties</h3>\n\n<p>NAND flash is generally arranged in <em>pages</em> and <em>blocks</em>. A page contains a section of data bytes and then a section of out-of-band (<em>OOB</em>) data bytes. Blocks contain a number of pages .<br /><a href=\"/yaffs-embedded-structure\"><img alt=\"YAFFS porting guide diagram\" height=\"335\" src=\"/sites/yaffs.net/files/images/yaffs_porting_guide_html_2de490f8.png\" width=\"783\" /></a></p>\n\n<p>The OOB section of each page is used keep track of various things like file system state, error correction data and bad block marking.</p>\n\n<p>NAND flash is programmed (written to) and read on a largely page basis (though with some level of random access) and is erased on a block basis. That is, to erase a page, you must erase the rest of the containing block along with it.</p>\n\n<p>When programming NAND flash only 1\'s can be programmed to 0\'s, so to change a byte containing 0x00 to 0xFF it must be erased, along with the rest of the block. However subsequent programs may still be made without an erase if no 0s are to be changed to 1s, this might be useful in a scenario where subsequent data might regularly have this property.</p>\n\n<p>When manufactured NAND flash contains bad blocks, these are blocks that are not reliable and any data in them will commonly corrupt easily. These must be kept track of and the OOB data section is used to mark a bad block.</p>\n\n<p>NAND in general is prone to bit errors and for that reason the OOB data is also used to write error correction codes (ECC) so that some errors can be corrected.</p>\n\n<h3>Yaffs NAND Model</h3>\n\n<p>It is probably a good thing to detail at this point how Yaffs2 expects the NAND to behave so that you are aware of what you have to provide in the NAND driver to get YAFF running. Yaffs uses some different terminology in that it refers to a page as a <em>chunk</em>.</p>\n\n<p>Yaffs2 uses a fairly abstract model for NAND flash, this allows a lot of flexibility in the way Yaffs can be used. Yaffs is designed for NAND flash and makes the following assumptions and definitions:</p>\n\n<ul><li>NAND flash is arranged in blocks. Each block is the same size and comprises an integer number of chunks. Each block is treated as a single erasable item.</li>\n	<li>A page (chunk) equates to the allocation units of flash.</li>\n	<li>All accesses (reads and writes) are page (chunk) aligned.</li>\n	<li>When programming a NAND flash, only the zero bits in the pattern being programmed are relevant, and one bits are \"don\'t care\". For example, if a byte already contains the binary pattern 1010, then programming 1001 will result in the pattern which is the logical AND of these two patterns i.e. 1000. This is different to NOR flash.</li>\n</ul><p>Yaffs identifies blocks by their block number and chunks by their chunk Id. Yaffs treats a blank (0xFF filled) block as being free or erased. Thus, the equivalent of formatting for a Yaffs partition is to erase all the blocks that are not bad.</p>\n\n<p>Therefore Yaffs minimally needs access to functions that enable it to erase blocks and to read and write on a page basis. It is also helpful to be able to read only OOB data as reading/writing a full page to only view/update OOB data will cost many serial read cycles over the bus. This is an overhead that can be avoided using the random access read and write features of some nand chips.</p>\n\n<p> </p>\n\n<h2>Writing a Driver for NAND flash Chips</h2>\n\n<h3>Writing a Driver for the Samsung 628 K9F2G08U0M PCB0 on the Balloon Board (v3.01)</h3>\n\n<p>For the Balloon board the NAND chips hang off the CPLD which is in turn hooked up to the system bus. This is quite board specific and in this case reading the VHDL code reveals how to change the values on the pins of the NAND chips. You may look at the code by downloading the balloon source code (Appendix A) and looking at balloon3.vhd and Balloon_nand.vhd in balloon/vhdl/fpga/.</p>\n\n<p>It will be likely that this is significantly different on your platform and you should consult the relevant data sheets and documentation to determine how to access the NAND hardware on your board. I will present an example of the balloon board in order to give an overview of the kind of thing that is required.</p>\n\n<p>On the Balloon the CPLD routes data on the bus with certain address to the logic on the CPLD that actually controls the flash chips. They are as follows:</p>\n\n<p><code>NAND Data Bus : 0x10e00000</code> <code>NAND Control 2: 0x10e00010</code> <code>NAND Control : 0x10e00014</code></p>\n\n<p>Sending data to the \'NAND Data Bus\' address will put that data onto the I/O pins of the NAND chips. All of the nand chips are hooked up to the same pins on the CPLD so writing to the \'NAND Data Bus\' address will put the value written on the I/O pins for <em>all</em> of the available flash chips. To isolate the chip you want to work with using the chip enable pin on each flash chip.</p>\n\n<p>This is done by writing to the \'NAND Control\' (0x10e00014) address. When writing to \'NAND control\', the CPLD takes the data value on the bus and routes each bit to a different wire. This bit field is structured as follows:</p>\n\n<p> </p>\n\n<table><colgroup><col /><col /></colgroup><tr><td><em>Pin Attached To</em></td>\n			<td><em>Bit in NAND Control value</em></td>\n		</tr><tr><td>CLE (Control Latch Enable)</td>\n			<td>0</td>\n		</tr><tr><td>ALE (Address Latch Enable)</td>\n			<td>1</td>\n		</tr><tr><td>nCE0 (not Chip Enable for chip 0)</td>\n			<td>2</td>\n		</tr><tr><td>nCE1 (for chip 1)</td>\n			<td>3</td>\n		</tr><tr><td>nCE2 (for chip 2)</td>\n			<td>4</td>\n		</tr><tr><td>nCE3 (for chip 3)</td>\n			<td>5</td>\n		</tr><tr><td>nSE (not Chip Enable for chip 0)</td>\n			<td>6</td>\n		</tr><tr><td>nWP (not Write Protect)</td>\n			<td>7</td>\n		</tr></table><p> </p>\n\n<p>So for example bit 1 on the data lines is put onto the ALE pin on the physical chip. Bits prefixed with \'n\' are active low, for example chip 0 is selected when nCE0 is low and nCE1-3 are high.</p>\n\n<p> </p>\n\n<p>So writing to \'NAND Control\' we can change the values of the pins on the flash. Again, CLE, ALE, nSE and nWP change the value of the corresponding pin on all the flash chips available, nCE[0-3] will select the chip you are using.</p>\n\n<p>Finally, NAND flash typically comes in couple of flavours, 8 bit wide (x8) and 16 bit wide (x16). This means that x8 chips have 8 I/O pins and x16 have 16. The logic on the CPLD on the Balloon can handle both if you tell it which you are currently dealing with. Writing to \'NAND Control 2\' a value of 1 puts the CPLD logic for the NAND chips into x8 mode and 0 into x16 mode. I will assume for the rest of this document that there are only x8 chips connected to the balloon but it should be fairly trivial to extend it to support both.</p>\n\n<h3>Using the Flash Chips</h3>\n\n<p>The flash chips we\'re using have a number of commands, each triggered by a sequence of one or two command codes. You will want to refer to the data sheets for precise details of these functions, but I will briefly describe some of them in this document. The command set that we have for the particular chip we\'re using is table 1 on page 7 of the data sheet.</p>\n\n<p>To input a command there is generally one or two command input cycles. For two cycle commands there is generally an initial command followed by some data needed to complete the command then another command cycle to notify that the relevant data has been input and to start execution. For example for read operations the command 0x00 is latched in followed by some address input cycles followed by the command 0x30 to start the operation. With this in mind I will now describe how to input commands, the \'Command Latch Cycle\'.</p>\n\n<p>Note that for this section I have assumed that the bus is sufficiently slow that the set-up and hold times are not an issue, if you have a fast bus then you may have to wait for a small amount of time (refer to the data sheet) after changing values on the pins (by writing to the correct address) so that set-up and hold times are not violated.</p>\n\n<h3>Command Latch Cycle</h3>\n\n<p>For the command latch cycle you need to first select a chip by setting the relevant nCE low and then you need to set the CLE bit high, that means writing to the \'NAND Control\' address. ALE must also be low and should be set at the same time as CLE. It is then a case of putting the command value onto the I/O pins by writing to the \'NAND Data Bus\' address the value of the command you want. This will then latch in the command, afterwards you will need to clear the CLE bit again.</p>\n\n<p>You will also notice from looking at the data sheet that something needs to be done with the nWE (not <strong>w</strong>rite <strong>e</strong>nable) pin (specifically it should be low while latching in the command), but that I have yet to describe a mechanism for changing its value. This is because it is dealt with by the logic in the CPLD and whenever data is sent to the data address the CPLD will toggle nWE appropriately. (This is also true of nRE (not <strong>r</strong>ead <strong>e</strong>nable) when reading). This process is implemented in the nand_chip_select and the send_command functions (flash.c).</p>\n\n<h3>Address Latch Cycle and Addressing</h3>\n\n<p>The process for the Address Latch Cycle is similar to that for command latching (with the sense of ALE and CLE reversed) and can be looked at in the data sheet and is implemented in send_address in flash.c. The addressing is done by row and column. There are 5 address cycles on the flash chips we\'re looking at. The first cycle contains bits 0-7 of the column address, the second bits 8-11 with the remaining bits of the byte to be sent low. The row address is over 3 more cycles in a similar fashion.</p>\n\n<p>You may wish to chose to address the individual bytes of the chip with the OOB data not directly addressable. This has enabled me to lump several chips into the same address space and select the correct chip based on the address. Addresses then need to be converted to row and column. You should also check that they are page/block aligned in the relevant places if that\'s what your functions expect. It needn\'t be done this way any you could use page numbers instead of bytes just as easily.</p>\n\n<p><br /><a href=\"/yaffs-embedded-structure\"><img alt=\"YAFFS porting guide diagram 2\" height=\"209\" src=\"sites/yaffs.net/files/images/yaffs_porting_guide_html_m11b1f893.png\" width=\"654\" /></a></p>\n\n<p> </p>\n\n<p>The \'row\' is essentially the page index and the \'column\' is the index into to that page, so if you wanted to read from the start of page 213 you would send 0 for the column and 213 for the row. Conversely if you wanted just the OOB bytes from the same page you would send a column value of 2048 (given a page size of 2048+64 bytes).</p>\n\n<p><br /><a href=\"/yaffs-embedded-structure\"><img alt=\"YAFFS porting guide diagram 3\" height=\"271\" src=\"sites/yaffs.net/files/images/yaffs_porting_guide_html_m4650262f.png\" width=\"347\" /></a></p>\n\n<p> </p>\n\n<h3>Finding Chip information</h3>\n\n<p>You will then need to find out which chips are active (e.g. on the balloon there are 4 possible chips, not all of which will exist) and what type of chips they are. For this there is the \'Read ID\' operation. This operation is implemented in the read_ids function in flash.c. The result of the operation gives the manufacturer and device code of the chip and information about the chip (page size, block size, oob size etc). To find which chips are available, loop through the possible chips and start a Read ID command on each of them, if the expected data is returned then there is a chip at that location.</p>\n\n<p>The operation is started by sending the command 0x90 and then one address cycle of 0x00. There are then 5 read cycles which give you data about the device. A description of how to unpack this information from the returned bytes is located on page 32 of the data sheet for the chip described here.</p>\n\n<p>This then gives you how many chips you have and what layout the data in them has.</p>\n\n<h3>Bad Block Checking</h3>\n\n<p>Contained within a nand chip are blocks that the manufacturer will not guarantee the reliability of (this is to increase yield in manufacturing) and so bad blocks must be kept track of. The Samsung chips come with the first byte (or word for x16) of the first and second page of each bad block not programmed as 0xFF.</p>\n\n<p>This bad block marking should be maintained and should be added to in the same way when a bad block is is discovered. Yaffs will expect you to provide a function it can call to mark a particular block as bad when yaffs decides it is necessary.</p>\n\n<p>Yaffs keeps track of bad blocks itself so that the driver doesn\'t need to worry about masking out bad blocks.</p>\n\n<h3>Erasing a Block</h3>\n\n<p>An example of this operation is given in nand_erase_block in flash.c. If you are addressing the nand by bytes then you must first check that the address is aligned to the start of a block and then convert the address into a block number. If there is more than one chip this will involve working out which chip the address refers to and then selecting the correct chip. This can be seen in the select_chip function in flash.c. You must then send the first command cycle for the erase operation before sending 3 cycles of address and then finally the last command cycle.</p>\n\n<p>For the erase operation the 3 address cycles are different than for the read/write operations. Only address bits A18 to A29 is valid (for x8) while A12 to A17 is ignored. In terms of the ordinary 5 cycles address input you only need to deal with the last 3 cycles and of those only the highest 2 bits of the 3rd cycle are used and the full 4th and 5th cycle are used.</p>\n\n<p>Once the operation has been started the program can check the progress of the operation by sending a command of 70h. Each subsequent read will contain the read status. The driver should wait until the read is complete (by the read status operation), the read status operation also contains information about whether the erase failed and this information should be returned from the function doing the erase.</p>\n\n<h3>Reading a Page</h3>\n\n<p>Reading a page is performed by first selecting the correct chip and then converting the address to a row and column number. You can then sending the first command cycle for the read operation followed by 5 address cycles as described in the previous sections. The second command cycle then starts the read operation. The driver must then wait for the data to be retrieved into the data registers on the NAND before they can be read out over the bus. For the example chip this is 25us, consult the data sheet as this may differ. The data can then be read out sequentially byte by byte until all the data needed is obtained.</p>\n\n<h3>Writing a Page</h3>\n\n<p>Page program operations are performed by first selecting the correct chip converting the address to row and column numbers. The page program operation is initiated by the relevant fist command latch cycle (command 0x80) followed by an address latch cycle (as for read), serial data loading and then the second command latch cycle (command 0x10).</p>\n\n<p>The serial data loading is done by serially writing data to the I/O pins. Up to 2112 bytes (x8) can be loaded into the data registers. Once the second command cycle is sent the program is initiated and there is then a programming period where the loaded data is programmed into the appropriate cell. The driver should wait for this to complete by issuing a read status command (0x70) and monitoring the R/nB (ready / not busy) bit. The R/nB flag is on I/O pin 6 and can be checked by repeatedly reading from the \'NAND Data Bus\' address. Once the operation is complete the Write Status Bit (I/O 0 ) may be checked to confirm that the operation was successful.</p>\n\n<h2>Yaffs</h2>\n\n<h3>How To Use Yaffs</h3>\n\n<h3>Checking Out From Git</h3>\n\n<p>The first thing to do is to obtain the source code for Yaffs. This can be done from CVS, details of the process can be found at <a href=\"http://www.yaffs.net/download-yaffs-using-git\">http://www.yaffs.net/download-yaffs-using-git</a>.</p>\n\n<p>The following command will checkout the latest Git version using public read-only access, if you are using bash.</p>\n\n<p><code>$ </code>git clone git://www.aleph1.co.uk/yaffs2 </p>\n\n<h3>Making Some Tweaks to the Source Code</h3>\n\n<p>As of the latest version from CVS in January 2009, you will need to make a small number of changes before you can compile the source code without errors and warnings. There is a patch file included with this document.</p>\n\n<p>You will need to provide a definition of loff_t (in yaffs2/direct/ydirectenv.h) this is for holding the file size in bytes, you should make it big enough to hold the largest file size you wish to support. Unsigned long is probably a good place to start. You will need to edit yaffsfs.c to change a #if to a #ifdef. Then if you have the relevant warnings and -Werror switched on you will need to correct a couple of printf format strings to get the type right (changing a few \'%d\' to \'%ld\').</p>\n\n<p><code>change yaffs/ydirectenv.h </code></p>\n\n<p><code>+ typedef unsigned long loff_t; </code></p>\n\n<p><code>change yaffs2/direct/yaffsfs.c ~line 1117 </code></p>\n\n<p><code>- #if CONFIG_YAFFS_WINCE </code></p>\n\n<p><code>+ #ifdef CONFIG_YAFFS_WINCE</code></p>\n\n<h3>Relevant Files to the Direct Interface</h3>\n\n<p>There are quite a few files that get checked out, not all of which you will need to get going with the yaffs direct interface. The ones you will actually need are listed bellow, you do not need to compile the rest in.</p>\n\n<p><code><code>direct/yaffsfs.c </code></code></p>\n\n<p><code><code>yaffs_guts.c </code></code></p>\n\n<p><code><code>direct/yaffscfg.c </code></code></p>\n\n<p><code><code>yaffs_nand.c </code></code></p>\n\n<p><code><code>yaffs_tagsvalidity.c </code></code></p>\n\n<p><code><code>yaffs_checkptrw.c </code></code></p>\n\n<p><code><code>yaffs_qsort.c </code></code></p>\n\n<p><code><code>yaffs_tagscompat.c </code></code></p>\n\n<p><code><code>yaffs_ecc.c </code></code></p>\n\n<p><code><code>yaffs_packedtags2.c</code></code></p>\n\n<h3>Some Relevant Preprocessor Flags</h3>\n\n<p>There are many different configuration options for yaffs, here are a few that you should be aware of for using the yaffs direct interface.</p>\n\n<ul><li>CONFIG_YAFFS_DIRECT - Tell yaffs to use the direct interface.</li>\n	<li>CONFIG_YAFFS_YAFFS2 - Tell yaffs we want to use yaffs2</li>\n	<li>CONFIG_YAFFS_PROVIDE_DEFS - provides some definitions for file types and #includes linux/types.h, linux/fs.h, linux/stat.h (see yaffs2/devextras.h).</li>\n	<li>CONFIG_YAFFSFS_PROVIDE_VALUES - This may be used so that you can customise error values and constants like O_RDONLY to match the underlying system values, if itis not defined then it includes errno.h,sys/stat.h and fcntl.h (see yaffs2/direct/yaffsfs.h).</li>\n</ul><p>Specify these options when compiling yaffs, i.e. -DCONFIG_YAFFS_DIRECT etc.</p>\n\n<h3>Configuring</h3>\n\n<p>You will then need to provide yaffs with configuration information. This includes details about the nand flash you are using and also tells yaffs which functions to call when when it wants to read/write/erase parts of the flash, these functions will form the bridge between yaffs and the underlying hardware driver. This customisation is done in yaffscfg.h. Within yaffscfg.h you will need to provide a number of operating-system-like functions and a function to initialise yaffs. For example providing functions for malloc and free. Here is a breakdown of those functions that need to be implemented.</p>\n\n<h3>Operating System Functions</h3>\n\n<p><code><code>void yaffsfs_SetError(int err); </code> </code></p>\n\n<p>Report system errors, for example using errno if it exists.</p>\n\n<p><code><code>void *yaffs_malloc(size_t size);</code> <code>void yaffs_free(void *ptr);</code> </code></p>\n\n<p>As for the standard malloc and free functions, if they already exist on your system then you can just shim them.</p>\n\n<p><code><code>void yaffsfs_LocalInitialisation(void);</code> <code>void yaffsfs_Lock(void);</code> <code>void yaffsfs_Unlock(void);</code> </code></p>\n\n<p>Use yaffsfs_LocalInitalisation to initialise \"Real Time Operating System\" state, if the system is multi-threaded then it should initialise a semaphore/mutex for use by lock and unlock. Lock/unlock should use the semaphore set up in LocalInitialisation to lock yaffs from multi-threaded access.</p>\n\n<p><code><code>__u32 yaffsfs_CurrentTime(void);</code> </code></p>\n\n<p>This can be any time increment of use to the system. If this is not required, then it is fine to just use a function that returns zero.</p>\n\n<h3>Yaffs Startup Function</h3>\n\n<p><code><code>int yaffs_StartUp(void); </code> </code></p>\n\n<p><code><code>Return value: YAFFS_OK or YAFFS_FAIL</code> </code></p>\n\n<p>This functions should be used to provide yaffs with many details about the properties of the underlying nand device. Within this function you will need to set up a \'yaffs_Device\' (yaffs_guts.h) and a \'yaffsfs_DeviceConfiguration\' (direct/yaffscfg.h). How to set up a yaffs device will follow in the next section. Once you have set up the required yaffs_Device structures you should call yaffs_initialise (yaffs_guts.h) with a pointer to a null terminated array of yaffs_DeviceConfiguration structures. A yaffs_DeviceConfiguration structure contains a pointer to a yaffs_Device and the \'mount point\' string (prefix) that that device corresponds to.</p>\n\n<h3>Yaffs Devices</h3>\n\n<p>A yaffs device is a logical device that represents part of or a whole physical device. You might think of it as a \'partition\' on the nand. For example, it might cover the whole of the nand device or perhaps only claim half, with another yaffs_Device claiming the other half. It may also be used so that you can use a device other than a flash device (e.g. RAM) for testing purposes.</p>\n\n<p>A yaffs_Device keeps track of the start and end block, so you may have more than one yaffs_Device corresponding to the same physical device by altering the start and end block of the yaffs device.</p>\n\n<p>The fields on the yaffs_Device struct that you need to set up yourself are listed below, all other fields are setup automatically by yaffs.</p>\n\n<p><code><code>int nDataBytesPerChunk</code> </code></p>\n\n<p>As the name suggests this is the number of bytes per chunk, remembering that in yaffs terminology a page is referred to as a chunk, this is then the number of bytes per page. This is the number of data bytes, that is the number of bytes excluding the OOB byte data. E.g. if a page is 2048byte + 64bytes of OOB then set nDataBytesPerChunk to 2048.</p>\n\n<p><code><code>int nChunksPerBlock </code> </code></p>\n\n<p>Straightforwardly the number of chunks (pages on the nand) in each block on the physical nand device. Must be at least 2.</p>\n\n<p><code><code>int spareBytesPerChunk</code></code><br />\nThis is the size of the spare area, i.e. the number of OOB bytes per chunk (page)<code>. </code></p>\n\n<p><code><code>int startBlock</code> </code></p>\n\n<p>The block number (not the address in bytes) on the chip of the first block of this logical yaffs_Device. Beware, yaffs needs the first block to be free so you should not set this to 0, if it is then yaffs will add on one to it itself and also add on one to the end block which could be an issue if you wanted your device to start at block 0 and finish at the last block which might mean yaffs trying to write to a non-existent block.</p>\n\n<p><code><code>int endBlock</code> </code></p>\n\n<p>The block number on the chip of the last block for this logical yaffs_Device. If startBlock == 0 then yaffs will use endBlock+1. Must be at least startBlock + nReservedBlocks + 2.</p>\n\n<p><code><code>int nReservedBlocks</code> </code></p>\n\n<p>This is then number of erasable blocks that Yaffs must keep in reserve for garbage collection and to cover for block failures. This must be a minimum of 2, but 5 or so is better. If you are using a medium that is not expected to fail (eg. RAM for a RAM disk, or a host file system emulation then 2 is OK).</p>\n\n<p><code><code>int nShortOpCaches</code> </code></p>\n\n<p>This configures the number of entries in the Yaffs cache for this device. A value of zero defeats the cache. A value of 10 to 20 is recommended for most systems. Cannon be any bigger than YAFFS_MAX_SHORT_OP_CACHES.</p>\n\n<p><code><code>int useNANDECC</code> </code></p>\n\n<p>This is a flag that tells yaffs whether it should be doing ECC calculations or if it should be left to the driver.</p>\n\n<p><code><code>void *genericDevice</code> </code></p>\n\n<p>This is a pointer which should point to any data that the underlying nand driver will need to know to write and read from the physical device.</p>\n\n<p><code><code>int isYaffs2</code> </code></p>\n\n<p>Are we using Yaffs2? We only deal with Yaffs2 in this document.</p>\n\n<p><code><code>int inbandTags</code> </code></p>\n\n<p>Is there an OOB section? If not then this should be true. Only relevant to Yaffs2.</p>\n\n<p><code><code>_u32 totalBytesPerChunk</code> </code></p>\n\n<p>Possibly a misleading name, it should be equal to nDataBytesPerChunk not nDataBytesPerChunk + spareBytesPerChunk as the name might suggest. If inbandTags is true then yaffs sets nDataBytesPerChunk such that there is enough space for the data yaffs would normally store in the spare area.</p>\n\n<p><code><code>write/readChunkWithTagsFromNAND, markNANDBlockBad, queryNANDBlock</code> </code></p>\n\n<p>These are all pointers to functions that you shall provide to provide Yaffs with a method of writing/reading etc from the NAND.</p>\n\n<h3>NAND access functions</h3>\n\n<p>If you are using Yaffs2 you need to provide pointers to functions that Yaffs can call to write and read from the nand. Example implementations of these function can be seen in yaffs_mtdif.c, these are the functions written to do the same job for the linux mtd layer and provides the write and read functions. The following functions return YAFFS_OK on success and YAFFS_FAIL on failure.</p>\n\n<p><code><code>int (*writeChunkWithTagsToNAND) (struct yaffs_DeviceStruct * dev,</code> <code>int chunkInNAND, const __u8 * data,</code> <code>const yaffs_ExtendedTags * tags);</code> <code>dev: yaffs_Device to write to.</code> <code>chunkInNAND: Which page to write the chunk to.</code> <code>Data: Pointer to the data to write</code> <code>tags: Unpacked OOB data.</code> <code>Return: YAFFS_OK / YAFFS_FAIL</code> </code></p>\n\n<p>This function is to write pages (chunks) to the nand. In this function you will probably want to first retrive any useful data that you put in dev-&gt;genericDevice (in the yaffs_StartUp function) and use it to call the function you wrote previously to write data to the nand. For yaffs2 data and tags should never be NULL. chunkInNand is the page number of the page to write to, not an address so it will need converting if that\'s what your underling functions to write to the nand expect.</p>\n\n<p>You will then need to pack the tags into a yaffs_PackedTags2 structure, this takes out the all relevant details from the yaffs_ExtendedTags tags structure and calculates ECC data on it before placing them in the packedtags2 structure. This structure is the OOB data you will want to write out to the nands spare area.</p>\n\n<p>How you write these out to the OOB data depends on your architecture, nand chips and therefore how bad block marking is done. If for example the first byte is used for bad block marking then simply writing the tags out after the first byte is acceptable. The ECC data in packed tags only covers error correction and detection for the tags in the OOB data, if you want ECC on the data then you must do that yourself.</p>\n\n<p>To perform ECC checks to the data bytes you may use the yaffs_ECCCalculate function which calculates ECC data for 256 byte sections of data. This function produces 3 bytes of ECC data per 256 bytes. Therefore for 2048 bytes of data in each page you would need (2048/256) * 3 = 8 * 3 = 24 extra bytes of ECC data. This can be written out after the bad block byte and packed tags data.<br />\n </p>\n\n<p><code><code>int (*readChunkWithTagsFromNAND) (struct yaffs_DeviceStruct * dev,</code> <code>int chunkInNAND, __u8 * data,</code> <code>yaffs_ExtendedTags * tags);</code> <code>dev: The yaffs_Device to read from.</code> <code>chunkInNAND: Which page to read from.</code> <code>Data: Pointer to a buffer to read data to.</code> <code>tags: Pointer to a buffer to unpacked OOB data into.</code> <code>Return: YAFFS_OK / YAFFS_FAIL</code> </code></p>\n\n<p>This function should do the opposite to the previous function. Firstly, read in the data and OOB bytes. Secondly place the data bytes in the area pointed to by data, then unpack the OOB bytes into into the pointer to tags using yaffs_UnpackTags2.</p>\n\n<p>Once the tags have been unpacked you should then recalculate the ECC data on the data bytes you just read back, just as you did for the write operation. Then use the recalculated ECC and the ECC data read out of the OOB bytes with yaffs_ECCCorrect to correct the data.</p>\n\n<p>Depending on the return value from yaffs_ECCCorrect you should set tags-&gt;eccResult to reflect whether anything was corrected or the correction failed. yaffs_UnpackTags2 also sets tags-&gt;eccResult so you should only update it if the result of the data correction is worse than is already there. i.e. if after the tags are unpacked and eccResult is YAFFS_ECC_RESULT_FIXED and ECC correction on the data read back resulted in no errors then you should leave unpackedtags2 and YAFFS_ECC_RESULT_FIXED and not set it to YAFFS_ECC_RESULT_NO_ERROR.</p>\n\n<p><code><code>int (*markNANDBlockBad) (struct yaffs_DeviceStruct * dev, int blockNo);</code> <code>dev: yaffs_Device to write to.</code> <code>blockNo: Which block to mark.</code> <code>Return: YAFFS_OK / YAFFS_FAIL</code></code></p>\n\n<p>This should mark the block bad. This probably means reading the OOB data and changing the relevant byte that marks the bad block, and writing the OOB data back.</p>\n\n<p><code><code>int (*queryNANDBlock) (struct yaffs_DeviceStruct * dev, int blockNo,</code> <code>yaffs_BlockState * state, __u32 *sequenceNumber);</code> <code>dev: The yaffs_Device to write to.</code> <code>blockNo: Which block to mark.</code> <code>state: Upon returning this should be set to the relevant state of this particular block.</code> <code>Sequence number: The Sequence number of this block. 0 if the block is unused.</code> <code>Return: YAFFS_OK / YAFFS_FAIL</code> </code></p>\n\n<p>This should check whether or not the block is valid.</p>\n\n<p>If the bad block marker is set in the OOB then *state should be set to YAFFS_BLOCK_STATE_DEAD *sequenceNumber set to 0, and return YAFFS_FAIL.</p>\n\n<p>If the block is not bad then the tags should be unpacked. After the tags are unpacked, and it is found that chunk is used (see tags.chunkUsed) *sequenceNumber should be set to tags.sequenceNumber and *state to YAFFS_BLOCK_STATE_NEEDS_SCANNING, otherwise if the block is not used then *sequenceNumber should be 0 and *state should be set to YAFFS_BLOCK_STATE_EMPTY.</p>\n\n<h3>Application Interface</h3>\n\n<p>The yaffs provides a number of functions for applications to interface with it. These are mostly the same as the standard clib open/close etc prefixed with yaffs_ eg yaffs_open. These functions are defined in direct/yaffsfs.h.</p>\n\n<p>To initialise yaffs so that reading and writing can be done, you must call yaffs mount for each yaffs device you would like to use, e.g. yaffs_mount(\"/boot\"). This could be done at system boot if there is an operating system present so that the application need to worry about this. You will also need to call yaffs_unmount when you have finished so that yaffs may write any state it needs to to disk.</p>\n\n<p>If there is already an application interface for reading and writing files you may shim the relevant function calls with the related operating system calls.</p>\n\n<p>E.g. simply doing #define open(path, oflag, mode) yaffs_open(path, oflag, mode)</p>\n\n<p>Or having something more complex to provide redirection functions if there is more than one file system present.</p>\n\n<p><code><code>For example: int open(const char *path,...)<br />\n{<br />\n//Determine which file system is being used </code> <code>if(it_is_a_yaffs_path(path)) {</code> <code> return yaffs_open(...);<br />\n} else {<br />\n// Do something else<br />\n}<br />\n}</code></code></p>\n\n<h2>Appendices</h2>\n\n<h3>Appendix A - Accessing the Balloon Source Code</h3>\n\n<p>The latest source code for the balloon board can be checked out from SVN. There is different code for different balloon versions. Details of getting the source and setting up tool chains is decribed in the following page <a href=\"http://www.balloonboard.org/software.html\">http://www.balloonboard.org/software.html</a>. If you just want to take a look at the latest mainline code then the following will give you what you want.</p>\n\n<p>svn checkout svn://balloonboard.org/balloon/trunk/</p>\n\n<p> </p></div>\n      \n  </div>\n\n</article>\n\";}s:9:\"#attached\";a:1:{s:14:\"html_head_link\";a:3:{i:0;a:2:{i:0;a:2:{s:3:\"rel\";s:9:\"canonical\";s:4:\"href\";s:20:\"/yaffs-porting-guide\";}i:1;b:1;}i:1;a:2:{i:0;a:2:{s:3:\"rel\";s:9:\"shortlink\";s:4:\"href\";s:9:\"/node/369\";}i:1;b:1;}i:2;a:2:{i:0;a:2:{s:3:\"rel\";s:8:\"revision\";s:4:\"href\";s:20:\"/yaffs-porting-guide\";}i:1;b:1;}}}s:6:\"#cache\";a:3:{s:8:\"contexts\";a:7:{i:0;s:28:\"languages:language_interface\";i:1;s:5:\"theme\";i:2;s:8:\"timezone\";i:3;s:17:\"url.path.is_front\";i:4;s:16:\"user.permissions\";i:5;s:20:\"user.roles:anonymous\";i:6;s:24:\"user.roles:authenticated\";}s:4:\"tags\";a:5:{i:0;s:31:\"config:filter.format.basic_html\";i:1;s:18:\"config:system.site\";i:2;s:8:\"node:369\";i:3;s:9:\"node_view\";i:4;s:6:\"user:5\";}s:7:\"max-age\";i:-1;}s:17:\"#cache_properties\";a:1:{i:0;s:6:\"#title\";}s:6:\"#title\";O:25:\"Drupal\\Core\\Render\\Markup\":1:{s:9:\"\0*\0string\";s:56:\"<span property=\"schema:name\">Yaffs Porting Guide</span>\n\";}}',-1,1510663231.393,1,'config:filter.format.basic_html config:system.site node:369 node_view rendered user:5','273'),('entity_view:node:369:full:[languages:language_interface]=en:[theme]=yaffs:[user.permissions]=aa7fc4c8fb40c7a8665ccd12fea07926dff0f59b9ee3346bc513c6399bee5b01:[user.roles:anonymous]=0','a:2:{s:15:\"#cache_redirect\";b:1;s:6:\"#cache\";a:5:{s:4:\"keys\";a:4:{i:0;s:11:\"entity_view\";i:1;s:4:\"node\";i:2;s:3:\"369\";i:3;s:4:\"full\";}s:8:\"contexts\";a:7:{i:0;s:28:\"languages:language_interface\";i:1;s:5:\"theme\";i:2;s:8:\"timezone\";i:3;s:17:\"url.path.is_front\";i:4;s:16:\"user.permissions\";i:5;s:20:\"user.roles:anonymous\";i:6;s:24:\"user.roles:authenticated\";}s:4:\"tags\";a:5:{i:0;s:31:\"config:filter.format.basic_html\";i:1;s:18:\"config:system.site\";i:2;s:8:\"node:369\";i:3;s:9:\"node_view\";i:4;s:6:\"user:5\";}s:7:\"max-age\";i:-1;s:3:\"bin\";s:6:\"render\";}}',-1,1510663231.391,1,'config:filter.format.basic_html config:system.site node:369 node_view rendered user:5','273'),('entity_view:node:369:search_result:[languages:language_interface]=en:[theme]=yaffs:[url.path.is_front]=is_front.0:[user.permissions]=aa7fc4c8fb40c7a8665ccd12fea07926dff0f59b9ee3346bc513c6399bee5b01','a:3:{s:7:\"#markup\";O:25:\"Drupal\\Core\\Render\\Markup\":1:{s:9:\"\0*\0string\";s:33828:\"<span property=\"schema:name\">Yaffs Porting Guide</span>\n\n            <div property=\"schema:text\" class=\"field field--name-body field--type-text-with-summary field--label-hidden field--item\"><p>version 2.0</p>\n\n<p>Last changed: rrw@kynesim.co.uk, 2009-03-20<br />\n </p>\n\n<h3>Purpose</h3>\n\n<p>The purpose of this document is to describe how to bring up Yaffs2 on a board previously unsupported using the Yaffs Direct Interface, with an example using eCos on a Balloon board.</p>\n\n<p>Before we start you probably want to have the data sheet for the NAND chips you are using in front you so that you can refer to it as we go along.</p>\n\n<h3>Background and NAND Flash Properties</h3>\n\n<p>NAND flash is generally arranged in <em>pages</em> and <em>blocks</em>. A page contains a section of data bytes and then a section of out-of-band (<em>OOB</em>) data bytes. Blocks contain a number of pages .<br /><a href=\"/yaffs-embedded-structure\"><img alt=\"YAFFS porting guide diagram\" height=\"335\" src=\"/sites/yaffs.net/files/images/yaffs_porting_guide_html_2de490f8.png\" width=\"783\" /></a></p>\n\n<p>The OOB section of each page is used keep track of various things like file system state, error correction data and bad block marking.</p>\n\n<p>NAND flash is programmed (written to) and read on a largely page basis (though with some level of random access) and is erased on a block basis. That is, to erase a page, you must erase the rest of the containing block along with it.</p>\n\n<p>When programming NAND flash only 1\'s can be programmed to 0\'s, so to change a byte containing 0x00 to 0xFF it must be erased, along with the rest of the block. However subsequent programs may still be made without an erase if no 0s are to be changed to 1s, this might be useful in a scenario where subsequent data might regularly have this property.</p>\n\n<p>When manufactured NAND flash contains bad blocks, these are blocks that are not reliable and any data in them will commonly corrupt easily. These must be kept track of and the OOB data section is used to mark a bad block.</p>\n\n<p>NAND in general is prone to bit errors and for that reason the OOB data is also used to write error correction codes (ECC) so that some errors can be corrected.</p>\n\n<h3>Yaffs NAND Model</h3>\n\n<p>It is probably a good thing to detail at this point how Yaffs2 expects the NAND to behave so that you are aware of what you have to provide in the NAND driver to get YAFF running. Yaffs uses some different terminology in that it refers to a page as a <em>chunk</em>.</p>\n\n<p>Yaffs2 uses a fairly abstract model for NAND flash, this allows a lot of flexibility in the way Yaffs can be used. Yaffs is designed for NAND flash and makes the following assumptions and definitions:</p>\n\n<ul><li>NAND flash is arranged in blocks. Each block is the same size and comprises an integer number of chunks. Each block is treated as a single erasable item.</li>\n	<li>A page (chunk) equates to the allocation units of flash.</li>\n	<li>All accesses (reads and writes) are page (chunk) aligned.</li>\n	<li>When programming a NAND flash, only the zero bits in the pattern being programmed are relevant, and one bits are \"don\'t care\". For example, if a byte already contains the binary pattern 1010, then programming 1001 will result in the pattern which is the logical AND of these two patterns i.e. 1000. This is different to NOR flash.</li>\n</ul><p>Yaffs identifies blocks by their block number and chunks by their chunk Id. Yaffs treats a blank (0xFF filled) block as being free or erased. Thus, the equivalent of formatting for a Yaffs partition is to erase all the blocks that are not bad.</p>\n\n<p>Therefore Yaffs minimally needs access to functions that enable it to erase blocks and to read and write on a page basis. It is also helpful to be able to read only OOB data as reading/writing a full page to only view/update OOB data will cost many serial read cycles over the bus. This is an overhead that can be avoided using the random access read and write features of some nand chips.</p>\n\n<p> </p>\n\n<h2>Writing a Driver for NAND flash Chips</h2>\n\n<h3>Writing a Driver for the Samsung 628 K9F2G08U0M PCB0 on the Balloon Board (v3.01)</h3>\n\n<p>For the Balloon board the NAND chips hang off the CPLD which is in turn hooked up to the system bus. This is quite board specific and in this case reading the VHDL code reveals how to change the values on the pins of the NAND chips. You may look at the code by downloading the balloon source code (Appendix A) and looking at balloon3.vhd and Balloon_nand.vhd in balloon/vhdl/fpga/.</p>\n\n<p>It will be likely that this is significantly different on your platform and you should consult the relevant data sheets and documentation to determine how to access the NAND hardware on your board. I will present an example of the balloon board in order to give an overview of the kind of thing that is required.</p>\n\n<p>On the Balloon the CPLD routes data on the bus with certain address to the logic on the CPLD that actually controls the flash chips. They are as follows:</p>\n\n<p><code>NAND Data Bus : 0x10e00000</code> <code>NAND Control 2: 0x10e00010</code> <code>NAND Control : 0x10e00014</code></p>\n\n<p>Sending data to the \'NAND Data Bus\' address will put that data onto the I/O pins of the NAND chips. All of the nand chips are hooked up to the same pins on the CPLD so writing to the \'NAND Data Bus\' address will put the value written on the I/O pins for <em>all</em> of the available flash chips. To isolate the chip you want to work with using the chip enable pin on each flash chip.</p>\n\n<p>This is done by writing to the \'NAND Control\' (0x10e00014) address. When writing to \'NAND control\', the CPLD takes the data value on the bus and routes each bit to a different wire. This bit field is structured as follows:</p>\n\n<p> </p>\n\n<table><colgroup><col /><col /></colgroup><tr><td><em>Pin Attached To</em></td>\n			<td><em>Bit in NAND Control value</em></td>\n		</tr><tr><td>CLE (Control Latch Enable)</td>\n			<td>0</td>\n		</tr><tr><td>ALE (Address Latch Enable)</td>\n			<td>1</td>\n		</tr><tr><td>nCE0 (not Chip Enable for chip 0)</td>\n			<td>2</td>\n		</tr><tr><td>nCE1 (for chip 1)</td>\n			<td>3</td>\n		</tr><tr><td>nCE2 (for chip 2)</td>\n			<td>4</td>\n		</tr><tr><td>nCE3 (for chip 3)</td>\n			<td>5</td>\n		</tr><tr><td>nSE (not Chip Enable for chip 0)</td>\n			<td>6</td>\n		</tr><tr><td>nWP (not Write Protect)</td>\n			<td>7</td>\n		</tr></table><p> </p>\n\n<p>So for example bit 1 on the data lines is put onto the ALE pin on the physical chip. Bits prefixed with \'n\' are active low, for example chip 0 is selected when nCE0 is low and nCE1-3 are high.</p>\n\n<p> </p>\n\n<p>So writing to \'NAND Control\' we can change the values of the pins on the flash. Again, CLE, ALE, nSE and nWP change the value of the corresponding pin on all the flash chips available, nCE[0-3] will select the chip you are using.</p>\n\n<p>Finally, NAND flash typically comes in couple of flavours, 8 bit wide (x8) and 16 bit wide (x16). This means that x8 chips have 8 I/O pins and x16 have 16. The logic on the CPLD on the Balloon can handle both if you tell it which you are currently dealing with. Writing to \'NAND Control 2\' a value of 1 puts the CPLD logic for the NAND chips into x8 mode and 0 into x16 mode. I will assume for the rest of this document that there are only x8 chips connected to the balloon but it should be fairly trivial to extend it to support both.</p>\n\n<h3>Using the Flash Chips</h3>\n\n<p>The flash chips we\'re using have a number of commands, each triggered by a sequence of one or two command codes. You will want to refer to the data sheets for precise details of these functions, but I will briefly describe some of them in this document. The command set that we have for the particular chip we\'re using is table 1 on page 7 of the data sheet.</p>\n\n<p>To input a command there is generally one or two command input cycles. For two cycle commands there is generally an initial command followed by some data needed to complete the command then another command cycle to notify that the relevant data has been input and to start execution. For example for read operations the command 0x00 is latched in followed by some address input cycles followed by the command 0x30 to start the operation. With this in mind I will now describe how to input commands, the \'Command Latch Cycle\'.</p>\n\n<p>Note that for this section I have assumed that the bus is sufficiently slow that the set-up and hold times are not an issue, if you have a fast bus then you may have to wait for a small amount of time (refer to the data sheet) after changing values on the pins (by writing to the correct address) so that set-up and hold times are not violated.</p>\n\n<h3>Command Latch Cycle</h3>\n\n<p>For the command latch cycle you need to first select a chip by setting the relevant nCE low and then you need to set the CLE bit high, that means writing to the \'NAND Control\' address. ALE must also be low and should be set at the same time as CLE. It is then a case of putting the command value onto the I/O pins by writing to the \'NAND Data Bus\' address the value of the command you want. This will then latch in the command, afterwards you will need to clear the CLE bit again.</p>\n\n<p>You will also notice from looking at the data sheet that something needs to be done with the nWE (not <strong>w</strong>rite <strong>e</strong>nable) pin (specifically it should be low while latching in the command), but that I have yet to describe a mechanism for changing its value. This is because it is dealt with by the logic in the CPLD and whenever data is sent to the data address the CPLD will toggle nWE appropriately. (This is also true of nRE (not <strong>r</strong>ead <strong>e</strong>nable) when reading). This process is implemented in the nand_chip_select and the send_command functions (flash.c).</p>\n\n<h3>Address Latch Cycle and Addressing</h3>\n\n<p>The process for the Address Latch Cycle is similar to that for command latching (with the sense of ALE and CLE reversed) and can be looked at in the data sheet and is implemented in send_address in flash.c. The addressing is done by row and column. There are 5 address cycles on the flash chips we\'re looking at. The first cycle contains bits 0-7 of the column address, the second bits 8-11 with the remaining bits of the byte to be sent low. The row address is over 3 more cycles in a similar fashion.</p>\n\n<p>You may wish to chose to address the individual bytes of the chip with the OOB data not directly addressable. This has enabled me to lump several chips into the same address space and select the correct chip based on the address. Addresses then need to be converted to row and column. You should also check that they are page/block aligned in the relevant places if that\'s what your functions expect. It needn\'t be done this way any you could use page numbers instead of bytes just as easily.</p>\n\n<p><br /><a href=\"/yaffs-embedded-structure\"><img alt=\"YAFFS porting guide diagram 2\" height=\"209\" src=\"sites/yaffs.net/files/images/yaffs_porting_guide_html_m11b1f893.png\" width=\"654\" /></a></p>\n\n<p> </p>\n\n<p>The \'row\' is essentially the page index and the \'column\' is the index into to that page, so if you wanted to read from the start of page 213 you would send 0 for the column and 213 for the row. Conversely if you wanted just the OOB bytes from the same page you would send a column value of 2048 (given a page size of 2048+64 bytes).</p>\n\n<p><br /><a href=\"/yaffs-embedded-structure\"><img alt=\"YAFFS porting guide diagram 3\" height=\"271\" src=\"sites/yaffs.net/files/images/yaffs_porting_guide_html_m4650262f.png\" width=\"347\" /></a></p>\n\n<p> </p>\n\n<h3>Finding Chip information</h3>\n\n<p>You will then need to find out which chips are active (e.g. on the balloon there are 4 possible chips, not all of which will exist) and what type of chips they are. For this there is the \'Read ID\' operation. This operation is implemented in the read_ids function in flash.c. The result of the operation gives the manufacturer and device code of the chip and information about the chip (page size, block size, oob size etc). To find which chips are available, loop through the possible chips and start a Read ID command on each of them, if the expected data is returned then there is a chip at that location.</p>\n\n<p>The operation is started by sending the command 0x90 and then one address cycle of 0x00. There are then 5 read cycles which give you data about the device. A description of how to unpack this information from the returned bytes is located on page 32 of the data sheet for the chip described here.</p>\n\n<p>This then gives you how many chips you have and what layout the data in them has.</p>\n\n<h3>Bad Block Checking</h3>\n\n<p>Contained within a nand chip are blocks that the manufacturer will not guarantee the reliability of (this is to increase yield in manufacturing) and so bad blocks must be kept track of. The Samsung chips come with the first byte (or word for x16) of the first and second page of each bad block not programmed as 0xFF.</p>\n\n<p>This bad block marking should be maintained and should be added to in the same way when a bad block is is discovered. Yaffs will expect you to provide a function it can call to mark a particular block as bad when yaffs decides it is necessary.</p>\n\n<p>Yaffs keeps track of bad blocks itself so that the driver doesn\'t need to worry about masking out bad blocks.</p>\n\n<h3>Erasing a Block</h3>\n\n<p>An example of this operation is given in nand_erase_block in flash.c. If you are addressing the nand by bytes then you must first check that the address is aligned to the start of a block and then convert the address into a block number. If there is more than one chip this will involve working out which chip the address refers to and then selecting the correct chip. This can be seen in the select_chip function in flash.c. You must then send the first command cycle for the erase operation before sending 3 cycles of address and then finally the last command cycle.</p>\n\n<p>For the erase operation the 3 address cycles are different than for the read/write operations. Only address bits A18 to A29 is valid (for x8) while A12 to A17 is ignored. In terms of the ordinary 5 cycles address input you only need to deal with the last 3 cycles and of those only the highest 2 bits of the 3rd cycle are used and the full 4th and 5th cycle are used.</p>\n\n<p>Once the operation has been started the program can check the progress of the operation by sending a command of 70h. Each subsequent read will contain the read status. The driver should wait until the read is complete (by the read status operation), the read status operation also contains information about whether the erase failed and this information should be returned from the function doing the erase.</p>\n\n<h3>Reading a Page</h3>\n\n<p>Reading a page is performed by first selecting the correct chip and then converting the address to a row and column number. You can then sending the first command cycle for the read operation followed by 5 address cycles as described in the previous sections. The second command cycle then starts the read operation. The driver must then wait for the data to be retrieved into the data registers on the NAND before they can be read out over the bus. For the example chip this is 25us, consult the data sheet as this may differ. The data can then be read out sequentially byte by byte until all the data needed is obtained.</p>\n\n<h3>Writing a Page</h3>\n\n<p>Page program operations are performed by first selecting the correct chip converting the address to row and column numbers. The page program operation is initiated by the relevant fist command latch cycle (command 0x80) followed by an address latch cycle (as for read), serial data loading and then the second command latch cycle (command 0x10).</p>\n\n<p>The serial data loading is done by serially writing data to the I/O pins. Up to 2112 bytes (x8) can be loaded into the data registers. Once the second command cycle is sent the program is initiated and there is then a programming period where the loaded data is programmed into the appropriate cell. The driver should wait for this to complete by issuing a read status command (0x70) and monitoring the R/nB (ready / not busy) bit. The R/nB flag is on I/O pin 6 and can be checked by repeatedly reading from the \'NAND Data Bus\' address. Once the operation is complete the Write Status Bit (I/O 0 ) may be checked to confirm that the operation was successful.</p>\n\n<h2>Yaffs</h2>\n\n<h3>How To Use Yaffs</h3>\n\n<h3>Checking Out From Git</h3>\n\n<p>The first thing to do is to obtain the source code for Yaffs. This can be done from CVS, details of the process can be found at <a href=\"http://www.yaffs.net/download-yaffs-using-git\">http://www.yaffs.net/download-yaffs-using-git</a>.</p>\n\n<p>The following command will checkout the latest Git version using public read-only access, if you are using bash.</p>\n\n<p><code>$ </code>git clone git://www.aleph1.co.uk/yaffs2 </p>\n\n<h3>Making Some Tweaks to the Source Code</h3>\n\n<p>As of the latest version from CVS in January 2009, you will need to make a small number of changes before you can compile the source code without errors and warnings. There is a patch file included with this document.</p>\n\n<p>You will need to provide a definition of loff_t (in yaffs2/direct/ydirectenv.h) this is for holding the file size in bytes, you should make it big enough to hold the largest file size you wish to support. Unsigned long is probably a good place to start. You will need to edit yaffsfs.c to change a #if to a #ifdef. Then if you have the relevant warnings and -Werror switched on you will need to correct a couple of printf format strings to get the type right (changing a few \'%d\' to \'%ld\').</p>\n\n<p><code>change yaffs/ydirectenv.h </code></p>\n\n<p><code>+ typedef unsigned long loff_t; </code></p>\n\n<p><code>change yaffs2/direct/yaffsfs.c ~line 1117 </code></p>\n\n<p><code>- #if CONFIG_YAFFS_WINCE </code></p>\n\n<p><code>+ #ifdef CONFIG_YAFFS_WINCE</code></p>\n\n<h3>Relevant Files to the Direct Interface</h3>\n\n<p>There are quite a few files that get checked out, not all of which you will need to get going with the yaffs direct interface. The ones you will actually need are listed bellow, you do not need to compile the rest in.</p>\n\n<p><code><code>direct/yaffsfs.c </code></code></p>\n\n<p><code><code>yaffs_guts.c </code></code></p>\n\n<p><code><code>direct/yaffscfg.c </code></code></p>\n\n<p><code><code>yaffs_nand.c </code></code></p>\n\n<p><code><code>yaffs_tagsvalidity.c </code></code></p>\n\n<p><code><code>yaffs_checkptrw.c </code></code></p>\n\n<p><code><code>yaffs_qsort.c </code></code></p>\n\n<p><code><code>yaffs_tagscompat.c </code></code></p>\n\n<p><code><code>yaffs_ecc.c </code></code></p>\n\n<p><code><code>yaffs_packedtags2.c</code></code></p>\n\n<h3>Some Relevant Preprocessor Flags</h3>\n\n<p>There are many different configuration options for yaffs, here are a few that you should be aware of for using the yaffs direct interface.</p>\n\n<ul><li>CONFIG_YAFFS_DIRECT - Tell yaffs to use the direct interface.</li>\n	<li>CONFIG_YAFFS_YAFFS2 - Tell yaffs we want to use yaffs2</li>\n	<li>CONFIG_YAFFS_PROVIDE_DEFS - provides some definitions for file types and #includes linux/types.h, linux/fs.h, linux/stat.h (see yaffs2/devextras.h).</li>\n	<li>CONFIG_YAFFSFS_PROVIDE_VALUES - This may be used so that you can customise error values and constants like O_RDONLY to match the underlying system values, if itis not defined then it includes errno.h,sys/stat.h and fcntl.h (see yaffs2/direct/yaffsfs.h).</li>\n</ul><p>Specify these options when compiling yaffs, i.e. -DCONFIG_YAFFS_DIRECT etc.</p>\n\n<h3>Configuring</h3>\n\n<p>You will then need to provide yaffs with configuration information. This includes details about the nand flash you are using and also tells yaffs which functions to call when when it wants to read/write/erase parts of the flash, these functions will form the bridge between yaffs and the underlying hardware driver. This customisation is done in yaffscfg.h. Within yaffscfg.h you will need to provide a number of operating-system-like functions and a function to initialise yaffs. For example providing functions for malloc and free. Here is a breakdown of those functions that need to be implemented.</p>\n\n<h3>Operating System Functions</h3>\n\n<p><code><code>void yaffsfs_SetError(int err); </code> </code></p>\n\n<p>Report system errors, for example using errno if it exists.</p>\n\n<p><code><code>void *yaffs_malloc(size_t size);</code> <code>void yaffs_free(void *ptr);</code> </code></p>\n\n<p>As for the standard malloc and free functions, if they already exist on your system then you can just shim them.</p>\n\n<p><code><code>void yaffsfs_LocalInitialisation(void);</code> <code>void yaffsfs_Lock(void);</code> <code>void yaffsfs_Unlock(void);</code> </code></p>\n\n<p>Use yaffsfs_LocalInitalisation to initialise \"Real Time Operating System\" state, if the system is multi-threaded then it should initialise a semaphore/mutex for use by lock and unlock. Lock/unlock should use the semaphore set up in LocalInitialisation to lock yaffs from multi-threaded access.</p>\n\n<p><code><code>__u32 yaffsfs_CurrentTime(void);</code> </code></p>\n\n<p>This can be any time increment of use to the system. If this is not required, then it is fine to just use a function that returns zero.</p>\n\n<h3>Yaffs Startup Function</h3>\n\n<p><code><code>int yaffs_StartUp(void); </code> </code></p>\n\n<p><code><code>Return value: YAFFS_OK or YAFFS_FAIL</code> </code></p>\n\n<p>This functions should be used to provide yaffs with many details about the properties of the underlying nand device. Within this function you will need to set up a \'yaffs_Device\' (yaffs_guts.h) and a \'yaffsfs_DeviceConfiguration\' (direct/yaffscfg.h). How to set up a yaffs device will follow in the next section. Once you have set up the required yaffs_Device structures you should call yaffs_initialise (yaffs_guts.h) with a pointer to a null terminated array of yaffs_DeviceConfiguration structures. A yaffs_DeviceConfiguration structure contains a pointer to a yaffs_Device and the \'mount point\' string (prefix) that that device corresponds to.</p>\n\n<h3>Yaffs Devices</h3>\n\n<p>A yaffs device is a logical device that represents part of or a whole physical device. You might think of it as a \'partition\' on the nand. For example, it might cover the whole of the nand device or perhaps only claim half, with another yaffs_Device claiming the other half. It may also be used so that you can use a device other than a flash device (e.g. RAM) for testing purposes.</p>\n\n<p>A yaffs_Device keeps track of the start and end block, so you may have more than one yaffs_Device corresponding to the same physical device by altering the start and end block of the yaffs device.</p>\n\n<p>The fields on the yaffs_Device struct that you need to set up yourself are listed below, all other fields are setup automatically by yaffs.</p>\n\n<p><code><code>int nDataBytesPerChunk</code> </code></p>\n\n<p>As the name suggests this is the number of bytes per chunk, remembering that in yaffs terminology a page is referred to as a chunk, this is then the number of bytes per page. This is the number of data bytes, that is the number of bytes excluding the OOB byte data. E.g. if a page is 2048byte + 64bytes of OOB then set nDataBytesPerChunk to 2048.</p>\n\n<p><code><code>int nChunksPerBlock </code> </code></p>\n\n<p>Straightforwardly the number of chunks (pages on the nand) in each block on the physical nand device. Must be at least 2.</p>\n\n<p><code><code>int spareBytesPerChunk</code></code><br />\nThis is the size of the spare area, i.e. the number of OOB bytes per chunk (page)<code>. </code></p>\n\n<p><code><code>int startBlock</code> </code></p>\n\n<p>The block number (not the address in bytes) on the chip of the first block of this logical yaffs_Device. Beware, yaffs needs the first block to be free so you should not set this to 0, if it is then yaffs will add on one to it itself and also add on one to the end block which could be an issue if you wanted your device to start at block 0 and finish at the last block which might mean yaffs trying to write to a non-existent block.</p>\n\n<p><code><code>int endBlock</code> </code></p>\n\n<p>The block number on the chip of the last block for this logical yaffs_Device. If startBlock == 0 then yaffs will use endBlock+1. Must be at least startBlock + nReservedBlocks + 2.</p>\n\n<p><code><code>int nReservedBlocks</code> </code></p>\n\n<p>This is then number of erasable blocks that Yaffs must keep in reserve for garbage collection and to cover for block failures. This must be a minimum of 2, but 5 or so is better. If you are using a medium that is not expected to fail (eg. RAM for a RAM disk, or a host file system emulation then 2 is OK).</p>\n\n<p><code><code>int nShortOpCaches</code> </code></p>\n\n<p>This configures the number of entries in the Yaffs cache for this device. A value of zero defeats the cache. A value of 10 to 20 is recommended for most systems. Cannon be any bigger than YAFFS_MAX_SHORT_OP_CACHES.</p>\n\n<p><code><code>int useNANDECC</code> </code></p>\n\n<p>This is a flag that tells yaffs whether it should be doing ECC calculations or if it should be left to the driver.</p>\n\n<p><code><code>void *genericDevice</code> </code></p>\n\n<p>This is a pointer which should point to any data that the underlying nand driver will need to know to write and read from the physical device.</p>\n\n<p><code><code>int isYaffs2</code> </code></p>\n\n<p>Are we using Yaffs2? We only deal with Yaffs2 in this document.</p>\n\n<p><code><code>int inbandTags</code> </code></p>\n\n<p>Is there an OOB section? If not then this should be true. Only relevant to Yaffs2.</p>\n\n<p><code><code>_u32 totalBytesPerChunk</code> </code></p>\n\n<p>Possibly a misleading name, it should be equal to nDataBytesPerChunk not nDataBytesPerChunk + spareBytesPerChunk as the name might suggest. If inbandTags is true then yaffs sets nDataBytesPerChunk such that there is enough space for the data yaffs would normally store in the spare area.</p>\n\n<p><code><code>write/readChunkWithTagsFromNAND, markNANDBlockBad, queryNANDBlock</code> </code></p>\n\n<p>These are all pointers to functions that you shall provide to provide Yaffs with a method of writing/reading etc from the NAND.</p>\n\n<h3>NAND access functions</h3>\n\n<p>If you are using Yaffs2 you need to provide pointers to functions that Yaffs can call to write and read from the nand. Example implementations of these function can be seen in yaffs_mtdif.c, these are the functions written to do the same job for the linux mtd layer and provides the write and read functions. The following functions return YAFFS_OK on success and YAFFS_FAIL on failure.</p>\n\n<p><code><code>int (*writeChunkWithTagsToNAND) (struct yaffs_DeviceStruct * dev,</code> <code>int chunkInNAND, const __u8 * data,</code> <code>const yaffs_ExtendedTags * tags);</code> <code>dev: yaffs_Device to write to.</code> <code>chunkInNAND: Which page to write the chunk to.</code> <code>Data: Pointer to the data to write</code> <code>tags: Unpacked OOB data.</code> <code>Return: YAFFS_OK / YAFFS_FAIL</code> </code></p>\n\n<p>This function is to write pages (chunks) to the nand. In this function you will probably want to first retrive any useful data that you put in dev-&gt;genericDevice (in the yaffs_StartUp function) and use it to call the function you wrote previously to write data to the nand. For yaffs2 data and tags should never be NULL. chunkInNand is the page number of the page to write to, not an address so it will need converting if that\'s what your underling functions to write to the nand expect.</p>\n\n<p>You will then need to pack the tags into a yaffs_PackedTags2 structure, this takes out the all relevant details from the yaffs_ExtendedTags tags structure and calculates ECC data on it before placing them in the packedtags2 structure. This structure is the OOB data you will want to write out to the nands spare area.</p>\n\n<p>How you write these out to the OOB data depends on your architecture, nand chips and therefore how bad block marking is done. If for example the first byte is used for bad block marking then simply writing the tags out after the first byte is acceptable. The ECC data in packed tags only covers error correction and detection for the tags in the OOB data, if you want ECC on the data then you must do that yourself.</p>\n\n<p>To perform ECC checks to the data bytes you may use the yaffs_ECCCalculate function which calculates ECC data for 256 byte sections of data. This function produces 3 bytes of ECC data per 256 bytes. Therefore for 2048 bytes of data in each page you would need (2048/256) * 3 = 8 * 3 = 24 extra bytes of ECC data. This can be written out after the bad block byte and packed tags data.<br />\n </p>\n\n<p><code><code>int (*readChunkWithTagsFromNAND) (struct yaffs_DeviceStruct * dev,</code> <code>int chunkInNAND, __u8 * data,</code> <code>yaffs_ExtendedTags * tags);</code> <code>dev: The yaffs_Device to read from.</code> <code>chunkInNAND: Which page to read from.</code> <code>Data: Pointer to a buffer to read data to.</code> <code>tags: Pointer to a buffer to unpacked OOB data into.</code> <code>Return: YAFFS_OK / YAFFS_FAIL</code> </code></p>\n\n<p>This function should do the opposite to the previous function. Firstly, read in the data and OOB bytes. Secondly place the data bytes in the area pointed to by data, then unpack the OOB bytes into into the pointer to tags using yaffs_UnpackTags2.</p>\n\n<p>Once the tags have been unpacked you should then recalculate the ECC data on the data bytes you just read back, just as you did for the write operation. Then use the recalculated ECC and the ECC data read out of the OOB bytes with yaffs_ECCCorrect to correct the data.</p>\n\n<p>Depending on the return value from yaffs_ECCCorrect you should set tags-&gt;eccResult to reflect whether anything was corrected or the correction failed. yaffs_UnpackTags2 also sets tags-&gt;eccResult so you should only update it if the result of the data correction is worse than is already there. i.e. if after the tags are unpacked and eccResult is YAFFS_ECC_RESULT_FIXED and ECC correction on the data read back resulted in no errors then you should leave unpackedtags2 and YAFFS_ECC_RESULT_FIXED and not set it to YAFFS_ECC_RESULT_NO_ERROR.</p>\n\n<p><code><code>int (*markNANDBlockBad) (struct yaffs_DeviceStruct * dev, int blockNo);</code> <code>dev: yaffs_Device to write to.</code> <code>blockNo: Which block to mark.</code> <code>Return: YAFFS_OK / YAFFS_FAIL</code></code></p>\n\n<p>This should mark the block bad. This probably means reading the OOB data and changing the relevant byte that marks the bad block, and writing the OOB data back.</p>\n\n<p><code><code>int (*queryNANDBlock) (struct yaffs_DeviceStruct * dev, int blockNo,</code> <code>yaffs_BlockState * state, __u32 *sequenceNumber);</code> <code>dev: The yaffs_Device to write to.</code> <code>blockNo: Which block to mark.</code> <code>state: Upon returning this should be set to the relevant state of this particular block.</code> <code>Sequence number: The Sequence number of this block. 0 if the block is unused.</code> <code>Return: YAFFS_OK / YAFFS_FAIL</code> </code></p>\n\n<p>This should check whether or not the block is valid.</p>\n\n<p>If the bad block marker is set in the OOB then *state should be set to YAFFS_BLOCK_STATE_DEAD *sequenceNumber set to 0, and return YAFFS_FAIL.</p>\n\n<p>If the block is not bad then the tags should be unpacked. After the tags are unpacked, and it is found that chunk is used (see tags.chunkUsed) *sequenceNumber should be set to tags.sequenceNumber and *state to YAFFS_BLOCK_STATE_NEEDS_SCANNING, otherwise if the block is not used then *sequenceNumber should be 0 and *state should be set to YAFFS_BLOCK_STATE_EMPTY.</p>\n\n<h3>Application Interface</h3>\n\n<p>The yaffs provides a number of functions for applications to interface with it. These are mostly the same as the standard clib open/close etc prefixed with yaffs_ eg yaffs_open. These functions are defined in direct/yaffsfs.h.</p>\n\n<p>To initialise yaffs so that reading and writing can be done, you must call yaffs mount for each yaffs device you would like to use, e.g. yaffs_mount(\"/boot\"). This could be done at system boot if there is an operating system present so that the application need to worry about this. You will also need to call yaffs_unmount when you have finished so that yaffs may write any state it needs to to disk.</p>\n\n<p>If there is already an application interface for reading and writing files you may shim the relevant function calls with the related operating system calls.</p>\n\n<p>E.g. simply doing #define open(path, oflag, mode) yaffs_open(path, oflag, mode)</p>\n\n<p>Or having something more complex to provide redirection functions if there is more than one file system present.</p>\n\n<p><code><code>For example: int open(const char *path,...)<br />\n{<br />\n//Determine which file system is being used </code> <code>if(it_is_a_yaffs_path(path)) {</code> <code> return yaffs_open(...);<br />\n} else {<br />\n// Do something else<br />\n}<br />\n}</code></code></p>\n\n<h2>Appendices</h2>\n\n<h3>Appendix A - Accessing the Balloon Source Code</h3>\n\n<p>The latest source code for the balloon board can be checked out from SVN. There is different code for different balloon versions. Details of getting the source and setting up tool chains is decribed in the following page <a href=\"http://www.balloonboard.org/software.html\">http://www.balloonboard.org/software.html</a>. If you just want to take a look at the latest mainline code then the following will give you what you want.</p>\n\n<p>svn checkout svn://balloonboard.org/balloon/trunk/</p>\n\n<p> </p></div>\n      \";}s:9:\"#attached\";a:0:{}s:6:\"#cache\";a:3:{s:8:\"contexts\";a:4:{i:0;s:28:\"languages:language_interface\";i:1;s:5:\"theme\";i:2;s:17:\"url.path.is_front\";i:3;s:16:\"user.permissions\";}s:4:\"tags\";a:3:{i:0;s:31:\"config:filter.format.basic_html\";i:1;s:8:\"node:369\";i:2;s:9:\"node_view\";}s:7:\"max-age\";i:-1;}}',-1,1510805654.214,1,'config:filter.format.basic_html node:369 node_view rendered','265'),('entity_view:node:369:search_result:[languages:language_interface]=en:[theme]=yaffs:[user.permissions]=aa7fc4c8fb40c7a8665ccd12fea07926dff0f59b9ee3346bc513c6399bee5b01','a:2:{s:15:\"#cache_redirect\";b:1;s:6:\"#cache\";a:5:{s:4:\"keys\";a:4:{i:0;s:11:\"entity_view\";i:1;s:4:\"node\";i:2;s:3:\"369\";i:3;s:13:\"search_result\";}s:8:\"contexts\";a:4:{i:0;s:28:\"languages:language_interface\";i:1;s:5:\"theme\";i:2;s:17:\"url.path.is_front\";i:3;s:16:\"user.permissions\";}s:4:\"tags\";a:3:{i:0;s:31:\"config:filter.format.basic_html\";i:1;s:8:\"node:369\";i:2;s:9:\"node_view\";}s:7:\"max-age\";i:-1;s:3:\"bin\";s:6:\"render\";}}',-1,1510805654.192,1,'config:filter.format.basic_html node:369 node_view rendered','265'),('entity_view:node:370:full:[languages:language_interface]=en:[theme]=yaffs:[timezone]=Europe/London:[url.path.is_front]=is_front.0:[user.permissions]=aa7fc4c8fb40c7a8665ccd12fea07926dff0f59b9ee3346bc513c6399bee5b0Ow_25iMMZ-LZJaCb7Pi-4CiscwKFtpaZEOhwccR5NOw','a:5:{s:7:\"#markup\";O:25:\"Drupal\\Core\\Render\\Markup\":1:{s:9:\"\0*\0string\";s:175:\"<article role=\"article\" about=\"/yaffs-porting-guide-html-2de490f8-png\" class=\"image is-promoted full clearfix\">\n\n  \n    \n\n  \n  <div class=\"content\">\n    \n  </div>\n\n</article>\n\";}s:9:\"#attached\";a:1:{s:14:\"html_head_link\";a:3:{i:0;a:2:{i:0;a:2:{s:3:\"rel\";s:9:\"canonical\";s:4:\"href\";s:38:\"/yaffs-porting-guide-html-2de490f8-png\";}i:1;b:1;}i:1;a:2:{i:0;a:2:{s:3:\"rel\";s:9:\"shortlink\";s:4:\"href\";s:9:\"/node/370\";}i:1;b:1;}i:2;a:2:{i:0;a:2:{s:3:\"rel\";s:8:\"revision\";s:4:\"href\";s:38:\"/yaffs-porting-guide-html-2de490f8-png\";}i:1;b:1;}}}s:6:\"#cache\";a:3:{s:8:\"contexts\";a:7:{i:0;s:28:\"languages:language_interface\";i:1;s:5:\"theme\";i:2;s:8:\"timezone\";i:3;s:17:\"url.path.is_front\";i:4;s:16:\"user.permissions\";i:5;s:20:\"user.roles:anonymous\";i:6;s:24:\"user.roles:authenticated\";}s:4:\"tags\";a:4:{i:0;s:18:\"config:system.site\";i:1;s:8:\"node:370\";i:2;s:9:\"node_view\";i:3;s:6:\"user:5\";}s:7:\"max-age\";i:-1;}s:17:\"#cache_properties\";a:1:{i:0;s:6:\"#title\";}s:6:\"#title\";O:25:\"Drupal\\Core\\Render\\Markup\":1:{s:9:\"\0*\0string\";s:51:\"<span>yaffs_porting_guide_html_2de490f8.png</span>\n\";}}',-1,1511955819.199,1,'config:system.site node:370 node_view rendered user:5','262'),('entity_view:node:370:full:[languages:language_interface]=en:[theme]=yaffs:[user.permissions]=aa7fc4c8fb40c7a8665ccd12fea07926dff0f59b9ee3346bc513c6399bee5b01:[user.roles:anonymous]=0','a:2:{s:15:\"#cache_redirect\";b:1;s:6:\"#cache\";a:5:{s:4:\"keys\";a:4:{i:0;s:11:\"entity_view\";i:1;s:4:\"node\";i:2;s:3:\"370\";i:3;s:4:\"full\";}s:8:\"contexts\";a:7:{i:0;s:28:\"languages:language_interface\";i:1;s:5:\"theme\";i:2;s:8:\"timezone\";i:3;s:17:\"url.path.is_front\";i:4;s:16:\"user.permissions\";i:5;s:20:\"user.roles:anonymous\";i:6;s:24:\"user.roles:authenticated\";}s:4:\"tags\";a:4:{i:0;s:18:\"config:system.site\";i:1;s:8:\"node:370\";i:2;s:9:\"node_view\";i:3;s:6:\"user:5\";}s:7:\"max-age\";i:-1;s:3:\"bin\";s:6:\"render\";}}',-1,1511955819.197,1,'config:system.site node:370 node_view rendered user:5','262'),('entity_view:node:370:teaser:[languages:language_interface]=en:[theme]=yaffs:[timezone]=Europe/London:[url.path.is_front]=is_front.0:[user.permissions]=aa7fc4c8fb40c7a8665ccd12fea07926dff0f59b9ee3346bc513c6399bee5b01','a:3:{s:7:\"#markup\";O:25:\"Drupal\\Core\\Render\\Markup\":1:{s:9:\"\0*\0string\";s:611:\"<article role=\"article\" about=\"/yaffs-porting-guide-html-2de490f8-png\" class=\"image is-promoted teaser clearfix\">\n\n  \n      <h2>\n      <a href=\"/yaffs-porting-guide-html-2de490f8-png\" rel=\"bookmark\"><span>yaffs_porting_guide_html_2de490f8.png</span>\n</a>\n    </h2>\n    \n\n  \n  <div class=\"content\">\n    <ul class=\"links inline list-inline\"><li class=\"node-readmore\"><a href=\"/yaffs-porting-guide-html-2de490f8-png\" rel=\"tag\" title=\"yaffs_porting_guide_html_2de490f8.png\" hreflang=\"und\">Read more<span class=\"visually-hidden\"> about yaffs_porting_guide_html_2de490f8.png</span></a></li></ul>\n  </div>\n\n</article>\n\";}s:9:\"#attached\";a:0:{}s:6:\"#cache\";a:3:{s:8:\"contexts\";a:5:{i:0;s:28:\"languages:language_interface\";i:1;s:5:\"theme\";i:2;s:8:\"timezone\";i:3;s:17:\"url.path.is_front\";i:4;s:16:\"user.permissions\";}s:4:\"tags\";a:3:{i:0;s:8:\"node:370\";i:1;s:9:\"node_view\";i:2;s:6:\"user:5\";}s:7:\"max-age\";i:-1;}}',-1,1510674351.334,1,'node:370 node_view rendered user:5','256'),('entity_view:node:370:teaser:[languages:language_interface]=en:[theme]=yaffs:[user.permissions]=aa7fc4c8fb40c7a8665ccd12fea07926dff0f59b9ee3346bc513c6399bee5b01','a:2:{s:15:\"#cache_redirect\";b:1;s:6:\"#cache\";a:5:{s:4:\"keys\";a:4:{i:0;s:11:\"entity_view\";i:1;s:4:\"node\";i:2;s:3:\"370\";i:3;s:6:\"teaser\";}s:8:\"contexts\";a:5:{i:0;s:28:\"languages:language_interface\";i:1;s:5:\"theme\";i:2;s:8:\"timezone\";i:3;s:17:\"url.path.is_front\";i:4;s:16:\"user.permissions\";}s:4:\"tags\";a:3:{i:0;s:8:\"node:370\";i:1;s:9:\"node_view\";i:2;s:6:\"user:5\";}s:7:\"max-age\";i:-1;s:3:\"bin\";s:6:\"render\";}}',-1,1510674351.322,1,'node:370 node_view rendered user:5','256'),('entity_view:node:371:full:[languages:language_interface]=en:[theme]=yaffs:[timezone]=Europe/London:[url.path.is_front]=is_front.0:[user.permissions]=aa7fc4c8fb40c7a8665ccd12fea07926dff0f59b9ee3346bc513c6399bee5b0N_5zskAKXYJeoZTezVIzKF0SK1c_-j7N5nuwQvC2q3I','a:5:{s:7:\"#markup\";O:25:\"Drupal\\Core\\Render\\Markup\":1:{s:9:\"\0*\0string\";s:176:\"<article role=\"article\" about=\"/yaffs-porting-guide-html-m11b1f893-png\" class=\"image is-promoted full clearfix\">\n\n  \n    \n\n  \n  <div class=\"content\">\n    \n  </div>\n\n</article>\n\";}s:9:\"#attached\";a:1:{s:14:\"html_head_link\";a:3:{i:0;a:2:{i:0;a:2:{s:3:\"rel\";s:9:\"canonical\";s:4:\"href\";s:39:\"/yaffs-porting-guide-html-m11b1f893-png\";}i:1;b:1;}i:1;a:2:{i:0;a:2:{s:3:\"rel\";s:9:\"shortlink\";s:4:\"href\";s:9:\"/node/371\";}i:1;b:1;}i:2;a:2:{i:0;a:2:{s:3:\"rel\";s:8:\"revision\";s:4:\"href\";s:39:\"/yaffs-porting-guide-html-m11b1f893-png\";}i:1;b:1;}}}s:6:\"#cache\";a:3:{s:8:\"contexts\";a:7:{i:0;s:28:\"languages:language_interface\";i:1;s:5:\"theme\";i:2;s:8:\"timezone\";i:3;s:17:\"url.path.is_front\";i:4;s:16:\"user.permissions\";i:5;s:20:\"user.roles:anonymous\";i:6;s:24:\"user.roles:authenticated\";}s:4:\"tags\";a:4:{i:0;s:18:\"config:system.site\";i:1;s:8:\"node:371\";i:2;s:9:\"node_view\";i:3;s:6:\"user:5\";}s:7:\"max-age\";i:-1;}s:17:\"#cache_properties\";a:1:{i:0;s:6:\"#title\";}s:6:\"#title\";O:25:\"Drupal\\Core\\Render\\Markup\":1:{s:9:\"\0*\0string\";s:52:\"<span>yaffs_porting_guide_html_m11b1f893.png</span>\n\";}}',-1,1511763447.638,1,'config:system.site node:371 node_view rendered user:5','262'),('entity_view:node:371:full:[languages:language_interface]=en:[theme]=yaffs:[user.permissions]=aa7fc4c8fb40c7a8665ccd12fea07926dff0f59b9ee3346bc513c6399bee5b01:[user.roles:anonymous]=0','a:2:{s:15:\"#cache_redirect\";b:1;s:6:\"#cache\";a:5:{s:4:\"keys\";a:4:{i:0;s:11:\"entity_view\";i:1;s:4:\"node\";i:2;s:3:\"371\";i:3;s:4:\"full\";}s:8:\"contexts\";a:7:{i:0;s:28:\"languages:language_interface\";i:1;s:5:\"theme\";i:2;s:8:\"timezone\";i:3;s:17:\"url.path.is_front\";i:4;s:16:\"user.permissions\";i:5;s:20:\"user.roles:anonymous\";i:6;s:24:\"user.roles:authenticated\";}s:4:\"tags\";a:4:{i:0;s:18:\"config:system.site\";i:1;s:8:\"node:371\";i:2;s:9:\"node_view\";i:3;s:6:\"user:5\";}s:7:\"max-age\";i:-1;s:3:\"bin\";s:6:\"render\";}}',-1,1511763447.634,1,'config:system.site node:371 node_view rendered user:5','262'),('entity_view:node:371:teaser:[languages:language_interface]=en:[theme]=yaffs:[timezone]=Europe/London:[url.path.is_front]=is_front.0:[user.permissions]=aa7fc4c8fb40c7a8665ccd12fea07926dff0f59b9ee3346bc513c6399bee5b01','a:3:{s:7:\"#markup\";O:25:\"Drupal\\Core\\Render\\Markup\":1:{s:9:\"\0*\0string\";s:617:\"<article role=\"article\" about=\"/yaffs-porting-guide-html-m11b1f893-png\" class=\"image is-promoted teaser clearfix\">\n\n  \n      <h2>\n      <a href=\"/yaffs-porting-guide-html-m11b1f893-png\" rel=\"bookmark\"><span>yaffs_porting_guide_html_m11b1f893.png</span>\n</a>\n    </h2>\n    \n\n  \n  <div class=\"content\">\n    <ul class=\"links inline list-inline\"><li class=\"node-readmore\"><a href=\"/yaffs-porting-guide-html-m11b1f893-png\" rel=\"tag\" title=\"yaffs_porting_guide_html_m11b1f893.png\" hreflang=\"und\">Read more<span class=\"visually-hidden\"> about yaffs_porting_guide_html_m11b1f893.png</span></a></li></ul>\n  </div>\n\n</article>\n\";}s:9:\"#attached\";a:0:{}s:6:\"#cache\";a:3:{s:8:\"contexts\";a:5:{i:0;s:28:\"languages:language_interface\";i:1;s:5:\"theme\";i:2;s:8:\"timezone\";i:3;s:17:\"url.path.is_front\";i:4;s:16:\"user.permissions\";}s:4:\"tags\";a:3:{i:0;s:8:\"node:371\";i:1;s:9:\"node_view\";i:2;s:6:\"user:5\";}s:7:\"max-age\";i:-1;}}',-1,1510674351.293,1,'node:371 node_view rendered user:5','256'),('entity_view:node:371:teaser:[languages:language_interface]=en:[theme]=yaffs:[user.permissions]=aa7fc4c8fb40c7a8665ccd12fea07926dff0f59b9ee3346bc513c6399bee5b01','a:2:{s:15:\"#cache_redirect\";b:1;s:6:\"#cache\";a:5:{s:4:\"keys\";a:4:{i:0;s:11:\"entity_view\";i:1;s:4:\"node\";i:2;s:3:\"371\";i:3;s:6:\"teaser\";}s:8:\"contexts\";a:5:{i:0;s:28:\"languages:language_interface\";i:1;s:5:\"theme\";i:2;s:8:\"timezone\";i:3;s:17:\"url.path.is_front\";i:4;s:16:\"user.permissions\";}s:4:\"tags\";a:3:{i:0;s:8:\"node:371\";i:1;s:9:\"node_view\";i:2;s:6:\"user:5\";}s:7:\"max-age\";i:-1;s:3:\"bin\";s:6:\"render\";}}',-1,1510674351.291,1,'node:371 node_view rendered user:5','256'),('entity_view:node:372:full:[languages:language_interface]=en:[theme]=yaffs:[timezone]=Europe/London:[url.path.is_front]=is_front.0:[user.permissions]=aa7fc4c8fb40c7a8665ccd12fea07926dff0f59b9ee3346bc513c6399bee5b0zHOFMwMGOmLRqPLwbNYJ8Fkfr4nwHKHGmV9BmbNTYKU','a:5:{s:7:\"#markup\";O:25:\"Drupal\\Core\\Render\\Markup\":1:{s:9:\"\0*\0string\";s:176:\"<article role=\"article\" about=\"/yaffs-porting-guide-html-m4650262f-png\" class=\"image is-promoted full clearfix\">\n\n  \n    \n\n  \n  <div class=\"content\">\n    \n  </div>\n\n</article>\n\";}s:9:\"#attached\";a:1:{s:14:\"html_head_link\";a:3:{i:0;a:2:{i:0;a:2:{s:3:\"rel\";s:9:\"canonical\";s:4:\"href\";s:39:\"/yaffs-porting-guide-html-m4650262f-png\";}i:1;b:1;}i:1;a:2:{i:0;a:2:{s:3:\"rel\";s:9:\"shortlink\";s:4:\"href\";s:9:\"/node/372\";}i:1;b:1;}i:2;a:2:{i:0;a:2:{s:3:\"rel\";s:8:\"revision\";s:4:\"href\";s:39:\"/yaffs-porting-guide-html-m4650262f-png\";}i:1;b:1;}}}s:6:\"#cache\";a:3:{s:8:\"contexts\";a:7:{i:0;s:28:\"languages:language_interface\";i:1;s:5:\"theme\";i:2;s:8:\"timezone\";i:3;s:17:\"url.path.is_front\";i:4;s:16:\"user.permissions\";i:5;s:20:\"user.roles:anonymous\";i:6;s:24:\"user.roles:authenticated\";}s:4:\"tags\";a:4:{i:0;s:18:\"config:system.site\";i:1;s:8:\"node:372\";i:2;s:9:\"node_view\";i:3;s:6:\"user:5\";}s:7:\"max-age\";i:-1;}s:17:\"#cache_properties\";a:1:{i:0;s:6:\"#title\";}s:6:\"#title\";O:25:\"Drupal\\Core\\Render\\Markup\":1:{s:9:\"\0*\0string\";s:52:\"<span>yaffs_porting_guide_html_m4650262f.png</span>\n\";}}',-1,1511339470.720,1,'config:system.site node:372 node_view rendered user:5','262'),('entity_view:node:372:full:[languages:language_interface]=en:[theme]=yaffs:[user.permissions]=aa7fc4c8fb40c7a8665ccd12fea07926dff0f59b9ee3346bc513c6399bee5b01:[user.roles:anonymous]=0','a:2:{s:15:\"#cache_redirect\";b:1;s:6:\"#cache\";a:5:{s:4:\"keys\";a:4:{i:0;s:11:\"entity_view\";i:1;s:4:\"node\";i:2;s:3:\"372\";i:3;s:4:\"full\";}s:8:\"contexts\";a:7:{i:0;s:28:\"languages:language_interface\";i:1;s:5:\"theme\";i:2;s:8:\"timezone\";i:3;s:17:\"url.path.is_front\";i:4;s:16:\"user.permissions\";i:5;s:20:\"user.roles:anonymous\";i:6;s:24:\"user.roles:authenticated\";}s:4:\"tags\";a:4:{i:0;s:18:\"config:system.site\";i:1;s:8:\"node:372\";i:2;s:9:\"node_view\";i:3;s:6:\"user:5\";}s:7:\"max-age\";i:-1;s:3:\"bin\";s:6:\"render\";}}',-1,1511339470.707,1,'config:system.site node:372 node_view rendered user:5','262'),('entity_view:node:372:teaser:[languages:language_interface]=en:[theme]=yaffs:[timezone]=Europe/London:[url.path.is_front]=is_front.0:[user.permissions]=aa7fc4c8fb40c7a8665ccd12fea07926dff0f59b9ee3346bc513c6399bee5b01','a:3:{s:7:\"#markup\";O:25:\"Drupal\\Core\\Render\\Markup\":1:{s:9:\"\0*\0string\";s:617:\"<article role=\"article\" about=\"/yaffs-porting-guide-html-m4650262f-png\" class=\"image is-promoted teaser clearfix\">\n\n  \n      <h2>\n      <a href=\"/yaffs-porting-guide-html-m4650262f-png\" rel=\"bookmark\"><span>yaffs_porting_guide_html_m4650262f.png</span>\n</a>\n    </h2>\n    \n\n  \n  <div class=\"content\">\n    <ul class=\"links inline list-inline\"><li class=\"node-readmore\"><a href=\"/yaffs-porting-guide-html-m4650262f-png\" rel=\"tag\" title=\"yaffs_porting_guide_html_m4650262f.png\" hreflang=\"und\">Read more<span class=\"visually-hidden\"> about yaffs_porting_guide_html_m4650262f.png</span></a></li></ul>\n  </div>\n\n</article>\n\";}s:9:\"#attached\";a:0:{}s:6:\"#cache\";a:3:{s:8:\"contexts\";a:5:{i:0;s:28:\"languages:language_interface\";i:1;s:5:\"theme\";i:2;s:8:\"timezone\";i:3;s:17:\"url.path.is_front\";i:4;s:16:\"user.permissions\";}s:4:\"tags\";a:3:{i:0;s:8:\"node:372\";i:1;s:9:\"node_view\";i:2;s:6:\"user:5\";}s:7:\"max-age\";i:-1;}}',-1,1510674351.282,1,'node:372 node_view rendered user:5','256'),('entity_view:node:372:teaser:[languages:language_interface]=en:[theme]=yaffs:[user.permissions]=aa7fc4c8fb40c7a8665ccd12fea07926dff0f59b9ee3346bc513c6399bee5b01','a:2:{s:15:\"#cache_redirect\";b:1;s:6:\"#cache\";a:5:{s:4:\"keys\";a:4:{i:0;s:11:\"entity_view\";i:1;s:4:\"node\";i:2;s:3:\"372\";i:3;s:6:\"teaser\";}s:8:\"contexts\";a:5:{i:0;s:28:\"languages:language_interface\";i:1;s:5:\"theme\";i:2;s:8:\"timezone\";i:3;s:17:\"url.path.is_front\";i:4;s:16:\"user.permissions\";}s:4:\"tags\";a:3:{i:0;s:8:\"node:372\";i:1;s:9:\"node_view\";i:2;s:6:\"user:5\";}s:7:\"max-age\";i:-1;s:3:\"bin\";s:6:\"render\";}}',-1,1510674351.280,1,'node:372 node_view rendered user:5','256'),('entity_view:node:374:full:[languages:language_interface]=en:[theme]=yaffs:[timezone]=Europe/London:[url.path.is_front]=is_front.0:[user.permissions]=aa7fc4c8fb40c7a8665ccd12fea07926dff0f59b9ee3346bc513c6399bee5b0Lq276R2_3_5sRLMf8yXROhg7TE0NBs7jZ2c8hYwSBkY','a:5:{s:7:\"#markup\";O:25:\"Drupal\\Core\\Render\\Markup\":1:{s:9:\"\0*\0string\";s:154:\"<article role=\"article\" about=\"/yaffs-tnode-tree\" class=\"image is-promoted full clearfix\">\n\n  \n    \n\n  \n  <div class=\"content\">\n    \n  </div>\n\n</article>\n\";}s:9:\"#attached\";a:1:{s:14:\"html_head_link\";a:3:{i:0;a:2:{i:0;a:2:{s:3:\"rel\";s:9:\"canonical\";s:4:\"href\";s:17:\"/yaffs-tnode-tree\";}i:1;b:1;}i:1;a:2:{i:0;a:2:{s:3:\"rel\";s:9:\"shortlink\";s:4:\"href\";s:9:\"/node/374\";}i:1;b:1;}i:2;a:2:{i:0;a:2:{s:3:\"rel\";s:8:\"revision\";s:4:\"href\";s:17:\"/yaffs-tnode-tree\";}i:1;b:1;}}}s:6:\"#cache\";a:3:{s:8:\"contexts\";a:7:{i:0;s:28:\"languages:language_interface\";i:1;s:5:\"theme\";i:2;s:8:\"timezone\";i:3;s:17:\"url.path.is_front\";i:4;s:16:\"user.permissions\";i:5;s:20:\"user.roles:anonymous\";i:6;s:24:\"user.roles:authenticated\";}s:4:\"tags\";a:4:{i:0;s:18:\"config:system.site\";i:1;s:8:\"node:374\";i:2;s:9:\"node_view\";i:3;s:6:\"user:1\";}s:7:\"max-age\";i:-1;}s:17:\"#cache_properties\";a:1:{i:0;s:6:\"#title\";}s:6:\"#title\";O:25:\"Drupal\\Core\\Render\\Markup\":1:{s:9:\"\0*\0string\";s:30:\"<span>YAFFS Tnode tree</span>\n\";}}',-1,1511339465.554,1,'config:system.site node:374 node_view rendered user:1','267'),('entity_view:node:374:full:[languages:language_interface]=en:[theme]=yaffs:[user.permissions]=aa7fc4c8fb40c7a8665ccd12fea07926dff0f59b9ee3346bc513c6399bee5b01:[user.roles:anonymous]=0','a:2:{s:15:\"#cache_redirect\";b:1;s:6:\"#cache\";a:5:{s:4:\"keys\";a:4:{i:0;s:11:\"entity_view\";i:1;s:4:\"node\";i:2;s:3:\"374\";i:3;s:4:\"full\";}s:8:\"contexts\";a:7:{i:0;s:28:\"languages:language_interface\";i:1;s:5:\"theme\";i:2;s:8:\"timezone\";i:3;s:17:\"url.path.is_front\";i:4;s:16:\"user.permissions\";i:5;s:20:\"user.roles:anonymous\";i:6;s:24:\"user.roles:authenticated\";}s:4:\"tags\";a:4:{i:0;s:18:\"config:system.site\";i:1;s:8:\"node:374\";i:2;s:9:\"node_view\";i:3;s:6:\"user:1\";}s:7:\"max-age\";i:-1;s:3:\"bin\";s:6:\"render\";}}',-1,1511339465.550,1,'config:system.site node:374 node_view rendered user:1','267'),('entity_view:node:374:search_result:[languages:language_interface]=en:[theme]=yaffs:[url.path.is_front]=is_front.0:[user.permissions]=aa7fc4c8fb40c7a8665ccd12fea07926dff0f59b9ee3346bc513c6399bee5b01','a:3:{s:7:\"#markup\";O:25:\"Drupal\\Core\\Render\\Markup\":1:{s:9:\"\0*\0string\";s:30:\"<span>YAFFS Tnode tree</span>\n\";}s:9:\"#attached\";a:0:{}s:6:\"#cache\";a:3:{s:8:\"contexts\";a:4:{i:0;s:28:\"languages:language_interface\";i:1;s:5:\"theme\";i:2;s:17:\"url.path.is_front\";i:3;s:16:\"user.permissions\";}s:4:\"tags\";a:2:{i:0;s:8:\"node:374\";i:1;s:9:\"node_view\";}s:7:\"max-age\";i:-1;}}',-1,1512113328.854,1,'node:374 node_view rendered','254'),('entity_view:node:374:search_result:[languages:language_interface]=en:[theme]=yaffs:[user.permissions]=aa7fc4c8fb40c7a8665ccd12fea07926dff0f59b9ee3346bc513c6399bee5b01','a:2:{s:15:\"#cache_redirect\";b:1;s:6:\"#cache\";a:5:{s:4:\"keys\";a:4:{i:0;s:11:\"entity_view\";i:1;s:4:\"node\";i:2;s:3:\"374\";i:3;s:13:\"search_result\";}s:8:\"contexts\";a:4:{i:0;s:28:\"languages:language_interface\";i:1;s:5:\"theme\";i:2;s:17:\"url.path.is_front\";i:3;s:16:\"user.permissions\";}s:4:\"tags\";a:2:{i:0;s:8:\"node:374\";i:1;s:9:\"node_view\";}s:7:\"max-age\";i:-1;s:3:\"bin\";s:6:\"render\";}}',-1,1512113328.852,1,'node:374 node_view rendered','254'),('entity_view:node:374:teaser:[languages:language_interface]=en:[theme]=yaffs:[timezone]=Europe/London:[url.path.is_front]=is_front.0:[user.permissions]=aa7fc4c8fb40c7a8665ccd12fea07926dff0f59b9ee3346bc513c6399bee5b01','a:3:{s:7:\"#markup\";O:25:\"Drupal\\Core\\Render\\Markup\":1:{s:9:\"\0*\0string\";s:485:\"<article role=\"article\" about=\"/yaffs-tnode-tree\" class=\"image is-promoted teaser clearfix\">\n\n  \n      <h2>\n      <a href=\"/yaffs-tnode-tree\" rel=\"bookmark\"><span>YAFFS Tnode tree</span>\n</a>\n    </h2>\n    \n\n  \n  <div class=\"content\">\n    <ul class=\"links inline list-inline\"><li class=\"node-readmore\"><a href=\"/yaffs-tnode-tree\" rel=\"tag\" title=\"YAFFS Tnode tree\" hreflang=\"und\">Read more<span class=\"visually-hidden\"> about YAFFS Tnode tree</span></a></li></ul>\n  </div>\n\n</article>\n\";}s:9:\"#attached\";a:0:{}s:6:\"#cache\";a:3:{s:8:\"contexts\";a:5:{i:0;s:28:\"languages:language_interface\";i:1;s:5:\"theme\";i:2;s:8:\"timezone\";i:3;s:17:\"url.path.is_front\";i:4;s:16:\"user.permissions\";}s:4:\"tags\";a:3:{i:0;s:8:\"node:374\";i:1;s:9:\"node_view\";i:2;s:6:\"user:1\";}s:7:\"max-age\";i:-1;}}',-1,1510674351.270,1,'node:374 node_view rendered user:1','261'),('entity_view:node:374:teaser:[languages:language_interface]=en:[theme]=yaffs:[user.permissions]=aa7fc4c8fb40c7a8665ccd12fea07926dff0f59b9ee3346bc513c6399bee5b01','a:2:{s:15:\"#cache_redirect\";b:1;s:6:\"#cache\";a:5:{s:4:\"keys\";a:4:{i:0;s:11:\"entity_view\";i:1;s:4:\"node\";i:2;s:3:\"374\";i:3;s:6:\"teaser\";}s:8:\"contexts\";a:5:{i:0;s:28:\"languages:language_interface\";i:1;s:5:\"theme\";i:2;s:8:\"timezone\";i:3;s:17:\"url.path.is_front\";i:4;s:16:\"user.permissions\";}s:4:\"tags\";a:3:{i:0;s:8:\"node:374\";i:1;s:9:\"node_view\";i:2;s:6:\"user:1\";}s:7:\"max-age\";i:-1;s:3:\"bin\";s:6:\"render\";}}',-1,1510674351.268,1,'node:374 node_view rendered user:1','261'),('entity_view:node:376:full:[languages:language_interface]=en:[theme]=yaffs:[timezone]=Europe/London:[url.path.is_front]=is_front.0:[user.permissions]=aa7fc4c8fb40c7a8665ccd12fea07926dff0f59b9ee3346bc513c6399bee5b0AYbG41HKiIPud_Xp83JqEYjQUB71zHg7hP689w56WKM','a:5:{s:7:\"#markup\";O:25:\"Drupal\\Core\\Render\\Markup\":1:{s:9:\"\0*\0string\";s:171:\"<article role=\"article\" about=\"/yaffs-directory-structure-example\" class=\"image is-promoted full clearfix\">\n\n  \n    \n\n  \n  <div class=\"content\">\n    \n  </div>\n\n</article>\n\";}s:9:\"#attached\";a:1:{s:14:\"html_head_link\";a:3:{i:0;a:2:{i:0;a:2:{s:3:\"rel\";s:9:\"canonical\";s:4:\"href\";s:34:\"/yaffs-directory-structure-example\";}i:1;b:1;}i:1;a:2:{i:0;a:2:{s:3:\"rel\";s:9:\"shortlink\";s:4:\"href\";s:9:\"/node/376\";}i:1;b:1;}i:2;a:2:{i:0;a:2:{s:3:\"rel\";s:8:\"revision\";s:4:\"href\";s:34:\"/yaffs-directory-structure-example\";}i:1;b:1;}}}s:6:\"#cache\";a:3:{s:8:\"contexts\";a:7:{i:0;s:28:\"languages:language_interface\";i:1;s:5:\"theme\";i:2;s:8:\"timezone\";i:3;s:17:\"url.path.is_front\";i:4;s:16:\"user.permissions\";i:5;s:20:\"user.roles:anonymous\";i:6;s:24:\"user.roles:authenticated\";}s:4:\"tags\";a:4:{i:0;s:18:\"config:system.site\";i:1;s:8:\"node:376\";i:2;s:9:\"node_view\";i:3;s:6:\"user:1\";}s:7:\"max-age\";i:-1;}s:17:\"#cache_properties\";a:1:{i:0;s:6:\"#title\";}s:6:\"#title\";O:25:\"Drupal\\Core\\Render\\Markup\":1:{s:9:\"\0*\0string\";s:49:\"<span>YAFFS - directory structure example</span>\n\";}}',-1,1511339464.672,1,'config:system.site node:376 node_view rendered user:1','267'),('entity_view:node:376:full:[languages:language_interface]=en:[theme]=yaffs:[user.permissions]=aa7fc4c8fb40c7a8665ccd12fea07926dff0f59b9ee3346bc513c6399bee5b01:[user.roles:anonymous]=0','a:2:{s:15:\"#cache_redirect\";b:1;s:6:\"#cache\";a:5:{s:4:\"keys\";a:4:{i:0;s:11:\"entity_view\";i:1;s:4:\"node\";i:2;s:3:\"376\";i:3;s:4:\"full\";}s:8:\"contexts\";a:7:{i:0;s:28:\"languages:language_interface\";i:1;s:5:\"theme\";i:2;s:8:\"timezone\";i:3;s:17:\"url.path.is_front\";i:4;s:16:\"user.permissions\";i:5;s:20:\"user.roles:anonymous\";i:6;s:24:\"user.roles:authenticated\";}s:4:\"tags\";a:4:{i:0;s:18:\"config:system.site\";i:1;s:8:\"node:376\";i:2;s:9:\"node_view\";i:3;s:6:\"user:1\";}s:7:\"max-age\";i:-1;s:3:\"bin\";s:6:\"render\";}}',-1,1511339464.669,1,'config:system.site node:376 node_view rendered user:1','267'),('entity_view:node:376:search_result:[languages:language_interface]=en:[theme]=yaffs:[url.path.is_front]=is_front.0:[user.permissions]=aa7fc4c8fb40c7a8665ccd12fea07926dff0f59b9ee3346bc513c6399bee5b01','a:3:{s:7:\"#markup\";O:25:\"Drupal\\Core\\Render\\Markup\":1:{s:9:\"\0*\0string\";s:49:\"<span>YAFFS - directory structure example</span>\n\";}s:9:\"#attached\";a:0:{}s:6:\"#cache\";a:3:{s:8:\"contexts\";a:4:{i:0;s:28:\"languages:language_interface\";i:1;s:5:\"theme\";i:2;s:17:\"url.path.is_front\";i:3;s:16:\"user.permissions\";}s:4:\"tags\";a:2:{i:0;s:8:\"node:376\";i:1;s:9:\"node_view\";}s:7:\"max-age\";i:-1;}}',-1,1512113328.844,1,'node:376 node_view rendered','254'),('entity_view:node:376:search_result:[languages:language_interface]=en:[theme]=yaffs:[user.permissions]=aa7fc4c8fb40c7a8665ccd12fea07926dff0f59b9ee3346bc513c6399bee5b01','a:2:{s:15:\"#cache_redirect\";b:1;s:6:\"#cache\";a:5:{s:4:\"keys\";a:4:{i:0;s:11:\"entity_view\";i:1;s:4:\"node\";i:2;s:3:\"376\";i:3;s:13:\"search_result\";}s:8:\"contexts\";a:4:{i:0;s:28:\"languages:language_interface\";i:1;s:5:\"theme\";i:2;s:17:\"url.path.is_front\";i:3;s:16:\"user.permissions\";}s:4:\"tags\";a:2:{i:0;s:8:\"node:376\";i:1;s:9:\"node_view\";}s:7:\"max-age\";i:-1;s:3:\"bin\";s:6:\"render\";}}',-1,1512113328.841,1,'node:376 node_view rendered','254'),('entity_view:node:376:teaser:[languages:language_interface]=en:[theme]=yaffs:[timezone]=Europe/London:[url.path.is_front]=is_front.0:[user.permissions]=aa7fc4c8fb40c7a8665ccd12fea07926dff0f59b9ee3346bc513c6399bee5b01','a:3:{s:7:\"#markup\";O:25:\"Drupal\\Core\\Render\\Markup\":1:{s:9:\"\0*\0string\";s:593:\"<article role=\"article\" about=\"/yaffs-directory-structure-example\" class=\"image is-promoted teaser clearfix\">\n\n  \n      <h2>\n      <a href=\"/yaffs-directory-structure-example\" rel=\"bookmark\"><span>YAFFS - directory structure example</span>\n</a>\n    </h2>\n    \n\n  \n  <div class=\"content\">\n    <ul class=\"links inline list-inline\"><li class=\"node-readmore\"><a href=\"/yaffs-directory-structure-example\" rel=\"tag\" title=\"YAFFS - directory structure example\" hreflang=\"und\">Read more<span class=\"visually-hidden\"> about YAFFS - directory structure example</span></a></li></ul>\n  </div>\n\n</article>\n\";}s:9:\"#attached\";a:0:{}s:6:\"#cache\";a:3:{s:8:\"contexts\";a:5:{i:0;s:28:\"languages:language_interface\";i:1;s:5:\"theme\";i:2;s:8:\"timezone\";i:3;s:17:\"url.path.is_front\";i:4;s:16:\"user.permissions\";}s:4:\"tags\";a:3:{i:0;s:8:\"node:376\";i:1;s:9:\"node_view\";i:2;s:6:\"user:1\";}s:7:\"max-age\";i:-1;}}',-1,1510674351.259,1,'node:376 node_view rendered user:1','261'),('entity_view:node:376:teaser:[languages:language_interface]=en:[theme]=yaffs:[user.permissions]=aa7fc4c8fb40c7a8665ccd12fea07926dff0f59b9ee3346bc513c6399bee5b01','a:2:{s:15:\"#cache_redirect\";b:1;s:6:\"#cache\";a:5:{s:4:\"keys\";a:4:{i:0;s:11:\"entity_view\";i:1;s:4:\"node\";i:2;s:3:\"376\";i:3;s:6:\"teaser\";}s:8:\"contexts\";a:5:{i:0;s:28:\"languages:language_interface\";i:1;s:5:\"theme\";i:2;s:8:\"timezone\";i:3;s:17:\"url.path.is_front\";i:4;s:16:\"user.permissions\";}s:4:\"tags\";a:3:{i:0;s:8:\"node:376\";i:1;s:9:\"node_view\";i:2;s:6:\"user:1\";}s:7:\"max-age\";i:-1;s:3:\"bin\";s:6:\"render\";}}',-1,1510674351.258,1,'node:376 node_view rendered user:1','261'),('entity_view:node:377:full:[languages:language_interface]=en:[theme]=yaffs:[timezone]=Europe/London:[url.path.is_front]=is_front.0:[user.permissions]=aa7fc4c8fb40c7a8665ccd12fea07926dff0f59b9ee3346bc513c6399bee5b0FVE-S4y23v7nrQX1O8CcaTPwJPSbIP8hE71O59cGP58','a:5:{s:7:\"#markup\";O:25:\"Drupal\\Core\\Render\\Markup\":1:{s:9:\"\0*\0string\";s:156:\"<article role=\"article\" about=\"/yaffs-block-states\" class=\"image is-promoted full clearfix\">\n\n  \n    \n\n  \n  <div class=\"content\">\n    \n  </div>\n\n</article>\n\";}s:9:\"#attached\";a:1:{s:14:\"html_head_link\";a:3:{i:0;a:2:{i:0;a:2:{s:3:\"rel\";s:9:\"canonical\";s:4:\"href\";s:19:\"/yaffs-block-states\";}i:1;b:1;}i:1;a:2:{i:0;a:2:{s:3:\"rel\";s:9:\"shortlink\";s:4:\"href\";s:9:\"/node/377\";}i:1;b:1;}i:2;a:2:{i:0;a:2:{s:3:\"rel\";s:8:\"revision\";s:4:\"href\";s:19:\"/yaffs-block-states\";}i:1;b:1;}}}s:6:\"#cache\";a:3:{s:8:\"contexts\";a:7:{i:0;s:28:\"languages:language_interface\";i:1;s:5:\"theme\";i:2;s:8:\"timezone\";i:3;s:17:\"url.path.is_front\";i:4;s:16:\"user.permissions\";i:5;s:20:\"user.roles:anonymous\";i:6;s:24:\"user.roles:authenticated\";}s:4:\"tags\";a:4:{i:0;s:18:\"config:system.site\";i:1;s:8:\"node:377\";i:2;s:9:\"node_view\";i:3;s:6:\"user:1\";}s:7:\"max-age\";i:-1;}s:17:\"#cache_properties\";a:1:{i:0;s:6:\"#title\";}s:6:\"#title\";O:25:\"Drupal\\Core\\Render\\Markup\":1:{s:9:\"\0*\0string\";s:34:\"<span>YAFFS - Block states</span>\n\";}}',-1,1511339454.366,1,'config:system.site node:377 node_view rendered user:1','267'),('entity_view:node:377:full:[languages:language_interface]=en:[theme]=yaffs:[user.permissions]=aa7fc4c8fb40c7a8665ccd12fea07926dff0f59b9ee3346bc513c6399bee5b01:[user.roles:anonymous]=0','a:2:{s:15:\"#cache_redirect\";b:1;s:6:\"#cache\";a:5:{s:4:\"keys\";a:4:{i:0;s:11:\"entity_view\";i:1;s:4:\"node\";i:2;s:3:\"377\";i:3;s:4:\"full\";}s:8:\"contexts\";a:7:{i:0;s:28:\"languages:language_interface\";i:1;s:5:\"theme\";i:2;s:8:\"timezone\";i:3;s:17:\"url.path.is_front\";i:4;s:16:\"user.permissions\";i:5;s:20:\"user.roles:anonymous\";i:6;s:24:\"user.roles:authenticated\";}s:4:\"tags\";a:4:{i:0;s:18:\"config:system.site\";i:1;s:8:\"node:377\";i:2;s:9:\"node_view\";i:3;s:6:\"user:1\";}s:7:\"max-age\";i:-1;s:3:\"bin\";s:6:\"render\";}}',-1,1511339454.360,1,'config:system.site node:377 node_view rendered user:1','267'),('entity_view:node:377:search_result:[languages:language_interface]=en:[theme]=yaffs:[url.path.is_front]=is_front.0:[user.permissions]=aa7fc4c8fb40c7a8665ccd12fea07926dff0f59b9ee3346bc513c6399bee5b01','a:3:{s:7:\"#markup\";O:25:\"Drupal\\Core\\Render\\Markup\":1:{s:9:\"\0*\0string\";s:34:\"<span>YAFFS - Block states</span>\n\";}s:9:\"#attached\";a:0:{}s:6:\"#cache\";a:3:{s:8:\"contexts\";a:4:{i:0;s:28:\"languages:language_interface\";i:1;s:5:\"theme\";i:2;s:17:\"url.path.is_front\";i:3;s:16:\"user.permissions\";}s:4:\"tags\";a:2:{i:0;s:8:\"node:377\";i:1;s:9:\"node_view\";}s:7:\"max-age\";i:-1;}}',-1,1512113328.834,1,'node:377 node_view rendered','254'),('entity_view:node:377:search_result:[languages:language_interface]=en:[theme]=yaffs:[user.permissions]=aa7fc4c8fb40c7a8665ccd12fea07926dff0f59b9ee3346bc513c6399bee5b01','a:2:{s:15:\"#cache_redirect\";b:1;s:6:\"#cache\";a:5:{s:4:\"keys\";a:4:{i:0;s:11:\"entity_view\";i:1;s:4:\"node\";i:2;s:3:\"377\";i:3;s:13:\"search_result\";}s:8:\"contexts\";a:4:{i:0;s:28:\"languages:language_interface\";i:1;s:5:\"theme\";i:2;s:17:\"url.path.is_front\";i:3;s:16:\"user.permissions\";}s:4:\"tags\";a:2:{i:0;s:8:\"node:377\";i:1;s:9:\"node_view\";}s:7:\"max-age\";i:-1;s:3:\"bin\";s:6:\"render\";}}',-1,1512113328.832,1,'node:377 node_view rendered','254'),('entity_view:node:377:teaser:[languages:language_interface]=en:[theme]=yaffs:[timezone]=Europe/London:[url.path.is_front]=is_front.0:[user.permissions]=aa7fc4c8fb40c7a8665ccd12fea07926dff0f59b9ee3346bc513c6399bee5b01','a:3:{s:7:\"#markup\";O:25:\"Drupal\\Core\\Render\\Markup\":1:{s:9:\"\0*\0string\";s:503:\"<article role=\"article\" about=\"/yaffs-block-states\" class=\"image is-promoted teaser clearfix\">\n\n  \n      <h2>\n      <a href=\"/yaffs-block-states\" rel=\"bookmark\"><span>YAFFS - Block states</span>\n</a>\n    </h2>\n    \n\n  \n  <div class=\"content\">\n    <ul class=\"links inline list-inline\"><li class=\"node-readmore\"><a href=\"/yaffs-block-states\" rel=\"tag\" title=\"YAFFS - Block states\" hreflang=\"und\">Read more<span class=\"visually-hidden\"> about YAFFS - Block states</span></a></li></ul>\n  </div>\n\n</article>\n\";}s:9:\"#attached\";a:0:{}s:6:\"#cache\";a:3:{s:8:\"contexts\";a:5:{i:0;s:28:\"languages:language_interface\";i:1;s:5:\"theme\";i:2;s:8:\"timezone\";i:3;s:17:\"url.path.is_front\";i:4;s:16:\"user.permissions\";}s:4:\"tags\";a:3:{i:0;s:8:\"node:377\";i:1;s:9:\"node_view\";i:2;s:6:\"user:1\";}s:7:\"max-age\";i:-1;}}',-1,1510674351.249,1,'node:377 node_view rendered user:1','261'),('entity_view:node:377:teaser:[languages:language_interface]=en:[theme]=yaffs:[user.permissions]=aa7fc4c8fb40c7a8665ccd12fea07926dff0f59b9ee3346bc513c6399bee5b01','a:2:{s:15:\"#cache_redirect\";b:1;s:6:\"#cache\";a:5:{s:4:\"keys\";a:4:{i:0;s:11:\"entity_view\";i:1;s:4:\"node\";i:2;s:3:\"377\";i:3;s:6:\"teaser\";}s:8:\"contexts\";a:5:{i:0;s:28:\"languages:language_interface\";i:1;s:5:\"theme\";i:2;s:8:\"timezone\";i:3;s:17:\"url.path.is_front\";i:4;s:16:\"user.permissions\";}s:4:\"tags\";a:3:{i:0;s:8:\"node:377\";i:1;s:9:\"node_view\";i:2;s:6:\"user:1\";}s:7:\"max-age\";i:-1;s:3:\"bin\";s:6:\"render\";}}',-1,1510674351.246,1,'node:377 node_view rendered user:1','261'),('entity_view:node:37:full:[languages:language_interface]=en:[theme]=yaffs:[timezone]=Europe/London:[url.path.is_front]=is_front.0:[user.permissions]=aa7fc4c8fb40c7a8665ccd12fea07926dff0f59b9ee3346bc513c6399bee5b018DCui2JOvzO-vVcmbFbSbtoR2WAcfA4lQtWBMJxuSH0','a:5:{s:7:\"#markup\";O:25:\"Drupal\\Core\\Render\\Markup\":1:{s:9:\"\0*\0string\";s:33144:\"<article role=\"article\" about=\"/archives/yaffs-original-specification\" typeof=\"schema:WebPage\" class=\"page is-sticky full clearfix\">\n\n  \n      <span property=\"schema:name\" content=\"Yaffs Original Specification\" class=\"hidden\"></span>\n\n\n  \n  <div class=\"content\">\n    \n            <div property=\"schema:text\" class=\"field field--name-body field--type-text-with-summary field--label-hidden field--item\"><p>YAFFS (Yet Another Flash File System)</p>\n\n<h4>Version 0.3</h4>\n\n<h4>Charles Manning (and Wookey), December 2001</h4>\n\n<p><br />\n </p>\n\n<h2>Revision History</h2>\n\n<p>V0.0 20/12/01 First Draft</p>\n\n<table><tr><td>\n			<p>V0.1</p>\n			</td>\n			<td>\n			<p>11/01/02</p>\n			</td>\n			<td>\n			<p>Minor corrections &amp; cosmetics.<br />\n			Change use of data status byte.</p>\n			</td>\n		</tr><tr><td>\n			<p>V0.2</p>\n			</td>\n			<td>\n			<p>28/01/02</p>\n			</td>\n			<td>\n			<p>Added observations about inodes, file headers and hard links.</p>\n			</td>\n		</tr><tr><td>\n			<p>V0.3</p>\n			</td>\n			<td>\n			<p>26/02/02</p>\n			</td>\n			<td>\n			<p>W:Added some general observations on compatibility, partitions and bootloading.</p>\n			</td>\n		</tr></table><p><br />\n </p>\n\n<h2>Scope</h2>\n\n<p>The purpose of this document is to outline a potential NAND-friendly file system for Linux.</p>\n\n<h2>Background</h2>\n\n<p>There are already various flash-file systems (FFSs) or block drivers for flash (on top of which a regular FS runs). There are pros and cons with all of these.</p>\n\n<p>Flash memory has quite a few constraints which will not be addressed here. Various approaches are available to work around these constraints to provide a file system. It is important to recognise that \"flash\" includes both NOR and NAND flash which have different sets of constraints. It is easy to be mislead by the generic term \"flash\" into thinking that approaches appropriate for NOR flash are immediately suitable for NAND flash.</p>\n\n<p>The NAND block drivers (eg. SmartMedia [currently not available for Linux] and DiskOnChip NFTL) typically use FAT16 as the file system. This isn\'t too robust and nor is it that flash-friendly. These block drivers provide a logical to physical mapping layer to emulate rewritable blocks that look like disk sectors. When used with FAT16, these file systems work reasonably well. They have a low memory footprint and scale well. Like all FAT based systems they are prone to corruption (\"lost clusters etc\").</p>\n\n<p>The other approach is to design an entire file system which does not work through a block driver layer and is flash-friendly. This allows more scope to work around issues.</p>\n\n<p>Currently, two Linux file systems that support NOR flash very well are JFFS and its derivative JFFS2. Both of these are based on the principles of journaling (hence the leading J) which significantly increases robustness - a particularly important feature in embedded systems. Unfortunately neither of these file systems scale particularly well in both boot time and RAM usage. Scaling is particularly relevant when one considers that a 16MB NOR array would be considered large while a 128MB NAND is available as a single chip.</p>\n\n<p>JFFS requires a RAM-based jffs_node structure for each journalling node in the flash. Each of these nodes is 48 bytes. JFFS2 makes a significant improvement here by reducing the equivalent structure (jffs2_raw_node_ref) to 16 bytes. Still, at say an average node-size of 512 bytes, a 128MB NAND might need 250000 of these ... 4MB!</p>\n\n<p>Both JFFS and JFFS2 require scanning the flash array at boot time to find the journaling nodes and determine the file structures. Since NAND is large, slow, serially accessed and needs ECC this does not scale well and will take an unacceptably long boot time for the target systems. As a thumb-suck, the scanning of a 128MB NAND array might take approx 25 seconds.</p>\n\n<p>The intentions of the design sketched here are:</p>\n\n<ul><li>\n	<p>Be NAND-flash friendly.</p>\n	</li>\n	<li>\n	<p>Robustness through journaling strategies.</p>\n	</li>\n	<li>\n	<p>Significantly reduce the RAM overheads and boot times associated with JFFSx.</p>\n	</li>\n</ul><p>This FS is intended primarily for internal NAND rather than removable NAND (SM cards). On removable SM cards Smartmedia compatibility is likely to be important so SM/FAT will normally be used, although of course YAFFS makes a lot of sense if reliability is more important than compatibility.</p>\n\n<h2>Overview</h2>\n\n<p>Here follows a simplified overview of YAFFS.</p>\n\n<p>YAFFS uses a physical flash format similar to SmartMedia. This is done for various reasons:</p>\n\n<ul><li>\n	<p>Some of the formatting, eg placement of bad block markers is determined by the NAND manufacturers and can\'t be changed.</p>\n	</li>\n	<li>\n	<p>Potential to reuse code.</p>\n	</li>\n	<li>\n	<p>If it ain\'t broke don\'t fix.</p>\n	</li>\n</ul><p>Some of the fields are obviously different to reflect the different usage. Despite the similarities YAFFS is not actually compatible with SM/FAT. SM cards need to be reformatted to switch from using SM/FAT to YAFFS or vice versa.</p>\n\n<p>File data is stored in fixed size \"chunks\" consistent with the size of a page (ie. 512 bytes). Each page is marked with a file id and chunk number. These tags are stored in the \"spare data\" region of the flash. The chunk number is determined by dividing the file position by the chunk size.</p>\n\n<p>When data in a file is overwritten, the relevant chunks are replaced by writing new pages to flash containing the new data but the same tags. The overwritten data is marked as \"discarded\".</p>\n\n<p>File \"headers\" are stored as a single page, marked so as to be differentiated from data pages.</p>\n\n<p>Pages are also marked with a short (2 bit) serial number that increments each time the page at this position is incremented. The reason for this is that if power loss/crash/other act of demonic forces happens before the replaced page is marked as discarded, it is possible to have two pages with the same tags. The serial number is used to arbitrate.</p>\n\n<p>A block containing only discarded pages (termed a <em>dirty block</em>) is an obvious candidate for garbage collection. Otherwise valid pages can be copied off a block thus rendering the whole block discarded and ready for garbage collection.</p>\n\n<p>In theory you don\'t need to hold the file structure in RAM... you could just scan the whole flash looking for pages when you need them. In practice though you\'d want better file access times than that! The mechanism proposed here is to have a list of __u16 page addresses associated with each file. Since there are 218 pages in a 128MB NAND, a __u16 is insufficient to uniquely identify a page but is does identify a group of 4 pages - a small enough region to search exhaustively. This mechanism is clearly expandable to larger NAND devices - within reason. The RAM overhead with this approach is approx 2 bytes per page - 512kB of RAM for a whole 128MB NAND.</p>\n\n<p>Boot-time scanning to build the file structure lists should require just one pass reading NAND. Since only the the spare data needs to be read, this should be relatively fast ( approx 3 seconds for 128MB). Improvements can be achieved by partitioning the NAND. ie. mount the critical partition first then mount the data partition afterwards.</p>\n\n<p>Various runtime improvements can be achieved by changing the \"chunk size\" to 1024 bytes or more. However this would likely reduce flash efficiency. As always, life is a compromise....</p>\n\n<p><br />\n </p>\n\n<h3>Spare area details</h3>\n\n<p>The following table summarizes the layout of the spare area of each page.</p>\n\n<p>Byte #SmartMedia usageYAFFS usage</p>\n\n<table><tr><td>\n			<p>0..511</p>\n			</td>\n			<td>\n			<p>Data</p>\n			</td>\n			<td>\n			<p>Data. either file data or file header depending on tags</p>\n			</td>\n		</tr><tr><td>\n			<p>512..515</p>\n			</td>\n			<td>\n			<p>Reserved</p>\n			</td>\n			<td>\n			<p>Tags</p>\n			</td>\n		</tr><tr><td>\n			<p>516</p>\n			</td>\n			<td>\n			<p>Data status byte. Not used in SM code from Samsung</p>\n			</td>\n			<td>\n			<p>Data status byte. If more than 4 bits are zero, then this page is discarded.</p>\n			</td>\n		</tr><tr><td>\n			<p>517</p>\n			</td>\n			<td>\n			<p>Block status byte</p>\n			</td>\n			<td>\n			<p>Block status byte</p>\n			</td>\n		</tr><tr><td>\n			<p>518..519</p>\n			</td>\n			<td>\n			<p>Block address</p>\n			</td>\n			<td>\n			<p>Tags</p>\n			</td>\n		</tr><tr><td>\n			<p>520..522</p>\n			</td>\n			<td>\n			<p>ECC on second 256 bytes part of data</p>\n			</td>\n			<td>\n			<p>ECC on second 256 bytes of data</p>\n			</td>\n		</tr><tr><td>\n			<p>523..524</p>\n			</td>\n			<td>\n			<p>Block address</p>\n			</td>\n			<td>\n			<p>Tags</p>\n			</td>\n		</tr><tr><td>\n			<p>525..527</p>\n			</td>\n			<td>\n			<p>ECC on first 256 bytes part of data</p>\n			</td>\n			<td>\n			<p>ECC on first 256 bytes part of data</p>\n			</td>\n		</tr></table><p><br />\n </p>\n\n<p>The block status is a reserved value that shows whether the block is damaged.</p>\n\n<p>The data status tracks whether the page is valid. If less than 4 bits are zero, then the page is valid otherwise it is discarded.</p>\n\n<p>There are 8 bytes (64 bits) for use by YAFFS tags. This is partitioned as follows:</p>\n\n<p>Number of bitsUsage</p>\n\n<table><tr><td>\n			<p>18</p>\n			</td>\n			<td>\n			<p>18-bit file id. ie. Limit of 218 (over 260000) files. File id 0 is not valid and indicates a deleted page. File Id 0x3FFFF i is also not valid.</p>\n			</td>\n		</tr><tr><td>\n			<p>2</p>\n			</td>\n			<td>\n			<p>2-bit serial number.</p>\n			</td>\n		</tr><tr><td>\n			<p>20</p>\n			</td>\n			<td>\n			<p>20-bit page id within file. Limit of 220 pages per file. ie. over 500MB file max size. Page id 0 means the file header for this file.</p>\n			</td>\n		</tr><tr><td>\n			<p>10</p>\n			</td>\n			<td>\n			<p>10-bit counter of the number of bytes used in the page.</p>\n			</td>\n		</tr><tr><td>\n			<p>12</p>\n			</td>\n			<td>\n			<p>12-bit ECC on tags.</p>\n			</td>\n		</tr><tr><td>\n			<p>2</p>\n			</td>\n			<td>\n			<p>Unused. Keep as 1.</p>\n			</td>\n		</tr><tr><td>\n			<p><strong>64</strong></p>\n			</td>\n			<td>\n			<p><strong>Total</strong></p>\n			</td>\n		</tr></table><p><br />\n </p>\n\n<p>A bit of explanation on the usage of some of these fields:</p>\n\n<p>file Id is synonymous with inode.</p>\n\n<p>The serial number is incremented each time a page with the same file_id:page_id is rewritten (because of data changes or copy during garbage collection). When a page is replaced, there is a brief period during which there are two pages with the same id. The serial number resolves this. Since there should never be a difference of less than more than one, a two-bit counter is sufficient to determine which is the current page.</p>\n\n<p>When the page is rewritten, the file id, these data status byte and the 12-bit ECC are all written to zero.</p>\n\n<p>The byte counter indicates how many bytes are valid in this page. Since the page would not exist if it contains zero bytes, this field should thus hold 512 for all pages except the last page in the file. The use of counters means that the file length integrity is preserved while the file is open without having to constantly update the file length in the file header. The file header only needs to be refreshed when the file is closed (rather than whenever it is appended to). This field is wide enough to allow expansion to 1024-byte \"chunks\".</p>\n\n<p>File \"headers\" come in two flavours:</p>\n\n<ul><li>\n	<p>file info ( the mode, ower id, group id, length,...)</p>\n	</li>\n	<li>\n	<p>the hard link(s) that refers to the file.</p>\n	</li>\n</ul><p>A directory also appears as a file (ie. has an inode and hard link(s)) but has no data.</p>\n\n<p>The 12-bit ECC applies to only the tag data uses a similar algorithm to the 22-bit ECCs used for file system data. They are kept independent.</p>\n\n<h3>RAM data details</h3>\n\n<p>Block management details are reasonably obvious and, I feel, don\'t need to be addressed here apart from stating that there will be a structure to track block status (eg. number of pages in use, failed blocks, and which are candidates for garbage collection etc).</p>\n\n<p>The files need an indexing structure of sorts to locate and track the pages in the file. Some sort of tree structure should work rather well. The look-up needs to be quite efficient in both CPU time and space.</p>\n\n<h3>Page allocation and garbage collection</h3>\n\n<p>Pages are allocated sequentially from the currently selected block. When all the pages in the block are filled, another clean block is selected for allocation. At least two or three clean blocks are reserved for garbage collection purposes. If there are insufficient clean blocks available, then a dirty block ( ie one containing only discarded pages) is erased to free it up as a clean block. If no dirty blocks are available, then the dirtiest block is selected for garbage collection.</p>\n\n<p>Garbage collection is performed by copying the valid data pages into new data pages thus rendering all the pages in this block dirty and freeing it up for erasure. I also like the idea of selecting a block at random some small percentage of the time - thus reducing the chance of wear differences.</p>\n\n<p>Relative to NOR, NAND writes and erases very fast. Therefore garbage collection might be performed on-demand (eg. during a write) without significant degradation in performance. Alternatively garbage collection might be delegated to a kernel tasklet.</p>\n\n<p>Relative to JFFSx, the garbage collection presented here is incredibly simple - thanks mainly to the use of fixed-size pages instead of journaling nodes.</p>\n\n<h3>Flash writing</h3>\n\n<p>As presented here, YAFFS only writes to the page\'s data area once and to the spare area twice (once when new page is written and once when it gets stomped on) before an erasure. This is within the limits of the most restrictive NAND flashes.</p>\n\n<h3>Wear levelling</h3>\n\n<p>No wear levelling is explicitly used here. Instead we rely on two \"strategies\":</p>\n\n<ul><li>\n	<p>Reserving some blocks to cater for failure. You need to do this anyway with NAND. The main purpose behind wear levelling is to prevent some blocks getting more wear and failing. Since we expect, and handle, failure this is no longer as important.</p>\n	</li>\n	<li>\n	<p>The infrequent random block selection should prevent low-wear blocks getting \"stuck\".</p>\n	</li>\n</ul><h3>Partitioning</h3>\n\n<p>Partitioning is not included in this spec, but could be added if required.</p>\n\n<h3>Bootloading</h3>\n\n<p>Bootloaders cannot just read files direct from NAND due to the high probability of bad blocks. Because YAFFS is quite simple it will be relatively straightforward for bootloaders to read from it (eg reading a kernel).</p>\n\n<h3>Conclusion</h3>\n\n<p>YAFFS is very simple. It is also NAND-friendly, is relatively frugal with resources (especially RAM) and boots quickly. Like JFFSx it has journaling which makes it far more robust than FAT.</p>\n\n<p>While it might seem high-risk to develop YAFFS, it is probably about the same amount of effort as implementing changes to JFFS to get it to work effectively within the constraints of NAND. A resulting JFFSx system would still require significant amounts of RAM and have long boot times.</p>\n\n<p>While YAFFS is indeed a new file system internally, much of the file system glue code (including inode management, link management etc) can likely be stolen from JFFSx.</p>\n\n<p> </p>\n\n<p>YAFFS Development Notes</p>\n\n<h3>Build options</h3>\n\n<p>Yaffs can be built as either a kernel module (ie. a Linux file system) or as an application.</p>\n\n<p>Of course the goal is to build yaffs as a file system running on top of real NAND flash, but yaffs can be built to run on a RAM emulation layer for in-kernel testing without NAND flash in the system.</p>\n\n<p>Building as an application allows the yaffs_guts algorithms to be tested/debugged in a more friendly debugging environment. The test harness is in yaffsdev.c</p>\n\n<h3>Trying it out</h3>\n\n<p>YAFFS can be built to run with either mtd or RAM emulation, or both. The file system that interfaces to mtd is called <strong>yaffs</strong>, the file system that uses internal ram is called <strong>yaffsram</strong>. YAFFS simultaneously supports both if they are enabled.</p>\n\n<ol><li>\n	<p>Hack the Makefile and change the KERNELDIR define to your kernel directory.</p>\n	</li>\n	<li>\n	<p>If you don\'t have mtd support in your kernel, then you might need to turn off USE_MTD otherwise the yaffs module might not load.</p>\n	</li>\n	<li>\n	<p>Type <strong>make clean; make</strong> to build yaffs</p>\n	</li>\n	<li>\n	<p>Load yaffs as a module by typing <strong>/sbin/insmod yaffs.o</strong> (ya gotta be root!).</p>\n	</li>\n	<li>\n	<p>Create a mount point eg. <strong>mkdir /mnt/y</strong></p>\n	</li>\n	<li>\n	<p>To mount the RAM emulation version of yaffs, <strong>mount -t yaffsram none /mnt/y</strong></p>\n	</li>\n	<li>\n	<p>Alternatively, to mount the mtd version of yaffs,<strong> mount -t yaffs /dev/mtd0 /mnt/y</strong></p>\n	</li>\n</ol><p><br />\n </p>\n\n<h3>YAFFS Data structures</h3>\n\n<p>All data types are defined in yaffs_guts.h</p>\n\n<p>Yaffs uses the following major objects:</p>\n\n<ul><li>\n	<p>yaffs_Object: A yaffs_Object can be a file, directory, symlink or hardlink. The yaffs_Objects \"know\" about their corresponding yaffs_ObjectHeader in NAND and the data for that object. yaffs_Objects also bind together the directory structure as follows:</p>\n	</li>\n	<li>\n	<p>parent: pointer to the yaffs_Object that is a parent of this yaffs_Object in the directory structure.</p>\n	</li>\n	<li>\n	<p>siblings: this field is used to link together a list of all the yaffs_Objects in the same directory.</p>\n	</li>\n	<li>\n	<p>children: if the object is a directory, then children holds the head of the list of objects in the directory.</p>\n	</li>\n	<li>\n	<p>yaffs_Tnode: yaffs_Tnodes form a tree structure that speeds up the search for data chunks in a file. As the file grows in size, the levels increase. The Tnodes are a constant size (32 bytes). Level 0 (ie the lowest level) comprise 16 2-byte entries giving an index used to search for the chunkId. Tnodes at other levels comprise 8 4-byte pointer entries to other tnodes lower in the tree.</p>\n	</li>\n	<li>\n	<p>yaffs_Device: this holds the device context and is in some ways analogous to the VFS superblock. It stores the data used to access the mtd as well as function pointers to access the NAND data.</p>\n	</li>\n</ul><p>The Tnodes and Objects are allocated in groups to reduce memory allocation/freeing overheads. Freed up tnodes and objects are kept in a free list and re-used.</p>\n\n<h3>yaffs_Object</h3>\n\n<p><br />\n </p>\n\n<p>struct yaffs_ObjectStruct</p>\n\n<p>{</p>\n\n<p>__u8 fake:1; // A fake object has no presence on NAND.</p>\n\n<p>__u8 renameAllowed:1; // Are we allowed to rename it?</p>\n\n<p>__u8 unlinkAllowed:1; // Are we allowed to unlink it?</p>\n\n<p>__u8 dirty:1; // the object needs to be written to flash</p>\n\n<p>__u8 valid:1; // When the file system is being loaded up, this</p>\n\n<p>// object might be created before the data</p>\n\n<p>// is available (ie. file data records appear before the header).</p>\n\n<p>__u8 serial; // serial number of chunk in NAND. Store here so we don\'t have to</p>\n\n<p>// read back the old one to update.</p>\n\n<p>__u16 sum; // sum of the name to speed searching</p>\n\n<p> </p>\n\n<p>struct yaffs_DeviceStruct *myDev; // The device I\'m on</p>\n\n<p> </p>\n\n<p> </p>\n\n<p>struct list_head hashLink; // list of objects in this hash bucket</p>\n\n<p> </p>\n\n<p> </p>\n\n<p>struct list_head hardLinks; // all the equivalent hard linked objects</p>\n\n<p>// live on this list</p>\n\n<p>// directory structure stuff</p>\n\n<p>struct yaffs_ObjectStruct *parent; //my parent directory</p>\n\n<p>struct list_head siblings; // siblings in a directory</p>\n\n<p>// also used for linking up the free list</p>\n\n<p> </p>\n\n<p>// Where\'s my data in NAND?</p>\n\n<p>int chunkId; // where it lives</p>\n\n<p> </p>\n\n<p>__u32 objectId; // the object id value</p>\n\n<p> </p>\n\n<p> </p>\n\n<p>__u32 st_mode; // protection</p>\n\n<p>__u32 st_uid; // user ID of owner</p>\n\n<p>__u32 st_gid; // group ID of owner</p>\n\n<p>__u32 st_atime; // time of last access</p>\n\n<p>__u32 st_mtime; // time of last modification</p>\n\n<p>__u32 st_ctime; // time of last change</p>\n\n<p> </p>\n\n<p> </p>\n\n<p>yaffs_ObjectType variantType;</p>\n\n<p> </p>\n\n<p>yaffs_ObjectVariant variant;</p>\n\n<p> </p>\n\n<p>};</p>\n\n<p><br />\n </p>\n\n<p>Obvious stuff skipped....</p>\n\n<p>fake, renameAllowed, unlinkAllowed are special flags for handling \"fake\" objects which live in the file system but do not live on NAND. Currently there are only two such objects: the root object and the lost+found directory. None of these may be renamed or unlinked.</p>\n\n<p>serial, sum: see yaffs_ObjectHeader.</p>\n\n<p>dirty indicates that the object\'s contents has changed and a new yaffs_ObjectHeader must be written to flash.</p>\n\n<p>valid indicates that the object has been loaded up. This is only used during scanning (yaffs_Scan()) since we can know of an object\'s existance - and thus need to create the object header - before we encounter the associated yaffs_ObjectHeader.</p>\n\n<p>hashlink is a list of Objects in the same hash bucket.</p>\n\n<p>The four variants hold extra info:</p>\n\n<p>Files hold the file size and the top level and pointer to the tnode tree for the file.</p>\n\n<p>Directories hold a list of children objects.</p>\n\n<p>Symlinks hold a pointer to the alias string. This is probably inefficient, but that probably does not matter since we don\'t expect to see many of these.</p>\n\n<p>Hardlinks hold information to identify the equivalent object.</p>\n\n<p><br />\n </p>\n\n<p><br />\n </p>\n\n<h3>File structure (tnodes)</h3>\n\n<p>File structures are done with a tiered indexing structure</p>\n\n<p><br />\n </p>\n\n<p><img alt=\"\" height=\"294\" src=\"yaffs/sv9349341.gif\" width=\"491\" /><br /><br />\n </p>\n\n<p>The file structure is maintained by a tree structure. Depending where it is in the tree, each tree node (<strong><em>tnode</em></strong>) (the blue/things) holds either:</p>\n\n<ul><li>\n	<p>.... if it is at the lowest level, then 16 __u16s which identify the page.</p>\n	</li>\n	<li>\n	<p>.... if it is at a higher level (ie an internal tnode), then 8 pointers to lowest-level tnodes.</p>\n	</li>\n</ul><p>When the file starts out, it is assigned only one low-level tnode. When the file expands past what a single tnode can hold, then it is assigned a second tnode and an internal node is added to point to the two tnodes. As the file grows, more low-level tnodes and high level tnodes are added.</p>\n\n<p>Traversing the tnode tree to find a particular page in a file is quite simple: each internal tnode is selected from by using 3 bits of the page offset in the file. The level 0 page resolves 4 bits.</p>\n\n<p>For example, finding page 0x235 (ie. the one starting at file position 0x46800 would proceed as follows:</p>\n\n<p>0x235 is 0000001000110101, partitioned as follows. 000.000.100.011.0101</p>\n\n<p>LevelBitsSelected value</p>\n\n<table><tr><td>\n			<p>3 or more if they exist</p>\n			</td>\n			<td>\n			<p>&gt;= 10</p>\n			</td>\n			<td>\n			<p>Zero</p>\n			</td>\n		</tr><tr><td>\n			<p>2</p>\n			</td>\n			<td>\n			<p>9 to 7</p>\n			</td>\n			<td>\n			<p>100 binary = 4</p>\n			</td>\n		</tr><tr><td>\n			<p>1</p>\n			</td>\n			<td>\n			<p>6 to 4</p>\n			</td>\n			<td>\n			<p>011 binary = 3</p>\n			</td>\n		</tr><tr><td>\n			<p>0</p>\n			</td>\n			<td>\n			<p>3 to 0</p>\n			</td>\n			<td>\n			<p>0101 binary = 5</p>\n			</td>\n		</tr></table><p><br />\n </p>\n\n<p>Free tnodes are stored in a list. When the list is exhausted, more are allocated.</p>\n\n<p>Each tnode takes 32 bytes. Each file needs at least one level 0 tnode. How many do we need? A full 16MB file system needs at least 16MB/512/16 = 2000 level zero tnodes. More for internal tnodes. More for files smaller than optimal.</p>\n\n<p>The tree grows as required. When the file is resized to a smaller size then it is pruned.</p>\n\n<p><br />\n </p>\n\n<h3>NAND data</h3>\n\n<p>Data is stored on NAND in \"chunks\". Currently each chunk is the same size as a NAND flash page (ie. 512 bytes + 16 byte spare). In the future we might decide to allow for different chunk sizes. Chunks can hold either:</p>\n\n<ul><li>\n	<p>A yaffs_ObjectHeader. This is the way a yaffs_Object gets stored on NAND.</p>\n	</li>\n	<li>\n	<p>A chunk of file data.</p>\n	</li>\n</ul><p>The 16 byte spare area contains:</p>\n\n<ul><li>\n	<p>8 bytes of tags,</p>\n	</li>\n	<li>\n	<p>6 bytes of ECC data</p>\n	</li>\n	<li>\n	<p>1 byte block status (used to identify damaged blocks)</p>\n	</li>\n	<li>\n	<p>1 byte data status (currently unused).</p>\n	</li>\n</ul><p>The tags are made up as follows:</p>\n\n<p>typedef struct</p>\n\n<p>{</p>\n\n<p>unsigned chunkId:20; //chunk number in file</p>\n\n<p>unsigned serialNumber:2; //serial number for chunk</p>\n\n<p>unsigned byteCount:10; //number of bytes of data used in this chunk</p>\n\n<p>unsigned objectId:18; //the object id that this chunk belongs to.</p>\n\n<p>unsigned ecc:12; //ECC on tags</p>\n\n<p>unsigned unusedStuff:2; //unused</p>\n\n<p>} yaffs_Tags;</p>\n\n<p> </p>\n\n<p>A chunkId of zero indicates that this chunk holds a yaffs_ObjectHeader. A non zero value indicates that this is a data chunk and the position of the chunk in the file (ie. the first chunk - at offset 0 - has chunkId 1). See yaffs_guts.c:yaffs_Scan () to see how this is done.</p>\n\n<p>When a chunk is replaced (eg. file details changed or a part of a file was overwritten), the new chunk is written before the old chunk is deleted. This means that we don\'t lose data if there is a power loss after the new chunk is created but before the old one is discarded, but it does mean that we can encounter the situation where we find both the old and the new chunks in flash. The serialNumber is incremented each time the chunk is written. 2 bits is sufficient to resolve any ambiguity.</p>\n\n<p>bytecount applies only to data chunks and tells how many of the data bytes are valid.</p>\n\n<p>objectId says which object this chunk belongs to.</p>\n\n<p>ecc is used to perform error correction on the tags. Another ecc field is used to error correct the data.</p>\n\n<p><br />\n </p>\n\n<h3>yaffs_ObjectHeader</h3>\n\n<p>typedef struct</p>\n\n<p>{</p>\n\n<p>yaffs_ObjectType type;</p>\n\n<p> </p>\n\n<p>// Apply to everything</p>\n\n<p>int parentObjectId;</p>\n\n<p>__u16 sum; // checksum of name</p>\n\n<p>char name[YAFFS_MAX_NAME_LENGTH + 1];</p>\n\n<p> </p>\n\n<p>// Thes following apply to directories, files, symlinks - not hard links</p>\n\n<p>__u32 st_mode; // protection</p>\n\n<p>__u32 st_uid; // user ID of owner</p>\n\n<p>__u32 st_gid; // group ID of owner</p>\n\n<p>__u32 st_atime; // time of last access</p>\n\n<p>__u32 st_mtime; // time of last modification</p>\n\n<p>__u32 st_ctime; // time of last change</p>\n\n<p> </p>\n\n<p>// File size applies to files only</p>\n\n<p>int fileSize;</p>\n\n<p> </p>\n\n<p>// Equivalent object id applies to hard links only.</p>\n\n<p>int equivalentObjectId;</p>\n\n<p>// alias only applies to symlinks</p>\n\n<p>char alias[YAFFS_MAX_ALIAS_LENGTH + 1];</p>\n\n<p> </p>\n\n<p> </p>\n\n<p>} yaffs_ObjectHeader;</p>\n\n<p> </p>\n\n<p>A yaffs_ObjectHeader is stored in NAND for every yaffs_Object.</p>\n\n<p>type holds the type of yaffs_Object (file,directory,hardlink or symlink).</p>\n\n<p>parentObject is the objectId of this object\'s parent. name holds the object\'s name. Together these form the directory structure of the file system. Also worth mention is sum. This is a \"checksum\" on the name which speeds directory searching (ie. when searching the directory we only compare the name for those entries where sum matches).</p>\n\n<p>Obvious stuff skipped....</p>\n\n<p>equivalentObjectId is used by hardlinks. A hardlink to an object uses this field to specify the object that this links to. This way of doing things is a bit different than the normal Linux way of doing things (ie. keeping the links distinct from the inode) but is simpler and uses less space except for a few corner cases with hardlinks.</p>\n\n<p>alias is used by symlinks to hold the symlink alias string. This limits the size of the symlink alias. In future we should expand YAFFS to use data chunks to store aliases too long to fit into the yaffs_ObjectHeader.</p>\n\n<p><br />\n </p>\n\n<h3>NAND Interface</h3>\n\n<p>All NAND access is performed via four functions pointed to by yaffs_Device. At the moment a chunk is a page.</p>\n\n<ul><li>\n	<p>int WriteChunkToNAND(struct yaffs_DeviceStruct *dev,int chunkInNAND, const __u8 *data, yaffs_Spare *spare)</p>\n	</li>\n	<li>\n	<p>int ReadChunkFromNAND(struct yaffs_DeviceStruct *dev,int chunkInNAND, __u8 *data, yaffs_Spare *spare);</p>\n	</li>\n	<li>\n	<p>int EraseBlockInNAND(struct yaffs_DeviceStruct *dev,int blockInNAND);</p>\n	</li>\n	<li>\n	<p>int InitialiseNAND(struct yaffs_DeviceStruct *dev);</p>\n	</li>\n</ul><p>In the Readxxx and Writexxx functions, the data and/or spare pointers may be NULL in which case these data transfers are ignored.</p>\n\n<p>A quick note about NAND:</p>\n\n<ul><li>\n	<p>NAND is not random access, but page oriented. Thus, we do all reads &amp; writes in pages.</p>\n	</li>\n	<li>\n	<p>Each NAND page holds 512 bytes of data and 16 \"spare\" bytes. Yaffs structures the spare area with tags used to identify what is stored in the data area. There are 32 such pages to a block.</p>\n	</li>\n	<li>\n	<p>NAND writes will only change 1 bits to 0. eg. if a byte holds 10110011 and you write 11011010 to it you will get the logical and of the two values: 10010010. The only way to get 1s again is to erase the entire block.</p>\n	</li>\n	<li>\n	<p>You may only write to a page a few times before erasing the entire block. Yaffs lives within these limitations. Each page only gets written to twice (once when written and once when discarded).</p>\n	</li>\n	<li>\n	<p>ECC is normally used with NAND to correct for single bit errors. YAFFS applies the ECC itself, so the MTD should not do this.</p>\n	</li>\n	<li>\n	<p>The current mtd interfaces are not particularly well suited to YAFFS and we will address the issue with the mtd group. (The mtd interface does not support page-oriented read/write which YAFFS would prefer).</p>\n	</li>\n</ul><p><br />\n </p>\n\n<h3>mkyaffs</h3>\n\n<p>mkyaffs is the tool to format a NAND mtd to be used for YAFFS. This is quite simple, just erase all the undamaged blocks. YAFFS treats erased blocks as free (empty) space.</p>\n\n<p><br />\n </p>\n\n<h2>Expected performance</h2>\n\n<p>The following numbers should give an indication of the performance we should expect from YAFFS.</p>\n\n<p>As an example, I\'ll use the following numbers. Since the hardware is capable of 50ns read/write, these numbers allow for some other ovberheads. Clearly though, the performance can be degraded in various ways.</p>\n\n<p>Seek10uS/page</p>\n\n<table><tr><td>\n			<p>Read</p>\n			</td>\n			<td>\n			<p>100nS/byte</p>\n			</td>\n		</tr><tr><td>\n			<p>Write</p>\n			</td>\n			<td>\n			<p>100nS/byte</p>\n			</td>\n		</tr><tr><td>\n			<p>Program</p>\n			</td>\n			<td>\n			<p>200uS/page</p>\n			</td>\n		</tr><tr><td>\n			<p>Erase</p>\n			</td>\n			<td>\n			<p>2mS/block</p>\n			</td>\n		</tr></table><p><br />\n </p>\n\n<p>From this we can derive some higher-level numbers:</p>\n\n<p>OperationTimeCalculation</p>\n\n<table><tr><td>\n			<p>Read spare</p>\n			</td>\n			<td>\n			<p>12uS</p>\n			</td>\n			<td>\n			<p>seek + 16 * read</p>\n			</td>\n		</tr><tr><td>\n			<p>Read page</p>\n			</td>\n			<td>\n			<p>63 uS</p>\n			</td>\n			<td>\n			<p>seek + 528 * read</p>\n			</td>\n		</tr><tr><td>\n			<p>Write page</p>\n			</td>\n			<td>\n			<p>326 uS</p>\n			</td>\n			<td>\n			<p>seek + 528 * write + program + read page (for verification)</p>\n			</td>\n		</tr><tr><td>\n			<p>Discard page</p>\n			</td>\n			<td>\n			<p>212 uS</p>\n			</td>\n			<td>\n			<p>seek + 16 * write + program</p>\n			</td>\n		</tr><tr><td>\n			<p>Overwrite page</p>\n			</td>\n			<td>\n			<p>538 uS</p>\n			</td>\n			<td>\n			<p>write page + discard page</p>\n			</td>\n		</tr><tr><td>\n			<p>Erase overhead per page</p>\n			</td>\n			<td>\n			<p>63uS</p>\n			</td>\n			<td>\n			<p>erase/32</p>\n			</td>\n		</tr></table><p><br />\n </p>\n\n<p>From this we can infer the following flash access times:</p>\n\n<p>OperationTimeCalculation</p>\n\n<table><tr><td>\n			<p>Read 1MB file</p>\n			</td>\n			<td>\n			<p>0.13s (about 7.5 MB/s)</p>\n			</td>\n			<td>\n			<p>2000 * read page</p>\n			</td>\n		</tr><tr><td>\n			<p>Write 1MB (clean system)</p>\n			</td>\n			<td>\n			<p>0.53s (about 1.8 MB/s)</p>\n			</td>\n			<td>\n			<p>2000 * write page</p>\n			</td>\n		</tr><tr><td>\n			<p>Overwrite 1MB file (no gc)</p>\n			</td>\n			<td>\n			<p>1.08s (about 0.9MB/s)</p>\n			</td>\n			<td>\n			<p>2000 * overwrite page</p>\n			</td>\n		</tr><tr><td>\n			<p>Overwrite 1MB with 50% gc</p>\n			</td>\n			<td>\n			<p>2.4s (about 0.4 MB/s)</p>\n			</td>\n			<td>\n			<p>2000 * overwrite page + 2000 * page copy (== overwrite page) + 4000 * erase overhead</p>\n			</td>\n		</tr><tr><td>\n			<p>Delete 1MB file</p>\n			</td>\n			<td>\n			<p>0.43s (about 2.2 MB/s)</p>\n			</td>\n			<td>\n			<p>2000 * discard page</p>\n			</td>\n		</tr><tr><td>\n			<p>Delete 1MB file with 50% gc</p>\n			</td>\n			<td>\n			<p>0.49s (about 2.0MB/s)</p>\n			</td>\n			<td>\n			<p>2000 * discard page + 1000 * erase overhead</p>\n			</td>\n		</tr></table><p> </p></div>\n      \n  </div>\n\n</article>\n\";}s:9:\"#attached\";a:1:{s:14:\"html_head_link\";a:3:{i:0;a:2:{i:0;a:2:{s:3:\"rel\";s:9:\"canonical\";s:4:\"href\";s:38:\"/archives/yaffs-original-specification\";}i:1;b:1;}i:1;a:2:{i:0;a:2:{s:3:\"rel\";s:9:\"shortlink\";s:4:\"href\";s:8:\"/node/37\";}i:1;b:1;}i:2;a:2:{i:0;a:2:{s:3:\"rel\";s:8:\"revision\";s:4:\"href\";s:38:\"/archives/yaffs-original-specification\";}i:1;b:1;}}}s:6:\"#cache\";a:3:{s:8:\"contexts\";a:7:{i:0;s:28:\"languages:language_interface\";i:1;s:5:\"theme\";i:2;s:8:\"timezone\";i:3;s:17:\"url.path.is_front\";i:4;s:16:\"user.permissions\";i:5;s:20:\"user.roles:anonymous\";i:6;s:24:\"user.roles:authenticated\";}s:4:\"tags\";a:5:{i:0;s:31:\"config:filter.format.basic_html\";i:1;s:18:\"config:system.site\";i:2;s:7:\"node:37\";i:3;s:9:\"node_view\";i:4;s:6:\"user:1\";}s:7:\"max-age\";i:-1;}s:17:\"#cache_properties\";a:1:{i:0;s:6:\"#title\";}s:6:\"#title\";O:25:\"Drupal\\Core\\Render\\Markup\":1:{s:9:\"\0*\0string\";s:65:\"<span property=\"schema:name\">Yaffs Original Specification</span>\n\";}}',-1,1510655169.915,1,'config:filter.format.basic_html config:system.site node:37 node_view rendered user:1','278'),('entity_view:node:37:full:[languages:language_interface]=en:[theme]=yaffs:[user.permissions]=aa7fc4c8fb40c7a8665ccd12fea07926dff0f59b9ee3346bc513c6399bee5b01:[user.roles:anonymous]=0','a:2:{s:15:\"#cache_redirect\";b:1;s:6:\"#cache\";a:5:{s:4:\"keys\";a:4:{i:0;s:11:\"entity_view\";i:1;s:4:\"node\";i:2;s:2:\"37\";i:3;s:4:\"full\";}s:8:\"contexts\";a:7:{i:0;s:28:\"languages:language_interface\";i:1;s:5:\"theme\";i:2;s:8:\"timezone\";i:3;s:17:\"url.path.is_front\";i:4;s:16:\"user.permissions\";i:5;s:20:\"user.roles:anonymous\";i:6;s:24:\"user.roles:authenticated\";}s:4:\"tags\";a:5:{i:0;s:31:\"config:filter.format.basic_html\";i:1;s:18:\"config:system.site\";i:2;s:7:\"node:37\";i:3;s:9:\"node_view\";i:4;s:6:\"user:1\";}s:7:\"max-age\";i:-1;s:3:\"bin\";s:6:\"render\";}}',-1,1510655169.895,1,'config:filter.format.basic_html config:system.site node:37 node_view rendered user:1','278');



INSERT INTO `cache_render` VALUES ('https://yaffs.net/?author=13:html','O:31:\"Drupal\\Core\\Render\\HtmlResponse\":8:{s:7:\"headers\";O:50:\"Symfony\\Component\\HttpFoundation\\ResponseHeaderBag\":5:{s:23:\"\0*\0computedCacheControl\";a:2:{s:7:\"max-age\";s:3:\"300\";s:6:\"public\";b:1;}s:10:\"\0*\0cookies\";a:0:{}s:14:\"\0*\0headerNames\";a:14:{s:12:\"content-type\";s:12:\"Content-Type\";s:13:\"cache-control\";s:13:\"Cache-Control\";s:4:\"date\";s:4:\"Date\";s:22:\"x-drupal-dynamic-cache\";s:22:\"X-Drupal-Dynamic-Cache\";s:4:\"link\";s:4:\"Link\";s:15:\"x-ua-compatible\";s:15:\"X-UA-Compatible\";s:16:\"content-language\";s:16:\"Content-language\";s:22:\"x-content-type-options\";s:22:\"X-Content-Type-Options\";s:15:\"x-frame-options\";s:15:\"X-Frame-Options\";s:7:\"expires\";s:7:\"Expires\";s:13:\"last-modified\";s:13:\"Last-Modified\";s:4:\"etag\";s:4:\"ETag\";s:4:\"vary\";s:4:\"Vary\";s:11:\"x-generator\";s:11:\"X-Generator\";}s:10:\"\0*\0headers\";a:14:{s:12:\"content-type\";a:1:{i:0;s:24:\"text/html; charset=UTF-8\";}s:13:\"cache-control\";a:1:{i:0;s:19:\"max-age=300, public\";}s:4:\"date\";a:1:{i:0;s:29:\"Fri, 09 Feb 2018 06:19:27 GMT\";}s:22:\"x-drupal-dynamic-cache\";a:1:{i:0;s:4:\"MISS\";}s:4:\"link\";a:4:{i:0;s:23:\"</home>; rel=\"revision\"\";i:1;s:108:\"</sites/default/files/css/css_Ft-hGawuooABKJanSezg8PXovgOMbB_QLx9CIyXeHsA.css?ozekku>; rel=preload; as=style\";i:2;s:108:\"</sites/default/files/css/css_6qeLA6GBkZNPHWp9GdQIYovV3tYuKU-ts-HicZ-WeQQ.css?ozekku>; rel=preload; as=style\";i:3;s:99:\"</sites/default/files/js/js_2l0lF4i9o3aztHULbfajMT_RTqGCEN_lVC8JI48SILw.js>; rel=preload; as=script\";}s:15:\"x-ua-compatible\";a:1:{i:0;s:7:\"IE=edge\";}s:16:\"content-language\";a:1:{i:0;s:2:\"en\";}s:22:\"x-content-type-options\";a:1:{i:0;s:7:\"nosniff\";}s:15:\"x-frame-options\";a:1:{i:0;s:10:\"SAMEORIGIN\";}s:7:\"expires\";a:1:{i:0;s:29:\"Sun, 19 Nov 1978 05:00:00 GMT\";}s:13:\"last-modified\";a:1:{i:0;s:29:\"Fri, 09 Feb 2018 06:19:26 GMT\";}s:4:\"etag\";a:1:{i:0;s:12:\"\"1518157166\"\";}s:4:\"vary\";a:1:{i:0;s:6:\"Cookie\";}s:11:\"x-generator\";a:1:{i:0;s:33:\"Drupal 8 (https://www.drupal.org)\";}}s:15:\"\0*\0cacheControl\";a:2:{s:7:\"max-age\";s:3:\"300\";s:6:\"public\";b:1;}}s:10:\"\0*\0content\";s:51782:\"<!DOCTYPE html>\n<html  lang=\"en\" dir=\"ltr\" prefix=\"content: http://purl.org/rss/1.0/modules/content/  dc: http://purl.org/dc/terms/  foaf: http://xmlns.com/foaf/0.1/  og: http://ogp.me/ns#  rdfs: http://www.w3.org/2000/01/rdf-schema#  schema: http://schema.org/  sioc: http://rdfs.org/sioc/ns#  sioct: http://rdfs.org/sioc/types#  skos: http://www.w3.org/2004/02/skos/core#  xsd: http://www.w3.org/2001/XMLSchema# \">\n  <head>\n    <meta charset=\"utf-8\" />\n<meta name=\"title\" content=\"A Robust Flash File System Since 2002 | Yaffs - A Flash File System for embedded use\" />\n<link rel=\"shortlink\" href=\"https://yaffs.net/\" />\n<link rel=\"canonical\" href=\"https://yaffs.net/\" />\n<meta name=\"news_keywords\" content=\"Flash File System\" />\n<meta name=\"description\" content=\"Yaffs (Yet Another Flash File System) is an open-source file system specifically designed to be fast, robust and suitable for embedded use with NAND and NOR Flash. It is widely used with Linux, RTOSs, or no OS at all, in consumer devices and critical infrastructure. It is available under GNU Public License, GPL, or on commercial terms from Aleph One.\" />\n<meta name=\"abstract\" content=\"Yaffs (Yet Another Flash File System) is an open-source file system specifically designed to be fast, robust and suitable for embedded use with NAND and NOR Flash. It is widely used with Linux, RTOSs, or no OS at all, in consumer devices and critical infrastructure. It is available under GNU Public License, GPL, or on commercial terms from Aleph One.\" />\n<meta name=\"keywords\" content=\"flash File System, flash, file System, flash storage, NAND flash, NOR flash, Yaffs\" />\n<meta name=\"Generator\" content=\"Drupal 8 (https://www.drupal.org)\" />\n<meta name=\"MobileOptimized\" content=\"width\" />\n<meta name=\"HandheldFriendly\" content=\"true\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<link rel=\"stylesheet\" href=\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSansRegular-fontfacekit/fontyourface-stylesheet.css\" media=\"all\" />\n<link rel=\"stylesheet\" href=\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSansItalic-fontfacekit/fontyourface-stylesheet.css\" media=\"all\" />\n<link rel=\"stylesheet\" href=\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSansBold-fontfacekit/fontyourface-stylesheet.css\" media=\"all\" />\n<link rel=\"stylesheet\" href=\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSerifBold-fontfacekit/fontyourface-stylesheet.css\" media=\"all\" />\n<link rel=\"stylesheet\" href=\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSerifBoldItalic-fontfacekit/fontyourface-stylesheet.css\" media=\"all\" />\n<link rel=\"stylesheet\" href=\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSerifItalic-fontfacekit/fontyourface-stylesheet.css\" media=\"all\" />\n<link rel=\"stylesheet\" href=\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSerifRegular-fontfacekit/fontyourface-stylesheet.css\" media=\"all\" />\n<link rel=\"stylesheet\" href=\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSansBoldItalic-fontfacekit/fontyourface-stylesheet.css\" media=\"all\" />\n<link rel=\"shortcut icon\" href=\"/sites/default/files/yaffs_favicon.png\" type=\"image/png\" />\n<link rel=\"revision\" href=\"/home\" />\n\n    <title>A Robust Flash File System Since 2002 | Yaffs - A Flash File System for embedded use</title>\n    <link rel=\"stylesheet\" href=\"/sites/default/files/css/css_Ft-hGawuooABKJanSezg8PXovgOMbB_QLx9CIyXeHsA.css?ozekku\" media=\"all\" />\n<link rel=\"stylesheet\" href=\"/sites/default/files/css/css_6qeLA6GBkZNPHWp9GdQIYovV3tYuKU-ts-HicZ-WeQQ.css?ozekku\" media=\"all\" />\n\n    \n<!--[if lte IE 8]>\n<script src=\"/sites/default/files/js/js_VtafjXmRvoUgAzqzYTA3Wrjkx9wcWhjP0G4ZnnqRamA.js\"></script>\n<![endif]-->\n\n  </head>\n  <body class=\"fontyourface path-frontpage page-node-type-page navbar-is-fixed-top has-glyphicons\">\n    <a href=\"#main-content\" class=\"visually-hidden focusable skip-link\">\n      Skip to main content\n    </a>\n    <div style=\"background-color: ; color: \" id=\"environment-indicator\">\n  \n    </div>\n\n              <header class=\"navbar navbar-default navbar-fixed-top\" id=\"navbar\" role=\"banner\">\n              <div class=\"container\">\n            <div class=\"navbar-header\">\n          <div class=\"region region-navigation\">\n          <a class=\"logo navbar-btn pull-left\" href=\"/\" title=\"Home\" rel=\"home\">\n      <img src=\"/themes/custom/yaffs/logo.svg\" alt=\"Home\" />\n    </a>\n      \n  </div>\n\n                          <button type=\"button\" class=\"navbar-toggle\" data-toggle=\"collapse\" data-target=\"#navbar-collapse\">\n            <span class=\"sr-only\">Toggle navigation</span>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n          </button>\n              </div>\n\n                    <div id=\"navbar-collapse\" class=\"navbar-collapse collapse\">\n            <div class=\"region region-navigation-collapsible\">\n    <nav role=\"navigation\" aria-labelledby=\"block-mainnavigation-menu\" id=\"block-mainnavigation\">\n            <h2 class=\"sr-only\" id=\"block-mainnavigation-menu\">Main navigation</h2>\n\n      \n              <ul class=\"menu nav navbar-nav\">\n                            <li>\n        <a href=\"/\" data-drupal-link-system-path=\"&lt;front&gt;\">Home</a>\n                  </li>\n                        <li>\n        <a href=\"/support\" title=\"Help for Yaffs\" data-drupal-link-system-path=\"node/380\">Support</a>\n                  </li>\n                        <li>\n        <a href=\"/documents\" data-drupal-link-system-path=\"documents\">Documents</a>\n                  </li>\n                        <li>\n        <a href=\"/get-yaffs\" data-drupal-link-system-path=\"node/382\">Download</a>\n                  </li>\n                        <li>\n        <a href=\"/about-us\" data-drupal-link-system-path=\"node/325\">About us</a>\n                  </li>\n                        <li>\n        <a href=\"/contact\" data-drupal-link-system-path=\"node/73\">Contact</a>\n                  </li>\n        </ul>\n  \n\n\n  </nav>\n<div class=\"search-block-form block block-search block-search-form-block\" data-drupal-selector=\"search-block-form\" id=\"block-searchform\" role=\"search\">\n  \n    \n      <form action=\"/search/node\" method=\"get\" id=\"search-block-form\" accept-charset=\"UTF-8\">\n  <div class=\"form-item js-form-item form-type-search js-form-type-search form-item-keys js-form-item-keys form-no-label form-group\">\n      <label for=\"edit-keys\" class=\"control-label sr-only\">Search</label>\n  \n  \n  <div class=\"input-group\"><input title=\"Enter the terms you wish to search for.\" data-drupal-selector=\"edit-keys\" class=\"form-search form-control\" placeholder=\"Search\" type=\"search\" id=\"edit-keys\" name=\"keys\" value=\"\" size=\"15\" maxlength=\"128\" data-toggle=\"tooltip\" /><span class=\"input-group-btn\"><button type=\"submit\" value=\"Search\" class=\"button js-form-submit form-submit btn-primary btn icon-only\" name=\"\"><span class=\"sr-only\">Search</span><span class=\"icon glyphicon glyphicon-search\" aria-hidden=\"true\"></span></button></span></div>\n\n  \n  \n  </div>\n<div class=\"form-actions form-group js-form-wrapper form-wrapper\" data-drupal-selector=\"edit-actions\" id=\"edit-actions\"></div>\n\n</form>\n\n  </div>\n\n  </div>\n\n        </div>\n                    </div>\n          </header>\n  \n  <div role=\"main\" class=\"main-container container js-quickedit-main-content\">\n    <div class=\"row\">\n\n            \n            \n                  <section class=\"col-sm-12\">\n\n                                      <div class=\"highlighted\">  <div class=\"region region-highlighted\">\n    \n\n  </div>\n</div>\n                  \n                \n                \n                                      \n                  \n                          <a id=\"main-content\"></a>\n            <div class=\"region region-content\">\n        <h1 class=\"page-header\"><span property=\"schema:name\">A Robust Flash File System Since 2002</span>\n</h1>\n\n  <article role=\"article\" about=\"/home\" typeof=\"schema:WebPage\" class=\"page full clearfix\">\n\n  \n      <span property=\"schema:name\" content=\"A Robust Flash File System Since 2002\" class=\"hidden\"></span>\n\n\n  \n  <div class=\"content\">\n    \n            <div property=\"schema:text\" class=\"field field--name-body field--type-text-with-summary field--label-hidden field--item\">\n<p>Yaffs (Yet Another Flash File System) is an open-source file system specifically designed to be fast, robust and suitable for embedded use with NAND and NOR Flash. It is widely used with Linux, RTOSs, or no OS at all, in consumer devices, avionics, and critical infrastructure. It is available under GNU Public License, GPL, or on commercial terms from Aleph One.</p>\n<p>&nbsp;</p>\n</div>\n      \n  </div>\n\n</article>\n\n<section id=\"block-yaffsinspace\" class=\"panel yaffs-shout well block block-block-content block-block-content9f676777-54d9-40d2-86dd-174fff14ab1a clearfix\">\n  \n    \n\n      \n            <div class=\"field field--name-body field--type-text-with-summary field--label-hidden field--item\">\n<h3><em>New!</em> Yaffs in space!</h3>\n<p><strong><img alt=\"Tess satellite\" data-entity-type=\"file\" data-entity-uuid=\"f06319f1-b6ac-41e2-a70d-a4c4da605b87\" height=\"246\" src=\"/sites/default/files/inline-images/tess_satellite_0.gif\" width=\"347\" class=\"align-right\" />NASA TESS Mission </strong>This <strong>Transiting Exoplanet Survey Satellite (TESS)</strong> will discover thousands of exoplanets in orbit around the brightest stars in the sky.</p>\n<p>It is a project regularly using our Yaffs File System to store incoming data and preserve it, in the rigours of the space environment, before sending it back to Earth.</p>\n<p>In a two-year survey of the solar neighborhood, TESS will monitor more than 200,000 stars for temporary drops in brightness caused by planetary transits. This first-ever spaceborne all-sky transit survey will identify planets ranging from Earth-sized to gas giants, around a wide range of stellar types and orbital distances. No ground-based survey can achieve this feat.</p>\n<p>Some File Systems are not robust enough to be suitable for such exacting work.<br />\n </p>\n</div>\n      \n  </section>\n\n\n  </div>\n\n        \n                              <div class=\"front_highlight row\">\n              <div class=\"col-sm-4\">\n                    <div class=\"region region-front-highlight-1\">\n    <section id=\"block-choosingyaffs\" class=\"block block-block-content block-block-contentae8f54b9-5315-4995-a49e-c0780f3a88cc clearfix\">\n  \n    \n\n      \n            <div class=\"field field--name-body field--type-text-with-summary field--label-hidden field--item\"><a href=\"/documents/considerations-choosing-flash-file-system\">\n<article class=\"embedded-entity\">\n<img src=\"/sites/default/files/styles/max_325x325/public/2017-06/choosing_yaffs_0.jpg?itok=YuV5Z__e\" width=\"325\" height=\"325\" alt=\"Thumbnail\" title=\"Choosing Yaffs\" class=\"img-responsive\" />\n</article>\n</a> </div>\n      \n  </section>\n\n\n  </div>\n\n              </div>\n              <div class=\"col-sm-4\">\n                    <div class=\"region region-front-highlight-2\">\n    <section id=\"block-frontimagehighlight2\" class=\"block block-block-content block-block-contentfa53fc80-f3c4-4d6e-b947-0a3bcd479480 clearfix\">\n  \n    \n\n      \n            <div class=\"field field--name-body field--type-text-with-summary field--label-hidden field--item\"><a href=\"/yaffs-action\">\n<article class=\"embedded-entity\">\n<img src=\"/sites/default/files/styles/max_325x325/public/2017-06/atm_1.jpg?itok=HfIny6EH\" width=\"325\" height=\"325\" alt=\"Thumbnail\" title=\"ATM\" class=\"img-responsive\" />\n</article>\n</a> </div>\n      \n  </section>\n\n\n  </div>\n\n              </div>\n              <div class=\"col-sm-4\">\n                    <div class=\"region region-front-highlight-3\">\n    <section id=\"block-downloadyaffs\" class=\"block block-block-content block-block-contenteed71eb7-98b2-4109-aabe-7718283459ad clearfix\">\n  \n    \n\n      \n            <div class=\"field field--name-body field--type-text-with-summary field--label-hidden field--item\"><a href=\"/get-yaffs\">\n<article class=\"embedded-entity\">\n<img src=\"/sites/default/files/styles/max_325x325/public/2017-06/download_now_0.jpg?itok=XdRx8zkI\" width=\"325\" height=\"325\" alt=\"Thumbnail\" title=\"Download Yaffs\" class=\"img-responsive\" />\n</article>\n</a> </div>\n      \n  </section>\n\n\n  </div>\n\n              </div>\n            </div>\n                        </section>\n\n                </div>\n  </div>\n\n  <div class=\"container-fluid front-pane-1\">\n        <div class=\"container\">\n        \n    </div>\n  </div>\n\n  <div class=\"container-fluid front-pane-2\">\n        <div class=\"container\">\n          <div class=\"region region-front-pane-2\">\n    <section class=\"views-element-container block block-views block-views-blockyaffs-user-logos-block-1 clearfix\" id=\"block-views-block-yaffs-user-logos-block-1\">\n  \n    \n\n      <div class=\"form-group\"><div class=\"view view-yaffs-user-logos view-id-yaffs_user_logos view-display-id-block_1 js-view-dom-id-8a35fcda02584f84c79a8d5e2576f68f0216117953eb3ee7556ddd61dbbc1289\">\n  \n    \n      \n      <div class=\"view-content\">\n      <div id=\"views-bootstrap-yaffs-user-logos-block-1\"  class=\"grid views-view-grid horizontal\">\n            <div class=\"row\">\n                  <div class=\"col col-xs-12 col-sm-6 col-md-3 col-lg-3 \">\n            <div class=\"views-field views-field-field-yaffs-user-logo\"><div class=\"field-content\"><a href=\"/yaffs-action\">  <img src=\"/sites/default/files/styles/small/public/logos/designA_logo.png?itok=5VWxByrk\" width=\"200\" height=\"141\" alt=\"\" typeof=\"foaf:Image\" class=\"img-responsive\" />\n\n\n</a></div></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-6 col-md-3 col-lg-3 \">\n            <div class=\"views-field views-field-field-yaffs-user-logo\"><div class=\"field-content\"><a href=\"/yaffs-action\">  <img src=\"/sites/default/files/styles/small/public/logos/eaton_logo.png?itok=kExm8d-W\" width=\"200\" height=\"84\" alt=\"\" typeof=\"foaf:Image\" class=\"img-responsive\" />\n\n\n</a></div></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-6 col-md-3 col-lg-3 \">\n            <div class=\"views-field views-field-field-yaffs-user-logo\"><div class=\"field-content\"><a href=\"/yaffs-action\">  <img src=\"/sites/default/files/styles/small/public/logos/LANCOM_Logo_4c.png?itok=ZIDg8yYt\" width=\"200\" height=\"50\" alt=\"\" typeof=\"foaf:Image\" class=\"img-responsive\" />\n\n\n</a></div></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-6 col-md-3 col-lg-3 \">\n            <div class=\"views-field views-field-field-yaffs-user-logo\"><div class=\"field-content\"><a href=\"/yaffs-action\">  <img src=\"/sites/default/files/styles/small/public/logos/bernina_international_logo.png?itok=G8DeIWtW\" width=\"200\" height=\"30\" alt=\"\" typeof=\"foaf:Image\" class=\"img-responsive\" />\n\n\n</a></div></div>\n          </div>\n              </div>\n          <div class=\"row\">\n                  <div class=\"col col-xs-12 col-sm-6 col-md-3 col-lg-3 \">\n            <div class=\"views-field views-field-field-yaffs-user-logo\"><div class=\"field-content\"><a href=\"/yaffs-action\">  <img src=\"/sites/default/files/styles/small/public/logos/gallagher_logo.png?itok=lQyDJeN1\" width=\"200\" height=\"65\" alt=\"\" typeof=\"foaf:Image\" class=\"img-responsive\" />\n\n\n</a></div></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-6 col-md-3 col-lg-3 \">\n            <div class=\"views-field views-field-field-yaffs-user-logo\"><div class=\"field-content\"><a href=\"/yaffs-action\">  <img src=\"/sites/default/files/styles/small/public/logos/android_logo.png?itok=MShHoIK7\" width=\"170\" height=\"71\" alt=\"\" typeof=\"foaf:Image\" class=\"img-responsive\" />\n\n\n</a></div></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-6 col-md-3 col-lg-3 \">\n            <div class=\"views-field views-field-field-yaffs-user-logo\"><div class=\"field-content\"><a href=\"/yaffs-action\">  <img src=\"/sites/default/files/styles/small/public/logos/leica_logo.png?itok=Ne2u8w3-\" width=\"200\" height=\"130\" alt=\"\" typeof=\"foaf:Image\" class=\"img-responsive\" />\n\n\n</a></div></div>\n          </div>\n              </div>\n      </div>\n\n    </div>\n  \n            <div class=\"view-footer\">\n      <a class=\"btn btn-default\" href=\"/yaffs-action\">Who uses Yaffs? Read more...</a>\n    </div>\n    </div>\n</div>\n\n  </section>\n\n\n  </div>\n\n    </div>\n  </div>\n\n  <div class=\"container-fluid front-pane-3\">\n        <div class=\"container\">\n          <div class=\"region region-front-pane-3\">\n    <section class=\"views-element-container block block-views block-views-blockhighlighted-yaffs-features-block-1 clearfix\" id=\"block-views-block-highlighted-yaffs-features-block-1\">\n  \n    \n\n      <div class=\"form-group\"><div class=\"view view-highlighted-yaffs-features view-id-highlighted_yaffs_features view-display-id-block_1 js-view-dom-id-95fe550d5052828912ac5148bc15b78f3cf61f69a8797eb9f9fafb9077e0fe26\">\n  \n    \n      \n      <div class=\"view-content\">\n      <div id=\"views-bootstrap-highlighted-yaffs-features-block-1\"  class=\"grid views-view-grid horizontal\">\n            <div class=\"row\">\n                  <div class=\"col col-xs-12 col-sm-12 col-md-4 col-lg-4 \">\n            <div class=\"views-field views-field-field-icon-text\"><div class=\"field-content\"><i class=\"fa fa-thumbs-up\"></i></div></div><div class=\"views-field views-field-title\"><span class=\"field-content\"><a href=\"/features#384\"><h3>Royalty Free... </h3></a></span></div><div class=\"views-field views-field-body\"><div class=\"field-content\">Whether you use Yaffs under the GNU General Public Licence or under a commercial licence, Yaffs is free of any royalty. No need to worry about rising costs for your hit product!</div></div><div class=\"views-field views-field-edit-node\"><span class=\"field-content\"></span></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-12 col-md-4 col-lg-4 \">\n            <div class=\"views-field views-field-field-icon-text\"><div class=\"field-content\"><i class=\"fa fa-shield\"></i></div></div><div class=\"views-field views-field-title\"><span class=\"field-content\"><a href=\"/features#385\"><h3>A robust flash file system...</h3></a></span></div><div class=\"views-field views-field-body\"><div class=\"field-content\">After more than 100,000 <strong>random</strong> power-failures during reading or writing, a test file showed NO data corruption at all!</div></div><div class=\"views-field views-field-edit-node\"><span class=\"field-content\"></span></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-12 col-md-4 col-lg-4 \">\n            <div class=\"views-field views-field-field-icon-text\"><div class=\"field-content\"><i class=\"fa fa-heart\"></i></div></div><div class=\"views-field views-field-title\"><span class=\"field-content\"><a href=\"/features#388\"><h3>Yaffs is Open Source...</h3></a></span></div><div class=\"views-field views-field-body\"><div class=\"field-content\">You can have a look at the code at any time. <a href=\"/downloads\">Download it now</a>! And it\'s suitable for GPL and commercially licensed projects.</div></div><div class=\"views-field views-field-edit-node\"><span class=\"field-content\"></span></div>\n          </div>\n              </div>\n          <div class=\"row\">\n                  <div class=\"col col-xs-12 col-sm-12 col-md-4 col-lg-4 \">\n            <div class=\"views-field views-field-field-icon-text\"><div class=\"field-content\"><i class=\"fa fa-mobile-phone\"></i></div></div><div class=\"views-field views-field-title\"><span class=\"field-content\"><a href=\"/features#389\"><h3>Tried and tested in millions of devices...</h3></a></span></div><div class=\"views-field views-field-body\"><div class=\"field-content\">Yaffs is widely used in Linux and proprietary commercial RTOSs. It\'s been included in hundreds of devices, and shipped as part of Google\'s Android, with millions of units sold.</div></div><div class=\"views-field views-field-edit-node\"><span class=\"field-content\"></span></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-12 col-md-4 col-lg-4 \">\n            <div class=\"views-field views-field-field-icon-text\"><div class=\"field-content\"><i class=\"fa fa-space-shuttle\"></i></div></div><div class=\"views-field views-field-title\"><span class=\"field-content\"><a href=\"/features#407\"><h3>Booting is fast...</h3></a></span></div><div class=\"views-field views-field-body\"><div class=\"field-content\">It is important for a Flash filesystem to boot fast, so boot speed was a fundamental consideration in the design of Yaffs.</div></div><div class=\"views-field views-field-edit-node\"><span class=\"field-content\"></span></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-12 col-md-4 col-lg-4 \">\n            <div class=\"views-field views-field-field-icon-text\"><div class=\"field-content\"><i class=\"fa fa-users\"></i></div></div><div class=\"views-field views-field-title\"><span class=\"field-content\"><a href=\"/features#408\"><h3>An active community...</h3></a></span></div><div class=\"views-field views-field-body\"><div class=\"field-content\">There\'s an active community of people who use Yaffs and who have developed with Yaffs, just a click or two away.</div></div><div class=\"views-field views-field-edit-node\"><span class=\"field-content\"></span></div>\n          </div>\n              </div>\n      </div>\n\n    </div>\n  \n            <div class=\"view-footer\">\n      <a class=\"btn btn-default\" href=\"/features\">Lots more Yaffs features...</a>\n    </div>\n    </div>\n</div>\n\n  </section>\n\n\n  </div>\n\n    </div>\n  </div>\n\n  <div class=\"container-fluid front-pane-4\">\n        <div class=\"container\" >\n          <div class=\"region region-front-pane-4\">\n    <section class=\"views-element-container block block-views block-views-blockyaffs-documents-highlights-block-1 clearfix\" id=\"block-views-block-yaffs-documents-highlights-block-1\">\n  \n    \n\n      <div class=\"form-group\"><div class=\"view view-yaffs-documents-highlights view-id-yaffs_documents_highlights view-display-id-block_1 js-view-dom-id-273bf60b230e3faef44a6e67c34370278019b51f5d0e914b039f491b4d00cf06\">\n  \n    \n      \n      <div class=\"view-content\">\n      <div id=\"views-bootstrap-yaffs-documents-highlights-block-1\"  class=\"grid views-view-grid horizontal\">\n            <div class=\"row\">\n                  <div class=\"col col-xs-12 col-sm-12 col-md-6 col-lg-6 \">\n            <div class=\"views-field views-field-field-teaser-image\"><div class=\"field-content\"></div></div><div class=\"views-field views-field-title\"><h3 class=\"field-content\"><a href=\"/yaffs-licence-sample\" hreflang=\"und\">Yaffs Licence Sample</a></h3></div><div class=\"views-field views-field-body\"><div class=\"field-content\">While the Yaffs code is available free of charge under GNU General Public Licence, version 2, that entails the obligation to disclose Source Code for your application using Yaffs. An Aleph One Licence does not impose that obligation and so is attractive for proprietary projects. This sample Licence provides an example of the points we expect a Licence to cover.</div></div><div class=\"views-field views-field-upload-1\"><div class=\"field-content\"></div></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-12 col-md-6 col-lg-6 \">\n            <div class=\"views-field views-field-field-teaser-image\"><div class=\"field-content\"></div></div><div class=\"views-field views-field-title\"><h3 class=\"field-content\"><a href=\"/yaffs-overview\" hreflang=\"und\">Yaffs Overview</a></h3></div><div class=\"views-field views-field-body\"><div class=\"field-content\">YAFFS is a filesystem designed specifically for the characteristics of NAND flash. This page gives an overview of the project - what is available, how it works, how to use it, developer resources, and licensing options.</div></div><div class=\"views-field views-field-upload-1\"><div class=\"field-content\"></div></div>\n          </div>\n              </div>\n          <div class=\"row\">\n                  <div class=\"col col-xs-12 col-sm-12 col-md-6 col-lg-6 \">\n            <div class=\"views-field views-field-field-teaser-image\"><div class=\"field-content\"></div></div><div class=\"views-field views-field-title\"><h3 class=\"field-content\"><a href=\"/yaffs-licence-faqs\" hreflang=\"und\">Yaffs Licence FAQs</a></h3></div><div class=\"views-field views-field-body\"><div class=\"field-content\"><p>Some questions about the commercial licence for Yaffs and how we arrive at one.</p></div></div><div class=\"views-field views-field-upload-1\"><div class=\"field-content\"></div></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-12 col-md-6 col-lg-6 \">\n            <div class=\"views-field views-field-field-teaser-image\"><div class=\"field-content\"></div></div><div class=\"views-field views-field-title\"><h3 class=\"field-content\"><a href=\"/documents/faq\" hreflang=\"und\">FAQ</a></h3></div><div class=\"views-field views-field-body\"><div class=\"field-content\"><p>Common questions about Yaffs technical issues.</p></div></div><div class=\"views-field views-field-upload-1\"><div class=\"field-content\"></div></div>\n          </div>\n              </div>\n          <div class=\"row\">\n                  <div class=\"col col-xs-12 col-sm-12 col-md-6 col-lg-6 \">\n            <div class=\"views-field views-field-field-teaser-image\"><div class=\"field-content\"></div></div><div class=\"views-field views-field-title\"><h3 class=\"field-content\"><a href=\"/licences-more-background-and-detail\" hreflang=\"und\">Licences - more background and detail</a></h3></div><div class=\"views-field views-field-body\"><div class=\"field-content\"><p>More on the details and background of Licences for Yaffs</p></div></div><div class=\"views-field views-field-upload-1\"><div class=\"field-content\"></div></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-12 col-md-6 col-lg-6 \">\n            <div class=\"views-field views-field-field-teaser-image\"><div class=\"field-content\"><a href=\"/sites/default/files/downloads/ConsiderationsInChoosingAFlashFileSystem_0.pdf\">  <img src=\"/sites/default/files/styles/pdf_image/public/styles/pdf_image/public/downloads/ConsiderationsInChoosingAFlashFileSystem_0.pdf.png?itok=ROOk6w-T\" width=\"150\" height=\"212\" alt=\"Preview of ConsiderationsInChoosingAFlashFileSystem.pdf\" typeof=\"foaf:Image\" class=\"img-responsive\" />\n\n\n</a></div></div><div class=\"views-field views-field-title\"><h3 class=\"field-content\"><a href=\"/documents/considerations-choosing-flash-file-system\" hreflang=\"und\">Considerations in Choosing a Flash File System</a></h3></div><div class=\"views-field views-field-body\"><div class=\"field-content\">Failures in an embedded File System in a product are much more serious to the user than failures in an office computer.&nbsp; Power failures and failures to cache data properly can be avoided by choosing a FFS specifically designed for reliability from the ground up.</div></div><div class=\"views-field views-field-upload-1\"><div class=\"field-content\"><span class=\"file file--mime-application-pdf file--application-pdf icon-before\"><span class=\"file-icon\"><span class=\"icon glyphicon glyphicon-file text-primary\" aria-hidden=\"true\"></span></span><span class=\"file-link\"><a href=\"https://yaffs.net/sites/default/files/downloads/ConsiderationsInChoosingAFlashFileSystem_0.pdf\" type=\"application/pdf; length=131376\" title=\"Open file in new window\" target=\"_blank\" data-toggle=\"tooltip\" data-placement=\"bottom\">ConsiderationsInChoosingAFlashFileSystem.pdf</a></span><span class=\"file-size\">128.3 KB</span></span></div></div>\n          </div>\n              </div>\n          <div class=\"row\">\n                  <div class=\"col col-xs-12 col-sm-12 col-md-6 col-lg-6 \">\n            <div class=\"views-field views-field-field-teaser-image\"><div class=\"field-content\"><a href=\"/sites/default/files/downloads/HowYaffsWorks.pdf\">  <img src=\"/sites/default/files/styles/pdf_image/public/styles/pdf_image/public/downloads/HowYaffsWorks.pdf.png?itok=_nJu31C0\" width=\"150\" height=\"194\" alt=\"Preview of HowYaffsWorks.pdf\" typeof=\"foaf:Image\" class=\"img-responsive\" />\n\n\n</a></div></div><div class=\"views-field views-field-title\"><h3 class=\"field-content\"><a href=\"/documents/how-yaffs-works\" hreflang=\"und\">How Yaffs works</a></h3></div><div class=\"views-field views-field-body\"><div class=\"field-content\">This document gives an explanation of most of the core mechanisms that make Yaffs work. As of the time of writing this, the Yaffs2 code base includes approximately 19,000 lines of code making a very detailed discussion impractical. This document is the starting point for understanding Yaffs. Further detailed questions and discussions are welcomed on the Yaffs discussion list.</div></div><div class=\"views-field views-field-upload-1\"><div class=\"field-content\"><span class=\"file file--mime-application-pdf file--application-pdf icon-before\"><span class=\"file-icon\"><span class=\"icon glyphicon glyphicon-file text-primary\" aria-hidden=\"true\"></span></span><span class=\"file-link\"><a href=\"https://yaffs.net/sites/default/files/downloads/HowYaffsWorks.pdf\" type=\"application/pdf; length=402514\" title=\"Open file in new window\" target=\"_blank\" data-toggle=\"tooltip\" data-placement=\"bottom\">HowYaffsWorks.pdf</a></span><span class=\"file-size\">393.08 KB</span></span></div></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-12 col-md-6 col-lg-6 \">\n            <div class=\"views-field views-field-field-teaser-image\"><div class=\"field-content\"><a href=\"/sites/default/files/downloads/YaffsTuning.pdf\">  <img src=\"/sites/default/files/styles/pdf_image/public/styles/pdf_image/public/downloads/YaffsTuning.pdf.png?itok=idZTTQBs\" alt=\"Preview of YaffsTuning.pdf\" typeof=\"foaf:Image\" class=\"img-responsive\" />\n\n\n</a></div></div><div class=\"views-field views-field-title\"><h3 class=\"field-content\"><a href=\"/documents/yaffs-tuning\" hreflang=\"und\">Yaffs Tuning</a></h3></div><div class=\"views-field views-field-body\"><div class=\"field-content\"><p>This document describes the parameters which can be modified by the developer in the different phases of applying, debugging, and routine use of Yaffs.</p></div></div><div class=\"views-field views-field-upload-1\"><div class=\"field-content\"><span class=\"file file--mime-application-pdf file--application-pdf icon-before\"><span class=\"file-icon\"><span class=\"icon glyphicon glyphicon-file text-primary\" aria-hidden=\"true\"></span></span><span class=\"file-link\"><a href=\"https://yaffs.net/sites/default/files/downloads/YaffsTuning.pdf\" type=\"application/pdf; length=93667\" title=\"Open file in new window\" target=\"_blank\" data-toggle=\"tooltip\" data-placement=\"bottom\">YaffsTuning.pdf</a></span><span class=\"file-size\">91.47 KB</span></span></div></div>\n          </div>\n              </div>\n      </div>\n\n    </div>\n  \n            <div class=\"view-footer\">\n      <a class=\"btn btn-default\" href=\"/documents\">All the Yaffs documentation...</a>\n    </div>\n    </div>\n</div>\n\n  </section>\n\n\n  </div>\n\n    </div>\n  </div>\n\n    <div class=\"container-fluid front-pane-5\">\n                <div class=\"container\" >\n              <div class=\"region region-front-pane-5\">\n    <section id=\"block-frontpageprimeryaffs\" class=\"block block-block-content block-block-contente7a8d2de-4fbb-4680-9e18-fe4d8337f1d6 clearfix\">\n  \n    \n\n      \n            <div class=\"field field--name-body field--type-text-with-summary field--label-hidden field--item\">\n<h1>Flash file systems primer</h1>\n<h2>Background &amp; basics</h2>\n<h3><span>What is a </span><span>F</span><span>lash </span><span>F</span><span>ile </span><span>S</span><span>ystem</span>?</h3>\n<p><span>A <span>Flash File System</span> stores data on flash memory, rather than a hard drive. Flash is used because it’s faster, much more tolerant of physical stress and takes less power. A <span>flash filesystem</span> is used to manage the data and get the best out of flash memory.</span></p>\n<p><span>As two examples, a flash memory chip needs to be erased in blocks before it is rewritten and a flash file system will manage that; flash memory has a limited number of writes per block so many flash file systems incorporate a <span>wear levelling</span> mechanism to ensure the writes are spread out.</span></p>\n<p><span>A flash file system is most useful as a part of an embedded system,. As a developer, you <em>can</em>&nbsp;read from and write directly to your Flash memory on an embedded system, but unless your use is extremely limited, you\'ll probably find that you come up against problems that Flash file systems have already solved.</span></p>\n<h3>What are NAND flash &amp; NOR flash?</h3>\n<p><span>These are the two fundamental flash architectures and have very different characteristics in performance, reliability, erase cycles, life span, and price. They also differ fundamentally from hard disk drives, and so need specialised handling.</span></p>\n<table>\n<tbody>\n <tr>\n  <td>\n  <p>&nbsp;</p>\n   </td>\n  <td>\n  <p>NAND flash</p>\n   </td>\n  <td>\n  <p>NOR flash</p>\n   </td>\n </tr>\n <tr>\n  <td>\n  <p>Storage density</p>\n   </td>\n  <td>\n  <p>Higher</p>\n   </td>\n  <td>\n  <p>Lower</p>\n   </td>\n </tr>\n <tr>\n  <td>\n  <p>Read performance</p>\n   </td>\n  <td>\n  <p>Fast</p>\n   </td>\n  <td>\n  <p>Fast (may be slowed by serial access)</p>\n   </td>\n </tr>\n <tr>\n  <td>\n  <p>Write performance</p>\n   </td>\n  <td>\n  <p>Faster</p>\n   </td>\n  <td>\n  <p>Slower (may be slowed further by serial access)</p>\n   </td>\n </tr>\n <tr>\n  <td>\n  <p>Erase performance</p>\n   </td>\n  <td>\n  <p>Faster (low ms typically)</p>\n   </td>\n  <td>\n  <p>Slower (possibly seconds)</p>\n   </td>\n </tr>\n <tr>\n  <td>\n  <p>Storage reliability</p>\n   </td>\n  <td>\n  <p>Lower (without management)</p>\n   </td>\n  <td>\n  <p>Better</p>\n   </td>\n </tr>\n <tr>\n  <td>\n  <p>Life span</p>\n   </td>\n  <td>\n  <p>Higher</p>\n   </td>\n  <td>\n  <p>Lower</p>\n   </td>\n </tr>\n <tr>\n  <td>\n  <p>Price</p>\n   </td>\n  <td>\n  <p>Lower</p>\n   </td>\n  <td>\n  <p>Higher</p>\n   </td>\n </tr>\n</tbody>\n</table>\n<p><span>Yaffs is both an <span>embedded NAN</span><span>D flash file system</span> and an <span>embedded N</span><span>OR Flash file system</span>. It can handle SLC, TLC and MLC NAND. It also works on MLC and SLC NOR. And it can work with parallel or serial access including Serial Peripheral Bus (SPI).</span></p>\n<h3>What special functions does a <span>file system </span><span>for flash</span> include?</h3>\n<p><span>As well as the normal file system functions, a <span>flash file system embedded</span> in hardware should help the device to start and stop quickly and deal well with losing power with no warning, without corrupting the data; and, manage the foibles of flash memory, protecting the stored data with extreme reliability. (Read our paper <a href=\"/documents/considerations-choosing-flash-file-system\">Considerations in Choosing a Flash File System</a>.)</span></p>\n<p><span><span>To these ends, an embedded flash file system must employ extra steps to achieve these such as using log structuring, rather than traditional file structuring plus a flash translation layer; manage power loss and recovery; include flash memory wear levelling; deal with the unreliability of flash from read and write disturbs, by using error correction (ECC), bad block remapping, over provision and flash block refreshing; ensure it’s ready to write fast by using garbage collection and flash block erase to prepare; and manage writing while avoiding write amplification. </span></span></p>\n<h4>What is a log-structured file system?</h4>\n<p><span>Log structuring means that data is written to the file system as a sequence of changes to the file system. This has the advantage that there is less overhead, and so it\'s faster than a non-log-structured system. More important though is that it is more robust against power failure. It also means that a file may be fragmented. For hard drives, fragmentation can mean much slower access due to the time required to mechanically move the read heads around the disk, but flash memory has no moving parts so there is no overhead for flash.</span></p>\n<p><span>Yaffs is log structured a <span>flash file system </span><span>architecture</span> which is faster and more robust than the alternatives.</span></p>\n<h4>What is a <span>Flash Translation Layer</span> (FTL) ?</h4>\n<p><span>It is sometimes desirable to use regular block file systems (such as FAT) with flash memory. In such cases, a Flash Translation Layer presents flash memory or a flash file system as if it\'s an ordinary hard drive.</span></p>\n<p><span>An FTL is an incomplete storage solution it still requires a file system. This makes two layers where data can be damaged and lost: in the FTL and in the <span>flash memory </span><span>file system</span>.</span></p>\n<p><span>True <span>file systems for flash memory</span>, such as Yaffs, do not use FTLs. They deal directly with the idiosyncrasies of flash, providing a faster and more reliable solution.</span></p>\n<h4>What is power loss recovery?</h4>\n<p><span>When power to any storage device is suddenly lost, the device can end up in an unknown state and may have damaged areas. Most file systems have to work hard to ensure that they are in a consistent state after power loss. <span>E</span><span>mbedded file systems</span> <span>for flash</span> may make allowances for unscheduled power loss with a recovery process.</span></p>\n<p><span>Yaffs is built with fault tolerance as a guiding principle and so is designed so power loss is considered a normal event.</span></p>\n<h4>What is <span>wear levelling</span>?</h4>\n<p><span>Flash chips wear out. Each time a part of the flash memory is erased and written, it is slightly damaged. <span>Embedded f</span><span>lash file systems</span> note the danger, and sometimes try to spread the damage rather than having it concentrated in one region, so prolonging the life of the memory and the life of the device.</span></p>\n<p><span>Yaffs is designed so that extra <span>wear leveling</span> is unnecessary. Instead, it’s automatically <span>wear levelling</span> because of the log structure.</span></p>\n<h4>What is flash read disturb? What is flash write disturb?</h4>\n<p><span><a href=\"/documents/yaffs-nand-flash-failure-mitigation\">NAND flash may experience degradation or loss of data</a> owing to reads of pages in the same block or data changes in neighbouring blocks of the NAND device. This is particularly true for MLC NAND.</span></p>\n<p><span>Yaffs uses block refreshing to deal with such problems.</span></p>\n<h4>What is flash error correction/flash ECC?</h4>\n<p><span>There are ways in which flash memory can be corrupted – for instance F-N tunnelling problems and leaky oxide layers. See our <a href=\"/documents/yaffs-nand-flash-failure-mitigation\">detailed discussion of flash memory problems</a>.</span></p>\n<p><span>But every bit counts, and especially if it\'s part of critical data or essential to the correct working of a system. Flash error correction keeps track of a section of memory to tell if there\'s corruption, and provides ways to correct these small errors.</span></p>\n<p><span>Yaffs can use hardware or software based ECC.</span></p>\n<h4>What is bad-block remapping?</h4>\n<p><span>File systems are built upon storing data on physical media. But all media suffers deterioration. Some hardware or <span>flash media </span><span>file systems</span> keep lists of damaged regions and behind the scenes, substitute known good ones in their place.</span></p>\n<p><span>Because of the way that Yaffs works, there\'s no need for bad block remapping because it isn’t a block structured file system.</span></p>\n<h4>What is <span>o</span><span>ver-provisioning</span> ?</h4>\n<p><span>Knowing that the media will degrade and suffer errors, and needing space to alter data because of the nature of flash memory, sometimes a <span>flash memory based </span><span>file system</span> puts aside a portion of the media for this use. This is <span>overprovisioning</span>. Often this space used when remapping bad blocks.</span></p>\n<p><span>Because Yaffs is log structured, it has the advantage that it does not need <span>over provision</span><span>ing</span>, making more memory available to store data.</span></p>\n<h4>What is flash block refreshing?</h4>\n<p><span>To counteract the problems of unreliable flash memory – for instance errors due to read and write disturbs – a flash filesystem can refresh the memory, by making a new copy of a block.</span></p>\n<p><span>Yaffs includes flash block refreshing.</span></p>\n<h4>What is flash garbage collection?</h4>\n<p><span>When a file is deleted, or a part of a file is overwritten, file systems often simply mark the flash space as deleted, rather than removing it. Later they reclaim the space for reuse. This is garbage collection.</span></p>\n<p><span>Yaffs has garbage collection to maximise the amount of data the file system can store.</span></p>\n<h4>What is flash block erase?</h4>\n<p><span>Data must be written into blank areas of the flash chip, but erasing takes time. Rather than erase and write at the same time, in order to speed writes, NAND and <span>NOR flash file systems</span> can prepare blocks for later use. This is not usually necessary for other storage media.</span></p>\n<p><span>As part of garbage collection, Yaffs uses a block erase strategy.</span></p>\n<h4>What is flash write amplification ?</h4>\n<p><span>In many block-based flash file systems, when data changes the new data must be written to the disk, and then the old data must be marked as invalid. A small change to the data can have consequences that propagate involving writing to the memory twice or more as the old data is cleaned up by garbage collection and files are organised to take the minimum amount of space. This is write amplification - a single small write causing a cascade of writes (and erases) of whole blocks.</span></p>\n<p><span>Yaffs avoids much of this problem by being log structured, meaning that flash memory is slower to reach it\'s maximum number of cycles, while writing is faster.</span></p>\n<h2>How does Yaffs work?</h2>\n<p><span>You can find full details in our paper <a href=\"/documents/how-yaffs-works\">How Yaffs Works</a>&nbsp;but briefly, here\'s how it works.</span></p>\n<p><span>It\'s a log-structured filing system. This also ensures that Yaffs is wear-levelling is built into the design because no one part of the flash memory is used any more than another.</span></p>\n<p><span>A Yaffs object is anything that Yaffs stores - for instance a file or a directory.</span></p>\n<p><span>The memory in NAND flash is arranged in pages. A page is the unit of allocation and programming. In Yaffs, the unit of allocation is called the chunk. Typically a chunk will be the same as a NAND page, but there is flexibility to use chunks which map to multiple pages (eg. A system may have two NAND chips in parallel requiring 2x2048 = 4096 byte chunks) . This distinction gives a lot of flexibility in how the system can be configured.</span></p>\n<p><span>A fixed but configurable number of chunks form a block which is the unit of erasure.</span></p>\n<p><span>NAND flash is shipped with bad blocks and further blocks may go bad during the operation of the device so Yaffs detects and marks bad blocks.</span></p>\n<p><span>NAND flash also typically requires the use of some sort of error detection and correction code (ECC). Yaffs can either use existing ECC logic or provide its own.</span></p>\n<p><span>Yaffs maintains data in RAM about the file system, but this is not needed for Yaffs to work - so the device can safely lose power at any point without data corruption.</span></p>\n<p><span>Here\'s how the Yaffs filesystem works to ensure data safety and a very fast startup... At regular points and on controlled shutdown, checkpoint blocks are written to the flash memory, containing all the data to quickly rebuild the file system. Under usual circumstances this checkpoint is used when a device is started, to very quickly rebuild the RAM data about the file system. If the checkpoint is determined to be corrupted, or if the user requested then the file system is rebuilt by scanning.</span></p>\n<p><span>To do this, Yaffs makes a prescan, to find the sequence numbers for blocks. Then it scans through blocks backwards to build up the list of chunks that make up objects. It speeds up this process by using Block Summaries, which are collections of all the tags in a data in a block. (But it\'s still always possible to go back to the chunks themselves, to find the tags, if a summary is missing or damaged.)</span></p>\n<p><span>And tags are how Yaffs tells that a chunk belongs to a particular object.</span></p>\n<p><span>Tags are also how Yaffs knows which chunks make up the current version of an object... Because the file system is log structured, if an object has been updated, only the latest chunks are used, giving the correct version of the object. A full description of the process is available in the technical documentation, and of course you can browse the code to see exactly how it all works; there\'s a lot more to tags, the metadata that they can hold, how they are stored, and how tags are used to link together objects into a file system with a POSIX interface.</span></p>\n<p><span>And of course that\'s not the end of the story. There\'s caching to deal with repeated small changes to data. There\'s garbage collection to let space be re-used, and Yaffs deals with collecting garbage differently depending on whether there\'s lots of free space or only a little. And part of making Yaffs a high performance flash file system is to make sure that re-useable blocks are erased well before they are needed, so that writing involves only a single operation. There\'s lazy loading to reduce scanning time. And all of this is built in a portable way, so that Yaffs can be configured to match almost any hardware, and can be ported to any operating system, or work on bare metal without an operating system. There\'s a test harness which is used to subject Yaffs to power failure, and ensure it works even with external data corruption. That\'s what makes it robust enough to send into space and to handle hundreds of terabytes of mission critical data.</span></p>\n<h4>Why is Yaffs special as an embedded flash file system?</h4>\n<p><span>Yaffs has been in use since 2002, and so it is hardened. It has been used in everything from phones to sewing machines to satellites. It is popular with Aerospace companies, and firms managing large infrastructure and in Point-of-Sale (POS) equipment (where customer feedback is very rapid!) It has been used in extreme conditions where it must not lose data, and where there is no chance for maintenance. It\'s been used for very large file systems up to 190TB. It\'s been used for safety critical applications, and millions of consumer devices.</span></p>\n<p><span>We carry out testing in a <a href=\"/documents/yaffs-robustness-and-testing\">rig which can simulate random power failures</a> and proved its reliability after tens to hundreds of millions of power failures.&nbsp;It\'s designed with an understanding of the constraints of flash memory and for speed.</span></p>\n<p><span>Yaffs works on multiple operating systems – Linux, VxWorks, Windows CE, eCos. - and also directly on bare metal, with no operating system. And it\'s easy to integrate into your RTOS or application using the Yaffs Direct Interface. It works with multiple types of flash memory - NAND &amp; NOR, SLC, MLC &amp; TLC.&nbsp;It\'s endian neutral. It\'s been used with 32-bit and 64-bit CPUs including MIPS, 68000, ARM, ColdFire, PowerPC and x86 variants. Yaffs has even been used with various DSP architectures! And it\'ll work with 16-bit with some tuning. So it can be configured to work with your design and the flash geometry that you need.</span></p>\n<p><span>And it\'s a <span>free embedded flash file system - </span><span>it’s open</span> <span>source</span>! <a href=\"/get-yaffs\">Grab the GPL version now</a>! Check out our the active community. And that\'s not the whole story - there are lots more reasons that make Yaffs special.&nbsp;</span></p>\n<p>&nbsp;</p>\n</div>\n      \n  </section>\n\n\n  </div>\n\n        </div>\n    </div>\n\n      <footer class=\"footer container\" role=\"contentinfo\">\n        <div class=\"primary_footer row\">\n            <div class=\"col-sm-3\">\n                  <div class=\"region region-footer-col1\">\n    <section id=\"block-yaffs-block-6\" class=\"block block-block-content block-block-content6c2d4b45-4dba-4b2d-8b9f-76701bf27533 clearfix\">\n  \n    \n\n      \n            <div class=\"field field--name-body field--type-text-with-summary field--label-hidden field--item\">\n<ul class=\"fa-ul\">\n<li><i class=\"fa-li fa fa-phone\"></i>+44 (0)1223 811679</li>\n<li><i class=\"fa-li fa fa-envelope\"></i><a href=\"denied:mailto:info@aleph1.co.uk?Subject=Website contact\" target=\"_top\">info@aleph1.co.uk</a></li>\n</ul>\n</div>\n      \n  </section>\n\n\n  </div>\n\n            </div>\n            <div class=\"col-sm-3\">\n                \n            </div>\n            <div class=\"col-sm-3\">\n                \n            </div>\n            <div class=\"col-sm-3\">\n                  <div class=\"region region-footer-col4\">\n    <section id=\"block-footerlegal\" class=\"block block-block-content block-block-content78ab593d-35b6-4772-a141-30216e7fcbb2 clearfix\">\n  \n    \n\n      \n            <div class=\"field field--name-body field--type-text-with-summary field--label-hidden field--item\">\n<p class=\"text-align-right\">&nbsp;<a href=\"/legal\">Legal &amp; Cookies</a></p>\n</div>\n      \n  </section>\n\n<section id=\"block-cookieinfo\" class=\"block block-block-content block-block-content4848c58d-90df-4819-81d8-0f9568eeeaac clearfix\">\n  \n    \n\n      \n            <div class=\"field field--name-body field--type-text-with-summary field--label-hidden field--item\">\n<p class=\"text-align-justify\"><br />\nWe use <a href=\"/legal\">cookies on this site</a>. By using it, you are giving us consent to set cookies.</p>\n</div>\n      \n  </section>\n\n\n  </div>\n\n            </div>\n        </div>\n        <div class = \"secondary_footer row\">\n            <div class=\"col-sm-12\">\n                <div class=\"region region-footer\">\n    <nav role=\"navigation\" aria-labelledby=\"block-yaffs-account-menu-menu\" id=\"block-yaffs-account-menu\">\n            <h2 class=\"sr-only\" id=\"block-yaffs-account-menu-menu\">User account menu</h2>\n\n      \n              <ul class=\"menu nav navbar-nav navbar-right\">\n                            <li>\n        <a href=\"/user/login\" data-drupal-link-system-path=\"user/login\">Log in</a>\n                  </li>\n        </ul>\n  \n\n\n  </nav>\n\n  </div>\n\n            </div>\n        </div>\n    </footer>\n  \n    \n    <script type=\"application/json\" data-drupal-selector=\"drupal-settings-json\">{\"path\":{\"baseUrl\":\"\\/\",\"scriptPath\":null,\"pathPrefix\":\"\",\"currentPath\":\"node\\/487\",\"currentPathIsAdmin\":false,\"isFront\":true,\"currentLanguage\":\"en\",\"currentQuery\":{\"author\":\"13\"}},\"pluralDelimiter\":\"\\u0003\",\"bootstrap\":{\"forms_has_error_value_toggle\":1,\"modal_animation\":1,\"modal_backdrop\":\"true\",\"modal_keyboard\":1,\"modal_show\":1,\"modal_size\":\"\",\"popover_enabled\":1,\"popover_animation\":1,\"popover_container\":\"body\",\"popover_content\":\"\",\"popover_delay\":\"0\",\"popover_html\":0,\"popover_placement\":\"right\",\"popover_selector\":\"\",\"popover_title\":\"\",\"popover_trigger\":\"click\",\"popover_trigger_autoclose\":1,\"tooltip_enabled\":1,\"tooltip_animation\":1,\"tooltip_container\":\"body\",\"tooltip_delay\":\"0\",\"tooltip_html\":0,\"tooltip_placement\":\"auto left\",\"tooltip_selector\":\"\",\"tooltip_trigger\":\"hover\"},\"ajaxTrustedUrl\":{\"\\/search\\/node\":true},\"user\":{\"uid\":0,\"permissionsHash\":\"aa7fc4c8fb40c7a8665ccd12fea07926dff0f59b9ee3346bc513c6399bee5b01\"}}</script>\n<script src=\"/sites/default/files/js/js_2l0lF4i9o3aztHULbfajMT_RTqGCEN_lVC8JI48SILw.js\"></script>\n\n  </body>\n</html>\n\";s:10:\"\0*\0version\";s:3:\"1.0\";s:13:\"\0*\0statusCode\";i:200;s:13:\"\0*\0statusText\";s:2:\"OK\";s:10:\"\0*\0charset\";N;s:23:\"\0*\0cacheabilityMetadata\";O:35:\"Drupal\\Core\\Cache\\CacheableMetadata\":3:{s:16:\"\0*\0cacheContexts\";a:18:{i:0;s:26:\"languages:language_content\";i:1;s:28:\"languages:language_interface\";i:2;s:5:\"route\";i:3;s:32:\"route.menu_active_trails:account\";i:4;s:29:\"route.menu_active_trails:main\";i:5;s:5:\"theme\";i:6;s:8:\"timezone\";i:7;s:8:\"url.path\";i:8;s:17:\"url.path.is_front\";i:9;s:15:\"url.path.parent\";i:10;s:30:\"url.query_args:_wrapper_format\";i:11;s:8:\"url.site\";i:12;s:4:\"user\";i:13;s:21:\"user.node_grants:view\";i:14;s:16:\"user.permissions\";i:15;s:10:\"user.roles\";i:16;s:20:\"user.roles:anonymous\";i:17;s:24:\"user.roles:authenticated\";}s:12:\"\0*\0cacheTags\";a:103:{i:0;s:16:\"block_content:18\";i:1;s:16:\"block_content:23\";i:2;s:16:\"block_content:25\";i:3;s:16:\"block_content:27\";i:4;s:16:\"block_content:28\";i:5;s:16:\"block_content:29\";i:6;s:16:\"block_content:30\";i:7;s:15:\"block_content:7\";i:8;s:18:\"block_content_view\";i:9;s:10:\"block_view\";i:10;s:32:\"config:block.block.choosingyaffs\";i:11;s:29:\"config:block.block.cookieinfo\";i:12;s:32:\"config:block.block.downloadyaffs\";i:13;s:30:\"config:block.block.footerlegal\";i:14;s:39:\"config:block.block.frontimagehighlight2\";i:15;s:32:\"config:block.block.frontpagehero\";i:16;s:39:\"config:block.block.frontpageprimeryaffs\";i:17;s:33:\"config:block.block.mainnavigation\";i:18;s:35:\"config:block.block.mainnavigation_2\";i:19;s:29:\"config:block.block.searchform\";i:20;s:31:\"config:block.block.sitebranding\";i:21;s:66:\"config:block.block.views_block__highlighted_yaffs_features_block_1\";i:22;s:66:\"config:block.block.views_block__yaffs_admin_recent_content_block_1\";i:23;s:66:\"config:block.block.views_block__yaffs_documents_highlights_block_1\";i:24;s:56:\"config:block.block.views_block__yaffs_user_logos_block_1\";i:25;s:37:\"config:block.block.yaffs_account_menu\";i:26;s:33:\"config:block.block.yaffs_block_10\";i:27;s:32:\"config:block.block.yaffs_block_5\";i:28;s:32:\"config:block.block.yaffs_block_6\";i:29;s:32:\"config:block.block.yaffs_block_8\";i:30;s:32:\"config:block.block.yaffs_block_9\";i:31;s:36:\"config:block.block.yaffs_breadcrumbs\";i:32;s:32:\"config:block.block.yaffs_content\";i:33;s:29:\"config:block.block.yaffs_help\";i:34;s:36:\"config:block.block.yaffs_local_tasks\";i:35;s:33:\"config:block.block.yaffs_messages\";i:36;s:35:\"config:block.block.yaffs_page_title\";i:37;s:32:\"config:block.block.yaffs_user_21\";i:38;s:31:\"config:block.block.yaffsinspace\";i:39;s:17:\"config:block_list\";i:40;s:24:\"config:color.theme.yaffs\";i:41;s:30:\"config:field.storage.node.body\";i:42;s:41:\"config:field.storage.node.field_icon_text\";i:43;s:44:\"config:field.storage.node.field_teaser_image\";i:44;s:47:\"config:field.storage.node.field_yaffs_user_logo\";i:45;s:32:\"config:field.storage.node.upload\";i:46;s:31:\"config:filter.format.basic_html\";i:47;s:30:\"config:filter.format.full_html\";i:48;s:29:\"config:filter.format.raw_html\";i:49;s:28:\"config:image.style.pdf_image\";i:50;s:24:\"config:image.style.small\";i:51;s:22:\"config:search.settings\";i:52;s:26:\"config:system.menu.account\";i:53;s:23:\"config:system.menu.main\";i:54;s:18:\"config:system.site\";i:55;s:26:\"config:user.role.anonymous\";i:56;s:44:\"config:views.view.highlighted_yaffs_features\";i:57;s:44:\"config:views.view.yaffs_documents_highlights\";i:58;s:34:\"config:views.view.yaffs_user_logos\";i:59;s:8:\"file:108\";i:60;s:8:\"file:109\";i:61;s:8:\"file:110\";i:62;s:7:\"file:40\";i:63;s:7:\"file:43\";i:64;s:7:\"file:44\";i:65;s:7:\"file:45\";i:66;s:7:\"file:46\";i:67;s:7:\"file:47\";i:68;s:7:\"file:48\";i:69;s:7:\"file:76\";i:70;s:7:\"file:77\";i:71;s:7:\"file:85\";i:72;s:13:\"http_response\";i:73;s:7:\"media:5\";i:74;s:7:\"media:8\";i:75;s:7:\"media:9\";i:76;s:7:\"node:32\";i:77;s:8:\"node:344\";i:78;s:8:\"node:353\";i:79;s:8:\"node:384\";i:80;s:8:\"node:385\";i:81;s:8:\"node:388\";i:82;s:8:\"node:389\";i:83;s:8:\"node:397\";i:84;s:8:\"node:398\";i:85;s:8:\"node:399\";i:86;s:8:\"node:400\";i:87;s:8:\"node:401\";i:88;s:8:\"node:407\";i:89;s:8:\"node:408\";i:90;s:8:\"node:409\";i:91;s:8:\"node:448\";i:92;s:8:\"node:451\";i:93;s:8:\"node:457\";i:94;s:8:\"node:460\";i:95;s:8:\"node:462\";i:96;s:8:\"node:466\";i:97;s:8:\"node:487\";i:98;s:9:\"node_list\";i:99;s:9:\"node_view\";i:100;s:8:\"rendered\";i:101;s:6:\"user:0\";i:102;s:6:\"user:1\";}s:14:\"\0*\0cacheMaxAge\";i:-1;}s:14:\"\0*\0attachments\";a:5:{s:7:\"library\";a:10:{i:0;s:14:\"core/html5shiv\";i:1;s:11:\"system/base\";i:2;s:15:\"bootstrap/theme\";i:3;s:20:\"yaffs/global-styling\";i:4;s:23:\"yaffs/bootstrap-scripts\";i:5;s:19:\"yaffs/yaffs-helpers\";i:6;s:17:\"bootstrap/popover\";i:7;s:17:\"bootstrap/tooltip\";i:8;s:18:\"views/views.module\";i:10;s:50:\"environment_indicator/drupal.environment_indicator\";}s:9:\"html_head\";a:22:{i:0;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"meta\";s:11:\"#attributes\";a:2:{s:4:\"name\";s:5:\"title\";s:7:\"content\";s:84:\"A Robust Flash File System Since 2002 | Yaffs - A Flash File System for embedded use\";}}i:1;s:5:\"title\";}i:1;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:2:{s:3:\"rel\";s:9:\"shortlink\";s:4:\"href\";s:18:\"https://yaffs.net/\";}}i:1;s:9:\"shortlink\";}i:2;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:2:{s:3:\"rel\";s:9:\"canonical\";s:4:\"href\";s:18:\"https://yaffs.net/\";}}i:1;s:13:\"canonical_url\";}i:3;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"meta\";s:11:\"#attributes\";a:2:{s:4:\"name\";s:13:\"news_keywords\";s:7:\"content\";s:17:\"Flash File System\";}}i:1;s:13:\"news_keywords\";}i:4;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"meta\";s:11:\"#attributes\";a:2:{s:4:\"name\";s:11:\"description\";s:7:\"content\";s:352:\"Yaffs (Yet Another Flash File System) is an open-source file system specifically designed to be fast, robust and suitable for embedded use with NAND and NOR Flash. It is widely used with Linux, RTOSs, or no OS at all, in consumer devices and critical infrastructure. It is available under GNU Public License, GPL, or on commercial terms from Aleph One.\";}}i:1;s:11:\"description\";}i:5;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"meta\";s:11:\"#attributes\";a:2:{s:4:\"name\";s:8:\"abstract\";s:7:\"content\";s:352:\"Yaffs (Yet Another Flash File System) is an open-source file system specifically designed to be fast, robust and suitable for embedded use with NAND and NOR Flash. It is widely used with Linux, RTOSs, or no OS at all, in consumer devices and critical infrastructure. It is available under GNU Public License, GPL, or on commercial terms from Aleph One.\";}}i:1;s:8:\"abstract\";}i:6;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"meta\";s:11:\"#attributes\";a:2:{s:4:\"name\";s:8:\"keywords\";s:7:\"content\";s:82:\"flash File System, flash, file System, flash storage, NAND flash, NOR flash, Yaffs\";}}i:1;s:8:\"keywords\";}i:7;a:2:{i:0;a:3:{s:4:\"#tag\";s:4:\"meta\";s:11:\"#attributes\";a:1:{s:7:\"charset\";s:5:\"utf-8\";}s:7:\"#weight\";i:-1000;}i:1;s:24:\"system_meta_content_type\";}i:8;a:2:{i:0;a:3:{s:5:\"#type\";s:8:\"html_tag\";s:4:\"#tag\";s:4:\"meta\";s:11:\"#attributes\";a:2:{s:4:\"name\";s:9:\"Generator\";s:7:\"content\";s:33:\"Drupal 8 (https://www.drupal.org)\";}}i:1;s:21:\"system_meta_generator\";}i:9;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"meta\";s:11:\"#attributes\";a:2:{s:4:\"name\";s:15:\"MobileOptimized\";s:7:\"content\";s:5:\"width\";}}i:1;s:15:\"MobileOptimized\";}i:10;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"meta\";s:11:\"#attributes\";a:2:{s:4:\"name\";s:16:\"HandheldFriendly\";s:7:\"content\";s:4:\"true\";}}i:1;s:16:\"HandheldFriendly\";}i:11;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"meta\";s:11:\"#attributes\";a:2:{s:4:\"name\";s:8:\"viewport\";s:7:\"content\";s:37:\"width=device-width, initial-scale=1.0\";}}i:1;s:8:\"viewport\";}i:12;a:2:{i:0;a:3:{s:5:\"#type\";s:8:\"html_tag\";s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:3:{s:3:\"rel\";s:10:\"stylesheet\";s:4:\"href\";s:125:\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSansRegular-fontfacekit/fontyourface-stylesheet.css\";s:5:\"media\";s:3:\"all\";}}i:1;s:21:\"fontsquirrel-api-1151\";}i:13;a:2:{i:0;a:3:{s:5:\"#type\";s:8:\"html_tag\";s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:3:{s:3:\"rel\";s:10:\"stylesheet\";s:4:\"href\";s:124:\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSansItalic-fontfacekit/fontyourface-stylesheet.css\";s:5:\"media\";s:3:\"all\";}}i:1;s:21:\"fontsquirrel-api-1152\";}i:14;a:2:{i:0;a:3:{s:5:\"#type\";s:8:\"html_tag\";s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:3:{s:3:\"rel\";s:10:\"stylesheet\";s:4:\"href\";s:122:\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSansBold-fontfacekit/fontyourface-stylesheet.css\";s:5:\"media\";s:3:\"all\";}}i:1;s:21:\"fontsquirrel-api-1153\";}i:15;a:2:{i:0;a:3:{s:5:\"#type\";s:8:\"html_tag\";s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:3:{s:3:\"rel\";s:10:\"stylesheet\";s:4:\"href\";s:123:\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSerifBold-fontfacekit/fontyourface-stylesheet.css\";s:5:\"media\";s:3:\"all\";}}i:1;s:21:\"fontsquirrel-api-1149\";}i:16;a:2:{i:0;a:3:{s:5:\"#type\";s:8:\"html_tag\";s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:3:{s:3:\"rel\";s:10:\"stylesheet\";s:4:\"href\";s:129:\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSerifBoldItalic-fontfacekit/fontyourface-stylesheet.css\";s:5:\"media\";s:3:\"all\";}}i:1;s:21:\"fontsquirrel-api-1150\";}i:17;a:2:{i:0;a:3:{s:5:\"#type\";s:8:\"html_tag\";s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:3:{s:3:\"rel\";s:10:\"stylesheet\";s:4:\"href\";s:125:\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSerifItalic-fontfacekit/fontyourface-stylesheet.css\";s:5:\"media\";s:3:\"all\";}}i:1;s:21:\"fontsquirrel-api-1148\";}i:18;a:2:{i:0;a:3:{s:5:\"#type\";s:8:\"html_tag\";s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:3:{s:3:\"rel\";s:10:\"stylesheet\";s:4:\"href\";s:126:\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSerifRegular-fontfacekit/fontyourface-stylesheet.css\";s:5:\"media\";s:3:\"all\";}}i:1;s:21:\"fontsquirrel-api-1147\";}i:19;a:2:{i:0;a:3:{s:5:\"#type\";s:8:\"html_tag\";s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:3:{s:3:\"rel\";s:10:\"stylesheet\";s:4:\"href\";s:128:\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSansBoldItalic-fontfacekit/fontyourface-stylesheet.css\";s:5:\"media\";s:3:\"all\";}}i:1;s:21:\"fontsquirrel-api-1154\";}i:20;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:3:{s:3:\"rel\";s:13:\"shortcut icon\";s:4:\"href\";s:38:\"/sites/default/files/yaffs_favicon.png\";s:4:\"type\";s:9:\"image/png\";}}i:1;s:67:\"html_head_link:shortcut icon:/sites/default/files/yaffs_favicon.png\";}i:21;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:2:{s:3:\"rel\";s:8:\"revision\";s:4:\"href\";s:5:\"/home\";}}i:1;s:29:\"html_head_link:revision:/home\";}}s:12:\"placeholders\";a:0:{}s:14:\"drupalSettings\";a:5:{s:4:\"path\";a:8:{s:7:\"baseUrl\";s:1:\"/\";s:10:\"scriptPath\";N;s:10:\"pathPrefix\";s:0:\"\";s:11:\"currentPath\";s:8:\"node/487\";s:18:\"currentPathIsAdmin\";b:0;s:7:\"isFront\";b:1;s:15:\"currentLanguage\";s:2:\"en\";s:12:\"currentQuery\";O:8:\"stdClass\":1:{s:6:\"author\";s:2:\"13\";}}s:15:\"pluralDelimiter\";s:1:\"\";s:9:\"bootstrap\";a:25:{s:28:\"forms_has_error_value_toggle\";i:1;s:15:\"modal_animation\";i:1;s:14:\"modal_backdrop\";s:4:\"true\";s:14:\"modal_keyboard\";i:1;s:10:\"modal_show\";i:1;s:10:\"modal_size\";s:0:\"\";s:15:\"popover_enabled\";i:1;s:17:\"popover_animation\";i:1;s:17:\"popover_container\";s:4:\"body\";s:15:\"popover_content\";s:0:\"\";s:13:\"popover_delay\";s:1:\"0\";s:12:\"popover_html\";i:0;s:17:\"popover_placement\";s:5:\"right\";s:16:\"popover_selector\";s:0:\"\";s:13:\"popover_title\";s:0:\"\";s:15:\"popover_trigger\";s:5:\"click\";s:25:\"popover_trigger_autoclose\";i:1;s:15:\"tooltip_enabled\";i:1;s:17:\"tooltip_animation\";i:1;s:17:\"tooltip_container\";s:4:\"body\";s:13:\"tooltip_delay\";s:1:\"0\";s:12:\"tooltip_html\";i:0;s:17:\"tooltip_placement\";s:9:\"auto left\";s:16:\"tooltip_selector\";s:0:\"\";s:15:\"tooltip_trigger\";s:5:\"hover\";}s:14:\"ajaxTrustedUrl\";a:1:{s:12:\"/search/node\";b:1;}s:4:\"user\";a:2:{s:3:\"uid\";i:0;s:15:\"permissionsHash\";s:64:\"aa7fc4c8fb40c7a8665ccd12fea07926dff0f59b9ee3346bc513c6399bee5b01\";}}s:11:\"http_header\";a:1:{i:0;a:3:{i:0;s:4:\"Link\";i:1;s:23:\"</home>; rel=\"revision\"\";i:2;b:0;}}}}',-1,1518157167.076,1,'block_content:18 block_content:23 block_content:25 block_content:27 block_content:28 block_content:29 block_content:30 block_content:7 block_content_view block_view config:block.block.choosingyaffs config:block.block.cookieinfo config:block.block.downloadyaffs config:block.block.footerlegal config:block.block.frontimagehighlight2 config:block.block.frontpagehero config:block.block.frontpageprimeryaffs config:block.block.mainnavigation config:block.block.mainnavigation_2 config:block.block.searchform config:block.block.sitebranding config:block.block.views_block__highlighted_yaffs_features_block_1 config:block.block.views_block__yaffs_admin_recent_content_block_1 config:block.block.views_block__yaffs_documents_highlights_block_1 config:block.block.views_block__yaffs_user_logos_block_1 config:block.block.yaffs_account_menu config:block.block.yaffs_block_10 config:block.block.yaffs_block_5 config:block.block.yaffs_block_6 config:block.block.yaffs_block_8 config:block.block.yaffs_block_9 config:block.block.yaffs_breadcrumbs config:block.block.yaffs_content config:block.block.yaffs_help config:block.block.yaffs_local_tasks config:block.block.yaffs_messages config:block.block.yaffs_page_title config:block.block.yaffs_user_21 config:block.block.yaffsinspace config:block_list config:color.theme.yaffs config:field.storage.node.body config:field.storage.node.field_icon_text config:field.storage.node.field_teaser_image config:field.storage.node.field_yaffs_user_logo config:field.storage.node.upload config:filter.format.basic_html config:filter.format.full_html config:filter.format.raw_html config:image.style.pdf_image config:image.style.small config:search.settings config:system.menu.account config:system.menu.main config:system.site config:user.role.anonymous config:views.view.highlighted_yaffs_features config:views.view.yaffs_documents_highlights config:views.view.yaffs_user_logos file:108 file:109 file:110 file:40 file:43 file:44 file:45 file:46 file:47 file:48 file:76 file:77 file:85 http_response media:5 media:8 media:9 node:32 node:344 node:353 node:384 node:385 node:388 node:389 node:397 node:398 node:399 node:400 node:401 node:407 node:408 node:409 node:448 node:451 node:457 node:460 node:462 node:466 node:487 node_list node_view rendered user:0 user:1','3569'),('https://yaffs.net/?author=14:html','O:31:\"Drupal\\Core\\Render\\HtmlResponse\":8:{s:7:\"headers\";O:50:\"Symfony\\Component\\HttpFoundation\\ResponseHeaderBag\":5:{s:23:\"\0*\0computedCacheControl\";a:2:{s:7:\"max-age\";s:3:\"300\";s:6:\"public\";b:1;}s:10:\"\0*\0cookies\";a:0:{}s:14:\"\0*\0headerNames\";a:14:{s:12:\"content-type\";s:12:\"Content-Type\";s:13:\"cache-control\";s:13:\"Cache-Control\";s:4:\"date\";s:4:\"Date\";s:22:\"x-drupal-dynamic-cache\";s:22:\"X-Drupal-Dynamic-Cache\";s:4:\"link\";s:4:\"Link\";s:15:\"x-ua-compatible\";s:15:\"X-UA-Compatible\";s:16:\"content-language\";s:16:\"Content-language\";s:22:\"x-content-type-options\";s:22:\"X-Content-Type-Options\";s:15:\"x-frame-options\";s:15:\"X-Frame-Options\";s:7:\"expires\";s:7:\"Expires\";s:13:\"last-modified\";s:13:\"Last-Modified\";s:4:\"etag\";s:4:\"ETag\";s:4:\"vary\";s:4:\"Vary\";s:11:\"x-generator\";s:11:\"X-Generator\";}s:10:\"\0*\0headers\";a:14:{s:12:\"content-type\";a:1:{i:0;s:24:\"text/html; charset=UTF-8\";}s:13:\"cache-control\";a:1:{i:0;s:19:\"max-age=300, public\";}s:4:\"date\";a:1:{i:0;s:29:\"Fri, 09 Feb 2018 06:19:29 GMT\";}s:22:\"x-drupal-dynamic-cache\";a:1:{i:0;s:4:\"MISS\";}s:4:\"link\";a:4:{i:0;s:23:\"</home>; rel=\"revision\"\";i:1;s:108:\"</sites/default/files/css/css_Ft-hGawuooABKJanSezg8PXovgOMbB_QLx9CIyXeHsA.css?ozekku>; rel=preload; as=style\";i:2;s:108:\"</sites/default/files/css/css_6qeLA6GBkZNPHWp9GdQIYovV3tYuKU-ts-HicZ-WeQQ.css?ozekku>; rel=preload; as=style\";i:3;s:99:\"</sites/default/files/js/js_2l0lF4i9o3aztHULbfajMT_RTqGCEN_lVC8JI48SILw.js>; rel=preload; as=script\";}s:15:\"x-ua-compatible\";a:1:{i:0;s:7:\"IE=edge\";}s:16:\"content-language\";a:1:{i:0;s:2:\"en\";}s:22:\"x-content-type-options\";a:1:{i:0;s:7:\"nosniff\";}s:15:\"x-frame-options\";a:1:{i:0;s:10:\"SAMEORIGIN\";}s:7:\"expires\";a:1:{i:0;s:29:\"Sun, 19 Nov 1978 05:00:00 GMT\";}s:13:\"last-modified\";a:1:{i:0;s:29:\"Fri, 09 Feb 2018 06:19:29 GMT\";}s:4:\"etag\";a:1:{i:0;s:12:\"\"1518157169\"\";}s:4:\"vary\";a:1:{i:0;s:6:\"Cookie\";}s:11:\"x-generator\";a:1:{i:0;s:33:\"Drupal 8 (https://www.drupal.org)\";}}s:15:\"\0*\0cacheControl\";a:2:{s:7:\"max-age\";s:3:\"300\";s:6:\"public\";b:1;}}s:10:\"\0*\0content\";s:51782:\"<!DOCTYPE html>\n<html  lang=\"en\" dir=\"ltr\" prefix=\"content: http://purl.org/rss/1.0/modules/content/  dc: http://purl.org/dc/terms/  foaf: http://xmlns.com/foaf/0.1/  og: http://ogp.me/ns#  rdfs: http://www.w3.org/2000/01/rdf-schema#  schema: http://schema.org/  sioc: http://rdfs.org/sioc/ns#  sioct: http://rdfs.org/sioc/types#  skos: http://www.w3.org/2004/02/skos/core#  xsd: http://www.w3.org/2001/XMLSchema# \">\n  <head>\n    <meta charset=\"utf-8\" />\n<meta name=\"title\" content=\"A Robust Flash File System Since 2002 | Yaffs - A Flash File System for embedded use\" />\n<link rel=\"shortlink\" href=\"https://yaffs.net/\" />\n<link rel=\"canonical\" href=\"https://yaffs.net/\" />\n<meta name=\"news_keywords\" content=\"Flash File System\" />\n<meta name=\"description\" content=\"Yaffs (Yet Another Flash File System) is an open-source file system specifically designed to be fast, robust and suitable for embedded use with NAND and NOR Flash. It is widely used with Linux, RTOSs, or no OS at all, in consumer devices and critical infrastructure. It is available under GNU Public License, GPL, or on commercial terms from Aleph One.\" />\n<meta name=\"abstract\" content=\"Yaffs (Yet Another Flash File System) is an open-source file system specifically designed to be fast, robust and suitable for embedded use with NAND and NOR Flash. It is widely used with Linux, RTOSs, or no OS at all, in consumer devices and critical infrastructure. It is available under GNU Public License, GPL, or on commercial terms from Aleph One.\" />\n<meta name=\"keywords\" content=\"flash File System, flash, file System, flash storage, NAND flash, NOR flash, Yaffs\" />\n<meta name=\"Generator\" content=\"Drupal 8 (https://www.drupal.org)\" />\n<meta name=\"MobileOptimized\" content=\"width\" />\n<meta name=\"HandheldFriendly\" content=\"true\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<link rel=\"stylesheet\" href=\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSansRegular-fontfacekit/fontyourface-stylesheet.css\" media=\"all\" />\n<link rel=\"stylesheet\" href=\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSansItalic-fontfacekit/fontyourface-stylesheet.css\" media=\"all\" />\n<link rel=\"stylesheet\" href=\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSansBold-fontfacekit/fontyourface-stylesheet.css\" media=\"all\" />\n<link rel=\"stylesheet\" href=\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSerifBold-fontfacekit/fontyourface-stylesheet.css\" media=\"all\" />\n<link rel=\"stylesheet\" href=\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSerifBoldItalic-fontfacekit/fontyourface-stylesheet.css\" media=\"all\" />\n<link rel=\"stylesheet\" href=\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSerifItalic-fontfacekit/fontyourface-stylesheet.css\" media=\"all\" />\n<link rel=\"stylesheet\" href=\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSerifRegular-fontfacekit/fontyourface-stylesheet.css\" media=\"all\" />\n<link rel=\"stylesheet\" href=\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSansBoldItalic-fontfacekit/fontyourface-stylesheet.css\" media=\"all\" />\n<link rel=\"shortcut icon\" href=\"/sites/default/files/yaffs_favicon.png\" type=\"image/png\" />\n<link rel=\"revision\" href=\"/home\" />\n\n    <title>A Robust Flash File System Since 2002 | Yaffs - A Flash File System for embedded use</title>\n    <link rel=\"stylesheet\" href=\"/sites/default/files/css/css_Ft-hGawuooABKJanSezg8PXovgOMbB_QLx9CIyXeHsA.css?ozekku\" media=\"all\" />\n<link rel=\"stylesheet\" href=\"/sites/default/files/css/css_6qeLA6GBkZNPHWp9GdQIYovV3tYuKU-ts-HicZ-WeQQ.css?ozekku\" media=\"all\" />\n\n    \n<!--[if lte IE 8]>\n<script src=\"/sites/default/files/js/js_VtafjXmRvoUgAzqzYTA3Wrjkx9wcWhjP0G4ZnnqRamA.js\"></script>\n<![endif]-->\n\n  </head>\n  <body class=\"fontyourface path-frontpage page-node-type-page navbar-is-fixed-top has-glyphicons\">\n    <a href=\"#main-content\" class=\"visually-hidden focusable skip-link\">\n      Skip to main content\n    </a>\n    <div style=\"background-color: ; color: \" id=\"environment-indicator\">\n  \n    </div>\n\n              <header class=\"navbar navbar-default navbar-fixed-top\" id=\"navbar\" role=\"banner\">\n              <div class=\"container\">\n            <div class=\"navbar-header\">\n          <div class=\"region region-navigation\">\n          <a class=\"logo navbar-btn pull-left\" href=\"/\" title=\"Home\" rel=\"home\">\n      <img src=\"/themes/custom/yaffs/logo.svg\" alt=\"Home\" />\n    </a>\n      \n  </div>\n\n                          <button type=\"button\" class=\"navbar-toggle\" data-toggle=\"collapse\" data-target=\"#navbar-collapse\">\n            <span class=\"sr-only\">Toggle navigation</span>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n          </button>\n              </div>\n\n                    <div id=\"navbar-collapse\" class=\"navbar-collapse collapse\">\n            <div class=\"region region-navigation-collapsible\">\n    <nav role=\"navigation\" aria-labelledby=\"block-mainnavigation-menu\" id=\"block-mainnavigation\">\n            <h2 class=\"sr-only\" id=\"block-mainnavigation-menu\">Main navigation</h2>\n\n      \n              <ul class=\"menu nav navbar-nav\">\n                            <li>\n        <a href=\"/\" data-drupal-link-system-path=\"&lt;front&gt;\">Home</a>\n                  </li>\n                        <li>\n        <a href=\"/support\" title=\"Help for Yaffs\" data-drupal-link-system-path=\"node/380\">Support</a>\n                  </li>\n                        <li>\n        <a href=\"/documents\" data-drupal-link-system-path=\"documents\">Documents</a>\n                  </li>\n                        <li>\n        <a href=\"/get-yaffs\" data-drupal-link-system-path=\"node/382\">Download</a>\n                  </li>\n                        <li>\n        <a href=\"/about-us\" data-drupal-link-system-path=\"node/325\">About us</a>\n                  </li>\n                        <li>\n        <a href=\"/contact\" data-drupal-link-system-path=\"node/73\">Contact</a>\n                  </li>\n        </ul>\n  \n\n\n  </nav>\n<div class=\"search-block-form block block-search block-search-form-block\" data-drupal-selector=\"search-block-form\" id=\"block-searchform\" role=\"search\">\n  \n    \n      <form action=\"/search/node\" method=\"get\" id=\"search-block-form\" accept-charset=\"UTF-8\">\n  <div class=\"form-item js-form-item form-type-search js-form-type-search form-item-keys js-form-item-keys form-no-label form-group\">\n      <label for=\"edit-keys\" class=\"control-label sr-only\">Search</label>\n  \n  \n  <div class=\"input-group\"><input title=\"Enter the terms you wish to search for.\" data-drupal-selector=\"edit-keys\" class=\"form-search form-control\" placeholder=\"Search\" type=\"search\" id=\"edit-keys\" name=\"keys\" value=\"\" size=\"15\" maxlength=\"128\" data-toggle=\"tooltip\" /><span class=\"input-group-btn\"><button type=\"submit\" value=\"Search\" class=\"button js-form-submit form-submit btn-primary btn icon-only\" name=\"\"><span class=\"sr-only\">Search</span><span class=\"icon glyphicon glyphicon-search\" aria-hidden=\"true\"></span></button></span></div>\n\n  \n  \n  </div>\n<div class=\"form-actions form-group js-form-wrapper form-wrapper\" data-drupal-selector=\"edit-actions\" id=\"edit-actions\"></div>\n\n</form>\n\n  </div>\n\n  </div>\n\n        </div>\n                    </div>\n          </header>\n  \n  <div role=\"main\" class=\"main-container container js-quickedit-main-content\">\n    <div class=\"row\">\n\n            \n            \n                  <section class=\"col-sm-12\">\n\n                                      <div class=\"highlighted\">  <div class=\"region region-highlighted\">\n    \n\n  </div>\n</div>\n                  \n                \n                \n                                      \n                  \n                          <a id=\"main-content\"></a>\n            <div class=\"region region-content\">\n        <h1 class=\"page-header\"><span property=\"schema:name\">A Robust Flash File System Since 2002</span>\n</h1>\n\n  <article role=\"article\" about=\"/home\" typeof=\"schema:WebPage\" class=\"page full clearfix\">\n\n  \n      <span property=\"schema:name\" content=\"A Robust Flash File System Since 2002\" class=\"hidden\"></span>\n\n\n  \n  <div class=\"content\">\n    \n            <div property=\"schema:text\" class=\"field field--name-body field--type-text-with-summary field--label-hidden field--item\">\n<p>Yaffs (Yet Another Flash File System) is an open-source file system specifically designed to be fast, robust and suitable for embedded use with NAND and NOR Flash. It is widely used with Linux, RTOSs, or no OS at all, in consumer devices, avionics, and critical infrastructure. It is available under GNU Public License, GPL, or on commercial terms from Aleph One.</p>\n<p>&nbsp;</p>\n</div>\n      \n  </div>\n\n</article>\n\n<section id=\"block-yaffsinspace\" class=\"panel yaffs-shout well block block-block-content block-block-content9f676777-54d9-40d2-86dd-174fff14ab1a clearfix\">\n  \n    \n\n      \n            <div class=\"field field--name-body field--type-text-with-summary field--label-hidden field--item\">\n<h3><em>New!</em> Yaffs in space!</h3>\n<p><strong><img alt=\"Tess satellite\" data-entity-type=\"file\" data-entity-uuid=\"f06319f1-b6ac-41e2-a70d-a4c4da605b87\" height=\"246\" src=\"/sites/default/files/inline-images/tess_satellite_0.gif\" width=\"347\" class=\"align-right\" />NASA TESS Mission </strong>This <strong>Transiting Exoplanet Survey Satellite (TESS)</strong> will discover thousands of exoplanets in orbit around the brightest stars in the sky.</p>\n<p>It is a project regularly using our Yaffs File System to store incoming data and preserve it, in the rigours of the space environment, before sending it back to Earth.</p>\n<p>In a two-year survey of the solar neighborhood, TESS will monitor more than 200,000 stars for temporary drops in brightness caused by planetary transits. This first-ever spaceborne all-sky transit survey will identify planets ranging from Earth-sized to gas giants, around a wide range of stellar types and orbital distances. No ground-based survey can achieve this feat.</p>\n<p>Some File Systems are not robust enough to be suitable for such exacting work.<br />\n </p>\n</div>\n      \n  </section>\n\n\n  </div>\n\n        \n                              <div class=\"front_highlight row\">\n              <div class=\"col-sm-4\">\n                    <div class=\"region region-front-highlight-1\">\n    <section id=\"block-choosingyaffs\" class=\"block block-block-content block-block-contentae8f54b9-5315-4995-a49e-c0780f3a88cc clearfix\">\n  \n    \n\n      \n            <div class=\"field field--name-body field--type-text-with-summary field--label-hidden field--item\"><a href=\"/documents/considerations-choosing-flash-file-system\">\n<article class=\"embedded-entity\">\n<img src=\"/sites/default/files/styles/max_325x325/public/2017-06/choosing_yaffs_0.jpg?itok=YuV5Z__e\" width=\"325\" height=\"325\" alt=\"Thumbnail\" title=\"Choosing Yaffs\" class=\"img-responsive\" />\n</article>\n</a> </div>\n      \n  </section>\n\n\n  </div>\n\n              </div>\n              <div class=\"col-sm-4\">\n                    <div class=\"region region-front-highlight-2\">\n    <section id=\"block-frontimagehighlight2\" class=\"block block-block-content block-block-contentfa53fc80-f3c4-4d6e-b947-0a3bcd479480 clearfix\">\n  \n    \n\n      \n            <div class=\"field field--name-body field--type-text-with-summary field--label-hidden field--item\"><a href=\"/yaffs-action\">\n<article class=\"embedded-entity\">\n<img src=\"/sites/default/files/styles/max_325x325/public/2017-06/atm_1.jpg?itok=HfIny6EH\" width=\"325\" height=\"325\" alt=\"Thumbnail\" title=\"ATM\" class=\"img-responsive\" />\n</article>\n</a> </div>\n      \n  </section>\n\n\n  </div>\n\n              </div>\n              <div class=\"col-sm-4\">\n                    <div class=\"region region-front-highlight-3\">\n    <section id=\"block-downloadyaffs\" class=\"block block-block-content block-block-contenteed71eb7-98b2-4109-aabe-7718283459ad clearfix\">\n  \n    \n\n      \n            <div class=\"field field--name-body field--type-text-with-summary field--label-hidden field--item\"><a href=\"/get-yaffs\">\n<article class=\"embedded-entity\">\n<img src=\"/sites/default/files/styles/max_325x325/public/2017-06/download_now_0.jpg?itok=XdRx8zkI\" width=\"325\" height=\"325\" alt=\"Thumbnail\" title=\"Download Yaffs\" class=\"img-responsive\" />\n</article>\n</a> </div>\n      \n  </section>\n\n\n  </div>\n\n              </div>\n            </div>\n                        </section>\n\n                </div>\n  </div>\n\n  <div class=\"container-fluid front-pane-1\">\n        <div class=\"container\">\n        \n    </div>\n  </div>\n\n  <div class=\"container-fluid front-pane-2\">\n        <div class=\"container\">\n          <div class=\"region region-front-pane-2\">\n    <section class=\"views-element-container block block-views block-views-blockyaffs-user-logos-block-1 clearfix\" id=\"block-views-block-yaffs-user-logos-block-1\">\n  \n    \n\n      <div class=\"form-group\"><div class=\"view view-yaffs-user-logos view-id-yaffs_user_logos view-display-id-block_1 js-view-dom-id-8a35fcda02584f84c79a8d5e2576f68f0216117953eb3ee7556ddd61dbbc1289\">\n  \n    \n      \n      <div class=\"view-content\">\n      <div id=\"views-bootstrap-yaffs-user-logos-block-1\"  class=\"grid views-view-grid horizontal\">\n            <div class=\"row\">\n                  <div class=\"col col-xs-12 col-sm-6 col-md-3 col-lg-3 \">\n            <div class=\"views-field views-field-field-yaffs-user-logo\"><div class=\"field-content\"><a href=\"/yaffs-action\">  <img src=\"/sites/default/files/styles/small/public/logos/designA_logo.png?itok=5VWxByrk\" width=\"200\" height=\"141\" alt=\"\" typeof=\"foaf:Image\" class=\"img-responsive\" />\n\n\n</a></div></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-6 col-md-3 col-lg-3 \">\n            <div class=\"views-field views-field-field-yaffs-user-logo\"><div class=\"field-content\"><a href=\"/yaffs-action\">  <img src=\"/sites/default/files/styles/small/public/logos/eaton_logo.png?itok=kExm8d-W\" width=\"200\" height=\"84\" alt=\"\" typeof=\"foaf:Image\" class=\"img-responsive\" />\n\n\n</a></div></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-6 col-md-3 col-lg-3 \">\n            <div class=\"views-field views-field-field-yaffs-user-logo\"><div class=\"field-content\"><a href=\"/yaffs-action\">  <img src=\"/sites/default/files/styles/small/public/logos/LANCOM_Logo_4c.png?itok=ZIDg8yYt\" width=\"200\" height=\"50\" alt=\"\" typeof=\"foaf:Image\" class=\"img-responsive\" />\n\n\n</a></div></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-6 col-md-3 col-lg-3 \">\n            <div class=\"views-field views-field-field-yaffs-user-logo\"><div class=\"field-content\"><a href=\"/yaffs-action\">  <img src=\"/sites/default/files/styles/small/public/logos/bernina_international_logo.png?itok=G8DeIWtW\" width=\"200\" height=\"30\" alt=\"\" typeof=\"foaf:Image\" class=\"img-responsive\" />\n\n\n</a></div></div>\n          </div>\n              </div>\n          <div class=\"row\">\n                  <div class=\"col col-xs-12 col-sm-6 col-md-3 col-lg-3 \">\n            <div class=\"views-field views-field-field-yaffs-user-logo\"><div class=\"field-content\"><a href=\"/yaffs-action\">  <img src=\"/sites/default/files/styles/small/public/logos/gallagher_logo.png?itok=lQyDJeN1\" width=\"200\" height=\"65\" alt=\"\" typeof=\"foaf:Image\" class=\"img-responsive\" />\n\n\n</a></div></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-6 col-md-3 col-lg-3 \">\n            <div class=\"views-field views-field-field-yaffs-user-logo\"><div class=\"field-content\"><a href=\"/yaffs-action\">  <img src=\"/sites/default/files/styles/small/public/logos/android_logo.png?itok=MShHoIK7\" width=\"170\" height=\"71\" alt=\"\" typeof=\"foaf:Image\" class=\"img-responsive\" />\n\n\n</a></div></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-6 col-md-3 col-lg-3 \">\n            <div class=\"views-field views-field-field-yaffs-user-logo\"><div class=\"field-content\"><a href=\"/yaffs-action\">  <img src=\"/sites/default/files/styles/small/public/logos/leica_logo.png?itok=Ne2u8w3-\" width=\"200\" height=\"130\" alt=\"\" typeof=\"foaf:Image\" class=\"img-responsive\" />\n\n\n</a></div></div>\n          </div>\n              </div>\n      </div>\n\n    </div>\n  \n            <div class=\"view-footer\">\n      <a class=\"btn btn-default\" href=\"/yaffs-action\">Who uses Yaffs? Read more...</a>\n    </div>\n    </div>\n</div>\n\n  </section>\n\n\n  </div>\n\n    </div>\n  </div>\n\n  <div class=\"container-fluid front-pane-3\">\n        <div class=\"container\">\n          <div class=\"region region-front-pane-3\">\n    <section class=\"views-element-container block block-views block-views-blockhighlighted-yaffs-features-block-1 clearfix\" id=\"block-views-block-highlighted-yaffs-features-block-1\">\n  \n    \n\n      <div class=\"form-group\"><div class=\"view view-highlighted-yaffs-features view-id-highlighted_yaffs_features view-display-id-block_1 js-view-dom-id-95fe550d5052828912ac5148bc15b78f3cf61f69a8797eb9f9fafb9077e0fe26\">\n  \n    \n      \n      <div class=\"view-content\">\n      <div id=\"views-bootstrap-highlighted-yaffs-features-block-1\"  class=\"grid views-view-grid horizontal\">\n            <div class=\"row\">\n                  <div class=\"col col-xs-12 col-sm-12 col-md-4 col-lg-4 \">\n            <div class=\"views-field views-field-field-icon-text\"><div class=\"field-content\"><i class=\"fa fa-thumbs-up\"></i></div></div><div class=\"views-field views-field-title\"><span class=\"field-content\"><a href=\"/features#384\"><h3>Royalty Free... </h3></a></span></div><div class=\"views-field views-field-body\"><div class=\"field-content\">Whether you use Yaffs under the GNU General Public Licence or under a commercial licence, Yaffs is free of any royalty. No need to worry about rising costs for your hit product!</div></div><div class=\"views-field views-field-edit-node\"><span class=\"field-content\"></span></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-12 col-md-4 col-lg-4 \">\n            <div class=\"views-field views-field-field-icon-text\"><div class=\"field-content\"><i class=\"fa fa-shield\"></i></div></div><div class=\"views-field views-field-title\"><span class=\"field-content\"><a href=\"/features#385\"><h3>A robust flash file system...</h3></a></span></div><div class=\"views-field views-field-body\"><div class=\"field-content\">After more than 100,000 <strong>random</strong> power-failures during reading or writing, a test file showed NO data corruption at all!</div></div><div class=\"views-field views-field-edit-node\"><span class=\"field-content\"></span></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-12 col-md-4 col-lg-4 \">\n            <div class=\"views-field views-field-field-icon-text\"><div class=\"field-content\"><i class=\"fa fa-heart\"></i></div></div><div class=\"views-field views-field-title\"><span class=\"field-content\"><a href=\"/features#388\"><h3>Yaffs is Open Source...</h3></a></span></div><div class=\"views-field views-field-body\"><div class=\"field-content\">You can have a look at the code at any time. <a href=\"/downloads\">Download it now</a>! And it\'s suitable for GPL and commercially licensed projects.</div></div><div class=\"views-field views-field-edit-node\"><span class=\"field-content\"></span></div>\n          </div>\n              </div>\n          <div class=\"row\">\n                  <div class=\"col col-xs-12 col-sm-12 col-md-4 col-lg-4 \">\n            <div class=\"views-field views-field-field-icon-text\"><div class=\"field-content\"><i class=\"fa fa-mobile-phone\"></i></div></div><div class=\"views-field views-field-title\"><span class=\"field-content\"><a href=\"/features#389\"><h3>Tried and tested in millions of devices...</h3></a></span></div><div class=\"views-field views-field-body\"><div class=\"field-content\">Yaffs is widely used in Linux and proprietary commercial RTOSs. It\'s been included in hundreds of devices, and shipped as part of Google\'s Android, with millions of units sold.</div></div><div class=\"views-field views-field-edit-node\"><span class=\"field-content\"></span></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-12 col-md-4 col-lg-4 \">\n            <div class=\"views-field views-field-field-icon-text\"><div class=\"field-content\"><i class=\"fa fa-space-shuttle\"></i></div></div><div class=\"views-field views-field-title\"><span class=\"field-content\"><a href=\"/features#407\"><h3>Booting is fast...</h3></a></span></div><div class=\"views-field views-field-body\"><div class=\"field-content\">It is important for a Flash filesystem to boot fast, so boot speed was a fundamental consideration in the design of Yaffs.</div></div><div class=\"views-field views-field-edit-node\"><span class=\"field-content\"></span></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-12 col-md-4 col-lg-4 \">\n            <div class=\"views-field views-field-field-icon-text\"><div class=\"field-content\"><i class=\"fa fa-users\"></i></div></div><div class=\"views-field views-field-title\"><span class=\"field-content\"><a href=\"/features#408\"><h3>An active community...</h3></a></span></div><div class=\"views-field views-field-body\"><div class=\"field-content\">There\'s an active community of people who use Yaffs and who have developed with Yaffs, just a click or two away.</div></div><div class=\"views-field views-field-edit-node\"><span class=\"field-content\"></span></div>\n          </div>\n              </div>\n      </div>\n\n    </div>\n  \n            <div class=\"view-footer\">\n      <a class=\"btn btn-default\" href=\"/features\">Lots more Yaffs features...</a>\n    </div>\n    </div>\n</div>\n\n  </section>\n\n\n  </div>\n\n    </div>\n  </div>\n\n  <div class=\"container-fluid front-pane-4\">\n        <div class=\"container\" >\n          <div class=\"region region-front-pane-4\">\n    <section class=\"views-element-container block block-views block-views-blockyaffs-documents-highlights-block-1 clearfix\" id=\"block-views-block-yaffs-documents-highlights-block-1\">\n  \n    \n\n      <div class=\"form-group\"><div class=\"view view-yaffs-documents-highlights view-id-yaffs_documents_highlights view-display-id-block_1 js-view-dom-id-273bf60b230e3faef44a6e67c34370278019b51f5d0e914b039f491b4d00cf06\">\n  \n    \n      \n      <div class=\"view-content\">\n      <div id=\"views-bootstrap-yaffs-documents-highlights-block-1\"  class=\"grid views-view-grid horizontal\">\n            <div class=\"row\">\n                  <div class=\"col col-xs-12 col-sm-12 col-md-6 col-lg-6 \">\n            <div class=\"views-field views-field-field-teaser-image\"><div class=\"field-content\"></div></div><div class=\"views-field views-field-title\"><h3 class=\"field-content\"><a href=\"/yaffs-licence-sample\" hreflang=\"und\">Yaffs Licence Sample</a></h3></div><div class=\"views-field views-field-body\"><div class=\"field-content\">While the Yaffs code is available free of charge under GNU General Public Licence, version 2, that entails the obligation to disclose Source Code for your application using Yaffs. An Aleph One Licence does not impose that obligation and so is attractive for proprietary projects. This sample Licence provides an example of the points we expect a Licence to cover.</div></div><div class=\"views-field views-field-upload-1\"><div class=\"field-content\"></div></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-12 col-md-6 col-lg-6 \">\n            <div class=\"views-field views-field-field-teaser-image\"><div class=\"field-content\"></div></div><div class=\"views-field views-field-title\"><h3 class=\"field-content\"><a href=\"/yaffs-overview\" hreflang=\"und\">Yaffs Overview</a></h3></div><div class=\"views-field views-field-body\"><div class=\"field-content\">YAFFS is a filesystem designed specifically for the characteristics of NAND flash. This page gives an overview of the project - what is available, how it works, how to use it, developer resources, and licensing options.</div></div><div class=\"views-field views-field-upload-1\"><div class=\"field-content\"></div></div>\n          </div>\n              </div>\n          <div class=\"row\">\n                  <div class=\"col col-xs-12 col-sm-12 col-md-6 col-lg-6 \">\n            <div class=\"views-field views-field-field-teaser-image\"><div class=\"field-content\"></div></div><div class=\"views-field views-field-title\"><h3 class=\"field-content\"><a href=\"/yaffs-licence-faqs\" hreflang=\"und\">Yaffs Licence FAQs</a></h3></div><div class=\"views-field views-field-body\"><div class=\"field-content\"><p>Some questions about the commercial licence for Yaffs and how we arrive at one.</p></div></div><div class=\"views-field views-field-upload-1\"><div class=\"field-content\"></div></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-12 col-md-6 col-lg-6 \">\n            <div class=\"views-field views-field-field-teaser-image\"><div class=\"field-content\"></div></div><div class=\"views-field views-field-title\"><h3 class=\"field-content\"><a href=\"/documents/faq\" hreflang=\"und\">FAQ</a></h3></div><div class=\"views-field views-field-body\"><div class=\"field-content\"><p>Common questions about Yaffs technical issues.</p></div></div><div class=\"views-field views-field-upload-1\"><div class=\"field-content\"></div></div>\n          </div>\n              </div>\n          <div class=\"row\">\n                  <div class=\"col col-xs-12 col-sm-12 col-md-6 col-lg-6 \">\n            <div class=\"views-field views-field-field-teaser-image\"><div class=\"field-content\"></div></div><div class=\"views-field views-field-title\"><h3 class=\"field-content\"><a href=\"/licences-more-background-and-detail\" hreflang=\"und\">Licences - more background and detail</a></h3></div><div class=\"views-field views-field-body\"><div class=\"field-content\"><p>More on the details and background of Licences for Yaffs</p></div></div><div class=\"views-field views-field-upload-1\"><div class=\"field-content\"></div></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-12 col-md-6 col-lg-6 \">\n            <div class=\"views-field views-field-field-teaser-image\"><div class=\"field-content\"><a href=\"/sites/default/files/downloads/ConsiderationsInChoosingAFlashFileSystem_0.pdf\">  <img src=\"/sites/default/files/styles/pdf_image/public/styles/pdf_image/public/downloads/ConsiderationsInChoosingAFlashFileSystem_0.pdf.png?itok=ROOk6w-T\" width=\"150\" height=\"212\" alt=\"Preview of ConsiderationsInChoosingAFlashFileSystem.pdf\" typeof=\"foaf:Image\" class=\"img-responsive\" />\n\n\n</a></div></div><div class=\"views-field views-field-title\"><h3 class=\"field-content\"><a href=\"/documents/considerations-choosing-flash-file-system\" hreflang=\"und\">Considerations in Choosing a Flash File System</a></h3></div><div class=\"views-field views-field-body\"><div class=\"field-content\">Failures in an embedded File System in a product are much more serious to the user than failures in an office computer.&nbsp; Power failures and failures to cache data properly can be avoided by choosing a FFS specifically designed for reliability from the ground up.</div></div><div class=\"views-field views-field-upload-1\"><div class=\"field-content\"><span class=\"file file--mime-application-pdf file--application-pdf icon-before\"><span class=\"file-icon\"><span class=\"icon glyphicon glyphicon-file text-primary\" aria-hidden=\"true\"></span></span><span class=\"file-link\"><a href=\"https://yaffs.net/sites/default/files/downloads/ConsiderationsInChoosingAFlashFileSystem_0.pdf\" type=\"application/pdf; length=131376\" title=\"Open file in new window\" target=\"_blank\" data-toggle=\"tooltip\" data-placement=\"bottom\">ConsiderationsInChoosingAFlashFileSystem.pdf</a></span><span class=\"file-size\">128.3 KB</span></span></div></div>\n          </div>\n              </div>\n          <div class=\"row\">\n                  <div class=\"col col-xs-12 col-sm-12 col-md-6 col-lg-6 \">\n            <div class=\"views-field views-field-field-teaser-image\"><div class=\"field-content\"><a href=\"/sites/default/files/downloads/HowYaffsWorks.pdf\">  <img src=\"/sites/default/files/styles/pdf_image/public/styles/pdf_image/public/downloads/HowYaffsWorks.pdf.png?itok=_nJu31C0\" width=\"150\" height=\"194\" alt=\"Preview of HowYaffsWorks.pdf\" typeof=\"foaf:Image\" class=\"img-responsive\" />\n\n\n</a></div></div><div class=\"views-field views-field-title\"><h3 class=\"field-content\"><a href=\"/documents/how-yaffs-works\" hreflang=\"und\">How Yaffs works</a></h3></div><div class=\"views-field views-field-body\"><div class=\"field-content\">This document gives an explanation of most of the core mechanisms that make Yaffs work. As of the time of writing this, the Yaffs2 code base includes approximately 19,000 lines of code making a very detailed discussion impractical. This document is the starting point for understanding Yaffs. Further detailed questions and discussions are welcomed on the Yaffs discussion list.</div></div><div class=\"views-field views-field-upload-1\"><div class=\"field-content\"><span class=\"file file--mime-application-pdf file--application-pdf icon-before\"><span class=\"file-icon\"><span class=\"icon glyphicon glyphicon-file text-primary\" aria-hidden=\"true\"></span></span><span class=\"file-link\"><a href=\"https://yaffs.net/sites/default/files/downloads/HowYaffsWorks.pdf\" type=\"application/pdf; length=402514\" title=\"Open file in new window\" target=\"_blank\" data-toggle=\"tooltip\" data-placement=\"bottom\">HowYaffsWorks.pdf</a></span><span class=\"file-size\">393.08 KB</span></span></div></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-12 col-md-6 col-lg-6 \">\n            <div class=\"views-field views-field-field-teaser-image\"><div class=\"field-content\"><a href=\"/sites/default/files/downloads/YaffsTuning.pdf\">  <img src=\"/sites/default/files/styles/pdf_image/public/styles/pdf_image/public/downloads/YaffsTuning.pdf.png?itok=idZTTQBs\" alt=\"Preview of YaffsTuning.pdf\" typeof=\"foaf:Image\" class=\"img-responsive\" />\n\n\n</a></div></div><div class=\"views-field views-field-title\"><h3 class=\"field-content\"><a href=\"/documents/yaffs-tuning\" hreflang=\"und\">Yaffs Tuning</a></h3></div><div class=\"views-field views-field-body\"><div class=\"field-content\"><p>This document describes the parameters which can be modified by the developer in the different phases of applying, debugging, and routine use of Yaffs.</p></div></div><div class=\"views-field views-field-upload-1\"><div class=\"field-content\"><span class=\"file file--mime-application-pdf file--application-pdf icon-before\"><span class=\"file-icon\"><span class=\"icon glyphicon glyphicon-file text-primary\" aria-hidden=\"true\"></span></span><span class=\"file-link\"><a href=\"https://yaffs.net/sites/default/files/downloads/YaffsTuning.pdf\" type=\"application/pdf; length=93667\" title=\"Open file in new window\" target=\"_blank\" data-toggle=\"tooltip\" data-placement=\"bottom\">YaffsTuning.pdf</a></span><span class=\"file-size\">91.47 KB</span></span></div></div>\n          </div>\n              </div>\n      </div>\n\n    </div>\n  \n            <div class=\"view-footer\">\n      <a class=\"btn btn-default\" href=\"/documents\">All the Yaffs documentation...</a>\n    </div>\n    </div>\n</div>\n\n  </section>\n\n\n  </div>\n\n    </div>\n  </div>\n\n    <div class=\"container-fluid front-pane-5\">\n                <div class=\"container\" >\n              <div class=\"region region-front-pane-5\">\n    <section id=\"block-frontpageprimeryaffs\" class=\"block block-block-content block-block-contente7a8d2de-4fbb-4680-9e18-fe4d8337f1d6 clearfix\">\n  \n    \n\n      \n            <div class=\"field field--name-body field--type-text-with-summary field--label-hidden field--item\">\n<h1>Flash file systems primer</h1>\n<h2>Background &amp; basics</h2>\n<h3><span>What is a </span><span>F</span><span>lash </span><span>F</span><span>ile </span><span>S</span><span>ystem</span>?</h3>\n<p><span>A <span>Flash File System</span> stores data on flash memory, rather than a hard drive. Flash is used because it’s faster, much more tolerant of physical stress and takes less power. A <span>flash filesystem</span> is used to manage the data and get the best out of flash memory.</span></p>\n<p><span>As two examples, a flash memory chip needs to be erased in blocks before it is rewritten and a flash file system will manage that; flash memory has a limited number of writes per block so many flash file systems incorporate a <span>wear levelling</span> mechanism to ensure the writes are spread out.</span></p>\n<p><span>A flash file system is most useful as a part of an embedded system,. As a developer, you <em>can</em>&nbsp;read from and write directly to your Flash memory on an embedded system, but unless your use is extremely limited, you\'ll probably find that you come up against problems that Flash file systems have already solved.</span></p>\n<h3>What are NAND flash &amp; NOR flash?</h3>\n<p><span>These are the two fundamental flash architectures and have very different characteristics in performance, reliability, erase cycles, life span, and price. They also differ fundamentally from hard disk drives, and so need specialised handling.</span></p>\n<table>\n<tbody>\n <tr>\n  <td>\n  <p>&nbsp;</p>\n   </td>\n  <td>\n  <p>NAND flash</p>\n   </td>\n  <td>\n  <p>NOR flash</p>\n   </td>\n </tr>\n <tr>\n  <td>\n  <p>Storage density</p>\n   </td>\n  <td>\n  <p>Higher</p>\n   </td>\n  <td>\n  <p>Lower</p>\n   </td>\n </tr>\n <tr>\n  <td>\n  <p>Read performance</p>\n   </td>\n  <td>\n  <p>Fast</p>\n   </td>\n  <td>\n  <p>Fast (may be slowed by serial access)</p>\n   </td>\n </tr>\n <tr>\n  <td>\n  <p>Write performance</p>\n   </td>\n  <td>\n  <p>Faster</p>\n   </td>\n  <td>\n  <p>Slower (may be slowed further by serial access)</p>\n   </td>\n </tr>\n <tr>\n  <td>\n  <p>Erase performance</p>\n   </td>\n  <td>\n  <p>Faster (low ms typically)</p>\n   </td>\n  <td>\n  <p>Slower (possibly seconds)</p>\n   </td>\n </tr>\n <tr>\n  <td>\n  <p>Storage reliability</p>\n   </td>\n  <td>\n  <p>Lower (without management)</p>\n   </td>\n  <td>\n  <p>Better</p>\n   </td>\n </tr>\n <tr>\n  <td>\n  <p>Life span</p>\n   </td>\n  <td>\n  <p>Higher</p>\n   </td>\n  <td>\n  <p>Lower</p>\n   </td>\n </tr>\n <tr>\n  <td>\n  <p>Price</p>\n   </td>\n  <td>\n  <p>Lower</p>\n   </td>\n  <td>\n  <p>Higher</p>\n   </td>\n </tr>\n</tbody>\n</table>\n<p><span>Yaffs is both an <span>embedded NAN</span><span>D flash file system</span> and an <span>embedded N</span><span>OR Flash file system</span>. It can handle SLC, TLC and MLC NAND. It also works on MLC and SLC NOR. And it can work with parallel or serial access including Serial Peripheral Bus (SPI).</span></p>\n<h3>What special functions does a <span>file system </span><span>for flash</span> include?</h3>\n<p><span>As well as the normal file system functions, a <span>flash file system embedded</span> in hardware should help the device to start and stop quickly and deal well with losing power with no warning, without corrupting the data; and, manage the foibles of flash memory, protecting the stored data with extreme reliability. (Read our paper <a href=\"/documents/considerations-choosing-flash-file-system\">Considerations in Choosing a Flash File System</a>.)</span></p>\n<p><span><span>To these ends, an embedded flash file system must employ extra steps to achieve these such as using log structuring, rather than traditional file structuring plus a flash translation layer; manage power loss and recovery; include flash memory wear levelling; deal with the unreliability of flash from read and write disturbs, by using error correction (ECC), bad block remapping, over provision and flash block refreshing; ensure it’s ready to write fast by using garbage collection and flash block erase to prepare; and manage writing while avoiding write amplification. </span></span></p>\n<h4>What is a log-structured file system?</h4>\n<p><span>Log structuring means that data is written to the file system as a sequence of changes to the file system. This has the advantage that there is less overhead, and so it\'s faster than a non-log-structured system. More important though is that it is more robust against power failure. It also means that a file may be fragmented. For hard drives, fragmentation can mean much slower access due to the time required to mechanically move the read heads around the disk, but flash memory has no moving parts so there is no overhead for flash.</span></p>\n<p><span>Yaffs is log structured a <span>flash file system </span><span>architecture</span> which is faster and more robust than the alternatives.</span></p>\n<h4>What is a <span>Flash Translation Layer</span> (FTL) ?</h4>\n<p><span>It is sometimes desirable to use regular block file systems (such as FAT) with flash memory. In such cases, a Flash Translation Layer presents flash memory or a flash file system as if it\'s an ordinary hard drive.</span></p>\n<p><span>An FTL is an incomplete storage solution it still requires a file system. This makes two layers where data can be damaged and lost: in the FTL and in the <span>flash memory </span><span>file system</span>.</span></p>\n<p><span>True <span>file systems for flash memory</span>, such as Yaffs, do not use FTLs. They deal directly with the idiosyncrasies of flash, providing a faster and more reliable solution.</span></p>\n<h4>What is power loss recovery?</h4>\n<p><span>When power to any storage device is suddenly lost, the device can end up in an unknown state and may have damaged areas. Most file systems have to work hard to ensure that they are in a consistent state after power loss. <span>E</span><span>mbedded file systems</span> <span>for flash</span> may make allowances for unscheduled power loss with a recovery process.</span></p>\n<p><span>Yaffs is built with fault tolerance as a guiding principle and so is designed so power loss is considered a normal event.</span></p>\n<h4>What is <span>wear levelling</span>?</h4>\n<p><span>Flash chips wear out. Each time a part of the flash memory is erased and written, it is slightly damaged. <span>Embedded f</span><span>lash file systems</span> note the danger, and sometimes try to spread the damage rather than having it concentrated in one region, so prolonging the life of the memory and the life of the device.</span></p>\n<p><span>Yaffs is designed so that extra <span>wear leveling</span> is unnecessary. Instead, it’s automatically <span>wear levelling</span> because of the log structure.</span></p>\n<h4>What is flash read disturb? What is flash write disturb?</h4>\n<p><span><a href=\"/documents/yaffs-nand-flash-failure-mitigation\">NAND flash may experience degradation or loss of data</a> owing to reads of pages in the same block or data changes in neighbouring blocks of the NAND device. This is particularly true for MLC NAND.</span></p>\n<p><span>Yaffs uses block refreshing to deal with such problems.</span></p>\n<h4>What is flash error correction/flash ECC?</h4>\n<p><span>There are ways in which flash memory can be corrupted – for instance F-N tunnelling problems and leaky oxide layers. See our <a href=\"/documents/yaffs-nand-flash-failure-mitigation\">detailed discussion of flash memory problems</a>.</span></p>\n<p><span>But every bit counts, and especially if it\'s part of critical data or essential to the correct working of a system. Flash error correction keeps track of a section of memory to tell if there\'s corruption, and provides ways to correct these small errors.</span></p>\n<p><span>Yaffs can use hardware or software based ECC.</span></p>\n<h4>What is bad-block remapping?</h4>\n<p><span>File systems are built upon storing data on physical media. But all media suffers deterioration. Some hardware or <span>flash media </span><span>file systems</span> keep lists of damaged regions and behind the scenes, substitute known good ones in their place.</span></p>\n<p><span>Because of the way that Yaffs works, there\'s no need for bad block remapping because it isn’t a block structured file system.</span></p>\n<h4>What is <span>o</span><span>ver-provisioning</span> ?</h4>\n<p><span>Knowing that the media will degrade and suffer errors, and needing space to alter data because of the nature of flash memory, sometimes a <span>flash memory based </span><span>file system</span> puts aside a portion of the media for this use. This is <span>overprovisioning</span>. Often this space used when remapping bad blocks.</span></p>\n<p><span>Because Yaffs is log structured, it has the advantage that it does not need <span>over provision</span><span>ing</span>, making more memory available to store data.</span></p>\n<h4>What is flash block refreshing?</h4>\n<p><span>To counteract the problems of unreliable flash memory – for instance errors due to read and write disturbs – a flash filesystem can refresh the memory, by making a new copy of a block.</span></p>\n<p><span>Yaffs includes flash block refreshing.</span></p>\n<h4>What is flash garbage collection?</h4>\n<p><span>When a file is deleted, or a part of a file is overwritten, file systems often simply mark the flash space as deleted, rather than removing it. Later they reclaim the space for reuse. This is garbage collection.</span></p>\n<p><span>Yaffs has garbage collection to maximise the amount of data the file system can store.</span></p>\n<h4>What is flash block erase?</h4>\n<p><span>Data must be written into blank areas of the flash chip, but erasing takes time. Rather than erase and write at the same time, in order to speed writes, NAND and <span>NOR flash file systems</span> can prepare blocks for later use. This is not usually necessary for other storage media.</span></p>\n<p><span>As part of garbage collection, Yaffs uses a block erase strategy.</span></p>\n<h4>What is flash write amplification ?</h4>\n<p><span>In many block-based flash file systems, when data changes the new data must be written to the disk, and then the old data must be marked as invalid. A small change to the data can have consequences that propagate involving writing to the memory twice or more as the old data is cleaned up by garbage collection and files are organised to take the minimum amount of space. This is write amplification - a single small write causing a cascade of writes (and erases) of whole blocks.</span></p>\n<p><span>Yaffs avoids much of this problem by being log structured, meaning that flash memory is slower to reach it\'s maximum number of cycles, while writing is faster.</span></p>\n<h2>How does Yaffs work?</h2>\n<p><span>You can find full details in our paper <a href=\"/documents/how-yaffs-works\">How Yaffs Works</a>&nbsp;but briefly, here\'s how it works.</span></p>\n<p><span>It\'s a log-structured filing system. This also ensures that Yaffs is wear-levelling is built into the design because no one part of the flash memory is used any more than another.</span></p>\n<p><span>A Yaffs object is anything that Yaffs stores - for instance a file or a directory.</span></p>\n<p><span>The memory in NAND flash is arranged in pages. A page is the unit of allocation and programming. In Yaffs, the unit of allocation is called the chunk. Typically a chunk will be the same as a NAND page, but there is flexibility to use chunks which map to multiple pages (eg. A system may have two NAND chips in parallel requiring 2x2048 = 4096 byte chunks) . This distinction gives a lot of flexibility in how the system can be configured.</span></p>\n<p><span>A fixed but configurable number of chunks form a block which is the unit of erasure.</span></p>\n<p><span>NAND flash is shipped with bad blocks and further blocks may go bad during the operation of the device so Yaffs detects and marks bad blocks.</span></p>\n<p><span>NAND flash also typically requires the use of some sort of error detection and correction code (ECC). Yaffs can either use existing ECC logic or provide its own.</span></p>\n<p><span>Yaffs maintains data in RAM about the file system, but this is not needed for Yaffs to work - so the device can safely lose power at any point without data corruption.</span></p>\n<p><span>Here\'s how the Yaffs filesystem works to ensure data safety and a very fast startup... At regular points and on controlled shutdown, checkpoint blocks are written to the flash memory, containing all the data to quickly rebuild the file system. Under usual circumstances this checkpoint is used when a device is started, to very quickly rebuild the RAM data about the file system. If the checkpoint is determined to be corrupted, or if the user requested then the file system is rebuilt by scanning.</span></p>\n<p><span>To do this, Yaffs makes a prescan, to find the sequence numbers for blocks. Then it scans through blocks backwards to build up the list of chunks that make up objects. It speeds up this process by using Block Summaries, which are collections of all the tags in a data in a block. (But it\'s still always possible to go back to the chunks themselves, to find the tags, if a summary is missing or damaged.)</span></p>\n<p><span>And tags are how Yaffs tells that a chunk belongs to a particular object.</span></p>\n<p><span>Tags are also how Yaffs knows which chunks make up the current version of an object... Because the file system is log structured, if an object has been updated, only the latest chunks are used, giving the correct version of the object. A full description of the process is available in the technical documentation, and of course you can browse the code to see exactly how it all works; there\'s a lot more to tags, the metadata that they can hold, how they are stored, and how tags are used to link together objects into a file system with a POSIX interface.</span></p>\n<p><span>And of course that\'s not the end of the story. There\'s caching to deal with repeated small changes to data. There\'s garbage collection to let space be re-used, and Yaffs deals with collecting garbage differently depending on whether there\'s lots of free space or only a little. And part of making Yaffs a high performance flash file system is to make sure that re-useable blocks are erased well before they are needed, so that writing involves only a single operation. There\'s lazy loading to reduce scanning time. And all of this is built in a portable way, so that Yaffs can be configured to match almost any hardware, and can be ported to any operating system, or work on bare metal without an operating system. There\'s a test harness which is used to subject Yaffs to power failure, and ensure it works even with external data corruption. That\'s what makes it robust enough to send into space and to handle hundreds of terabytes of mission critical data.</span></p>\n<h4>Why is Yaffs special as an embedded flash file system?</h4>\n<p><span>Yaffs has been in use since 2002, and so it is hardened. It has been used in everything from phones to sewing machines to satellites. It is popular with Aerospace companies, and firms managing large infrastructure and in Point-of-Sale (POS) equipment (where customer feedback is very rapid!) It has been used in extreme conditions where it must not lose data, and where there is no chance for maintenance. It\'s been used for very large file systems up to 190TB. It\'s been used for safety critical applications, and millions of consumer devices.</span></p>\n<p><span>We carry out testing in a <a href=\"/documents/yaffs-robustness-and-testing\">rig which can simulate random power failures</a> and proved its reliability after tens to hundreds of millions of power failures.&nbsp;It\'s designed with an understanding of the constraints of flash memory and for speed.</span></p>\n<p><span>Yaffs works on multiple operating systems – Linux, VxWorks, Windows CE, eCos. - and also directly on bare metal, with no operating system. And it\'s easy to integrate into your RTOS or application using the Yaffs Direct Interface. It works with multiple types of flash memory - NAND &amp; NOR, SLC, MLC &amp; TLC.&nbsp;It\'s endian neutral. It\'s been used with 32-bit and 64-bit CPUs including MIPS, 68000, ARM, ColdFire, PowerPC and x86 variants. Yaffs has even been used with various DSP architectures! And it\'ll work with 16-bit with some tuning. So it can be configured to work with your design and the flash geometry that you need.</span></p>\n<p><span>And it\'s a <span>free embedded flash file system - </span><span>it’s open</span> <span>source</span>! <a href=\"/get-yaffs\">Grab the GPL version now</a>! Check out our the active community. And that\'s not the whole story - there are lots more reasons that make Yaffs special.&nbsp;</span></p>\n<p>&nbsp;</p>\n</div>\n      \n  </section>\n\n\n  </div>\n\n        </div>\n    </div>\n\n      <footer class=\"footer container\" role=\"contentinfo\">\n        <div class=\"primary_footer row\">\n            <div class=\"col-sm-3\">\n                  <div class=\"region region-footer-col1\">\n    <section id=\"block-yaffs-block-6\" class=\"block block-block-content block-block-content6c2d4b45-4dba-4b2d-8b9f-76701bf27533 clearfix\">\n  \n    \n\n      \n            <div class=\"field field--name-body field--type-text-with-summary field--label-hidden field--item\">\n<ul class=\"fa-ul\">\n<li><i class=\"fa-li fa fa-phone\"></i>+44 (0)1223 811679</li>\n<li><i class=\"fa-li fa fa-envelope\"></i><a href=\"denied:mailto:info@aleph1.co.uk?Subject=Website contact\" target=\"_top\">info@aleph1.co.uk</a></li>\n</ul>\n</div>\n      \n  </section>\n\n\n  </div>\n\n            </div>\n            <div class=\"col-sm-3\">\n                \n            </div>\n            <div class=\"col-sm-3\">\n                \n            </div>\n            <div class=\"col-sm-3\">\n                  <div class=\"region region-footer-col4\">\n    <section id=\"block-footerlegal\" class=\"block block-block-content block-block-content78ab593d-35b6-4772-a141-30216e7fcbb2 clearfix\">\n  \n    \n\n      \n            <div class=\"field field--name-body field--type-text-with-summary field--label-hidden field--item\">\n<p class=\"text-align-right\">&nbsp;<a href=\"/legal\">Legal &amp; Cookies</a></p>\n</div>\n      \n  </section>\n\n<section id=\"block-cookieinfo\" class=\"block block-block-content block-block-content4848c58d-90df-4819-81d8-0f9568eeeaac clearfix\">\n  \n    \n\n      \n            <div class=\"field field--name-body field--type-text-with-summary field--label-hidden field--item\">\n<p class=\"text-align-justify\"><br />\nWe use <a href=\"/legal\">cookies on this site</a>. By using it, you are giving us consent to set cookies.</p>\n</div>\n      \n  </section>\n\n\n  </div>\n\n            </div>\n        </div>\n        <div class = \"secondary_footer row\">\n            <div class=\"col-sm-12\">\n                <div class=\"region region-footer\">\n    <nav role=\"navigation\" aria-labelledby=\"block-yaffs-account-menu-menu\" id=\"block-yaffs-account-menu\">\n            <h2 class=\"sr-only\" id=\"block-yaffs-account-menu-menu\">User account menu</h2>\n\n      \n              <ul class=\"menu nav navbar-nav navbar-right\">\n                            <li>\n        <a href=\"/user/login\" data-drupal-link-system-path=\"user/login\">Log in</a>\n                  </li>\n        </ul>\n  \n\n\n  </nav>\n\n  </div>\n\n            </div>\n        </div>\n    </footer>\n  \n    \n    <script type=\"application/json\" data-drupal-selector=\"drupal-settings-json\">{\"path\":{\"baseUrl\":\"\\/\",\"scriptPath\":null,\"pathPrefix\":\"\",\"currentPath\":\"node\\/487\",\"currentPathIsAdmin\":false,\"isFront\":true,\"currentLanguage\":\"en\",\"currentQuery\":{\"author\":\"14\"}},\"pluralDelimiter\":\"\\u0003\",\"bootstrap\":{\"forms_has_error_value_toggle\":1,\"modal_animation\":1,\"modal_backdrop\":\"true\",\"modal_keyboard\":1,\"modal_show\":1,\"modal_size\":\"\",\"popover_enabled\":1,\"popover_animation\":1,\"popover_container\":\"body\",\"popover_content\":\"\",\"popover_delay\":\"0\",\"popover_html\":0,\"popover_placement\":\"right\",\"popover_selector\":\"\",\"popover_title\":\"\",\"popover_trigger\":\"click\",\"popover_trigger_autoclose\":1,\"tooltip_enabled\":1,\"tooltip_animation\":1,\"tooltip_container\":\"body\",\"tooltip_delay\":\"0\",\"tooltip_html\":0,\"tooltip_placement\":\"auto left\",\"tooltip_selector\":\"\",\"tooltip_trigger\":\"hover\"},\"ajaxTrustedUrl\":{\"\\/search\\/node\":true},\"user\":{\"uid\":0,\"permissionsHash\":\"aa7fc4c8fb40c7a8665ccd12fea07926dff0f59b9ee3346bc513c6399bee5b01\"}}</script>\n<script src=\"/sites/default/files/js/js_2l0lF4i9o3aztHULbfajMT_RTqGCEN_lVC8JI48SILw.js\"></script>\n\n  </body>\n</html>\n\";s:10:\"\0*\0version\";s:3:\"1.0\";s:13:\"\0*\0statusCode\";i:200;s:13:\"\0*\0statusText\";s:2:\"OK\";s:10:\"\0*\0charset\";N;s:23:\"\0*\0cacheabilityMetadata\";O:35:\"Drupal\\Core\\Cache\\CacheableMetadata\":3:{s:16:\"\0*\0cacheContexts\";a:18:{i:0;s:26:\"languages:language_content\";i:1;s:28:\"languages:language_interface\";i:2;s:5:\"route\";i:3;s:32:\"route.menu_active_trails:account\";i:4;s:29:\"route.menu_active_trails:main\";i:5;s:5:\"theme\";i:6;s:8:\"timezone\";i:7;s:8:\"url.path\";i:8;s:17:\"url.path.is_front\";i:9;s:15:\"url.path.parent\";i:10;s:30:\"url.query_args:_wrapper_format\";i:11;s:8:\"url.site\";i:12;s:4:\"user\";i:13;s:21:\"user.node_grants:view\";i:14;s:16:\"user.permissions\";i:15;s:10:\"user.roles\";i:16;s:20:\"user.roles:anonymous\";i:17;s:24:\"user.roles:authenticated\";}s:12:\"\0*\0cacheTags\";a:103:{i:0;s:16:\"block_content:18\";i:1;s:16:\"block_content:23\";i:2;s:16:\"block_content:25\";i:3;s:16:\"block_content:27\";i:4;s:16:\"block_content:28\";i:5;s:16:\"block_content:29\";i:6;s:16:\"block_content:30\";i:7;s:15:\"block_content:7\";i:8;s:18:\"block_content_view\";i:9;s:10:\"block_view\";i:10;s:32:\"config:block.block.choosingyaffs\";i:11;s:29:\"config:block.block.cookieinfo\";i:12;s:32:\"config:block.block.downloadyaffs\";i:13;s:30:\"config:block.block.footerlegal\";i:14;s:39:\"config:block.block.frontimagehighlight2\";i:15;s:32:\"config:block.block.frontpagehero\";i:16;s:39:\"config:block.block.frontpageprimeryaffs\";i:17;s:33:\"config:block.block.mainnavigation\";i:18;s:35:\"config:block.block.mainnavigation_2\";i:19;s:29:\"config:block.block.searchform\";i:20;s:31:\"config:block.block.sitebranding\";i:21;s:66:\"config:block.block.views_block__highlighted_yaffs_features_block_1\";i:22;s:66:\"config:block.block.views_block__yaffs_admin_recent_content_block_1\";i:23;s:66:\"config:block.block.views_block__yaffs_documents_highlights_block_1\";i:24;s:56:\"config:block.block.views_block__yaffs_user_logos_block_1\";i:25;s:37:\"config:block.block.yaffs_account_menu\";i:26;s:33:\"config:block.block.yaffs_block_10\";i:27;s:32:\"config:block.block.yaffs_block_5\";i:28;s:32:\"config:block.block.yaffs_block_6\";i:29;s:32:\"config:block.block.yaffs_block_8\";i:30;s:32:\"config:block.block.yaffs_block_9\";i:31;s:36:\"config:block.block.yaffs_breadcrumbs\";i:32;s:32:\"config:block.block.yaffs_content\";i:33;s:29:\"config:block.block.yaffs_help\";i:34;s:36:\"config:block.block.yaffs_local_tasks\";i:35;s:33:\"config:block.block.yaffs_messages\";i:36;s:35:\"config:block.block.yaffs_page_title\";i:37;s:32:\"config:block.block.yaffs_user_21\";i:38;s:31:\"config:block.block.yaffsinspace\";i:39;s:17:\"config:block_list\";i:40;s:24:\"config:color.theme.yaffs\";i:41;s:30:\"config:field.storage.node.body\";i:42;s:41:\"config:field.storage.node.field_icon_text\";i:43;s:44:\"config:field.storage.node.field_teaser_image\";i:44;s:47:\"config:field.storage.node.field_yaffs_user_logo\";i:45;s:32:\"config:field.storage.node.upload\";i:46;s:31:\"config:filter.format.basic_html\";i:47;s:30:\"config:filter.format.full_html\";i:48;s:29:\"config:filter.format.raw_html\";i:49;s:28:\"config:image.style.pdf_image\";i:50;s:24:\"config:image.style.small\";i:51;s:22:\"config:search.settings\";i:52;s:26:\"config:system.menu.account\";i:53;s:23:\"config:system.menu.main\";i:54;s:18:\"config:system.site\";i:55;s:26:\"config:user.role.anonymous\";i:56;s:44:\"config:views.view.highlighted_yaffs_features\";i:57;s:44:\"config:views.view.yaffs_documents_highlights\";i:58;s:34:\"config:views.view.yaffs_user_logos\";i:59;s:8:\"file:108\";i:60;s:8:\"file:109\";i:61;s:8:\"file:110\";i:62;s:7:\"file:40\";i:63;s:7:\"file:43\";i:64;s:7:\"file:44\";i:65;s:7:\"file:45\";i:66;s:7:\"file:46\";i:67;s:7:\"file:47\";i:68;s:7:\"file:48\";i:69;s:7:\"file:76\";i:70;s:7:\"file:77\";i:71;s:7:\"file:85\";i:72;s:13:\"http_response\";i:73;s:7:\"media:5\";i:74;s:7:\"media:8\";i:75;s:7:\"media:9\";i:76;s:7:\"node:32\";i:77;s:8:\"node:344\";i:78;s:8:\"node:353\";i:79;s:8:\"node:384\";i:80;s:8:\"node:385\";i:81;s:8:\"node:388\";i:82;s:8:\"node:389\";i:83;s:8:\"node:397\";i:84;s:8:\"node:398\";i:85;s:8:\"node:399\";i:86;s:8:\"node:400\";i:87;s:8:\"node:401\";i:88;s:8:\"node:407\";i:89;s:8:\"node:408\";i:90;s:8:\"node:409\";i:91;s:8:\"node:448\";i:92;s:8:\"node:451\";i:93;s:8:\"node:457\";i:94;s:8:\"node:460\";i:95;s:8:\"node:462\";i:96;s:8:\"node:466\";i:97;s:8:\"node:487\";i:98;s:9:\"node_list\";i:99;s:9:\"node_view\";i:100;s:8:\"rendered\";i:101;s:6:\"user:0\";i:102;s:6:\"user:1\";}s:14:\"\0*\0cacheMaxAge\";i:-1;}s:14:\"\0*\0attachments\";a:5:{s:7:\"library\";a:10:{i:0;s:14:\"core/html5shiv\";i:1;s:11:\"system/base\";i:2;s:15:\"bootstrap/theme\";i:3;s:20:\"yaffs/global-styling\";i:4;s:23:\"yaffs/bootstrap-scripts\";i:5;s:19:\"yaffs/yaffs-helpers\";i:6;s:17:\"bootstrap/popover\";i:7;s:17:\"bootstrap/tooltip\";i:8;s:18:\"views/views.module\";i:10;s:50:\"environment_indicator/drupal.environment_indicator\";}s:9:\"html_head\";a:22:{i:0;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"meta\";s:11:\"#attributes\";a:2:{s:4:\"name\";s:5:\"title\";s:7:\"content\";s:84:\"A Robust Flash File System Since 2002 | Yaffs - A Flash File System for embedded use\";}}i:1;s:5:\"title\";}i:1;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:2:{s:3:\"rel\";s:9:\"shortlink\";s:4:\"href\";s:18:\"https://yaffs.net/\";}}i:1;s:9:\"shortlink\";}i:2;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:2:{s:3:\"rel\";s:9:\"canonical\";s:4:\"href\";s:18:\"https://yaffs.net/\";}}i:1;s:13:\"canonical_url\";}i:3;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"meta\";s:11:\"#attributes\";a:2:{s:4:\"name\";s:13:\"news_keywords\";s:7:\"content\";s:17:\"Flash File System\";}}i:1;s:13:\"news_keywords\";}i:4;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"meta\";s:11:\"#attributes\";a:2:{s:4:\"name\";s:11:\"description\";s:7:\"content\";s:352:\"Yaffs (Yet Another Flash File System) is an open-source file system specifically designed to be fast, robust and suitable for embedded use with NAND and NOR Flash. It is widely used with Linux, RTOSs, or no OS at all, in consumer devices and critical infrastructure. It is available under GNU Public License, GPL, or on commercial terms from Aleph One.\";}}i:1;s:11:\"description\";}i:5;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"meta\";s:11:\"#attributes\";a:2:{s:4:\"name\";s:8:\"abstract\";s:7:\"content\";s:352:\"Yaffs (Yet Another Flash File System) is an open-source file system specifically designed to be fast, robust and suitable for embedded use with NAND and NOR Flash. It is widely used with Linux, RTOSs, or no OS at all, in consumer devices and critical infrastructure. It is available under GNU Public License, GPL, or on commercial terms from Aleph One.\";}}i:1;s:8:\"abstract\";}i:6;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"meta\";s:11:\"#attributes\";a:2:{s:4:\"name\";s:8:\"keywords\";s:7:\"content\";s:82:\"flash File System, flash, file System, flash storage, NAND flash, NOR flash, Yaffs\";}}i:1;s:8:\"keywords\";}i:7;a:2:{i:0;a:3:{s:4:\"#tag\";s:4:\"meta\";s:11:\"#attributes\";a:1:{s:7:\"charset\";s:5:\"utf-8\";}s:7:\"#weight\";i:-1000;}i:1;s:24:\"system_meta_content_type\";}i:8;a:2:{i:0;a:3:{s:5:\"#type\";s:8:\"html_tag\";s:4:\"#tag\";s:4:\"meta\";s:11:\"#attributes\";a:2:{s:4:\"name\";s:9:\"Generator\";s:7:\"content\";s:33:\"Drupal 8 (https://www.drupal.org)\";}}i:1;s:21:\"system_meta_generator\";}i:9;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"meta\";s:11:\"#attributes\";a:2:{s:4:\"name\";s:15:\"MobileOptimized\";s:7:\"content\";s:5:\"width\";}}i:1;s:15:\"MobileOptimized\";}i:10;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"meta\";s:11:\"#attributes\";a:2:{s:4:\"name\";s:16:\"HandheldFriendly\";s:7:\"content\";s:4:\"true\";}}i:1;s:16:\"HandheldFriendly\";}i:11;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"meta\";s:11:\"#attributes\";a:2:{s:4:\"name\";s:8:\"viewport\";s:7:\"content\";s:37:\"width=device-width, initial-scale=1.0\";}}i:1;s:8:\"viewport\";}i:12;a:2:{i:0;a:3:{s:5:\"#type\";s:8:\"html_tag\";s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:3:{s:3:\"rel\";s:10:\"stylesheet\";s:4:\"href\";s:125:\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSansRegular-fontfacekit/fontyourface-stylesheet.css\";s:5:\"media\";s:3:\"all\";}}i:1;s:21:\"fontsquirrel-api-1151\";}i:13;a:2:{i:0;a:3:{s:5:\"#type\";s:8:\"html_tag\";s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:3:{s:3:\"rel\";s:10:\"stylesheet\";s:4:\"href\";s:124:\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSansItalic-fontfacekit/fontyourface-stylesheet.css\";s:5:\"media\";s:3:\"all\";}}i:1;s:21:\"fontsquirrel-api-1152\";}i:14;a:2:{i:0;a:3:{s:5:\"#type\";s:8:\"html_tag\";s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:3:{s:3:\"rel\";s:10:\"stylesheet\";s:4:\"href\";s:122:\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSansBold-fontfacekit/fontyourface-stylesheet.css\";s:5:\"media\";s:3:\"all\";}}i:1;s:21:\"fontsquirrel-api-1153\";}i:15;a:2:{i:0;a:3:{s:5:\"#type\";s:8:\"html_tag\";s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:3:{s:3:\"rel\";s:10:\"stylesheet\";s:4:\"href\";s:123:\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSerifBold-fontfacekit/fontyourface-stylesheet.css\";s:5:\"media\";s:3:\"all\";}}i:1;s:21:\"fontsquirrel-api-1149\";}i:16;a:2:{i:0;a:3:{s:5:\"#type\";s:8:\"html_tag\";s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:3:{s:3:\"rel\";s:10:\"stylesheet\";s:4:\"href\";s:129:\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSerifBoldItalic-fontfacekit/fontyourface-stylesheet.css\";s:5:\"media\";s:3:\"all\";}}i:1;s:21:\"fontsquirrel-api-1150\";}i:17;a:2:{i:0;a:3:{s:5:\"#type\";s:8:\"html_tag\";s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:3:{s:3:\"rel\";s:10:\"stylesheet\";s:4:\"href\";s:125:\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSerifItalic-fontfacekit/fontyourface-stylesheet.css\";s:5:\"media\";s:3:\"all\";}}i:1;s:21:\"fontsquirrel-api-1148\";}i:18;a:2:{i:0;a:3:{s:5:\"#type\";s:8:\"html_tag\";s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:3:{s:3:\"rel\";s:10:\"stylesheet\";s:4:\"href\";s:126:\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSerifRegular-fontfacekit/fontyourface-stylesheet.css\";s:5:\"media\";s:3:\"all\";}}i:1;s:21:\"fontsquirrel-api-1147\";}i:19;a:2:{i:0;a:3:{s:5:\"#type\";s:8:\"html_tag\";s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:3:{s:3:\"rel\";s:10:\"stylesheet\";s:4:\"href\";s:128:\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSansBoldItalic-fontfacekit/fontyourface-stylesheet.css\";s:5:\"media\";s:3:\"all\";}}i:1;s:21:\"fontsquirrel-api-1154\";}i:20;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:3:{s:3:\"rel\";s:13:\"shortcut icon\";s:4:\"href\";s:38:\"/sites/default/files/yaffs_favicon.png\";s:4:\"type\";s:9:\"image/png\";}}i:1;s:67:\"html_head_link:shortcut icon:/sites/default/files/yaffs_favicon.png\";}i:21;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:2:{s:3:\"rel\";s:8:\"revision\";s:4:\"href\";s:5:\"/home\";}}i:1;s:29:\"html_head_link:revision:/home\";}}s:12:\"placeholders\";a:0:{}s:14:\"drupalSettings\";a:5:{s:4:\"path\";a:8:{s:7:\"baseUrl\";s:1:\"/\";s:10:\"scriptPath\";N;s:10:\"pathPrefix\";s:0:\"\";s:11:\"currentPath\";s:8:\"node/487\";s:18:\"currentPathIsAdmin\";b:0;s:7:\"isFront\";b:1;s:15:\"currentLanguage\";s:2:\"en\";s:12:\"currentQuery\";O:8:\"stdClass\":1:{s:6:\"author\";s:2:\"14\";}}s:15:\"pluralDelimiter\";s:1:\"\";s:9:\"bootstrap\";a:25:{s:28:\"forms_has_error_value_toggle\";i:1;s:15:\"modal_animation\";i:1;s:14:\"modal_backdrop\";s:4:\"true\";s:14:\"modal_keyboard\";i:1;s:10:\"modal_show\";i:1;s:10:\"modal_size\";s:0:\"\";s:15:\"popover_enabled\";i:1;s:17:\"popover_animation\";i:1;s:17:\"popover_container\";s:4:\"body\";s:15:\"popover_content\";s:0:\"\";s:13:\"popover_delay\";s:1:\"0\";s:12:\"popover_html\";i:0;s:17:\"popover_placement\";s:5:\"right\";s:16:\"popover_selector\";s:0:\"\";s:13:\"popover_title\";s:0:\"\";s:15:\"popover_trigger\";s:5:\"click\";s:25:\"popover_trigger_autoclose\";i:1;s:15:\"tooltip_enabled\";i:1;s:17:\"tooltip_animation\";i:1;s:17:\"tooltip_container\";s:4:\"body\";s:13:\"tooltip_delay\";s:1:\"0\";s:12:\"tooltip_html\";i:0;s:17:\"tooltip_placement\";s:9:\"auto left\";s:16:\"tooltip_selector\";s:0:\"\";s:15:\"tooltip_trigger\";s:5:\"hover\";}s:14:\"ajaxTrustedUrl\";a:1:{s:12:\"/search/node\";b:1;}s:4:\"user\";a:2:{s:3:\"uid\";i:0;s:15:\"permissionsHash\";s:64:\"aa7fc4c8fb40c7a8665ccd12fea07926dff0f59b9ee3346bc513c6399bee5b01\";}}s:11:\"http_header\";a:1:{i:0;a:3:{i:0;s:4:\"Link\";i:1;s:23:\"</home>; rel=\"revision\"\";i:2;b:0;}}}}',-1,1518157169.640,1,'block_content:18 block_content:23 block_content:25 block_content:27 block_content:28 block_content:29 block_content:30 block_content:7 block_content_view block_view config:block.block.choosingyaffs config:block.block.cookieinfo config:block.block.downloadyaffs config:block.block.footerlegal config:block.block.frontimagehighlight2 config:block.block.frontpagehero config:block.block.frontpageprimeryaffs config:block.block.mainnavigation config:block.block.mainnavigation_2 config:block.block.searchform config:block.block.sitebranding config:block.block.views_block__highlighted_yaffs_features_block_1 config:block.block.views_block__yaffs_admin_recent_content_block_1 config:block.block.views_block__yaffs_documents_highlights_block_1 config:block.block.views_block__yaffs_user_logos_block_1 config:block.block.yaffs_account_menu config:block.block.yaffs_block_10 config:block.block.yaffs_block_5 config:block.block.yaffs_block_6 config:block.block.yaffs_block_8 config:block.block.yaffs_block_9 config:block.block.yaffs_breadcrumbs config:block.block.yaffs_content config:block.block.yaffs_help config:block.block.yaffs_local_tasks config:block.block.yaffs_messages config:block.block.yaffs_page_title config:block.block.yaffs_user_21 config:block.block.yaffsinspace config:block_list config:color.theme.yaffs config:field.storage.node.body config:field.storage.node.field_icon_text config:field.storage.node.field_teaser_image config:field.storage.node.field_yaffs_user_logo config:field.storage.node.upload config:filter.format.basic_html config:filter.format.full_html config:filter.format.raw_html config:image.style.pdf_image config:image.style.small config:search.settings config:system.menu.account config:system.menu.main config:system.site config:user.role.anonymous config:views.view.highlighted_yaffs_features config:views.view.yaffs_documents_highlights config:views.view.yaffs_user_logos file:108 file:109 file:110 file:40 file:43 file:44 file:45 file:46 file:47 file:48 file:76 file:77 file:85 http_response media:5 media:8 media:9 node:32 node:344 node:353 node:384 node:385 node:388 node:389 node:397 node:398 node:399 node:400 node:401 node:407 node:408 node:409 node:448 node:451 node:457 node:460 node:462 node:466 node:487 node_list node_view rendered user:0 user:1','3569'),('https://yaffs.net/?author=15:html','O:31:\"Drupal\\Core\\Render\\HtmlResponse\":8:{s:7:\"headers\";O:50:\"Symfony\\Component\\HttpFoundation\\ResponseHeaderBag\":5:{s:23:\"\0*\0computedCacheControl\";a:2:{s:7:\"max-age\";s:3:\"300\";s:6:\"public\";b:1;}s:10:\"\0*\0cookies\";a:0:{}s:14:\"\0*\0headerNames\";a:14:{s:12:\"content-type\";s:12:\"Content-Type\";s:13:\"cache-control\";s:13:\"Cache-Control\";s:4:\"date\";s:4:\"Date\";s:22:\"x-drupal-dynamic-cache\";s:22:\"X-Drupal-Dynamic-Cache\";s:4:\"link\";s:4:\"Link\";s:15:\"x-ua-compatible\";s:15:\"X-UA-Compatible\";s:16:\"content-language\";s:16:\"Content-language\";s:22:\"x-content-type-options\";s:22:\"X-Content-Type-Options\";s:15:\"x-frame-options\";s:15:\"X-Frame-Options\";s:7:\"expires\";s:7:\"Expires\";s:13:\"last-modified\";s:13:\"Last-Modified\";s:4:\"etag\";s:4:\"ETag\";s:4:\"vary\";s:4:\"Vary\";s:11:\"x-generator\";s:11:\"X-Generator\";}s:10:\"\0*\0headers\";a:14:{s:12:\"content-type\";a:1:{i:0;s:24:\"text/html; charset=UTF-8\";}s:13:\"cache-control\";a:1:{i:0;s:19:\"max-age=300, public\";}s:4:\"date\";a:1:{i:0;s:29:\"Fri, 09 Feb 2018 06:19:31 GMT\";}s:22:\"x-drupal-dynamic-cache\";a:1:{i:0;s:4:\"MISS\";}s:4:\"link\";a:4:{i:0;s:23:\"</home>; rel=\"revision\"\";i:1;s:108:\"</sites/default/files/css/css_Ft-hGawuooABKJanSezg8PXovgOMbB_QLx9CIyXeHsA.css?ozekku>; rel=preload; as=style\";i:2;s:108:\"</sites/default/files/css/css_6qeLA6GBkZNPHWp9GdQIYovV3tYuKU-ts-HicZ-WeQQ.css?ozekku>; rel=preload; as=style\";i:3;s:99:\"</sites/default/files/js/js_2l0lF4i9o3aztHULbfajMT_RTqGCEN_lVC8JI48SILw.js>; rel=preload; as=script\";}s:15:\"x-ua-compatible\";a:1:{i:0;s:7:\"IE=edge\";}s:16:\"content-language\";a:1:{i:0;s:2:\"en\";}s:22:\"x-content-type-options\";a:1:{i:0;s:7:\"nosniff\";}s:15:\"x-frame-options\";a:1:{i:0;s:10:\"SAMEORIGIN\";}s:7:\"expires\";a:1:{i:0;s:29:\"Sun, 19 Nov 1978 05:00:00 GMT\";}s:13:\"last-modified\";a:1:{i:0;s:29:\"Fri, 09 Feb 2018 06:19:31 GMT\";}s:4:\"etag\";a:1:{i:0;s:12:\"\"1518157171\"\";}s:4:\"vary\";a:1:{i:0;s:6:\"Cookie\";}s:11:\"x-generator\";a:1:{i:0;s:33:\"Drupal 8 (https://www.drupal.org)\";}}s:15:\"\0*\0cacheControl\";a:2:{s:7:\"max-age\";s:3:\"300\";s:6:\"public\";b:1;}}s:10:\"\0*\0content\";s:51782:\"<!DOCTYPE html>\n<html  lang=\"en\" dir=\"ltr\" prefix=\"content: http://purl.org/rss/1.0/modules/content/  dc: http://purl.org/dc/terms/  foaf: http://xmlns.com/foaf/0.1/  og: http://ogp.me/ns#  rdfs: http://www.w3.org/2000/01/rdf-schema#  schema: http://schema.org/  sioc: http://rdfs.org/sioc/ns#  sioct: http://rdfs.org/sioc/types#  skos: http://www.w3.org/2004/02/skos/core#  xsd: http://www.w3.org/2001/XMLSchema# \">\n  <head>\n    <meta charset=\"utf-8\" />\n<meta name=\"title\" content=\"A Robust Flash File System Since 2002 | Yaffs - A Flash File System for embedded use\" />\n<link rel=\"shortlink\" href=\"https://yaffs.net/\" />\n<link rel=\"canonical\" href=\"https://yaffs.net/\" />\n<meta name=\"news_keywords\" content=\"Flash File System\" />\n<meta name=\"description\" content=\"Yaffs (Yet Another Flash File System) is an open-source file system specifically designed to be fast, robust and suitable for embedded use with NAND and NOR Flash. It is widely used with Linux, RTOSs, or no OS at all, in consumer devices and critical infrastructure. It is available under GNU Public License, GPL, or on commercial terms from Aleph One.\" />\n<meta name=\"abstract\" content=\"Yaffs (Yet Another Flash File System) is an open-source file system specifically designed to be fast, robust and suitable for embedded use with NAND and NOR Flash. It is widely used with Linux, RTOSs, or no OS at all, in consumer devices and critical infrastructure. It is available under GNU Public License, GPL, or on commercial terms from Aleph One.\" />\n<meta name=\"keywords\" content=\"flash File System, flash, file System, flash storage, NAND flash, NOR flash, Yaffs\" />\n<meta name=\"Generator\" content=\"Drupal 8 (https://www.drupal.org)\" />\n<meta name=\"MobileOptimized\" content=\"width\" />\n<meta name=\"HandheldFriendly\" content=\"true\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<link rel=\"stylesheet\" href=\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSansRegular-fontfacekit/fontyourface-stylesheet.css\" media=\"all\" />\n<link rel=\"stylesheet\" href=\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSansItalic-fontfacekit/fontyourface-stylesheet.css\" media=\"all\" />\n<link rel=\"stylesheet\" href=\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSansBold-fontfacekit/fontyourface-stylesheet.css\" media=\"all\" />\n<link rel=\"stylesheet\" href=\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSerifBold-fontfacekit/fontyourface-stylesheet.css\" media=\"all\" />\n<link rel=\"stylesheet\" href=\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSerifBoldItalic-fontfacekit/fontyourface-stylesheet.css\" media=\"all\" />\n<link rel=\"stylesheet\" href=\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSerifItalic-fontfacekit/fontyourface-stylesheet.css\" media=\"all\" />\n<link rel=\"stylesheet\" href=\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSerifRegular-fontfacekit/fontyourface-stylesheet.css\" media=\"all\" />\n<link rel=\"stylesheet\" href=\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSansBoldItalic-fontfacekit/fontyourface-stylesheet.css\" media=\"all\" />\n<link rel=\"shortcut icon\" href=\"/sites/default/files/yaffs_favicon.png\" type=\"image/png\" />\n<link rel=\"revision\" href=\"/home\" />\n\n    <title>A Robust Flash File System Since 2002 | Yaffs - A Flash File System for embedded use</title>\n    <link rel=\"stylesheet\" href=\"/sites/default/files/css/css_Ft-hGawuooABKJanSezg8PXovgOMbB_QLx9CIyXeHsA.css?ozekku\" media=\"all\" />\n<link rel=\"stylesheet\" href=\"/sites/default/files/css/css_6qeLA6GBkZNPHWp9GdQIYovV3tYuKU-ts-HicZ-WeQQ.css?ozekku\" media=\"all\" />\n\n    \n<!--[if lte IE 8]>\n<script src=\"/sites/default/files/js/js_VtafjXmRvoUgAzqzYTA3Wrjkx9wcWhjP0G4ZnnqRamA.js\"></script>\n<![endif]-->\n\n  </head>\n  <body class=\"fontyourface path-frontpage page-node-type-page navbar-is-fixed-top has-glyphicons\">\n    <a href=\"#main-content\" class=\"visually-hidden focusable skip-link\">\n      Skip to main content\n    </a>\n    <div style=\"background-color: ; color: \" id=\"environment-indicator\">\n  \n    </div>\n\n              <header class=\"navbar navbar-default navbar-fixed-top\" id=\"navbar\" role=\"banner\">\n              <div class=\"container\">\n            <div class=\"navbar-header\">\n          <div class=\"region region-navigation\">\n          <a class=\"logo navbar-btn pull-left\" href=\"/\" title=\"Home\" rel=\"home\">\n      <img src=\"/themes/custom/yaffs/logo.svg\" alt=\"Home\" />\n    </a>\n      \n  </div>\n\n                          <button type=\"button\" class=\"navbar-toggle\" data-toggle=\"collapse\" data-target=\"#navbar-collapse\">\n            <span class=\"sr-only\">Toggle navigation</span>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n          </button>\n              </div>\n\n                    <div id=\"navbar-collapse\" class=\"navbar-collapse collapse\">\n            <div class=\"region region-navigation-collapsible\">\n    <nav role=\"navigation\" aria-labelledby=\"block-mainnavigation-menu\" id=\"block-mainnavigation\">\n            <h2 class=\"sr-only\" id=\"block-mainnavigation-menu\">Main navigation</h2>\n\n      \n              <ul class=\"menu nav navbar-nav\">\n                            <li>\n        <a href=\"/\" data-drupal-link-system-path=\"&lt;front&gt;\">Home</a>\n                  </li>\n                        <li>\n        <a href=\"/support\" title=\"Help for Yaffs\" data-drupal-link-system-path=\"node/380\">Support</a>\n                  </li>\n                        <li>\n        <a href=\"/documents\" data-drupal-link-system-path=\"documents\">Documents</a>\n                  </li>\n                        <li>\n        <a href=\"/get-yaffs\" data-drupal-link-system-path=\"node/382\">Download</a>\n                  </li>\n                        <li>\n        <a href=\"/about-us\" data-drupal-link-system-path=\"node/325\">About us</a>\n                  </li>\n                        <li>\n        <a href=\"/contact\" data-drupal-link-system-path=\"node/73\">Contact</a>\n                  </li>\n        </ul>\n  \n\n\n  </nav>\n<div class=\"search-block-form block block-search block-search-form-block\" data-drupal-selector=\"search-block-form\" id=\"block-searchform\" role=\"search\">\n  \n    \n      <form action=\"/search/node\" method=\"get\" id=\"search-block-form\" accept-charset=\"UTF-8\">\n  <div class=\"form-item js-form-item form-type-search js-form-type-search form-item-keys js-form-item-keys form-no-label form-group\">\n      <label for=\"edit-keys\" class=\"control-label sr-only\">Search</label>\n  \n  \n  <div class=\"input-group\"><input title=\"Enter the terms you wish to search for.\" data-drupal-selector=\"edit-keys\" class=\"form-search form-control\" placeholder=\"Search\" type=\"search\" id=\"edit-keys\" name=\"keys\" value=\"\" size=\"15\" maxlength=\"128\" data-toggle=\"tooltip\" /><span class=\"input-group-btn\"><button type=\"submit\" value=\"Search\" class=\"button js-form-submit form-submit btn-primary btn icon-only\" name=\"\"><span class=\"sr-only\">Search</span><span class=\"icon glyphicon glyphicon-search\" aria-hidden=\"true\"></span></button></span></div>\n\n  \n  \n  </div>\n<div class=\"form-actions form-group js-form-wrapper form-wrapper\" data-drupal-selector=\"edit-actions\" id=\"edit-actions\"></div>\n\n</form>\n\n  </div>\n\n  </div>\n\n        </div>\n                    </div>\n          </header>\n  \n  <div role=\"main\" class=\"main-container container js-quickedit-main-content\">\n    <div class=\"row\">\n\n            \n            \n                  <section class=\"col-sm-12\">\n\n                                      <div class=\"highlighted\">  <div class=\"region region-highlighted\">\n    \n\n  </div>\n</div>\n                  \n                \n                \n                                      \n                  \n                          <a id=\"main-content\"></a>\n            <div class=\"region region-content\">\n        <h1 class=\"page-header\"><span property=\"schema:name\">A Robust Flash File System Since 2002</span>\n</h1>\n\n  <article role=\"article\" about=\"/home\" typeof=\"schema:WebPage\" class=\"page full clearfix\">\n\n  \n      <span property=\"schema:name\" content=\"A Robust Flash File System Since 2002\" class=\"hidden\"></span>\n\n\n  \n  <div class=\"content\">\n    \n            <div property=\"schema:text\" class=\"field field--name-body field--type-text-with-summary field--label-hidden field--item\">\n<p>Yaffs (Yet Another Flash File System) is an open-source file system specifically designed to be fast, robust and suitable for embedded use with NAND and NOR Flash. It is widely used with Linux, RTOSs, or no OS at all, in consumer devices, avionics, and critical infrastructure. It is available under GNU Public License, GPL, or on commercial terms from Aleph One.</p>\n<p>&nbsp;</p>\n</div>\n      \n  </div>\n\n</article>\n\n<section id=\"block-yaffsinspace\" class=\"panel yaffs-shout well block block-block-content block-block-content9f676777-54d9-40d2-86dd-174fff14ab1a clearfix\">\n  \n    \n\n      \n            <div class=\"field field--name-body field--type-text-with-summary field--label-hidden field--item\">\n<h3><em>New!</em> Yaffs in space!</h3>\n<p><strong><img alt=\"Tess satellite\" data-entity-type=\"file\" data-entity-uuid=\"f06319f1-b6ac-41e2-a70d-a4c4da605b87\" height=\"246\" src=\"/sites/default/files/inline-images/tess_satellite_0.gif\" width=\"347\" class=\"align-right\" />NASA TESS Mission </strong>This <strong>Transiting Exoplanet Survey Satellite (TESS)</strong> will discover thousands of exoplanets in orbit around the brightest stars in the sky.</p>\n<p>It is a project regularly using our Yaffs File System to store incoming data and preserve it, in the rigours of the space environment, before sending it back to Earth.</p>\n<p>In a two-year survey of the solar neighborhood, TESS will monitor more than 200,000 stars for temporary drops in brightness caused by planetary transits. This first-ever spaceborne all-sky transit survey will identify planets ranging from Earth-sized to gas giants, around a wide range of stellar types and orbital distances. No ground-based survey can achieve this feat.</p>\n<p>Some File Systems are not robust enough to be suitable for such exacting work.<br />\n </p>\n</div>\n      \n  </section>\n\n\n  </div>\n\n        \n                              <div class=\"front_highlight row\">\n              <div class=\"col-sm-4\">\n                    <div class=\"region region-front-highlight-1\">\n    <section id=\"block-choosingyaffs\" class=\"block block-block-content block-block-contentae8f54b9-5315-4995-a49e-c0780f3a88cc clearfix\">\n  \n    \n\n      \n            <div class=\"field field--name-body field--type-text-with-summary field--label-hidden field--item\"><a href=\"/documents/considerations-choosing-flash-file-system\">\n<article class=\"embedded-entity\">\n<img src=\"/sites/default/files/styles/max_325x325/public/2017-06/choosing_yaffs_0.jpg?itok=YuV5Z__e\" width=\"325\" height=\"325\" alt=\"Thumbnail\" title=\"Choosing Yaffs\" class=\"img-responsive\" />\n</article>\n</a> </div>\n      \n  </section>\n\n\n  </div>\n\n              </div>\n              <div class=\"col-sm-4\">\n                    <div class=\"region region-front-highlight-2\">\n    <section id=\"block-frontimagehighlight2\" class=\"block block-block-content block-block-contentfa53fc80-f3c4-4d6e-b947-0a3bcd479480 clearfix\">\n  \n    \n\n      \n            <div class=\"field field--name-body field--type-text-with-summary field--label-hidden field--item\"><a href=\"/yaffs-action\">\n<article class=\"embedded-entity\">\n<img src=\"/sites/default/files/styles/max_325x325/public/2017-06/atm_1.jpg?itok=HfIny6EH\" width=\"325\" height=\"325\" alt=\"Thumbnail\" title=\"ATM\" class=\"img-responsive\" />\n</article>\n</a> </div>\n      \n  </section>\n\n\n  </div>\n\n              </div>\n              <div class=\"col-sm-4\">\n                    <div class=\"region region-front-highlight-3\">\n    <section id=\"block-downloadyaffs\" class=\"block block-block-content block-block-contenteed71eb7-98b2-4109-aabe-7718283459ad clearfix\">\n  \n    \n\n      \n            <div class=\"field field--name-body field--type-text-with-summary field--label-hidden field--item\"><a href=\"/get-yaffs\">\n<article class=\"embedded-entity\">\n<img src=\"/sites/default/files/styles/max_325x325/public/2017-06/download_now_0.jpg?itok=XdRx8zkI\" width=\"325\" height=\"325\" alt=\"Thumbnail\" title=\"Download Yaffs\" class=\"img-responsive\" />\n</article>\n</a> </div>\n      \n  </section>\n\n\n  </div>\n\n              </div>\n            </div>\n                        </section>\n\n                </div>\n  </div>\n\n  <div class=\"container-fluid front-pane-1\">\n        <div class=\"container\">\n        \n    </div>\n  </div>\n\n  <div class=\"container-fluid front-pane-2\">\n        <div class=\"container\">\n          <div class=\"region region-front-pane-2\">\n    <section class=\"views-element-container block block-views block-views-blockyaffs-user-logos-block-1 clearfix\" id=\"block-views-block-yaffs-user-logos-block-1\">\n  \n    \n\n      <div class=\"form-group\"><div class=\"view view-yaffs-user-logos view-id-yaffs_user_logos view-display-id-block_1 js-view-dom-id-8a35fcda02584f84c79a8d5e2576f68f0216117953eb3ee7556ddd61dbbc1289\">\n  \n    \n      \n      <div class=\"view-content\">\n      <div id=\"views-bootstrap-yaffs-user-logos-block-1\"  class=\"grid views-view-grid horizontal\">\n            <div class=\"row\">\n                  <div class=\"col col-xs-12 col-sm-6 col-md-3 col-lg-3 \">\n            <div class=\"views-field views-field-field-yaffs-user-logo\"><div class=\"field-content\"><a href=\"/yaffs-action\">  <img src=\"/sites/default/files/styles/small/public/logos/designA_logo.png?itok=5VWxByrk\" width=\"200\" height=\"141\" alt=\"\" typeof=\"foaf:Image\" class=\"img-responsive\" />\n\n\n</a></div></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-6 col-md-3 col-lg-3 \">\n            <div class=\"views-field views-field-field-yaffs-user-logo\"><div class=\"field-content\"><a href=\"/yaffs-action\">  <img src=\"/sites/default/files/styles/small/public/logos/eaton_logo.png?itok=kExm8d-W\" width=\"200\" height=\"84\" alt=\"\" typeof=\"foaf:Image\" class=\"img-responsive\" />\n\n\n</a></div></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-6 col-md-3 col-lg-3 \">\n            <div class=\"views-field views-field-field-yaffs-user-logo\"><div class=\"field-content\"><a href=\"/yaffs-action\">  <img src=\"/sites/default/files/styles/small/public/logos/LANCOM_Logo_4c.png?itok=ZIDg8yYt\" width=\"200\" height=\"50\" alt=\"\" typeof=\"foaf:Image\" class=\"img-responsive\" />\n\n\n</a></div></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-6 col-md-3 col-lg-3 \">\n            <div class=\"views-field views-field-field-yaffs-user-logo\"><div class=\"field-content\"><a href=\"/yaffs-action\">  <img src=\"/sites/default/files/styles/small/public/logos/bernina_international_logo.png?itok=G8DeIWtW\" width=\"200\" height=\"30\" alt=\"\" typeof=\"foaf:Image\" class=\"img-responsive\" />\n\n\n</a></div></div>\n          </div>\n              </div>\n          <div class=\"row\">\n                  <div class=\"col col-xs-12 col-sm-6 col-md-3 col-lg-3 \">\n            <div class=\"views-field views-field-field-yaffs-user-logo\"><div class=\"field-content\"><a href=\"/yaffs-action\">  <img src=\"/sites/default/files/styles/small/public/logos/gallagher_logo.png?itok=lQyDJeN1\" width=\"200\" height=\"65\" alt=\"\" typeof=\"foaf:Image\" class=\"img-responsive\" />\n\n\n</a></div></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-6 col-md-3 col-lg-3 \">\n            <div class=\"views-field views-field-field-yaffs-user-logo\"><div class=\"field-content\"><a href=\"/yaffs-action\">  <img src=\"/sites/default/files/styles/small/public/logos/android_logo.png?itok=MShHoIK7\" width=\"170\" height=\"71\" alt=\"\" typeof=\"foaf:Image\" class=\"img-responsive\" />\n\n\n</a></div></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-6 col-md-3 col-lg-3 \">\n            <div class=\"views-field views-field-field-yaffs-user-logo\"><div class=\"field-content\"><a href=\"/yaffs-action\">  <img src=\"/sites/default/files/styles/small/public/logos/leica_logo.png?itok=Ne2u8w3-\" width=\"200\" height=\"130\" alt=\"\" typeof=\"foaf:Image\" class=\"img-responsive\" />\n\n\n</a></div></div>\n          </div>\n              </div>\n      </div>\n\n    </div>\n  \n            <div class=\"view-footer\">\n      <a class=\"btn btn-default\" href=\"/yaffs-action\">Who uses Yaffs? Read more...</a>\n    </div>\n    </div>\n</div>\n\n  </section>\n\n\n  </div>\n\n    </div>\n  </div>\n\n  <div class=\"container-fluid front-pane-3\">\n        <div class=\"container\">\n          <div class=\"region region-front-pane-3\">\n    <section class=\"views-element-container block block-views block-views-blockhighlighted-yaffs-features-block-1 clearfix\" id=\"block-views-block-highlighted-yaffs-features-block-1\">\n  \n    \n\n      <div class=\"form-group\"><div class=\"view view-highlighted-yaffs-features view-id-highlighted_yaffs_features view-display-id-block_1 js-view-dom-id-95fe550d5052828912ac5148bc15b78f3cf61f69a8797eb9f9fafb9077e0fe26\">\n  \n    \n      \n      <div class=\"view-content\">\n      <div id=\"views-bootstrap-highlighted-yaffs-features-block-1\"  class=\"grid views-view-grid horizontal\">\n            <div class=\"row\">\n                  <div class=\"col col-xs-12 col-sm-12 col-md-4 col-lg-4 \">\n            <div class=\"views-field views-field-field-icon-text\"><div class=\"field-content\"><i class=\"fa fa-thumbs-up\"></i></div></div><div class=\"views-field views-field-title\"><span class=\"field-content\"><a href=\"/features#384\"><h3>Royalty Free... </h3></a></span></div><div class=\"views-field views-field-body\"><div class=\"field-content\">Whether you use Yaffs under the GNU General Public Licence or under a commercial licence, Yaffs is free of any royalty. No need to worry about rising costs for your hit product!</div></div><div class=\"views-field views-field-edit-node\"><span class=\"field-content\"></span></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-12 col-md-4 col-lg-4 \">\n            <div class=\"views-field views-field-field-icon-text\"><div class=\"field-content\"><i class=\"fa fa-shield\"></i></div></div><div class=\"views-field views-field-title\"><span class=\"field-content\"><a href=\"/features#385\"><h3>A robust flash file system...</h3></a></span></div><div class=\"views-field views-field-body\"><div class=\"field-content\">After more than 100,000 <strong>random</strong> power-failures during reading or writing, a test file showed NO data corruption at all!</div></div><div class=\"views-field views-field-edit-node\"><span class=\"field-content\"></span></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-12 col-md-4 col-lg-4 \">\n            <div class=\"views-field views-field-field-icon-text\"><div class=\"field-content\"><i class=\"fa fa-heart\"></i></div></div><div class=\"views-field views-field-title\"><span class=\"field-content\"><a href=\"/features#388\"><h3>Yaffs is Open Source...</h3></a></span></div><div class=\"views-field views-field-body\"><div class=\"field-content\">You can have a look at the code at any time. <a href=\"/downloads\">Download it now</a>! And it\'s suitable for GPL and commercially licensed projects.</div></div><div class=\"views-field views-field-edit-node\"><span class=\"field-content\"></span></div>\n          </div>\n              </div>\n          <div class=\"row\">\n                  <div class=\"col col-xs-12 col-sm-12 col-md-4 col-lg-4 \">\n            <div class=\"views-field views-field-field-icon-text\"><div class=\"field-content\"><i class=\"fa fa-mobile-phone\"></i></div></div><div class=\"views-field views-field-title\"><span class=\"field-content\"><a href=\"/features#389\"><h3>Tried and tested in millions of devices...</h3></a></span></div><div class=\"views-field views-field-body\"><div class=\"field-content\">Yaffs is widely used in Linux and proprietary commercial RTOSs. It\'s been included in hundreds of devices, and shipped as part of Google\'s Android, with millions of units sold.</div></div><div class=\"views-field views-field-edit-node\"><span class=\"field-content\"></span></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-12 col-md-4 col-lg-4 \">\n            <div class=\"views-field views-field-field-icon-text\"><div class=\"field-content\"><i class=\"fa fa-space-shuttle\"></i></div></div><div class=\"views-field views-field-title\"><span class=\"field-content\"><a href=\"/features#407\"><h3>Booting is fast...</h3></a></span></div><div class=\"views-field views-field-body\"><div class=\"field-content\">It is important for a Flash filesystem to boot fast, so boot speed was a fundamental consideration in the design of Yaffs.</div></div><div class=\"views-field views-field-edit-node\"><span class=\"field-content\"></span></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-12 col-md-4 col-lg-4 \">\n            <div class=\"views-field views-field-field-icon-text\"><div class=\"field-content\"><i class=\"fa fa-users\"></i></div></div><div class=\"views-field views-field-title\"><span class=\"field-content\"><a href=\"/features#408\"><h3>An active community...</h3></a></span></div><div class=\"views-field views-field-body\"><div class=\"field-content\">There\'s an active community of people who use Yaffs and who have developed with Yaffs, just a click or two away.</div></div><div class=\"views-field views-field-edit-node\"><span class=\"field-content\"></span></div>\n          </div>\n              </div>\n      </div>\n\n    </div>\n  \n            <div class=\"view-footer\">\n      <a class=\"btn btn-default\" href=\"/features\">Lots more Yaffs features...</a>\n    </div>\n    </div>\n</div>\n\n  </section>\n\n\n  </div>\n\n    </div>\n  </div>\n\n  <div class=\"container-fluid front-pane-4\">\n        <div class=\"container\" >\n          <div class=\"region region-front-pane-4\">\n    <section class=\"views-element-container block block-views block-views-blockyaffs-documents-highlights-block-1 clearfix\" id=\"block-views-block-yaffs-documents-highlights-block-1\">\n  \n    \n\n      <div class=\"form-group\"><div class=\"view view-yaffs-documents-highlights view-id-yaffs_documents_highlights view-display-id-block_1 js-view-dom-id-273bf60b230e3faef44a6e67c34370278019b51f5d0e914b039f491b4d00cf06\">\n  \n    \n      \n      <div class=\"view-content\">\n      <div id=\"views-bootstrap-yaffs-documents-highlights-block-1\"  class=\"grid views-view-grid horizontal\">\n            <div class=\"row\">\n                  <div class=\"col col-xs-12 col-sm-12 col-md-6 col-lg-6 \">\n            <div class=\"views-field views-field-field-teaser-image\"><div class=\"field-content\"></div></div><div class=\"views-field views-field-title\"><h3 class=\"field-content\"><a href=\"/yaffs-licence-sample\" hreflang=\"und\">Yaffs Licence Sample</a></h3></div><div class=\"views-field views-field-body\"><div class=\"field-content\">While the Yaffs code is available free of charge under GNU General Public Licence, version 2, that entails the obligation to disclose Source Code for your application using Yaffs. An Aleph One Licence does not impose that obligation and so is attractive for proprietary projects. This sample Licence provides an example of the points we expect a Licence to cover.</div></div><div class=\"views-field views-field-upload-1\"><div class=\"field-content\"></div></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-12 col-md-6 col-lg-6 \">\n            <div class=\"views-field views-field-field-teaser-image\"><div class=\"field-content\"></div></div><div class=\"views-field views-field-title\"><h3 class=\"field-content\"><a href=\"/yaffs-overview\" hreflang=\"und\">Yaffs Overview</a></h3></div><div class=\"views-field views-field-body\"><div class=\"field-content\">YAFFS is a filesystem designed specifically for the characteristics of NAND flash. This page gives an overview of the project - what is available, how it works, how to use it, developer resources, and licensing options.</div></div><div class=\"views-field views-field-upload-1\"><div class=\"field-content\"></div></div>\n          </div>\n              </div>\n          <div class=\"row\">\n                  <div class=\"col col-xs-12 col-sm-12 col-md-6 col-lg-6 \">\n            <div class=\"views-field views-field-field-teaser-image\"><div class=\"field-content\"></div></div><div class=\"views-field views-field-title\"><h3 class=\"field-content\"><a href=\"/yaffs-licence-faqs\" hreflang=\"und\">Yaffs Licence FAQs</a></h3></div><div class=\"views-field views-field-body\"><div class=\"field-content\"><p>Some questions about the commercial licence for Yaffs and how we arrive at one.</p></div></div><div class=\"views-field views-field-upload-1\"><div class=\"field-content\"></div></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-12 col-md-6 col-lg-6 \">\n            <div class=\"views-field views-field-field-teaser-image\"><div class=\"field-content\"></div></div><div class=\"views-field views-field-title\"><h3 class=\"field-content\"><a href=\"/documents/faq\" hreflang=\"und\">FAQ</a></h3></div><div class=\"views-field views-field-body\"><div class=\"field-content\"><p>Common questions about Yaffs technical issues.</p></div></div><div class=\"views-field views-field-upload-1\"><div class=\"field-content\"></div></div>\n          </div>\n              </div>\n          <div class=\"row\">\n                  <div class=\"col col-xs-12 col-sm-12 col-md-6 col-lg-6 \">\n            <div class=\"views-field views-field-field-teaser-image\"><div class=\"field-content\"></div></div><div class=\"views-field views-field-title\"><h3 class=\"field-content\"><a href=\"/licences-more-background-and-detail\" hreflang=\"und\">Licences - more background and detail</a></h3></div><div class=\"views-field views-field-body\"><div class=\"field-content\"><p>More on the details and background of Licences for Yaffs</p></div></div><div class=\"views-field views-field-upload-1\"><div class=\"field-content\"></div></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-12 col-md-6 col-lg-6 \">\n            <div class=\"views-field views-field-field-teaser-image\"><div class=\"field-content\"><a href=\"/sites/default/files/downloads/ConsiderationsInChoosingAFlashFileSystem_0.pdf\">  <img src=\"/sites/default/files/styles/pdf_image/public/styles/pdf_image/public/downloads/ConsiderationsInChoosingAFlashFileSystem_0.pdf.png?itok=ROOk6w-T\" width=\"150\" height=\"212\" alt=\"Preview of ConsiderationsInChoosingAFlashFileSystem.pdf\" typeof=\"foaf:Image\" class=\"img-responsive\" />\n\n\n</a></div></div><div class=\"views-field views-field-title\"><h3 class=\"field-content\"><a href=\"/documents/considerations-choosing-flash-file-system\" hreflang=\"und\">Considerations in Choosing a Flash File System</a></h3></div><div class=\"views-field views-field-body\"><div class=\"field-content\">Failures in an embedded File System in a product are much more serious to the user than failures in an office computer.&nbsp; Power failures and failures to cache data properly can be avoided by choosing a FFS specifically designed for reliability from the ground up.</div></div><div class=\"views-field views-field-upload-1\"><div class=\"field-content\"><span class=\"file file--mime-application-pdf file--application-pdf icon-before\"><span class=\"file-icon\"><span class=\"icon glyphicon glyphicon-file text-primary\" aria-hidden=\"true\"></span></span><span class=\"file-link\"><a href=\"https://yaffs.net/sites/default/files/downloads/ConsiderationsInChoosingAFlashFileSystem_0.pdf\" type=\"application/pdf; length=131376\" title=\"Open file in new window\" target=\"_blank\" data-toggle=\"tooltip\" data-placement=\"bottom\">ConsiderationsInChoosingAFlashFileSystem.pdf</a></span><span class=\"file-size\">128.3 KB</span></span></div></div>\n          </div>\n              </div>\n          <div class=\"row\">\n                  <div class=\"col col-xs-12 col-sm-12 col-md-6 col-lg-6 \">\n            <div class=\"views-field views-field-field-teaser-image\"><div class=\"field-content\"><a href=\"/sites/default/files/downloads/HowYaffsWorks.pdf\">  <img src=\"/sites/default/files/styles/pdf_image/public/styles/pdf_image/public/downloads/HowYaffsWorks.pdf.png?itok=_nJu31C0\" width=\"150\" height=\"194\" alt=\"Preview of HowYaffsWorks.pdf\" typeof=\"foaf:Image\" class=\"img-responsive\" />\n\n\n</a></div></div><div class=\"views-field views-field-title\"><h3 class=\"field-content\"><a href=\"/documents/how-yaffs-works\" hreflang=\"und\">How Yaffs works</a></h3></div><div class=\"views-field views-field-body\"><div class=\"field-content\">This document gives an explanation of most of the core mechanisms that make Yaffs work. As of the time of writing this, the Yaffs2 code base includes approximately 19,000 lines of code making a very detailed discussion impractical. This document is the starting point for understanding Yaffs. Further detailed questions and discussions are welcomed on the Yaffs discussion list.</div></div><div class=\"views-field views-field-upload-1\"><div class=\"field-content\"><span class=\"file file--mime-application-pdf file--application-pdf icon-before\"><span class=\"file-icon\"><span class=\"icon glyphicon glyphicon-file text-primary\" aria-hidden=\"true\"></span></span><span class=\"file-link\"><a href=\"https://yaffs.net/sites/default/files/downloads/HowYaffsWorks.pdf\" type=\"application/pdf; length=402514\" title=\"Open file in new window\" target=\"_blank\" data-toggle=\"tooltip\" data-placement=\"bottom\">HowYaffsWorks.pdf</a></span><span class=\"file-size\">393.08 KB</span></span></div></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-12 col-md-6 col-lg-6 \">\n            <div class=\"views-field views-field-field-teaser-image\"><div class=\"field-content\"><a href=\"/sites/default/files/downloads/YaffsTuning.pdf\">  <img src=\"/sites/default/files/styles/pdf_image/public/styles/pdf_image/public/downloads/YaffsTuning.pdf.png?itok=idZTTQBs\" alt=\"Preview of YaffsTuning.pdf\" typeof=\"foaf:Image\" class=\"img-responsive\" />\n\n\n</a></div></div><div class=\"views-field views-field-title\"><h3 class=\"field-content\"><a href=\"/documents/yaffs-tuning\" hreflang=\"und\">Yaffs Tuning</a></h3></div><div class=\"views-field views-field-body\"><div class=\"field-content\"><p>This document describes the parameters which can be modified by the developer in the different phases of applying, debugging, and routine use of Yaffs.</p></div></div><div class=\"views-field views-field-upload-1\"><div class=\"field-content\"><span class=\"file file--mime-application-pdf file--application-pdf icon-before\"><span class=\"file-icon\"><span class=\"icon glyphicon glyphicon-file text-primary\" aria-hidden=\"true\"></span></span><span class=\"file-link\"><a href=\"https://yaffs.net/sites/default/files/downloads/YaffsTuning.pdf\" type=\"application/pdf; length=93667\" title=\"Open file in new window\" target=\"_blank\" data-toggle=\"tooltip\" data-placement=\"bottom\">YaffsTuning.pdf</a></span><span class=\"file-size\">91.47 KB</span></span></div></div>\n          </div>\n              </div>\n      </div>\n\n    </div>\n  \n            <div class=\"view-footer\">\n      <a class=\"btn btn-default\" href=\"/documents\">All the Yaffs documentation...</a>\n    </div>\n    </div>\n</div>\n\n  </section>\n\n\n  </div>\n\n    </div>\n  </div>\n\n    <div class=\"container-fluid front-pane-5\">\n                <div class=\"container\" >\n              <div class=\"region region-front-pane-5\">\n    <section id=\"block-frontpageprimeryaffs\" class=\"block block-block-content block-block-contente7a8d2de-4fbb-4680-9e18-fe4d8337f1d6 clearfix\">\n  \n    \n\n      \n            <div class=\"field field--name-body field--type-text-with-summary field--label-hidden field--item\">\n<h1>Flash file systems primer</h1>\n<h2>Background &amp; basics</h2>\n<h3><span>What is a </span><span>F</span><span>lash </span><span>F</span><span>ile </span><span>S</span><span>ystem</span>?</h3>\n<p><span>A <span>Flash File System</span> stores data on flash memory, rather than a hard drive. Flash is used because it’s faster, much more tolerant of physical stress and takes less power. A <span>flash filesystem</span> is used to manage the data and get the best out of flash memory.</span></p>\n<p><span>As two examples, a flash memory chip needs to be erased in blocks before it is rewritten and a flash file system will manage that; flash memory has a limited number of writes per block so many flash file systems incorporate a <span>wear levelling</span> mechanism to ensure the writes are spread out.</span></p>\n<p><span>A flash file system is most useful as a part of an embedded system,. As a developer, you <em>can</em>&nbsp;read from and write directly to your Flash memory on an embedded system, but unless your use is extremely limited, you\'ll probably find that you come up against problems that Flash file systems have already solved.</span></p>\n<h3>What are NAND flash &amp; NOR flash?</h3>\n<p><span>These are the two fundamental flash architectures and have very different characteristics in performance, reliability, erase cycles, life span, and price. They also differ fundamentally from hard disk drives, and so need specialised handling.</span></p>\n<table>\n<tbody>\n <tr>\n  <td>\n  <p>&nbsp;</p>\n   </td>\n  <td>\n  <p>NAND flash</p>\n   </td>\n  <td>\n  <p>NOR flash</p>\n   </td>\n </tr>\n <tr>\n  <td>\n  <p>Storage density</p>\n   </td>\n  <td>\n  <p>Higher</p>\n   </td>\n  <td>\n  <p>Lower</p>\n   </td>\n </tr>\n <tr>\n  <td>\n  <p>Read performance</p>\n   </td>\n  <td>\n  <p>Fast</p>\n   </td>\n  <td>\n  <p>Fast (may be slowed by serial access)</p>\n   </td>\n </tr>\n <tr>\n  <td>\n  <p>Write performance</p>\n   </td>\n  <td>\n  <p>Faster</p>\n   </td>\n  <td>\n  <p>Slower (may be slowed further by serial access)</p>\n   </td>\n </tr>\n <tr>\n  <td>\n  <p>Erase performance</p>\n   </td>\n  <td>\n  <p>Faster (low ms typically)</p>\n   </td>\n  <td>\n  <p>Slower (possibly seconds)</p>\n   </td>\n </tr>\n <tr>\n  <td>\n  <p>Storage reliability</p>\n   </td>\n  <td>\n  <p>Lower (without management)</p>\n   </td>\n  <td>\n  <p>Better</p>\n   </td>\n </tr>\n <tr>\n  <td>\n  <p>Life span</p>\n   </td>\n  <td>\n  <p>Higher</p>\n   </td>\n  <td>\n  <p>Lower</p>\n   </td>\n </tr>\n <tr>\n  <td>\n  <p>Price</p>\n   </td>\n  <td>\n  <p>Lower</p>\n   </td>\n  <td>\n  <p>Higher</p>\n   </td>\n </tr>\n</tbody>\n</table>\n<p><span>Yaffs is both an <span>embedded NAN</span><span>D flash file system</span> and an <span>embedded N</span><span>OR Flash file system</span>. It can handle SLC, TLC and MLC NAND. It also works on MLC and SLC NOR. And it can work with parallel or serial access including Serial Peripheral Bus (SPI).</span></p>\n<h3>What special functions does a <span>file system </span><span>for flash</span> include?</h3>\n<p><span>As well as the normal file system functions, a <span>flash file system embedded</span> in hardware should help the device to start and stop quickly and deal well with losing power with no warning, without corrupting the data; and, manage the foibles of flash memory, protecting the stored data with extreme reliability. (Read our paper <a href=\"/documents/considerations-choosing-flash-file-system\">Considerations in Choosing a Flash File System</a>.)</span></p>\n<p><span><span>To these ends, an embedded flash file system must employ extra steps to achieve these such as using log structuring, rather than traditional file structuring plus a flash translation layer; manage power loss and recovery; include flash memory wear levelling; deal with the unreliability of flash from read and write disturbs, by using error correction (ECC), bad block remapping, over provision and flash block refreshing; ensure it’s ready to write fast by using garbage collection and flash block erase to prepare; and manage writing while avoiding write amplification. </span></span></p>\n<h4>What is a log-structured file system?</h4>\n<p><span>Log structuring means that data is written to the file system as a sequence of changes to the file system. This has the advantage that there is less overhead, and so it\'s faster than a non-log-structured system. More important though is that it is more robust against power failure. It also means that a file may be fragmented. For hard drives, fragmentation can mean much slower access due to the time required to mechanically move the read heads around the disk, but flash memory has no moving parts so there is no overhead for flash.</span></p>\n<p><span>Yaffs is log structured a <span>flash file system </span><span>architecture</span> which is faster and more robust than the alternatives.</span></p>\n<h4>What is a <span>Flash Translation Layer</span> (FTL) ?</h4>\n<p><span>It is sometimes desirable to use regular block file systems (such as FAT) with flash memory. In such cases, a Flash Translation Layer presents flash memory or a flash file system as if it\'s an ordinary hard drive.</span></p>\n<p><span>An FTL is an incomplete storage solution it still requires a file system. This makes two layers where data can be damaged and lost: in the FTL and in the <span>flash memory </span><span>file system</span>.</span></p>\n<p><span>True <span>file systems for flash memory</span>, such as Yaffs, do not use FTLs. They deal directly with the idiosyncrasies of flash, providing a faster and more reliable solution.</span></p>\n<h4>What is power loss recovery?</h4>\n<p><span>When power to any storage device is suddenly lost, the device can end up in an unknown state and may have damaged areas. Most file systems have to work hard to ensure that they are in a consistent state after power loss. <span>E</span><span>mbedded file systems</span> <span>for flash</span> may make allowances for unscheduled power loss with a recovery process.</span></p>\n<p><span>Yaffs is built with fault tolerance as a guiding principle and so is designed so power loss is considered a normal event.</span></p>\n<h4>What is <span>wear levelling</span>?</h4>\n<p><span>Flash chips wear out. Each time a part of the flash memory is erased and written, it is slightly damaged. <span>Embedded f</span><span>lash file systems</span> note the danger, and sometimes try to spread the damage rather than having it concentrated in one region, so prolonging the life of the memory and the life of the device.</span></p>\n<p><span>Yaffs is designed so that extra <span>wear leveling</span> is unnecessary. Instead, it’s automatically <span>wear levelling</span> because of the log structure.</span></p>\n<h4>What is flash read disturb? What is flash write disturb?</h4>\n<p><span><a href=\"/documents/yaffs-nand-flash-failure-mitigation\">NAND flash may experience degradation or loss of data</a> owing to reads of pages in the same block or data changes in neighbouring blocks of the NAND device. This is particularly true for MLC NAND.</span></p>\n<p><span>Yaffs uses block refreshing to deal with such problems.</span></p>\n<h4>What is flash error correction/flash ECC?</h4>\n<p><span>There are ways in which flash memory can be corrupted – for instance F-N tunnelling problems and leaky oxide layers. See our <a href=\"/documents/yaffs-nand-flash-failure-mitigation\">detailed discussion of flash memory problems</a>.</span></p>\n<p><span>But every bit counts, and especially if it\'s part of critical data or essential to the correct working of a system. Flash error correction keeps track of a section of memory to tell if there\'s corruption, and provides ways to correct these small errors.</span></p>\n<p><span>Yaffs can use hardware or software based ECC.</span></p>\n<h4>What is bad-block remapping?</h4>\n<p><span>File systems are built upon storing data on physical media. But all media suffers deterioration. Some hardware or <span>flash media </span><span>file systems</span> keep lists of damaged regions and behind the scenes, substitute known good ones in their place.</span></p>\n<p><span>Because of the way that Yaffs works, there\'s no need for bad block remapping because it isn’t a block structured file system.</span></p>\n<h4>What is <span>o</span><span>ver-provisioning</span> ?</h4>\n<p><span>Knowing that the media will degrade and suffer errors, and needing space to alter data because of the nature of flash memory, sometimes a <span>flash memory based </span><span>file system</span> puts aside a portion of the media for this use. This is <span>overprovisioning</span>. Often this space used when remapping bad blocks.</span></p>\n<p><span>Because Yaffs is log structured, it has the advantage that it does not need <span>over provision</span><span>ing</span>, making more memory available to store data.</span></p>\n<h4>What is flash block refreshing?</h4>\n<p><span>To counteract the problems of unreliable flash memory – for instance errors due to read and write disturbs – a flash filesystem can refresh the memory, by making a new copy of a block.</span></p>\n<p><span>Yaffs includes flash block refreshing.</span></p>\n<h4>What is flash garbage collection?</h4>\n<p><span>When a file is deleted, or a part of a file is overwritten, file systems often simply mark the flash space as deleted, rather than removing it. Later they reclaim the space for reuse. This is garbage collection.</span></p>\n<p><span>Yaffs has garbage collection to maximise the amount of data the file system can store.</span></p>\n<h4>What is flash block erase?</h4>\n<p><span>Data must be written into blank areas of the flash chip, but erasing takes time. Rather than erase and write at the same time, in order to speed writes, NAND and <span>NOR flash file systems</span> can prepare blocks for later use. This is not usually necessary for other storage media.</span></p>\n<p><span>As part of garbage collection, Yaffs uses a block erase strategy.</span></p>\n<h4>What is flash write amplification ?</h4>\n<p><span>In many block-based flash file systems, when data changes the new data must be written to the disk, and then the old data must be marked as invalid. A small change to the data can have consequences that propagate involving writing to the memory twice or more as the old data is cleaned up by garbage collection and files are organised to take the minimum amount of space. This is write amplification - a single small write causing a cascade of writes (and erases) of whole blocks.</span></p>\n<p><span>Yaffs avoids much of this problem by being log structured, meaning that flash memory is slower to reach it\'s maximum number of cycles, while writing is faster.</span></p>\n<h2>How does Yaffs work?</h2>\n<p><span>You can find full details in our paper <a href=\"/documents/how-yaffs-works\">How Yaffs Works</a>&nbsp;but briefly, here\'s how it works.</span></p>\n<p><span>It\'s a log-structured filing system. This also ensures that Yaffs is wear-levelling is built into the design because no one part of the flash memory is used any more than another.</span></p>\n<p><span>A Yaffs object is anything that Yaffs stores - for instance a file or a directory.</span></p>\n<p><span>The memory in NAND flash is arranged in pages. A page is the unit of allocation and programming. In Yaffs, the unit of allocation is called the chunk. Typically a chunk will be the same as a NAND page, but there is flexibility to use chunks which map to multiple pages (eg. A system may have two NAND chips in parallel requiring 2x2048 = 4096 byte chunks) . This distinction gives a lot of flexibility in how the system can be configured.</span></p>\n<p><span>A fixed but configurable number of chunks form a block which is the unit of erasure.</span></p>\n<p><span>NAND flash is shipped with bad blocks and further blocks may go bad during the operation of the device so Yaffs detects and marks bad blocks.</span></p>\n<p><span>NAND flash also typically requires the use of some sort of error detection and correction code (ECC). Yaffs can either use existing ECC logic or provide its own.</span></p>\n<p><span>Yaffs maintains data in RAM about the file system, but this is not needed for Yaffs to work - so the device can safely lose power at any point without data corruption.</span></p>\n<p><span>Here\'s how the Yaffs filesystem works to ensure data safety and a very fast startup... At regular points and on controlled shutdown, checkpoint blocks are written to the flash memory, containing all the data to quickly rebuild the file system. Under usual circumstances this checkpoint is used when a device is started, to very quickly rebuild the RAM data about the file system. If the checkpoint is determined to be corrupted, or if the user requested then the file system is rebuilt by scanning.</span></p>\n<p><span>To do this, Yaffs makes a prescan, to find the sequence numbers for blocks. Then it scans through blocks backwards to build up the list of chunks that make up objects. It speeds up this process by using Block Summaries, which are collections of all the tags in a data in a block. (But it\'s still always possible to go back to the chunks themselves, to find the tags, if a summary is missing or damaged.)</span></p>\n<p><span>And tags are how Yaffs tells that a chunk belongs to a particular object.</span></p>\n<p><span>Tags are also how Yaffs knows which chunks make up the current version of an object... Because the file system is log structured, if an object has been updated, only the latest chunks are used, giving the correct version of the object. A full description of the process is available in the technical documentation, and of course you can browse the code to see exactly how it all works; there\'s a lot more to tags, the metadata that they can hold, how they are stored, and how tags are used to link together objects into a file system with a POSIX interface.</span></p>\n<p><span>And of course that\'s not the end of the story. There\'s caching to deal with repeated small changes to data. There\'s garbage collection to let space be re-used, and Yaffs deals with collecting garbage differently depending on whether there\'s lots of free space or only a little. And part of making Yaffs a high performance flash file system is to make sure that re-useable blocks are erased well before they are needed, so that writing involves only a single operation. There\'s lazy loading to reduce scanning time. And all of this is built in a portable way, so that Yaffs can be configured to match almost any hardware, and can be ported to any operating system, or work on bare metal without an operating system. There\'s a test harness which is used to subject Yaffs to power failure, and ensure it works even with external data corruption. That\'s what makes it robust enough to send into space and to handle hundreds of terabytes of mission critical data.</span></p>\n<h4>Why is Yaffs special as an embedded flash file system?</h4>\n<p><span>Yaffs has been in use since 2002, and so it is hardened. It has been used in everything from phones to sewing machines to satellites. It is popular with Aerospace companies, and firms managing large infrastructure and in Point-of-Sale (POS) equipment (where customer feedback is very rapid!) It has been used in extreme conditions where it must not lose data, and where there is no chance for maintenance. It\'s been used for very large file systems up to 190TB. It\'s been used for safety critical applications, and millions of consumer devices.</span></p>\n<p><span>We carry out testing in a <a href=\"/documents/yaffs-robustness-and-testing\">rig which can simulate random power failures</a> and proved its reliability after tens to hundreds of millions of power failures.&nbsp;It\'s designed with an understanding of the constraints of flash memory and for speed.</span></p>\n<p><span>Yaffs works on multiple operating systems – Linux, VxWorks, Windows CE, eCos. - and also directly on bare metal, with no operating system. And it\'s easy to integrate into your RTOS or application using the Yaffs Direct Interface. It works with multiple types of flash memory - NAND &amp; NOR, SLC, MLC &amp; TLC.&nbsp;It\'s endian neutral. It\'s been used with 32-bit and 64-bit CPUs including MIPS, 68000, ARM, ColdFire, PowerPC and x86 variants. Yaffs has even been used with various DSP architectures! And it\'ll work with 16-bit with some tuning. So it can be configured to work with your design and the flash geometry that you need.</span></p>\n<p><span>And it\'s a <span>free embedded flash file system - </span><span>it’s open</span> <span>source</span>! <a href=\"/get-yaffs\">Grab the GPL version now</a>! Check out our the active community. And that\'s not the whole story - there are lots more reasons that make Yaffs special.&nbsp;</span></p>\n<p>&nbsp;</p>\n</div>\n      \n  </section>\n\n\n  </div>\n\n        </div>\n    </div>\n\n      <footer class=\"footer container\" role=\"contentinfo\">\n        <div class=\"primary_footer row\">\n            <div class=\"col-sm-3\">\n                  <div class=\"region region-footer-col1\">\n    <section id=\"block-yaffs-block-6\" class=\"block block-block-content block-block-content6c2d4b45-4dba-4b2d-8b9f-76701bf27533 clearfix\">\n  \n    \n\n      \n            <div class=\"field field--name-body field--type-text-with-summary field--label-hidden field--item\">\n<ul class=\"fa-ul\">\n<li><i class=\"fa-li fa fa-phone\"></i>+44 (0)1223 811679</li>\n<li><i class=\"fa-li fa fa-envelope\"></i><a href=\"denied:mailto:info@aleph1.co.uk?Subject=Website contact\" target=\"_top\">info@aleph1.co.uk</a></li>\n</ul>\n</div>\n      \n  </section>\n\n\n  </div>\n\n            </div>\n            <div class=\"col-sm-3\">\n                \n            </div>\n            <div class=\"col-sm-3\">\n                \n            </div>\n            <div class=\"col-sm-3\">\n                  <div class=\"region region-footer-col4\">\n    <section id=\"block-footerlegal\" class=\"block block-block-content block-block-content78ab593d-35b6-4772-a141-30216e7fcbb2 clearfix\">\n  \n    \n\n      \n            <div class=\"field field--name-body field--type-text-with-summary field--label-hidden field--item\">\n<p class=\"text-align-right\">&nbsp;<a href=\"/legal\">Legal &amp; Cookies</a></p>\n</div>\n      \n  </section>\n\n<section id=\"block-cookieinfo\" class=\"block block-block-content block-block-content4848c58d-90df-4819-81d8-0f9568eeeaac clearfix\">\n  \n    \n\n      \n            <div class=\"field field--name-body field--type-text-with-summary field--label-hidden field--item\">\n<p class=\"text-align-justify\"><br />\nWe use <a href=\"/legal\">cookies on this site</a>. By using it, you are giving us consent to set cookies.</p>\n</div>\n      \n  </section>\n\n\n  </div>\n\n            </div>\n        </div>\n        <div class = \"secondary_footer row\">\n            <div class=\"col-sm-12\">\n                <div class=\"region region-footer\">\n    <nav role=\"navigation\" aria-labelledby=\"block-yaffs-account-menu-menu\" id=\"block-yaffs-account-menu\">\n            <h2 class=\"sr-only\" id=\"block-yaffs-account-menu-menu\">User account menu</h2>\n\n      \n              <ul class=\"menu nav navbar-nav navbar-right\">\n                            <li>\n        <a href=\"/user/login\" data-drupal-link-system-path=\"user/login\">Log in</a>\n                  </li>\n        </ul>\n  \n\n\n  </nav>\n\n  </div>\n\n            </div>\n        </div>\n    </footer>\n  \n    \n    <script type=\"application/json\" data-drupal-selector=\"drupal-settings-json\">{\"path\":{\"baseUrl\":\"\\/\",\"scriptPath\":null,\"pathPrefix\":\"\",\"currentPath\":\"node\\/487\",\"currentPathIsAdmin\":false,\"isFront\":true,\"currentLanguage\":\"en\",\"currentQuery\":{\"author\":\"15\"}},\"pluralDelimiter\":\"\\u0003\",\"bootstrap\":{\"forms_has_error_value_toggle\":1,\"modal_animation\":1,\"modal_backdrop\":\"true\",\"modal_keyboard\":1,\"modal_show\":1,\"modal_size\":\"\",\"popover_enabled\":1,\"popover_animation\":1,\"popover_container\":\"body\",\"popover_content\":\"\",\"popover_delay\":\"0\",\"popover_html\":0,\"popover_placement\":\"right\",\"popover_selector\":\"\",\"popover_title\":\"\",\"popover_trigger\":\"click\",\"popover_trigger_autoclose\":1,\"tooltip_enabled\":1,\"tooltip_animation\":1,\"tooltip_container\":\"body\",\"tooltip_delay\":\"0\",\"tooltip_html\":0,\"tooltip_placement\":\"auto left\",\"tooltip_selector\":\"\",\"tooltip_trigger\":\"hover\"},\"ajaxTrustedUrl\":{\"\\/search\\/node\":true},\"user\":{\"uid\":0,\"permissionsHash\":\"aa7fc4c8fb40c7a8665ccd12fea07926dff0f59b9ee3346bc513c6399bee5b01\"}}</script>\n<script src=\"/sites/default/files/js/js_2l0lF4i9o3aztHULbfajMT_RTqGCEN_lVC8JI48SILw.js\"></script>\n\n  </body>\n</html>\n\";s:10:\"\0*\0version\";s:3:\"1.0\";s:13:\"\0*\0statusCode\";i:200;s:13:\"\0*\0statusText\";s:2:\"OK\";s:10:\"\0*\0charset\";N;s:23:\"\0*\0cacheabilityMetadata\";O:35:\"Drupal\\Core\\Cache\\CacheableMetadata\":3:{s:16:\"\0*\0cacheContexts\";a:18:{i:0;s:26:\"languages:language_content\";i:1;s:28:\"languages:language_interface\";i:2;s:5:\"route\";i:3;s:32:\"route.menu_active_trails:account\";i:4;s:29:\"route.menu_active_trails:main\";i:5;s:5:\"theme\";i:6;s:8:\"timezone\";i:7;s:8:\"url.path\";i:8;s:17:\"url.path.is_front\";i:9;s:15:\"url.path.parent\";i:10;s:30:\"url.query_args:_wrapper_format\";i:11;s:8:\"url.site\";i:12;s:4:\"user\";i:13;s:21:\"user.node_grants:view\";i:14;s:16:\"user.permissions\";i:15;s:10:\"user.roles\";i:16;s:20:\"user.roles:anonymous\";i:17;s:24:\"user.roles:authenticated\";}s:12:\"\0*\0cacheTags\";a:103:{i:0;s:16:\"block_content:18\";i:1;s:16:\"block_content:23\";i:2;s:16:\"block_content:25\";i:3;s:16:\"block_content:27\";i:4;s:16:\"block_content:28\";i:5;s:16:\"block_content:29\";i:6;s:16:\"block_content:30\";i:7;s:15:\"block_content:7\";i:8;s:18:\"block_content_view\";i:9;s:10:\"block_view\";i:10;s:32:\"config:block.block.choosingyaffs\";i:11;s:29:\"config:block.block.cookieinfo\";i:12;s:32:\"config:block.block.downloadyaffs\";i:13;s:30:\"config:block.block.footerlegal\";i:14;s:39:\"config:block.block.frontimagehighlight2\";i:15;s:32:\"config:block.block.frontpagehero\";i:16;s:39:\"config:block.block.frontpageprimeryaffs\";i:17;s:33:\"config:block.block.mainnavigation\";i:18;s:35:\"config:block.block.mainnavigation_2\";i:19;s:29:\"config:block.block.searchform\";i:20;s:31:\"config:block.block.sitebranding\";i:21;s:66:\"config:block.block.views_block__highlighted_yaffs_features_block_1\";i:22;s:66:\"config:block.block.views_block__yaffs_admin_recent_content_block_1\";i:23;s:66:\"config:block.block.views_block__yaffs_documents_highlights_block_1\";i:24;s:56:\"config:block.block.views_block__yaffs_user_logos_block_1\";i:25;s:37:\"config:block.block.yaffs_account_menu\";i:26;s:33:\"config:block.block.yaffs_block_10\";i:27;s:32:\"config:block.block.yaffs_block_5\";i:28;s:32:\"config:block.block.yaffs_block_6\";i:29;s:32:\"config:block.block.yaffs_block_8\";i:30;s:32:\"config:block.block.yaffs_block_9\";i:31;s:36:\"config:block.block.yaffs_breadcrumbs\";i:32;s:32:\"config:block.block.yaffs_content\";i:33;s:29:\"config:block.block.yaffs_help\";i:34;s:36:\"config:block.block.yaffs_local_tasks\";i:35;s:33:\"config:block.block.yaffs_messages\";i:36;s:35:\"config:block.block.yaffs_page_title\";i:37;s:32:\"config:block.block.yaffs_user_21\";i:38;s:31:\"config:block.block.yaffsinspace\";i:39;s:17:\"config:block_list\";i:40;s:24:\"config:color.theme.yaffs\";i:41;s:30:\"config:field.storage.node.body\";i:42;s:41:\"config:field.storage.node.field_icon_text\";i:43;s:44:\"config:field.storage.node.field_teaser_image\";i:44;s:47:\"config:field.storage.node.field_yaffs_user_logo\";i:45;s:32:\"config:field.storage.node.upload\";i:46;s:31:\"config:filter.format.basic_html\";i:47;s:30:\"config:filter.format.full_html\";i:48;s:29:\"config:filter.format.raw_html\";i:49;s:28:\"config:image.style.pdf_image\";i:50;s:24:\"config:image.style.small\";i:51;s:22:\"config:search.settings\";i:52;s:26:\"config:system.menu.account\";i:53;s:23:\"config:system.menu.main\";i:54;s:18:\"config:system.site\";i:55;s:26:\"config:user.role.anonymous\";i:56;s:44:\"config:views.view.highlighted_yaffs_features\";i:57;s:44:\"config:views.view.yaffs_documents_highlights\";i:58;s:34:\"config:views.view.yaffs_user_logos\";i:59;s:8:\"file:108\";i:60;s:8:\"file:109\";i:61;s:8:\"file:110\";i:62;s:7:\"file:40\";i:63;s:7:\"file:43\";i:64;s:7:\"file:44\";i:65;s:7:\"file:45\";i:66;s:7:\"file:46\";i:67;s:7:\"file:47\";i:68;s:7:\"file:48\";i:69;s:7:\"file:76\";i:70;s:7:\"file:77\";i:71;s:7:\"file:85\";i:72;s:13:\"http_response\";i:73;s:7:\"media:5\";i:74;s:7:\"media:8\";i:75;s:7:\"media:9\";i:76;s:7:\"node:32\";i:77;s:8:\"node:344\";i:78;s:8:\"node:353\";i:79;s:8:\"node:384\";i:80;s:8:\"node:385\";i:81;s:8:\"node:388\";i:82;s:8:\"node:389\";i:83;s:8:\"node:397\";i:84;s:8:\"node:398\";i:85;s:8:\"node:399\";i:86;s:8:\"node:400\";i:87;s:8:\"node:401\";i:88;s:8:\"node:407\";i:89;s:8:\"node:408\";i:90;s:8:\"node:409\";i:91;s:8:\"node:448\";i:92;s:8:\"node:451\";i:93;s:8:\"node:457\";i:94;s:8:\"node:460\";i:95;s:8:\"node:462\";i:96;s:8:\"node:466\";i:97;s:8:\"node:487\";i:98;s:9:\"node_list\";i:99;s:9:\"node_view\";i:100;s:8:\"rendered\";i:101;s:6:\"user:0\";i:102;s:6:\"user:1\";}s:14:\"\0*\0cacheMaxAge\";i:-1;}s:14:\"\0*\0attachments\";a:5:{s:7:\"library\";a:10:{i:0;s:14:\"core/html5shiv\";i:1;s:11:\"system/base\";i:2;s:15:\"bootstrap/theme\";i:3;s:20:\"yaffs/global-styling\";i:4;s:23:\"yaffs/bootstrap-scripts\";i:5;s:19:\"yaffs/yaffs-helpers\";i:6;s:17:\"bootstrap/popover\";i:7;s:17:\"bootstrap/tooltip\";i:8;s:18:\"views/views.module\";i:10;s:50:\"environment_indicator/drupal.environment_indicator\";}s:9:\"html_head\";a:22:{i:0;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"meta\";s:11:\"#attributes\";a:2:{s:4:\"name\";s:5:\"title\";s:7:\"content\";s:84:\"A Robust Flash File System Since 2002 | Yaffs - A Flash File System for embedded use\";}}i:1;s:5:\"title\";}i:1;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:2:{s:3:\"rel\";s:9:\"shortlink\";s:4:\"href\";s:18:\"https://yaffs.net/\";}}i:1;s:9:\"shortlink\";}i:2;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:2:{s:3:\"rel\";s:9:\"canonical\";s:4:\"href\";s:18:\"https://yaffs.net/\";}}i:1;s:13:\"canonical_url\";}i:3;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"meta\";s:11:\"#attributes\";a:2:{s:4:\"name\";s:13:\"news_keywords\";s:7:\"content\";s:17:\"Flash File System\";}}i:1;s:13:\"news_keywords\";}i:4;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"meta\";s:11:\"#attributes\";a:2:{s:4:\"name\";s:11:\"description\";s:7:\"content\";s:352:\"Yaffs (Yet Another Flash File System) is an open-source file system specifically designed to be fast, robust and suitable for embedded use with NAND and NOR Flash. It is widely used with Linux, RTOSs, or no OS at all, in consumer devices and critical infrastructure. It is available under GNU Public License, GPL, or on commercial terms from Aleph One.\";}}i:1;s:11:\"description\";}i:5;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"meta\";s:11:\"#attributes\";a:2:{s:4:\"name\";s:8:\"abstract\";s:7:\"content\";s:352:\"Yaffs (Yet Another Flash File System) is an open-source file system specifically designed to be fast, robust and suitable for embedded use with NAND and NOR Flash. It is widely used with Linux, RTOSs, or no OS at all, in consumer devices and critical infrastructure. It is available under GNU Public License, GPL, or on commercial terms from Aleph One.\";}}i:1;s:8:\"abstract\";}i:6;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"meta\";s:11:\"#attributes\";a:2:{s:4:\"name\";s:8:\"keywords\";s:7:\"content\";s:82:\"flash File System, flash, file System, flash storage, NAND flash, NOR flash, Yaffs\";}}i:1;s:8:\"keywords\";}i:7;a:2:{i:0;a:3:{s:4:\"#tag\";s:4:\"meta\";s:11:\"#attributes\";a:1:{s:7:\"charset\";s:5:\"utf-8\";}s:7:\"#weight\";i:-1000;}i:1;s:24:\"system_meta_content_type\";}i:8;a:2:{i:0;a:3:{s:5:\"#type\";s:8:\"html_tag\";s:4:\"#tag\";s:4:\"meta\";s:11:\"#attributes\";a:2:{s:4:\"name\";s:9:\"Generator\";s:7:\"content\";s:33:\"Drupal 8 (https://www.drupal.org)\";}}i:1;s:21:\"system_meta_generator\";}i:9;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"meta\";s:11:\"#attributes\";a:2:{s:4:\"name\";s:15:\"MobileOptimized\";s:7:\"content\";s:5:\"width\";}}i:1;s:15:\"MobileOptimized\";}i:10;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"meta\";s:11:\"#attributes\";a:2:{s:4:\"name\";s:16:\"HandheldFriendly\";s:7:\"content\";s:4:\"true\";}}i:1;s:16:\"HandheldFriendly\";}i:11;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"meta\";s:11:\"#attributes\";a:2:{s:4:\"name\";s:8:\"viewport\";s:7:\"content\";s:37:\"width=device-width, initial-scale=1.0\";}}i:1;s:8:\"viewport\";}i:12;a:2:{i:0;a:3:{s:5:\"#type\";s:8:\"html_tag\";s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:3:{s:3:\"rel\";s:10:\"stylesheet\";s:4:\"href\";s:125:\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSansRegular-fontfacekit/fontyourface-stylesheet.css\";s:5:\"media\";s:3:\"all\";}}i:1;s:21:\"fontsquirrel-api-1151\";}i:13;a:2:{i:0;a:3:{s:5:\"#type\";s:8:\"html_tag\";s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:3:{s:3:\"rel\";s:10:\"stylesheet\";s:4:\"href\";s:124:\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSansItalic-fontfacekit/fontyourface-stylesheet.css\";s:5:\"media\";s:3:\"all\";}}i:1;s:21:\"fontsquirrel-api-1152\";}i:14;a:2:{i:0;a:3:{s:5:\"#type\";s:8:\"html_tag\";s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:3:{s:3:\"rel\";s:10:\"stylesheet\";s:4:\"href\";s:122:\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSansBold-fontfacekit/fontyourface-stylesheet.css\";s:5:\"media\";s:3:\"all\";}}i:1;s:21:\"fontsquirrel-api-1153\";}i:15;a:2:{i:0;a:3:{s:5:\"#type\";s:8:\"html_tag\";s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:3:{s:3:\"rel\";s:10:\"stylesheet\";s:4:\"href\";s:123:\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSerifBold-fontfacekit/fontyourface-stylesheet.css\";s:5:\"media\";s:3:\"all\";}}i:1;s:21:\"fontsquirrel-api-1149\";}i:16;a:2:{i:0;a:3:{s:5:\"#type\";s:8:\"html_tag\";s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:3:{s:3:\"rel\";s:10:\"stylesheet\";s:4:\"href\";s:129:\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSerifBoldItalic-fontfacekit/fontyourface-stylesheet.css\";s:5:\"media\";s:3:\"all\";}}i:1;s:21:\"fontsquirrel-api-1150\";}i:17;a:2:{i:0;a:3:{s:5:\"#type\";s:8:\"html_tag\";s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:3:{s:3:\"rel\";s:10:\"stylesheet\";s:4:\"href\";s:125:\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSerifItalic-fontfacekit/fontyourface-stylesheet.css\";s:5:\"media\";s:3:\"all\";}}i:1;s:21:\"fontsquirrel-api-1148\";}i:18;a:2:{i:0;a:3:{s:5:\"#type\";s:8:\"html_tag\";s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:3:{s:3:\"rel\";s:10:\"stylesheet\";s:4:\"href\";s:126:\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSerifRegular-fontfacekit/fontyourface-stylesheet.css\";s:5:\"media\";s:3:\"all\";}}i:1;s:21:\"fontsquirrel-api-1147\";}i:19;a:2:{i:0;a:3:{s:5:\"#type\";s:8:\"html_tag\";s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:3:{s:3:\"rel\";s:10:\"stylesheet\";s:4:\"href\";s:128:\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSansBoldItalic-fontfacekit/fontyourface-stylesheet.css\";s:5:\"media\";s:3:\"all\";}}i:1;s:21:\"fontsquirrel-api-1154\";}i:20;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:3:{s:3:\"rel\";s:13:\"shortcut icon\";s:4:\"href\";s:38:\"/sites/default/files/yaffs_favicon.png\";s:4:\"type\";s:9:\"image/png\";}}i:1;s:67:\"html_head_link:shortcut icon:/sites/default/files/yaffs_favicon.png\";}i:21;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:2:{s:3:\"rel\";s:8:\"revision\";s:4:\"href\";s:5:\"/home\";}}i:1;s:29:\"html_head_link:revision:/home\";}}s:12:\"placeholders\";a:0:{}s:14:\"drupalSettings\";a:5:{s:4:\"path\";a:8:{s:7:\"baseUrl\";s:1:\"/\";s:10:\"scriptPath\";N;s:10:\"pathPrefix\";s:0:\"\";s:11:\"currentPath\";s:8:\"node/487\";s:18:\"currentPathIsAdmin\";b:0;s:7:\"isFront\";b:1;s:15:\"currentLanguage\";s:2:\"en\";s:12:\"currentQuery\";O:8:\"stdClass\":1:{s:6:\"author\";s:2:\"15\";}}s:15:\"pluralDelimiter\";s:1:\"\";s:9:\"bootstrap\";a:25:{s:28:\"forms_has_error_value_toggle\";i:1;s:15:\"modal_animation\";i:1;s:14:\"modal_backdrop\";s:4:\"true\";s:14:\"modal_keyboard\";i:1;s:10:\"modal_show\";i:1;s:10:\"modal_size\";s:0:\"\";s:15:\"popover_enabled\";i:1;s:17:\"popover_animation\";i:1;s:17:\"popover_container\";s:4:\"body\";s:15:\"popover_content\";s:0:\"\";s:13:\"popover_delay\";s:1:\"0\";s:12:\"popover_html\";i:0;s:17:\"popover_placement\";s:5:\"right\";s:16:\"popover_selector\";s:0:\"\";s:13:\"popover_title\";s:0:\"\";s:15:\"popover_trigger\";s:5:\"click\";s:25:\"popover_trigger_autoclose\";i:1;s:15:\"tooltip_enabled\";i:1;s:17:\"tooltip_animation\";i:1;s:17:\"tooltip_container\";s:4:\"body\";s:13:\"tooltip_delay\";s:1:\"0\";s:12:\"tooltip_html\";i:0;s:17:\"tooltip_placement\";s:9:\"auto left\";s:16:\"tooltip_selector\";s:0:\"\";s:15:\"tooltip_trigger\";s:5:\"hover\";}s:14:\"ajaxTrustedUrl\";a:1:{s:12:\"/search/node\";b:1;}s:4:\"user\";a:2:{s:3:\"uid\";i:0;s:15:\"permissionsHash\";s:64:\"aa7fc4c8fb40c7a8665ccd12fea07926dff0f59b9ee3346bc513c6399bee5b01\";}}s:11:\"http_header\";a:1:{i:0;a:3:{i:0;s:4:\"Link\";i:1;s:23:\"</home>; rel=\"revision\"\";i:2;b:0;}}}}',-1,1518157171.887,1,'block_content:18 block_content:23 block_content:25 block_content:27 block_content:28 block_content:29 block_content:30 block_content:7 block_content_view block_view config:block.block.choosingyaffs config:block.block.cookieinfo config:block.block.downloadyaffs config:block.block.footerlegal config:block.block.frontimagehighlight2 config:block.block.frontpagehero config:block.block.frontpageprimeryaffs config:block.block.mainnavigation config:block.block.mainnavigation_2 config:block.block.searchform config:block.block.sitebranding config:block.block.views_block__highlighted_yaffs_features_block_1 config:block.block.views_block__yaffs_admin_recent_content_block_1 config:block.block.views_block__yaffs_documents_highlights_block_1 config:block.block.views_block__yaffs_user_logos_block_1 config:block.block.yaffs_account_menu config:block.block.yaffs_block_10 config:block.block.yaffs_block_5 config:block.block.yaffs_block_6 config:block.block.yaffs_block_8 config:block.block.yaffs_block_9 config:block.block.yaffs_breadcrumbs config:block.block.yaffs_content config:block.block.yaffs_help config:block.block.yaffs_local_tasks config:block.block.yaffs_messages config:block.block.yaffs_page_title config:block.block.yaffs_user_21 config:block.block.yaffsinspace config:block_list config:color.theme.yaffs config:field.storage.node.body config:field.storage.node.field_icon_text config:field.storage.node.field_teaser_image config:field.storage.node.field_yaffs_user_logo config:field.storage.node.upload config:filter.format.basic_html config:filter.format.full_html config:filter.format.raw_html config:image.style.pdf_image config:image.style.small config:search.settings config:system.menu.account config:system.menu.main config:system.site config:user.role.anonymous config:views.view.highlighted_yaffs_features config:views.view.yaffs_documents_highlights config:views.view.yaffs_user_logos file:108 file:109 file:110 file:40 file:43 file:44 file:45 file:46 file:47 file:48 file:76 file:77 file:85 http_response media:5 media:8 media:9 node:32 node:344 node:353 node:384 node:385 node:388 node:389 node:397 node:398 node:399 node:400 node:401 node:407 node:408 node:409 node:448 node:451 node:457 node:460 node:462 node:466 node:487 node_list node_view rendered user:0 user:1','3569'),('https://yaffs.net/?author=1:html','O:31:\"Drupal\\Core\\Render\\HtmlResponse\":8:{s:7:\"headers\";O:50:\"Symfony\\Component\\HttpFoundation\\ResponseHeaderBag\":5:{s:23:\"\0*\0computedCacheControl\";a:2:{s:7:\"max-age\";s:3:\"300\";s:6:\"public\";b:1;}s:10:\"\0*\0cookies\";a:0:{}s:14:\"\0*\0headerNames\";a:14:{s:12:\"content-type\";s:12:\"Content-Type\";s:13:\"cache-control\";s:13:\"Cache-Control\";s:4:\"date\";s:4:\"Date\";s:22:\"x-drupal-dynamic-cache\";s:22:\"X-Drupal-Dynamic-Cache\";s:4:\"link\";s:4:\"Link\";s:15:\"x-ua-compatible\";s:15:\"X-UA-Compatible\";s:16:\"content-language\";s:16:\"Content-language\";s:22:\"x-content-type-options\";s:22:\"X-Content-Type-Options\";s:15:\"x-frame-options\";s:15:\"X-Frame-Options\";s:7:\"expires\";s:7:\"Expires\";s:13:\"last-modified\";s:13:\"Last-Modified\";s:4:\"etag\";s:4:\"ETag\";s:4:\"vary\";s:4:\"Vary\";s:11:\"x-generator\";s:11:\"X-Generator\";}s:10:\"\0*\0headers\";a:14:{s:12:\"content-type\";a:1:{i:0;s:24:\"text/html; charset=UTF-8\";}s:13:\"cache-control\";a:1:{i:0;s:19:\"max-age=300, public\";}s:4:\"date\";a:1:{i:0;s:29:\"Fri, 09 Feb 2018 06:19:00 GMT\";}s:22:\"x-drupal-dynamic-cache\";a:1:{i:0;s:4:\"MISS\";}s:4:\"link\";a:4:{i:0;s:23:\"</home>; rel=\"revision\"\";i:1;s:108:\"</sites/default/files/css/css_Ft-hGawuooABKJanSezg8PXovgOMbB_QLx9CIyXeHsA.css?ozekku>; rel=preload; as=style\";i:2;s:108:\"</sites/default/files/css/css_6qeLA6GBkZNPHWp9GdQIYovV3tYuKU-ts-HicZ-WeQQ.css?ozekku>; rel=preload; as=style\";i:3;s:99:\"</sites/default/files/js/js_2l0lF4i9o3aztHULbfajMT_RTqGCEN_lVC8JI48SILw.js>; rel=preload; as=script\";}s:15:\"x-ua-compatible\";a:1:{i:0;s:7:\"IE=edge\";}s:16:\"content-language\";a:1:{i:0;s:2:\"en\";}s:22:\"x-content-type-options\";a:1:{i:0;s:7:\"nosniff\";}s:15:\"x-frame-options\";a:1:{i:0;s:10:\"SAMEORIGIN\";}s:7:\"expires\";a:1:{i:0;s:29:\"Sun, 19 Nov 1978 05:00:00 GMT\";}s:13:\"last-modified\";a:1:{i:0;s:29:\"Fri, 09 Feb 2018 06:19:00 GMT\";}s:4:\"etag\";a:1:{i:0;s:12:\"\"1518157140\"\";}s:4:\"vary\";a:1:{i:0;s:6:\"Cookie\";}s:11:\"x-generator\";a:1:{i:0;s:33:\"Drupal 8 (https://www.drupal.org)\";}}s:15:\"\0*\0cacheControl\";a:2:{s:7:\"max-age\";s:3:\"300\";s:6:\"public\";b:1;}}s:10:\"\0*\0content\";s:51781:\"<!DOCTYPE html>\n<html  lang=\"en\" dir=\"ltr\" prefix=\"content: http://purl.org/rss/1.0/modules/content/  dc: http://purl.org/dc/terms/  foaf: http://xmlns.com/foaf/0.1/  og: http://ogp.me/ns#  rdfs: http://www.w3.org/2000/01/rdf-schema#  schema: http://schema.org/  sioc: http://rdfs.org/sioc/ns#  sioct: http://rdfs.org/sioc/types#  skos: http://www.w3.org/2004/02/skos/core#  xsd: http://www.w3.org/2001/XMLSchema# \">\n  <head>\n    <meta charset=\"utf-8\" />\n<meta name=\"title\" content=\"A Robust Flash File System Since 2002 | Yaffs - A Flash File System for embedded use\" />\n<link rel=\"shortlink\" href=\"https://yaffs.net/\" />\n<link rel=\"canonical\" href=\"https://yaffs.net/\" />\n<meta name=\"news_keywords\" content=\"Flash File System\" />\n<meta name=\"description\" content=\"Yaffs (Yet Another Flash File System) is an open-source file system specifically designed to be fast, robust and suitable for embedded use with NAND and NOR Flash. It is widely used with Linux, RTOSs, or no OS at all, in consumer devices and critical infrastructure. It is available under GNU Public License, GPL, or on commercial terms from Aleph One.\" />\n<meta name=\"abstract\" content=\"Yaffs (Yet Another Flash File System) is an open-source file system specifically designed to be fast, robust and suitable for embedded use with NAND and NOR Flash. It is widely used with Linux, RTOSs, or no OS at all, in consumer devices and critical infrastructure. It is available under GNU Public License, GPL, or on commercial terms from Aleph One.\" />\n<meta name=\"keywords\" content=\"flash File System, flash, file System, flash storage, NAND flash, NOR flash, Yaffs\" />\n<meta name=\"Generator\" content=\"Drupal 8 (https://www.drupal.org)\" />\n<meta name=\"MobileOptimized\" content=\"width\" />\n<meta name=\"HandheldFriendly\" content=\"true\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<link rel=\"stylesheet\" href=\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSansRegular-fontfacekit/fontyourface-stylesheet.css\" media=\"all\" />\n<link rel=\"stylesheet\" href=\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSansItalic-fontfacekit/fontyourface-stylesheet.css\" media=\"all\" />\n<link rel=\"stylesheet\" href=\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSansBold-fontfacekit/fontyourface-stylesheet.css\" media=\"all\" />\n<link rel=\"stylesheet\" href=\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSerifBold-fontfacekit/fontyourface-stylesheet.css\" media=\"all\" />\n<link rel=\"stylesheet\" href=\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSerifBoldItalic-fontfacekit/fontyourface-stylesheet.css\" media=\"all\" />\n<link rel=\"stylesheet\" href=\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSerifItalic-fontfacekit/fontyourface-stylesheet.css\" media=\"all\" />\n<link rel=\"stylesheet\" href=\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSerifRegular-fontfacekit/fontyourface-stylesheet.css\" media=\"all\" />\n<link rel=\"stylesheet\" href=\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSansBoldItalic-fontfacekit/fontyourface-stylesheet.css\" media=\"all\" />\n<link rel=\"shortcut icon\" href=\"/sites/default/files/yaffs_favicon.png\" type=\"image/png\" />\n<link rel=\"revision\" href=\"/home\" />\n\n    <title>A Robust Flash File System Since 2002 | Yaffs - A Flash File System for embedded use</title>\n    <link rel=\"stylesheet\" href=\"/sites/default/files/css/css_Ft-hGawuooABKJanSezg8PXovgOMbB_QLx9CIyXeHsA.css?ozekku\" media=\"all\" />\n<link rel=\"stylesheet\" href=\"/sites/default/files/css/css_6qeLA6GBkZNPHWp9GdQIYovV3tYuKU-ts-HicZ-WeQQ.css?ozekku\" media=\"all\" />\n\n    \n<!--[if lte IE 8]>\n<script src=\"/sites/default/files/js/js_VtafjXmRvoUgAzqzYTA3Wrjkx9wcWhjP0G4ZnnqRamA.js\"></script>\n<![endif]-->\n\n  </head>\n  <body class=\"fontyourface path-frontpage page-node-type-page navbar-is-fixed-top has-glyphicons\">\n    <a href=\"#main-content\" class=\"visually-hidden focusable skip-link\">\n      Skip to main content\n    </a>\n    <div style=\"background-color: ; color: \" id=\"environment-indicator\">\n  \n    </div>\n\n              <header class=\"navbar navbar-default navbar-fixed-top\" id=\"navbar\" role=\"banner\">\n              <div class=\"container\">\n            <div class=\"navbar-header\">\n          <div class=\"region region-navigation\">\n          <a class=\"logo navbar-btn pull-left\" href=\"/\" title=\"Home\" rel=\"home\">\n      <img src=\"/themes/custom/yaffs/logo.svg\" alt=\"Home\" />\n    </a>\n      \n  </div>\n\n                          <button type=\"button\" class=\"navbar-toggle\" data-toggle=\"collapse\" data-target=\"#navbar-collapse\">\n            <span class=\"sr-only\">Toggle navigation</span>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n          </button>\n              </div>\n\n                    <div id=\"navbar-collapse\" class=\"navbar-collapse collapse\">\n            <div class=\"region region-navigation-collapsible\">\n    <nav role=\"navigation\" aria-labelledby=\"block-mainnavigation-menu\" id=\"block-mainnavigation\">\n            <h2 class=\"sr-only\" id=\"block-mainnavigation-menu\">Main navigation</h2>\n\n      \n              <ul class=\"menu nav navbar-nav\">\n                            <li>\n        <a href=\"/\" data-drupal-link-system-path=\"&lt;front&gt;\">Home</a>\n                  </li>\n                        <li>\n        <a href=\"/support\" title=\"Help for Yaffs\" data-drupal-link-system-path=\"node/380\">Support</a>\n                  </li>\n                        <li>\n        <a href=\"/documents\" data-drupal-link-system-path=\"documents\">Documents</a>\n                  </li>\n                        <li>\n        <a href=\"/get-yaffs\" data-drupal-link-system-path=\"node/382\">Download</a>\n                  </li>\n                        <li>\n        <a href=\"/about-us\" data-drupal-link-system-path=\"node/325\">About us</a>\n                  </li>\n                        <li>\n        <a href=\"/contact\" data-drupal-link-system-path=\"node/73\">Contact</a>\n                  </li>\n        </ul>\n  \n\n\n  </nav>\n<div class=\"search-block-form block block-search block-search-form-block\" data-drupal-selector=\"search-block-form\" id=\"block-searchform\" role=\"search\">\n  \n    \n      <form action=\"/search/node\" method=\"get\" id=\"search-block-form\" accept-charset=\"UTF-8\">\n  <div class=\"form-item js-form-item form-type-search js-form-type-search form-item-keys js-form-item-keys form-no-label form-group\">\n      <label for=\"edit-keys\" class=\"control-label sr-only\">Search</label>\n  \n  \n  <div class=\"input-group\"><input title=\"Enter the terms you wish to search for.\" data-drupal-selector=\"edit-keys\" class=\"form-search form-control\" placeholder=\"Search\" type=\"search\" id=\"edit-keys\" name=\"keys\" value=\"\" size=\"15\" maxlength=\"128\" data-toggle=\"tooltip\" /><span class=\"input-group-btn\"><button type=\"submit\" value=\"Search\" class=\"button js-form-submit form-submit btn-primary btn icon-only\" name=\"\"><span class=\"sr-only\">Search</span><span class=\"icon glyphicon glyphicon-search\" aria-hidden=\"true\"></span></button></span></div>\n\n  \n  \n  </div>\n<div class=\"form-actions form-group js-form-wrapper form-wrapper\" data-drupal-selector=\"edit-actions\" id=\"edit-actions\"></div>\n\n</form>\n\n  </div>\n\n  </div>\n\n        </div>\n                    </div>\n          </header>\n  \n  <div role=\"main\" class=\"main-container container js-quickedit-main-content\">\n    <div class=\"row\">\n\n            \n            \n                  <section class=\"col-sm-12\">\n\n                                      <div class=\"highlighted\">  <div class=\"region region-highlighted\">\n    \n\n  </div>\n</div>\n                  \n                \n                \n                                      \n                  \n                          <a id=\"main-content\"></a>\n            <div class=\"region region-content\">\n        <h1 class=\"page-header\"><span property=\"schema:name\">A Robust Flash File System Since 2002</span>\n</h1>\n\n  <article role=\"article\" about=\"/home\" typeof=\"schema:WebPage\" class=\"page full clearfix\">\n\n  \n      <span property=\"schema:name\" content=\"A Robust Flash File System Since 2002\" class=\"hidden\"></span>\n\n\n  \n  <div class=\"content\">\n    \n            <div property=\"schema:text\" class=\"field field--name-body field--type-text-with-summary field--label-hidden field--item\">\n<p>Yaffs (Yet Another Flash File System) is an open-source file system specifically designed to be fast, robust and suitable for embedded use with NAND and NOR Flash. It is widely used with Linux, RTOSs, or no OS at all, in consumer devices, avionics, and critical infrastructure. It is available under GNU Public License, GPL, or on commercial terms from Aleph One.</p>\n<p>&nbsp;</p>\n</div>\n      \n  </div>\n\n</article>\n\n<section id=\"block-yaffsinspace\" class=\"panel yaffs-shout well block block-block-content block-block-content9f676777-54d9-40d2-86dd-174fff14ab1a clearfix\">\n  \n    \n\n      \n            <div class=\"field field--name-body field--type-text-with-summary field--label-hidden field--item\">\n<h3><em>New!</em> Yaffs in space!</h3>\n<p><strong><img alt=\"Tess satellite\" data-entity-type=\"file\" data-entity-uuid=\"f06319f1-b6ac-41e2-a70d-a4c4da605b87\" height=\"246\" src=\"/sites/default/files/inline-images/tess_satellite_0.gif\" width=\"347\" class=\"align-right\" />NASA TESS Mission </strong>This <strong>Transiting Exoplanet Survey Satellite (TESS)</strong> will discover thousands of exoplanets in orbit around the brightest stars in the sky.</p>\n<p>It is a project regularly using our Yaffs File System to store incoming data and preserve it, in the rigours of the space environment, before sending it back to Earth.</p>\n<p>In a two-year survey of the solar neighborhood, TESS will monitor more than 200,000 stars for temporary drops in brightness caused by planetary transits. This first-ever spaceborne all-sky transit survey will identify planets ranging from Earth-sized to gas giants, around a wide range of stellar types and orbital distances. No ground-based survey can achieve this feat.</p>\n<p>Some File Systems are not robust enough to be suitable for such exacting work.<br />\n </p>\n</div>\n      \n  </section>\n\n\n  </div>\n\n        \n                              <div class=\"front_highlight row\">\n              <div class=\"col-sm-4\">\n                    <div class=\"region region-front-highlight-1\">\n    <section id=\"block-choosingyaffs\" class=\"block block-block-content block-block-contentae8f54b9-5315-4995-a49e-c0780f3a88cc clearfix\">\n  \n    \n\n      \n            <div class=\"field field--name-body field--type-text-with-summary field--label-hidden field--item\"><a href=\"/documents/considerations-choosing-flash-file-system\">\n<article class=\"embedded-entity\">\n<img src=\"/sites/default/files/styles/max_325x325/public/2017-06/choosing_yaffs_0.jpg?itok=YuV5Z__e\" width=\"325\" height=\"325\" alt=\"Thumbnail\" title=\"Choosing Yaffs\" class=\"img-responsive\" />\n</article>\n</a> </div>\n      \n  </section>\n\n\n  </div>\n\n              </div>\n              <div class=\"col-sm-4\">\n                    <div class=\"region region-front-highlight-2\">\n    <section id=\"block-frontimagehighlight2\" class=\"block block-block-content block-block-contentfa53fc80-f3c4-4d6e-b947-0a3bcd479480 clearfix\">\n  \n    \n\n      \n            <div class=\"field field--name-body field--type-text-with-summary field--label-hidden field--item\"><a href=\"/yaffs-action\">\n<article class=\"embedded-entity\">\n<img src=\"/sites/default/files/styles/max_325x325/public/2017-06/atm_1.jpg?itok=HfIny6EH\" width=\"325\" height=\"325\" alt=\"Thumbnail\" title=\"ATM\" class=\"img-responsive\" />\n</article>\n</a> </div>\n      \n  </section>\n\n\n  </div>\n\n              </div>\n              <div class=\"col-sm-4\">\n                    <div class=\"region region-front-highlight-3\">\n    <section id=\"block-downloadyaffs\" class=\"block block-block-content block-block-contenteed71eb7-98b2-4109-aabe-7718283459ad clearfix\">\n  \n    \n\n      \n            <div class=\"field field--name-body field--type-text-with-summary field--label-hidden field--item\"><a href=\"/get-yaffs\">\n<article class=\"embedded-entity\">\n<img src=\"/sites/default/files/styles/max_325x325/public/2017-06/download_now_0.jpg?itok=XdRx8zkI\" width=\"325\" height=\"325\" alt=\"Thumbnail\" title=\"Download Yaffs\" class=\"img-responsive\" />\n</article>\n</a> </div>\n      \n  </section>\n\n\n  </div>\n\n              </div>\n            </div>\n                        </section>\n\n                </div>\n  </div>\n\n  <div class=\"container-fluid front-pane-1\">\n        <div class=\"container\">\n        \n    </div>\n  </div>\n\n  <div class=\"container-fluid front-pane-2\">\n        <div class=\"container\">\n          <div class=\"region region-front-pane-2\">\n    <section class=\"views-element-container block block-views block-views-blockyaffs-user-logos-block-1 clearfix\" id=\"block-views-block-yaffs-user-logos-block-1\">\n  \n    \n\n      <div class=\"form-group\"><div class=\"view view-yaffs-user-logos view-id-yaffs_user_logos view-display-id-block_1 js-view-dom-id-8a35fcda02584f84c79a8d5e2576f68f0216117953eb3ee7556ddd61dbbc1289\">\n  \n    \n      \n      <div class=\"view-content\">\n      <div id=\"views-bootstrap-yaffs-user-logos-block-1\"  class=\"grid views-view-grid horizontal\">\n            <div class=\"row\">\n                  <div class=\"col col-xs-12 col-sm-6 col-md-3 col-lg-3 \">\n            <div class=\"views-field views-field-field-yaffs-user-logo\"><div class=\"field-content\"><a href=\"/yaffs-action\">  <img src=\"/sites/default/files/styles/small/public/logos/designA_logo.png?itok=5VWxByrk\" width=\"200\" height=\"141\" alt=\"\" typeof=\"foaf:Image\" class=\"img-responsive\" />\n\n\n</a></div></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-6 col-md-3 col-lg-3 \">\n            <div class=\"views-field views-field-field-yaffs-user-logo\"><div class=\"field-content\"><a href=\"/yaffs-action\">  <img src=\"/sites/default/files/styles/small/public/logos/eaton_logo.png?itok=kExm8d-W\" width=\"200\" height=\"84\" alt=\"\" typeof=\"foaf:Image\" class=\"img-responsive\" />\n\n\n</a></div></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-6 col-md-3 col-lg-3 \">\n            <div class=\"views-field views-field-field-yaffs-user-logo\"><div class=\"field-content\"><a href=\"/yaffs-action\">  <img src=\"/sites/default/files/styles/small/public/logos/LANCOM_Logo_4c.png?itok=ZIDg8yYt\" width=\"200\" height=\"50\" alt=\"\" typeof=\"foaf:Image\" class=\"img-responsive\" />\n\n\n</a></div></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-6 col-md-3 col-lg-3 \">\n            <div class=\"views-field views-field-field-yaffs-user-logo\"><div class=\"field-content\"><a href=\"/yaffs-action\">  <img src=\"/sites/default/files/styles/small/public/logos/bernina_international_logo.png?itok=G8DeIWtW\" width=\"200\" height=\"30\" alt=\"\" typeof=\"foaf:Image\" class=\"img-responsive\" />\n\n\n</a></div></div>\n          </div>\n              </div>\n          <div class=\"row\">\n                  <div class=\"col col-xs-12 col-sm-6 col-md-3 col-lg-3 \">\n            <div class=\"views-field views-field-field-yaffs-user-logo\"><div class=\"field-content\"><a href=\"/yaffs-action\">  <img src=\"/sites/default/files/styles/small/public/logos/gallagher_logo.png?itok=lQyDJeN1\" width=\"200\" height=\"65\" alt=\"\" typeof=\"foaf:Image\" class=\"img-responsive\" />\n\n\n</a></div></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-6 col-md-3 col-lg-3 \">\n            <div class=\"views-field views-field-field-yaffs-user-logo\"><div class=\"field-content\"><a href=\"/yaffs-action\">  <img src=\"/sites/default/files/styles/small/public/logos/android_logo.png?itok=MShHoIK7\" width=\"170\" height=\"71\" alt=\"\" typeof=\"foaf:Image\" class=\"img-responsive\" />\n\n\n</a></div></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-6 col-md-3 col-lg-3 \">\n            <div class=\"views-field views-field-field-yaffs-user-logo\"><div class=\"field-content\"><a href=\"/yaffs-action\">  <img src=\"/sites/default/files/styles/small/public/logos/leica_logo.png?itok=Ne2u8w3-\" width=\"200\" height=\"130\" alt=\"\" typeof=\"foaf:Image\" class=\"img-responsive\" />\n\n\n</a></div></div>\n          </div>\n              </div>\n      </div>\n\n    </div>\n  \n            <div class=\"view-footer\">\n      <a class=\"btn btn-default\" href=\"/yaffs-action\">Who uses Yaffs? Read more...</a>\n    </div>\n    </div>\n</div>\n\n  </section>\n\n\n  </div>\n\n    </div>\n  </div>\n\n  <div class=\"container-fluid front-pane-3\">\n        <div class=\"container\">\n          <div class=\"region region-front-pane-3\">\n    <section class=\"views-element-container block block-views block-views-blockhighlighted-yaffs-features-block-1 clearfix\" id=\"block-views-block-highlighted-yaffs-features-block-1\">\n  \n    \n\n      <div class=\"form-group\"><div class=\"view view-highlighted-yaffs-features view-id-highlighted_yaffs_features view-display-id-block_1 js-view-dom-id-95fe550d5052828912ac5148bc15b78f3cf61f69a8797eb9f9fafb9077e0fe26\">\n  \n    \n      \n      <div class=\"view-content\">\n      <div id=\"views-bootstrap-highlighted-yaffs-features-block-1\"  class=\"grid views-view-grid horizontal\">\n            <div class=\"row\">\n                  <div class=\"col col-xs-12 col-sm-12 col-md-4 col-lg-4 \">\n            <div class=\"views-field views-field-field-icon-text\"><div class=\"field-content\"><i class=\"fa fa-thumbs-up\"></i></div></div><div class=\"views-field views-field-title\"><span class=\"field-content\"><a href=\"/features#384\"><h3>Royalty Free... </h3></a></span></div><div class=\"views-field views-field-body\"><div class=\"field-content\">Whether you use Yaffs under the GNU General Public Licence or under a commercial licence, Yaffs is free of any royalty. No need to worry about rising costs for your hit product!</div></div><div class=\"views-field views-field-edit-node\"><span class=\"field-content\"></span></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-12 col-md-4 col-lg-4 \">\n            <div class=\"views-field views-field-field-icon-text\"><div class=\"field-content\"><i class=\"fa fa-shield\"></i></div></div><div class=\"views-field views-field-title\"><span class=\"field-content\"><a href=\"/features#385\"><h3>A robust flash file system...</h3></a></span></div><div class=\"views-field views-field-body\"><div class=\"field-content\">After more than 100,000 <strong>random</strong> power-failures during reading or writing, a test file showed NO data corruption at all!</div></div><div class=\"views-field views-field-edit-node\"><span class=\"field-content\"></span></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-12 col-md-4 col-lg-4 \">\n            <div class=\"views-field views-field-field-icon-text\"><div class=\"field-content\"><i class=\"fa fa-heart\"></i></div></div><div class=\"views-field views-field-title\"><span class=\"field-content\"><a href=\"/features#388\"><h3>Yaffs is Open Source...</h3></a></span></div><div class=\"views-field views-field-body\"><div class=\"field-content\">You can have a look at the code at any time. <a href=\"/downloads\">Download it now</a>! And it\'s suitable for GPL and commercially licensed projects.</div></div><div class=\"views-field views-field-edit-node\"><span class=\"field-content\"></span></div>\n          </div>\n              </div>\n          <div class=\"row\">\n                  <div class=\"col col-xs-12 col-sm-12 col-md-4 col-lg-4 \">\n            <div class=\"views-field views-field-field-icon-text\"><div class=\"field-content\"><i class=\"fa fa-mobile-phone\"></i></div></div><div class=\"views-field views-field-title\"><span class=\"field-content\"><a href=\"/features#389\"><h3>Tried and tested in millions of devices...</h3></a></span></div><div class=\"views-field views-field-body\"><div class=\"field-content\">Yaffs is widely used in Linux and proprietary commercial RTOSs. It\'s been included in hundreds of devices, and shipped as part of Google\'s Android, with millions of units sold.</div></div><div class=\"views-field views-field-edit-node\"><span class=\"field-content\"></span></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-12 col-md-4 col-lg-4 \">\n            <div class=\"views-field views-field-field-icon-text\"><div class=\"field-content\"><i class=\"fa fa-space-shuttle\"></i></div></div><div class=\"views-field views-field-title\"><span class=\"field-content\"><a href=\"/features#407\"><h3>Booting is fast...</h3></a></span></div><div class=\"views-field views-field-body\"><div class=\"field-content\">It is important for a Flash filesystem to boot fast, so boot speed was a fundamental consideration in the design of Yaffs.</div></div><div class=\"views-field views-field-edit-node\"><span class=\"field-content\"></span></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-12 col-md-4 col-lg-4 \">\n            <div class=\"views-field views-field-field-icon-text\"><div class=\"field-content\"><i class=\"fa fa-users\"></i></div></div><div class=\"views-field views-field-title\"><span class=\"field-content\"><a href=\"/features#408\"><h3>An active community...</h3></a></span></div><div class=\"views-field views-field-body\"><div class=\"field-content\">There\'s an active community of people who use Yaffs and who have developed with Yaffs, just a click or two away.</div></div><div class=\"views-field views-field-edit-node\"><span class=\"field-content\"></span></div>\n          </div>\n              </div>\n      </div>\n\n    </div>\n  \n            <div class=\"view-footer\">\n      <a class=\"btn btn-default\" href=\"/features\">Lots more Yaffs features...</a>\n    </div>\n    </div>\n</div>\n\n  </section>\n\n\n  </div>\n\n    </div>\n  </div>\n\n  <div class=\"container-fluid front-pane-4\">\n        <div class=\"container\" >\n          <div class=\"region region-front-pane-4\">\n    <section class=\"views-element-container block block-views block-views-blockyaffs-documents-highlights-block-1 clearfix\" id=\"block-views-block-yaffs-documents-highlights-block-1\">\n  \n    \n\n      <div class=\"form-group\"><div class=\"view view-yaffs-documents-highlights view-id-yaffs_documents_highlights view-display-id-block_1 js-view-dom-id-273bf60b230e3faef44a6e67c34370278019b51f5d0e914b039f491b4d00cf06\">\n  \n    \n      \n      <div class=\"view-content\">\n      <div id=\"views-bootstrap-yaffs-documents-highlights-block-1\"  class=\"grid views-view-grid horizontal\">\n            <div class=\"row\">\n                  <div class=\"col col-xs-12 col-sm-12 col-md-6 col-lg-6 \">\n            <div class=\"views-field views-field-field-teaser-image\"><div class=\"field-content\"></div></div><div class=\"views-field views-field-title\"><h3 class=\"field-content\"><a href=\"/yaffs-licence-sample\" hreflang=\"und\">Yaffs Licence Sample</a></h3></div><div class=\"views-field views-field-body\"><div class=\"field-content\">While the Yaffs code is available free of charge under GNU General Public Licence, version 2, that entails the obligation to disclose Source Code for your application using Yaffs. An Aleph One Licence does not impose that obligation and so is attractive for proprietary projects. This sample Licence provides an example of the points we expect a Licence to cover.</div></div><div class=\"views-field views-field-upload-1\"><div class=\"field-content\"></div></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-12 col-md-6 col-lg-6 \">\n            <div class=\"views-field views-field-field-teaser-image\"><div class=\"field-content\"></div></div><div class=\"views-field views-field-title\"><h3 class=\"field-content\"><a href=\"/yaffs-overview\" hreflang=\"und\">Yaffs Overview</a></h3></div><div class=\"views-field views-field-body\"><div class=\"field-content\">YAFFS is a filesystem designed specifically for the characteristics of NAND flash. This page gives an overview of the project - what is available, how it works, how to use it, developer resources, and licensing options.</div></div><div class=\"views-field views-field-upload-1\"><div class=\"field-content\"></div></div>\n          </div>\n              </div>\n          <div class=\"row\">\n                  <div class=\"col col-xs-12 col-sm-12 col-md-6 col-lg-6 \">\n            <div class=\"views-field views-field-field-teaser-image\"><div class=\"field-content\"></div></div><div class=\"views-field views-field-title\"><h3 class=\"field-content\"><a href=\"/yaffs-licence-faqs\" hreflang=\"und\">Yaffs Licence FAQs</a></h3></div><div class=\"views-field views-field-body\"><div class=\"field-content\"><p>Some questions about the commercial licence for Yaffs and how we arrive at one.</p></div></div><div class=\"views-field views-field-upload-1\"><div class=\"field-content\"></div></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-12 col-md-6 col-lg-6 \">\n            <div class=\"views-field views-field-field-teaser-image\"><div class=\"field-content\"></div></div><div class=\"views-field views-field-title\"><h3 class=\"field-content\"><a href=\"/documents/faq\" hreflang=\"und\">FAQ</a></h3></div><div class=\"views-field views-field-body\"><div class=\"field-content\"><p>Common questions about Yaffs technical issues.</p></div></div><div class=\"views-field views-field-upload-1\"><div class=\"field-content\"></div></div>\n          </div>\n              </div>\n          <div class=\"row\">\n                  <div class=\"col col-xs-12 col-sm-12 col-md-6 col-lg-6 \">\n            <div class=\"views-field views-field-field-teaser-image\"><div class=\"field-content\"></div></div><div class=\"views-field views-field-title\"><h3 class=\"field-content\"><a href=\"/licences-more-background-and-detail\" hreflang=\"und\">Licences - more background and detail</a></h3></div><div class=\"views-field views-field-body\"><div class=\"field-content\"><p>More on the details and background of Licences for Yaffs</p></div></div><div class=\"views-field views-field-upload-1\"><div class=\"field-content\"></div></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-12 col-md-6 col-lg-6 \">\n            <div class=\"views-field views-field-field-teaser-image\"><div class=\"field-content\"><a href=\"/sites/default/files/downloads/ConsiderationsInChoosingAFlashFileSystem_0.pdf\">  <img src=\"/sites/default/files/styles/pdf_image/public/styles/pdf_image/public/downloads/ConsiderationsInChoosingAFlashFileSystem_0.pdf.png?itok=ROOk6w-T\" width=\"150\" height=\"212\" alt=\"Preview of ConsiderationsInChoosingAFlashFileSystem.pdf\" typeof=\"foaf:Image\" class=\"img-responsive\" />\n\n\n</a></div></div><div class=\"views-field views-field-title\"><h3 class=\"field-content\"><a href=\"/documents/considerations-choosing-flash-file-system\" hreflang=\"und\">Considerations in Choosing a Flash File System</a></h3></div><div class=\"views-field views-field-body\"><div class=\"field-content\">Failures in an embedded File System in a product are much more serious to the user than failures in an office computer.&nbsp; Power failures and failures to cache data properly can be avoided by choosing a FFS specifically designed for reliability from the ground up.</div></div><div class=\"views-field views-field-upload-1\"><div class=\"field-content\"><span class=\"file file--mime-application-pdf file--application-pdf icon-before\"><span class=\"file-icon\"><span class=\"icon glyphicon glyphicon-file text-primary\" aria-hidden=\"true\"></span></span><span class=\"file-link\"><a href=\"https://yaffs.net/sites/default/files/downloads/ConsiderationsInChoosingAFlashFileSystem_0.pdf\" type=\"application/pdf; length=131376\" title=\"Open file in new window\" target=\"_blank\" data-toggle=\"tooltip\" data-placement=\"bottom\">ConsiderationsInChoosingAFlashFileSystem.pdf</a></span><span class=\"file-size\">128.3 KB</span></span></div></div>\n          </div>\n              </div>\n          <div class=\"row\">\n                  <div class=\"col col-xs-12 col-sm-12 col-md-6 col-lg-6 \">\n            <div class=\"views-field views-field-field-teaser-image\"><div class=\"field-content\"><a href=\"/sites/default/files/downloads/HowYaffsWorks.pdf\">  <img src=\"/sites/default/files/styles/pdf_image/public/styles/pdf_image/public/downloads/HowYaffsWorks.pdf.png?itok=_nJu31C0\" width=\"150\" height=\"194\" alt=\"Preview of HowYaffsWorks.pdf\" typeof=\"foaf:Image\" class=\"img-responsive\" />\n\n\n</a></div></div><div class=\"views-field views-field-title\"><h3 class=\"field-content\"><a href=\"/documents/how-yaffs-works\" hreflang=\"und\">How Yaffs works</a></h3></div><div class=\"views-field views-field-body\"><div class=\"field-content\">This document gives an explanation of most of the core mechanisms that make Yaffs work. As of the time of writing this, the Yaffs2 code base includes approximately 19,000 lines of code making a very detailed discussion impractical. This document is the starting point for understanding Yaffs. Further detailed questions and discussions are welcomed on the Yaffs discussion list.</div></div><div class=\"views-field views-field-upload-1\"><div class=\"field-content\"><span class=\"file file--mime-application-pdf file--application-pdf icon-before\"><span class=\"file-icon\"><span class=\"icon glyphicon glyphicon-file text-primary\" aria-hidden=\"true\"></span></span><span class=\"file-link\"><a href=\"https://yaffs.net/sites/default/files/downloads/HowYaffsWorks.pdf\" type=\"application/pdf; length=402514\" title=\"Open file in new window\" target=\"_blank\" data-toggle=\"tooltip\" data-placement=\"bottom\">HowYaffsWorks.pdf</a></span><span class=\"file-size\">393.08 KB</span></span></div></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-12 col-md-6 col-lg-6 \">\n            <div class=\"views-field views-field-field-teaser-image\"><div class=\"field-content\"><a href=\"/sites/default/files/downloads/YaffsTuning.pdf\">  <img src=\"/sites/default/files/styles/pdf_image/public/styles/pdf_image/public/downloads/YaffsTuning.pdf.png?itok=idZTTQBs\" alt=\"Preview of YaffsTuning.pdf\" typeof=\"foaf:Image\" class=\"img-responsive\" />\n\n\n</a></div></div><div class=\"views-field views-field-title\"><h3 class=\"field-content\"><a href=\"/documents/yaffs-tuning\" hreflang=\"und\">Yaffs Tuning</a></h3></div><div class=\"views-field views-field-body\"><div class=\"field-content\"><p>This document describes the parameters which can be modified by the developer in the different phases of applying, debugging, and routine use of Yaffs.</p></div></div><div class=\"views-field views-field-upload-1\"><div class=\"field-content\"><span class=\"file file--mime-application-pdf file--application-pdf icon-before\"><span class=\"file-icon\"><span class=\"icon glyphicon glyphicon-file text-primary\" aria-hidden=\"true\"></span></span><span class=\"file-link\"><a href=\"https://yaffs.net/sites/default/files/downloads/YaffsTuning.pdf\" type=\"application/pdf; length=93667\" title=\"Open file in new window\" target=\"_blank\" data-toggle=\"tooltip\" data-placement=\"bottom\">YaffsTuning.pdf</a></span><span class=\"file-size\">91.47 KB</span></span></div></div>\n          </div>\n              </div>\n      </div>\n\n    </div>\n  \n            <div class=\"view-footer\">\n      <a class=\"btn btn-default\" href=\"/documents\">All the Yaffs documentation...</a>\n    </div>\n    </div>\n</div>\n\n  </section>\n\n\n  </div>\n\n    </div>\n  </div>\n\n    <div class=\"container-fluid front-pane-5\">\n                <div class=\"container\" >\n              <div class=\"region region-front-pane-5\">\n    <section id=\"block-frontpageprimeryaffs\" class=\"block block-block-content block-block-contente7a8d2de-4fbb-4680-9e18-fe4d8337f1d6 clearfix\">\n  \n    \n\n      \n            <div class=\"field field--name-body field--type-text-with-summary field--label-hidden field--item\">\n<h1>Flash file systems primer</h1>\n<h2>Background &amp; basics</h2>\n<h3><span>What is a </span><span>F</span><span>lash </span><span>F</span><span>ile </span><span>S</span><span>ystem</span>?</h3>\n<p><span>A <span>Flash File System</span> stores data on flash memory, rather than a hard drive. Flash is used because it’s faster, much more tolerant of physical stress and takes less power. A <span>flash filesystem</span> is used to manage the data and get the best out of flash memory.</span></p>\n<p><span>As two examples, a flash memory chip needs to be erased in blocks before it is rewritten and a flash file system will manage that; flash memory has a limited number of writes per block so many flash file systems incorporate a <span>wear levelling</span> mechanism to ensure the writes are spread out.</span></p>\n<p><span>A flash file system is most useful as a part of an embedded system,. As a developer, you <em>can</em>&nbsp;read from and write directly to your Flash memory on an embedded system, but unless your use is extremely limited, you\'ll probably find that you come up against problems that Flash file systems have already solved.</span></p>\n<h3>What are NAND flash &amp; NOR flash?</h3>\n<p><span>These are the two fundamental flash architectures and have very different characteristics in performance, reliability, erase cycles, life span, and price. They also differ fundamentally from hard disk drives, and so need specialised handling.</span></p>\n<table>\n<tbody>\n <tr>\n  <td>\n  <p>&nbsp;</p>\n   </td>\n  <td>\n  <p>NAND flash</p>\n   </td>\n  <td>\n  <p>NOR flash</p>\n   </td>\n </tr>\n <tr>\n  <td>\n  <p>Storage density</p>\n   </td>\n  <td>\n  <p>Higher</p>\n   </td>\n  <td>\n  <p>Lower</p>\n   </td>\n </tr>\n <tr>\n  <td>\n  <p>Read performance</p>\n   </td>\n  <td>\n  <p>Fast</p>\n   </td>\n  <td>\n  <p>Fast (may be slowed by serial access)</p>\n   </td>\n </tr>\n <tr>\n  <td>\n  <p>Write performance</p>\n   </td>\n  <td>\n  <p>Faster</p>\n   </td>\n  <td>\n  <p>Slower (may be slowed further by serial access)</p>\n   </td>\n </tr>\n <tr>\n  <td>\n  <p>Erase performance</p>\n   </td>\n  <td>\n  <p>Faster (low ms typically)</p>\n   </td>\n  <td>\n  <p>Slower (possibly seconds)</p>\n   </td>\n </tr>\n <tr>\n  <td>\n  <p>Storage reliability</p>\n   </td>\n  <td>\n  <p>Lower (without management)</p>\n   </td>\n  <td>\n  <p>Better</p>\n   </td>\n </tr>\n <tr>\n  <td>\n  <p>Life span</p>\n   </td>\n  <td>\n  <p>Higher</p>\n   </td>\n  <td>\n  <p>Lower</p>\n   </td>\n </tr>\n <tr>\n  <td>\n  <p>Price</p>\n   </td>\n  <td>\n  <p>Lower</p>\n   </td>\n  <td>\n  <p>Higher</p>\n   </td>\n </tr>\n</tbody>\n</table>\n<p><span>Yaffs is both an <span>embedded NAN</span><span>D flash file system</span> and an <span>embedded N</span><span>OR Flash file system</span>. It can handle SLC, TLC and MLC NAND. It also works on MLC and SLC NOR. And it can work with parallel or serial access including Serial Peripheral Bus (SPI).</span></p>\n<h3>What special functions does a <span>file system </span><span>for flash</span> include?</h3>\n<p><span>As well as the normal file system functions, a <span>flash file system embedded</span> in hardware should help the device to start and stop quickly and deal well with losing power with no warning, without corrupting the data; and, manage the foibles of flash memory, protecting the stored data with extreme reliability. (Read our paper <a href=\"/documents/considerations-choosing-flash-file-system\">Considerations in Choosing a Flash File System</a>.)</span></p>\n<p><span><span>To these ends, an embedded flash file system must employ extra steps to achieve these such as using log structuring, rather than traditional file structuring plus a flash translation layer; manage power loss and recovery; include flash memory wear levelling; deal with the unreliability of flash from read and write disturbs, by using error correction (ECC), bad block remapping, over provision and flash block refreshing; ensure it’s ready to write fast by using garbage collection and flash block erase to prepare; and manage writing while avoiding write amplification. </span></span></p>\n<h4>What is a log-structured file system?</h4>\n<p><span>Log structuring means that data is written to the file system as a sequence of changes to the file system. This has the advantage that there is less overhead, and so it\'s faster than a non-log-structured system. More important though is that it is more robust against power failure. It also means that a file may be fragmented. For hard drives, fragmentation can mean much slower access due to the time required to mechanically move the read heads around the disk, but flash memory has no moving parts so there is no overhead for flash.</span></p>\n<p><span>Yaffs is log structured a <span>flash file system </span><span>architecture</span> which is faster and more robust than the alternatives.</span></p>\n<h4>What is a <span>Flash Translation Layer</span> (FTL) ?</h4>\n<p><span>It is sometimes desirable to use regular block file systems (such as FAT) with flash memory. In such cases, a Flash Translation Layer presents flash memory or a flash file system as if it\'s an ordinary hard drive.</span></p>\n<p><span>An FTL is an incomplete storage solution it still requires a file system. This makes two layers where data can be damaged and lost: in the FTL and in the <span>flash memory </span><span>file system</span>.</span></p>\n<p><span>True <span>file systems for flash memory</span>, such as Yaffs, do not use FTLs. They deal directly with the idiosyncrasies of flash, providing a faster and more reliable solution.</span></p>\n<h4>What is power loss recovery?</h4>\n<p><span>When power to any storage device is suddenly lost, the device can end up in an unknown state and may have damaged areas. Most file systems have to work hard to ensure that they are in a consistent state after power loss. <span>E</span><span>mbedded file systems</span> <span>for flash</span> may make allowances for unscheduled power loss with a recovery process.</span></p>\n<p><span>Yaffs is built with fault tolerance as a guiding principle and so is designed so power loss is considered a normal event.</span></p>\n<h4>What is <span>wear levelling</span>?</h4>\n<p><span>Flash chips wear out. Each time a part of the flash memory is erased and written, it is slightly damaged. <span>Embedded f</span><span>lash file systems</span> note the danger, and sometimes try to spread the damage rather than having it concentrated in one region, so prolonging the life of the memory and the life of the device.</span></p>\n<p><span>Yaffs is designed so that extra <span>wear leveling</span> is unnecessary. Instead, it’s automatically <span>wear levelling</span> because of the log structure.</span></p>\n<h4>What is flash read disturb? What is flash write disturb?</h4>\n<p><span><a href=\"/documents/yaffs-nand-flash-failure-mitigation\">NAND flash may experience degradation or loss of data</a> owing to reads of pages in the same block or data changes in neighbouring blocks of the NAND device. This is particularly true for MLC NAND.</span></p>\n<p><span>Yaffs uses block refreshing to deal with such problems.</span></p>\n<h4>What is flash error correction/flash ECC?</h4>\n<p><span>There are ways in which flash memory can be corrupted – for instance F-N tunnelling problems and leaky oxide layers. See our <a href=\"/documents/yaffs-nand-flash-failure-mitigation\">detailed discussion of flash memory problems</a>.</span></p>\n<p><span>But every bit counts, and especially if it\'s part of critical data or essential to the correct working of a system. Flash error correction keeps track of a section of memory to tell if there\'s corruption, and provides ways to correct these small errors.</span></p>\n<p><span>Yaffs can use hardware or software based ECC.</span></p>\n<h4>What is bad-block remapping?</h4>\n<p><span>File systems are built upon storing data on physical media. But all media suffers deterioration. Some hardware or <span>flash media </span><span>file systems</span> keep lists of damaged regions and behind the scenes, substitute known good ones in their place.</span></p>\n<p><span>Because of the way that Yaffs works, there\'s no need for bad block remapping because it isn’t a block structured file system.</span></p>\n<h4>What is <span>o</span><span>ver-provisioning</span> ?</h4>\n<p><span>Knowing that the media will degrade and suffer errors, and needing space to alter data because of the nature of flash memory, sometimes a <span>flash memory based </span><span>file system</span> puts aside a portion of the media for this use. This is <span>overprovisioning</span>. Often this space used when remapping bad blocks.</span></p>\n<p><span>Because Yaffs is log structured, it has the advantage that it does not need <span>over provision</span><span>ing</span>, making more memory available to store data.</span></p>\n<h4>What is flash block refreshing?</h4>\n<p><span>To counteract the problems of unreliable flash memory – for instance errors due to read and write disturbs – a flash filesystem can refresh the memory, by making a new copy of a block.</span></p>\n<p><span>Yaffs includes flash block refreshing.</span></p>\n<h4>What is flash garbage collection?</h4>\n<p><span>When a file is deleted, or a part of a file is overwritten, file systems often simply mark the flash space as deleted, rather than removing it. Later they reclaim the space for reuse. This is garbage collection.</span></p>\n<p><span>Yaffs has garbage collection to maximise the amount of data the file system can store.</span></p>\n<h4>What is flash block erase?</h4>\n<p><span>Data must be written into blank areas of the flash chip, but erasing takes time. Rather than erase and write at the same time, in order to speed writes, NAND and <span>NOR flash file systems</span> can prepare blocks for later use. This is not usually necessary for other storage media.</span></p>\n<p><span>As part of garbage collection, Yaffs uses a block erase strategy.</span></p>\n<h4>What is flash write amplification ?</h4>\n<p><span>In many block-based flash file systems, when data changes the new data must be written to the disk, and then the old data must be marked as invalid. A small change to the data can have consequences that propagate involving writing to the memory twice or more as the old data is cleaned up by garbage collection and files are organised to take the minimum amount of space. This is write amplification - a single small write causing a cascade of writes (and erases) of whole blocks.</span></p>\n<p><span>Yaffs avoids much of this problem by being log structured, meaning that flash memory is slower to reach it\'s maximum number of cycles, while writing is faster.</span></p>\n<h2>How does Yaffs work?</h2>\n<p><span>You can find full details in our paper <a href=\"/documents/how-yaffs-works\">How Yaffs Works</a>&nbsp;but briefly, here\'s how it works.</span></p>\n<p><span>It\'s a log-structured filing system. This also ensures that Yaffs is wear-levelling is built into the design because no one part of the flash memory is used any more than another.</span></p>\n<p><span>A Yaffs object is anything that Yaffs stores - for instance a file or a directory.</span></p>\n<p><span>The memory in NAND flash is arranged in pages. A page is the unit of allocation and programming. In Yaffs, the unit of allocation is called the chunk. Typically a chunk will be the same as a NAND page, but there is flexibility to use chunks which map to multiple pages (eg. A system may have two NAND chips in parallel requiring 2x2048 = 4096 byte chunks) . This distinction gives a lot of flexibility in how the system can be configured.</span></p>\n<p><span>A fixed but configurable number of chunks form a block which is the unit of erasure.</span></p>\n<p><span>NAND flash is shipped with bad blocks and further blocks may go bad during the operation of the device so Yaffs detects and marks bad blocks.</span></p>\n<p><span>NAND flash also typically requires the use of some sort of error detection and correction code (ECC). Yaffs can either use existing ECC logic or provide its own.</span></p>\n<p><span>Yaffs maintains data in RAM about the file system, but this is not needed for Yaffs to work - so the device can safely lose power at any point without data corruption.</span></p>\n<p><span>Here\'s how the Yaffs filesystem works to ensure data safety and a very fast startup... At regular points and on controlled shutdown, checkpoint blocks are written to the flash memory, containing all the data to quickly rebuild the file system. Under usual circumstances this checkpoint is used when a device is started, to very quickly rebuild the RAM data about the file system. If the checkpoint is determined to be corrupted, or if the user requested then the file system is rebuilt by scanning.</span></p>\n<p><span>To do this, Yaffs makes a prescan, to find the sequence numbers for blocks. Then it scans through blocks backwards to build up the list of chunks that make up objects. It speeds up this process by using Block Summaries, which are collections of all the tags in a data in a block. (But it\'s still always possible to go back to the chunks themselves, to find the tags, if a summary is missing or damaged.)</span></p>\n<p><span>And tags are how Yaffs tells that a chunk belongs to a particular object.</span></p>\n<p><span>Tags are also how Yaffs knows which chunks make up the current version of an object... Because the file system is log structured, if an object has been updated, only the latest chunks are used, giving the correct version of the object. A full description of the process is available in the technical documentation, and of course you can browse the code to see exactly how it all works; there\'s a lot more to tags, the metadata that they can hold, how they are stored, and how tags are used to link together objects into a file system with a POSIX interface.</span></p>\n<p><span>And of course that\'s not the end of the story. There\'s caching to deal with repeated small changes to data. There\'s garbage collection to let space be re-used, and Yaffs deals with collecting garbage differently depending on whether there\'s lots of free space or only a little. And part of making Yaffs a high performance flash file system is to make sure that re-useable blocks are erased well before they are needed, so that writing involves only a single operation. There\'s lazy loading to reduce scanning time. And all of this is built in a portable way, so that Yaffs can be configured to match almost any hardware, and can be ported to any operating system, or work on bare metal without an operating system. There\'s a test harness which is used to subject Yaffs to power failure, and ensure it works even with external data corruption. That\'s what makes it robust enough to send into space and to handle hundreds of terabytes of mission critical data.</span></p>\n<h4>Why is Yaffs special as an embedded flash file system?</h4>\n<p><span>Yaffs has been in use since 2002, and so it is hardened. It has been used in everything from phones to sewing machines to satellites. It is popular with Aerospace companies, and firms managing large infrastructure and in Point-of-Sale (POS) equipment (where customer feedback is very rapid!) It has been used in extreme conditions where it must not lose data, and where there is no chance for maintenance. It\'s been used for very large file systems up to 190TB. It\'s been used for safety critical applications, and millions of consumer devices.</span></p>\n<p><span>We carry out testing in a <a href=\"/documents/yaffs-robustness-and-testing\">rig which can simulate random power failures</a> and proved its reliability after tens to hundreds of millions of power failures.&nbsp;It\'s designed with an understanding of the constraints of flash memory and for speed.</span></p>\n<p><span>Yaffs works on multiple operating systems – Linux, VxWorks, Windows CE, eCos. - and also directly on bare metal, with no operating system. And it\'s easy to integrate into your RTOS or application using the Yaffs Direct Interface. It works with multiple types of flash memory - NAND &amp; NOR, SLC, MLC &amp; TLC.&nbsp;It\'s endian neutral. It\'s been used with 32-bit and 64-bit CPUs including MIPS, 68000, ARM, ColdFire, PowerPC and x86 variants. Yaffs has even been used with various DSP architectures! And it\'ll work with 16-bit with some tuning. So it can be configured to work with your design and the flash geometry that you need.</span></p>\n<p><span>And it\'s a <span>free embedded flash file system - </span><span>it’s open</span> <span>source</span>! <a href=\"/get-yaffs\">Grab the GPL version now</a>! Check out our the active community. And that\'s not the whole story - there are lots more reasons that make Yaffs special.&nbsp;</span></p>\n<p>&nbsp;</p>\n</div>\n      \n  </section>\n\n\n  </div>\n\n        </div>\n    </div>\n\n      <footer class=\"footer container\" role=\"contentinfo\">\n        <div class=\"primary_footer row\">\n            <div class=\"col-sm-3\">\n                  <div class=\"region region-footer-col1\">\n    <section id=\"block-yaffs-block-6\" class=\"block block-block-content block-block-content6c2d4b45-4dba-4b2d-8b9f-76701bf27533 clearfix\">\n  \n    \n\n      \n            <div class=\"field field--name-body field--type-text-with-summary field--label-hidden field--item\">\n<ul class=\"fa-ul\">\n<li><i class=\"fa-li fa fa-phone\"></i>+44 (0)1223 811679</li>\n<li><i class=\"fa-li fa fa-envelope\"></i><a href=\"denied:mailto:info@aleph1.co.uk?Subject=Website contact\" target=\"_top\">info@aleph1.co.uk</a></li>\n</ul>\n</div>\n      \n  </section>\n\n\n  </div>\n\n            </div>\n            <div class=\"col-sm-3\">\n                \n            </div>\n            <div class=\"col-sm-3\">\n                \n            </div>\n            <div class=\"col-sm-3\">\n                  <div class=\"region region-footer-col4\">\n    <section id=\"block-footerlegal\" class=\"block block-block-content block-block-content78ab593d-35b6-4772-a141-30216e7fcbb2 clearfix\">\n  \n    \n\n      \n            <div class=\"field field--name-body field--type-text-with-summary field--label-hidden field--item\">\n<p class=\"text-align-right\">&nbsp;<a href=\"/legal\">Legal &amp; Cookies</a></p>\n</div>\n      \n  </section>\n\n<section id=\"block-cookieinfo\" class=\"block block-block-content block-block-content4848c58d-90df-4819-81d8-0f9568eeeaac clearfix\">\n  \n    \n\n      \n            <div class=\"field field--name-body field--type-text-with-summary field--label-hidden field--item\">\n<p class=\"text-align-justify\"><br />\nWe use <a href=\"/legal\">cookies on this site</a>. By using it, you are giving us consent to set cookies.</p>\n</div>\n      \n  </section>\n\n\n  </div>\n\n            </div>\n        </div>\n        <div class = \"secondary_footer row\">\n            <div class=\"col-sm-12\">\n                <div class=\"region region-footer\">\n    <nav role=\"navigation\" aria-labelledby=\"block-yaffs-account-menu-menu\" id=\"block-yaffs-account-menu\">\n            <h2 class=\"sr-only\" id=\"block-yaffs-account-menu-menu\">User account menu</h2>\n\n      \n              <ul class=\"menu nav navbar-nav navbar-right\">\n                            <li>\n        <a href=\"/user/login\" data-drupal-link-system-path=\"user/login\">Log in</a>\n                  </li>\n        </ul>\n  \n\n\n  </nav>\n\n  </div>\n\n            </div>\n        </div>\n    </footer>\n  \n    \n    <script type=\"application/json\" data-drupal-selector=\"drupal-settings-json\">{\"path\":{\"baseUrl\":\"\\/\",\"scriptPath\":null,\"pathPrefix\":\"\",\"currentPath\":\"node\\/487\",\"currentPathIsAdmin\":false,\"isFront\":true,\"currentLanguage\":\"en\",\"currentQuery\":{\"author\":\"1\"}},\"pluralDelimiter\":\"\\u0003\",\"bootstrap\":{\"forms_has_error_value_toggle\":1,\"modal_animation\":1,\"modal_backdrop\":\"true\",\"modal_keyboard\":1,\"modal_show\":1,\"modal_size\":\"\",\"popover_enabled\":1,\"popover_animation\":1,\"popover_container\":\"body\",\"popover_content\":\"\",\"popover_delay\":\"0\",\"popover_html\":0,\"popover_placement\":\"right\",\"popover_selector\":\"\",\"popover_title\":\"\",\"popover_trigger\":\"click\",\"popover_trigger_autoclose\":1,\"tooltip_enabled\":1,\"tooltip_animation\":1,\"tooltip_container\":\"body\",\"tooltip_delay\":\"0\",\"tooltip_html\":0,\"tooltip_placement\":\"auto left\",\"tooltip_selector\":\"\",\"tooltip_trigger\":\"hover\"},\"ajaxTrustedUrl\":{\"\\/search\\/node\":true},\"user\":{\"uid\":0,\"permissionsHash\":\"aa7fc4c8fb40c7a8665ccd12fea07926dff0f59b9ee3346bc513c6399bee5b01\"}}</script>\n<script src=\"/sites/default/files/js/js_2l0lF4i9o3aztHULbfajMT_RTqGCEN_lVC8JI48SILw.js\"></script>\n\n  </body>\n</html>\n\";s:10:\"\0*\0version\";s:3:\"1.0\";s:13:\"\0*\0statusCode\";i:200;s:13:\"\0*\0statusText\";s:2:\"OK\";s:10:\"\0*\0charset\";N;s:23:\"\0*\0cacheabilityMetadata\";O:35:\"Drupal\\Core\\Cache\\CacheableMetadata\":3:{s:16:\"\0*\0cacheContexts\";a:18:{i:0;s:26:\"languages:language_content\";i:1;s:28:\"languages:language_interface\";i:2;s:5:\"route\";i:3;s:32:\"route.menu_active_trails:account\";i:4;s:29:\"route.menu_active_trails:main\";i:5;s:5:\"theme\";i:6;s:8:\"timezone\";i:7;s:8:\"url.path\";i:8;s:17:\"url.path.is_front\";i:9;s:15:\"url.path.parent\";i:10;s:30:\"url.query_args:_wrapper_format\";i:11;s:8:\"url.site\";i:12;s:4:\"user\";i:13;s:21:\"user.node_grants:view\";i:14;s:16:\"user.permissions\";i:15;s:10:\"user.roles\";i:16;s:20:\"user.roles:anonymous\";i:17;s:24:\"user.roles:authenticated\";}s:12:\"\0*\0cacheTags\";a:103:{i:0;s:16:\"block_content:18\";i:1;s:16:\"block_content:23\";i:2;s:16:\"block_content:25\";i:3;s:16:\"block_content:27\";i:4;s:16:\"block_content:28\";i:5;s:16:\"block_content:29\";i:6;s:16:\"block_content:30\";i:7;s:15:\"block_content:7\";i:8;s:18:\"block_content_view\";i:9;s:10:\"block_view\";i:10;s:32:\"config:block.block.choosingyaffs\";i:11;s:29:\"config:block.block.cookieinfo\";i:12;s:32:\"config:block.block.downloadyaffs\";i:13;s:30:\"config:block.block.footerlegal\";i:14;s:39:\"config:block.block.frontimagehighlight2\";i:15;s:32:\"config:block.block.frontpagehero\";i:16;s:39:\"config:block.block.frontpageprimeryaffs\";i:17;s:33:\"config:block.block.mainnavigation\";i:18;s:35:\"config:block.block.mainnavigation_2\";i:19;s:29:\"config:block.block.searchform\";i:20;s:31:\"config:block.block.sitebranding\";i:21;s:66:\"config:block.block.views_block__highlighted_yaffs_features_block_1\";i:22;s:66:\"config:block.block.views_block__yaffs_admin_recent_content_block_1\";i:23;s:66:\"config:block.block.views_block__yaffs_documents_highlights_block_1\";i:24;s:56:\"config:block.block.views_block__yaffs_user_logos_block_1\";i:25;s:37:\"config:block.block.yaffs_account_menu\";i:26;s:33:\"config:block.block.yaffs_block_10\";i:27;s:32:\"config:block.block.yaffs_block_5\";i:28;s:32:\"config:block.block.yaffs_block_6\";i:29;s:32:\"config:block.block.yaffs_block_8\";i:30;s:32:\"config:block.block.yaffs_block_9\";i:31;s:36:\"config:block.block.yaffs_breadcrumbs\";i:32;s:32:\"config:block.block.yaffs_content\";i:33;s:29:\"config:block.block.yaffs_help\";i:34;s:36:\"config:block.block.yaffs_local_tasks\";i:35;s:33:\"config:block.block.yaffs_messages\";i:36;s:35:\"config:block.block.yaffs_page_title\";i:37;s:32:\"config:block.block.yaffs_user_21\";i:38;s:31:\"config:block.block.yaffsinspace\";i:39;s:17:\"config:block_list\";i:40;s:24:\"config:color.theme.yaffs\";i:41;s:30:\"config:field.storage.node.body\";i:42;s:41:\"config:field.storage.node.field_icon_text\";i:43;s:44:\"config:field.storage.node.field_teaser_image\";i:44;s:47:\"config:field.storage.node.field_yaffs_user_logo\";i:45;s:32:\"config:field.storage.node.upload\";i:46;s:31:\"config:filter.format.basic_html\";i:47;s:30:\"config:filter.format.full_html\";i:48;s:29:\"config:filter.format.raw_html\";i:49;s:28:\"config:image.style.pdf_image\";i:50;s:24:\"config:image.style.small\";i:51;s:22:\"config:search.settings\";i:52;s:26:\"config:system.menu.account\";i:53;s:23:\"config:system.menu.main\";i:54;s:18:\"config:system.site\";i:55;s:26:\"config:user.role.anonymous\";i:56;s:44:\"config:views.view.highlighted_yaffs_features\";i:57;s:44:\"config:views.view.yaffs_documents_highlights\";i:58;s:34:\"config:views.view.yaffs_user_logos\";i:59;s:8:\"file:108\";i:60;s:8:\"file:109\";i:61;s:8:\"file:110\";i:62;s:7:\"file:40\";i:63;s:7:\"file:43\";i:64;s:7:\"file:44\";i:65;s:7:\"file:45\";i:66;s:7:\"file:46\";i:67;s:7:\"file:47\";i:68;s:7:\"file:48\";i:69;s:7:\"file:76\";i:70;s:7:\"file:77\";i:71;s:7:\"file:85\";i:72;s:13:\"http_response\";i:73;s:7:\"media:5\";i:74;s:7:\"media:8\";i:75;s:7:\"media:9\";i:76;s:7:\"node:32\";i:77;s:8:\"node:344\";i:78;s:8:\"node:353\";i:79;s:8:\"node:384\";i:80;s:8:\"node:385\";i:81;s:8:\"node:388\";i:82;s:8:\"node:389\";i:83;s:8:\"node:397\";i:84;s:8:\"node:398\";i:85;s:8:\"node:399\";i:86;s:8:\"node:400\";i:87;s:8:\"node:401\";i:88;s:8:\"node:407\";i:89;s:8:\"node:408\";i:90;s:8:\"node:409\";i:91;s:8:\"node:448\";i:92;s:8:\"node:451\";i:93;s:8:\"node:457\";i:94;s:8:\"node:460\";i:95;s:8:\"node:462\";i:96;s:8:\"node:466\";i:97;s:8:\"node:487\";i:98;s:9:\"node_list\";i:99;s:9:\"node_view\";i:100;s:8:\"rendered\";i:101;s:6:\"user:0\";i:102;s:6:\"user:1\";}s:14:\"\0*\0cacheMaxAge\";i:-1;}s:14:\"\0*\0attachments\";a:5:{s:7:\"library\";a:10:{i:0;s:14:\"core/html5shiv\";i:1;s:11:\"system/base\";i:2;s:15:\"bootstrap/theme\";i:3;s:20:\"yaffs/global-styling\";i:4;s:23:\"yaffs/bootstrap-scripts\";i:5;s:19:\"yaffs/yaffs-helpers\";i:6;s:17:\"bootstrap/popover\";i:7;s:17:\"bootstrap/tooltip\";i:8;s:18:\"views/views.module\";i:10;s:50:\"environment_indicator/drupal.environment_indicator\";}s:9:\"html_head\";a:22:{i:0;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"meta\";s:11:\"#attributes\";a:2:{s:4:\"name\";s:5:\"title\";s:7:\"content\";s:84:\"A Robust Flash File System Since 2002 | Yaffs - A Flash File System for embedded use\";}}i:1;s:5:\"title\";}i:1;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:2:{s:3:\"rel\";s:9:\"shortlink\";s:4:\"href\";s:18:\"https://yaffs.net/\";}}i:1;s:9:\"shortlink\";}i:2;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:2:{s:3:\"rel\";s:9:\"canonical\";s:4:\"href\";s:18:\"https://yaffs.net/\";}}i:1;s:13:\"canonical_url\";}i:3;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"meta\";s:11:\"#attributes\";a:2:{s:4:\"name\";s:13:\"news_keywords\";s:7:\"content\";s:17:\"Flash File System\";}}i:1;s:13:\"news_keywords\";}i:4;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"meta\";s:11:\"#attributes\";a:2:{s:4:\"name\";s:11:\"description\";s:7:\"content\";s:352:\"Yaffs (Yet Another Flash File System) is an open-source file system specifically designed to be fast, robust and suitable for embedded use with NAND and NOR Flash. It is widely used with Linux, RTOSs, or no OS at all, in consumer devices and critical infrastructure. It is available under GNU Public License, GPL, or on commercial terms from Aleph One.\";}}i:1;s:11:\"description\";}i:5;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"meta\";s:11:\"#attributes\";a:2:{s:4:\"name\";s:8:\"abstract\";s:7:\"content\";s:352:\"Yaffs (Yet Another Flash File System) is an open-source file system specifically designed to be fast, robust and suitable for embedded use with NAND and NOR Flash. It is widely used with Linux, RTOSs, or no OS at all, in consumer devices and critical infrastructure. It is available under GNU Public License, GPL, or on commercial terms from Aleph One.\";}}i:1;s:8:\"abstract\";}i:6;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"meta\";s:11:\"#attributes\";a:2:{s:4:\"name\";s:8:\"keywords\";s:7:\"content\";s:82:\"flash File System, flash, file System, flash storage, NAND flash, NOR flash, Yaffs\";}}i:1;s:8:\"keywords\";}i:7;a:2:{i:0;a:3:{s:4:\"#tag\";s:4:\"meta\";s:11:\"#attributes\";a:1:{s:7:\"charset\";s:5:\"utf-8\";}s:7:\"#weight\";i:-1000;}i:1;s:24:\"system_meta_content_type\";}i:8;a:2:{i:0;a:3:{s:5:\"#type\";s:8:\"html_tag\";s:4:\"#tag\";s:4:\"meta\";s:11:\"#attributes\";a:2:{s:4:\"name\";s:9:\"Generator\";s:7:\"content\";s:33:\"Drupal 8 (https://www.drupal.org)\";}}i:1;s:21:\"system_meta_generator\";}i:9;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"meta\";s:11:\"#attributes\";a:2:{s:4:\"name\";s:15:\"MobileOptimized\";s:7:\"content\";s:5:\"width\";}}i:1;s:15:\"MobileOptimized\";}i:10;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"meta\";s:11:\"#attributes\";a:2:{s:4:\"name\";s:16:\"HandheldFriendly\";s:7:\"content\";s:4:\"true\";}}i:1;s:16:\"HandheldFriendly\";}i:11;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"meta\";s:11:\"#attributes\";a:2:{s:4:\"name\";s:8:\"viewport\";s:7:\"content\";s:37:\"width=device-width, initial-scale=1.0\";}}i:1;s:8:\"viewport\";}i:12;a:2:{i:0;a:3:{s:5:\"#type\";s:8:\"html_tag\";s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:3:{s:3:\"rel\";s:10:\"stylesheet\";s:4:\"href\";s:125:\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSansRegular-fontfacekit/fontyourface-stylesheet.css\";s:5:\"media\";s:3:\"all\";}}i:1;s:21:\"fontsquirrel-api-1151\";}i:13;a:2:{i:0;a:3:{s:5:\"#type\";s:8:\"html_tag\";s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:3:{s:3:\"rel\";s:10:\"stylesheet\";s:4:\"href\";s:124:\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSansItalic-fontfacekit/fontyourface-stylesheet.css\";s:5:\"media\";s:3:\"all\";}}i:1;s:21:\"fontsquirrel-api-1152\";}i:14;a:2:{i:0;a:3:{s:5:\"#type\";s:8:\"html_tag\";s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:3:{s:3:\"rel\";s:10:\"stylesheet\";s:4:\"href\";s:122:\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSansBold-fontfacekit/fontyourface-stylesheet.css\";s:5:\"media\";s:3:\"all\";}}i:1;s:21:\"fontsquirrel-api-1153\";}i:15;a:2:{i:0;a:3:{s:5:\"#type\";s:8:\"html_tag\";s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:3:{s:3:\"rel\";s:10:\"stylesheet\";s:4:\"href\";s:123:\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSerifBold-fontfacekit/fontyourface-stylesheet.css\";s:5:\"media\";s:3:\"all\";}}i:1;s:21:\"fontsquirrel-api-1149\";}i:16;a:2:{i:0;a:3:{s:5:\"#type\";s:8:\"html_tag\";s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:3:{s:3:\"rel\";s:10:\"stylesheet\";s:4:\"href\";s:129:\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSerifBoldItalic-fontfacekit/fontyourface-stylesheet.css\";s:5:\"media\";s:3:\"all\";}}i:1;s:21:\"fontsquirrel-api-1150\";}i:17;a:2:{i:0;a:3:{s:5:\"#type\";s:8:\"html_tag\";s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:3:{s:3:\"rel\";s:10:\"stylesheet\";s:4:\"href\";s:125:\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSerifItalic-fontfacekit/fontyourface-stylesheet.css\";s:5:\"media\";s:3:\"all\";}}i:1;s:21:\"fontsquirrel-api-1148\";}i:18;a:2:{i:0;a:3:{s:5:\"#type\";s:8:\"html_tag\";s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:3:{s:3:\"rel\";s:10:\"stylesheet\";s:4:\"href\";s:126:\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSerifRegular-fontfacekit/fontyourface-stylesheet.css\";s:5:\"media\";s:3:\"all\";}}i:1;s:21:\"fontsquirrel-api-1147\";}i:19;a:2:{i:0;a:3:{s:5:\"#type\";s:8:\"html_tag\";s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:3:{s:3:\"rel\";s:10:\"stylesheet\";s:4:\"href\";s:128:\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSansBoldItalic-fontfacekit/fontyourface-stylesheet.css\";s:5:\"media\";s:3:\"all\";}}i:1;s:21:\"fontsquirrel-api-1154\";}i:20;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:3:{s:3:\"rel\";s:13:\"shortcut icon\";s:4:\"href\";s:38:\"/sites/default/files/yaffs_favicon.png\";s:4:\"type\";s:9:\"image/png\";}}i:1;s:67:\"html_head_link:shortcut icon:/sites/default/files/yaffs_favicon.png\";}i:21;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:2:{s:3:\"rel\";s:8:\"revision\";s:4:\"href\";s:5:\"/home\";}}i:1;s:29:\"html_head_link:revision:/home\";}}s:12:\"placeholders\";a:0:{}s:14:\"drupalSettings\";a:5:{s:4:\"path\";a:8:{s:7:\"baseUrl\";s:1:\"/\";s:10:\"scriptPath\";N;s:10:\"pathPrefix\";s:0:\"\";s:11:\"currentPath\";s:8:\"node/487\";s:18:\"currentPathIsAdmin\";b:0;s:7:\"isFront\";b:1;s:15:\"currentLanguage\";s:2:\"en\";s:12:\"currentQuery\";O:8:\"stdClass\":1:{s:6:\"author\";s:1:\"1\";}}s:15:\"pluralDelimiter\";s:1:\"\";s:9:\"bootstrap\";a:25:{s:28:\"forms_has_error_value_toggle\";i:1;s:15:\"modal_animation\";i:1;s:14:\"modal_backdrop\";s:4:\"true\";s:14:\"modal_keyboard\";i:1;s:10:\"modal_show\";i:1;s:10:\"modal_size\";s:0:\"\";s:15:\"popover_enabled\";i:1;s:17:\"popover_animation\";i:1;s:17:\"popover_container\";s:4:\"body\";s:15:\"popover_content\";s:0:\"\";s:13:\"popover_delay\";s:1:\"0\";s:12:\"popover_html\";i:0;s:17:\"popover_placement\";s:5:\"right\";s:16:\"popover_selector\";s:0:\"\";s:13:\"popover_title\";s:0:\"\";s:15:\"popover_trigger\";s:5:\"click\";s:25:\"popover_trigger_autoclose\";i:1;s:15:\"tooltip_enabled\";i:1;s:17:\"tooltip_animation\";i:1;s:17:\"tooltip_container\";s:4:\"body\";s:13:\"tooltip_delay\";s:1:\"0\";s:12:\"tooltip_html\";i:0;s:17:\"tooltip_placement\";s:9:\"auto left\";s:16:\"tooltip_selector\";s:0:\"\";s:15:\"tooltip_trigger\";s:5:\"hover\";}s:14:\"ajaxTrustedUrl\";a:1:{s:12:\"/search/node\";b:1;}s:4:\"user\";a:2:{s:3:\"uid\";i:0;s:15:\"permissionsHash\";s:64:\"aa7fc4c8fb40c7a8665ccd12fea07926dff0f59b9ee3346bc513c6399bee5b01\";}}s:11:\"http_header\";a:1:{i:0;a:3:{i:0;s:4:\"Link\";i:1;s:23:\"</home>; rel=\"revision\"\";i:2;b:0;}}}}',-1,1518157140.682,1,'block_content:18 block_content:23 block_content:25 block_content:27 block_content:28 block_content:29 block_content:30 block_content:7 block_content_view block_view config:block.block.choosingyaffs config:block.block.cookieinfo config:block.block.downloadyaffs config:block.block.footerlegal config:block.block.frontimagehighlight2 config:block.block.frontpagehero config:block.block.frontpageprimeryaffs config:block.block.mainnavigation config:block.block.mainnavigation_2 config:block.block.searchform config:block.block.sitebranding config:block.block.views_block__highlighted_yaffs_features_block_1 config:block.block.views_block__yaffs_admin_recent_content_block_1 config:block.block.views_block__yaffs_documents_highlights_block_1 config:block.block.views_block__yaffs_user_logos_block_1 config:block.block.yaffs_account_menu config:block.block.yaffs_block_10 config:block.block.yaffs_block_5 config:block.block.yaffs_block_6 config:block.block.yaffs_block_8 config:block.block.yaffs_block_9 config:block.block.yaffs_breadcrumbs config:block.block.yaffs_content config:block.block.yaffs_help config:block.block.yaffs_local_tasks config:block.block.yaffs_messages config:block.block.yaffs_page_title config:block.block.yaffs_user_21 config:block.block.yaffsinspace config:block_list config:color.theme.yaffs config:field.storage.node.body config:field.storage.node.field_icon_text config:field.storage.node.field_teaser_image config:field.storage.node.field_yaffs_user_logo config:field.storage.node.upload config:filter.format.basic_html config:filter.format.full_html config:filter.format.raw_html config:image.style.pdf_image config:image.style.small config:search.settings config:system.menu.account config:system.menu.main config:system.site config:user.role.anonymous config:views.view.highlighted_yaffs_features config:views.view.yaffs_documents_highlights config:views.view.yaffs_user_logos file:108 file:109 file:110 file:40 file:43 file:44 file:45 file:46 file:47 file:48 file:76 file:77 file:85 http_response media:5 media:8 media:9 node:32 node:344 node:353 node:384 node:385 node:388 node:389 node:397 node:398 node:399 node:400 node:401 node:407 node:408 node:409 node:448 node:451 node:457 node:460 node:462 node:466 node:487 node_list node_view rendered user:0 user:1','3569'),('https://yaffs.net/?author=2:html','O:31:\"Drupal\\Core\\Render\\HtmlResponse\":8:{s:7:\"headers\";O:50:\"Symfony\\Component\\HttpFoundation\\ResponseHeaderBag\":5:{s:23:\"\0*\0computedCacheControl\";a:2:{s:7:\"max-age\";s:3:\"300\";s:6:\"public\";b:1;}s:10:\"\0*\0cookies\";a:0:{}s:14:\"\0*\0headerNames\";a:14:{s:12:\"content-type\";s:12:\"Content-Type\";s:13:\"cache-control\";s:13:\"Cache-Control\";s:4:\"date\";s:4:\"Date\";s:22:\"x-drupal-dynamic-cache\";s:22:\"X-Drupal-Dynamic-Cache\";s:4:\"link\";s:4:\"Link\";s:15:\"x-ua-compatible\";s:15:\"X-UA-Compatible\";s:16:\"content-language\";s:16:\"Content-language\";s:22:\"x-content-type-options\";s:22:\"X-Content-Type-Options\";s:15:\"x-frame-options\";s:15:\"X-Frame-Options\";s:7:\"expires\";s:7:\"Expires\";s:13:\"last-modified\";s:13:\"Last-Modified\";s:4:\"etag\";s:4:\"ETag\";s:4:\"vary\";s:4:\"Vary\";s:11:\"x-generator\";s:11:\"X-Generator\";}s:10:\"\0*\0headers\";a:14:{s:12:\"content-type\";a:1:{i:0;s:24:\"text/html; charset=UTF-8\";}s:13:\"cache-control\";a:1:{i:0;s:19:\"max-age=300, public\";}s:4:\"date\";a:1:{i:0;s:29:\"Fri, 09 Feb 2018 06:19:03 GMT\";}s:22:\"x-drupal-dynamic-cache\";a:1:{i:0;s:4:\"MISS\";}s:4:\"link\";a:4:{i:0;s:23:\"</home>; rel=\"revision\"\";i:1;s:108:\"</sites/default/files/css/css_Ft-hGawuooABKJanSezg8PXovgOMbB_QLx9CIyXeHsA.css?ozekku>; rel=preload; as=style\";i:2;s:108:\"</sites/default/files/css/css_6qeLA6GBkZNPHWp9GdQIYovV3tYuKU-ts-HicZ-WeQQ.css?ozekku>; rel=preload; as=style\";i:3;s:99:\"</sites/default/files/js/js_2l0lF4i9o3aztHULbfajMT_RTqGCEN_lVC8JI48SILw.js>; rel=preload; as=script\";}s:15:\"x-ua-compatible\";a:1:{i:0;s:7:\"IE=edge\";}s:16:\"content-language\";a:1:{i:0;s:2:\"en\";}s:22:\"x-content-type-options\";a:1:{i:0;s:7:\"nosniff\";}s:15:\"x-frame-options\";a:1:{i:0;s:10:\"SAMEORIGIN\";}s:7:\"expires\";a:1:{i:0;s:29:\"Sun, 19 Nov 1978 05:00:00 GMT\";}s:13:\"last-modified\";a:1:{i:0;s:29:\"Fri, 09 Feb 2018 06:19:02 GMT\";}s:4:\"etag\";a:1:{i:0;s:12:\"\"1518157142\"\";}s:4:\"vary\";a:1:{i:0;s:6:\"Cookie\";}s:11:\"x-generator\";a:1:{i:0;s:33:\"Drupal 8 (https://www.drupal.org)\";}}s:15:\"\0*\0cacheControl\";a:2:{s:7:\"max-age\";s:3:\"300\";s:6:\"public\";b:1;}}s:10:\"\0*\0content\";s:51781:\"<!DOCTYPE html>\n<html  lang=\"en\" dir=\"ltr\" prefix=\"content: http://purl.org/rss/1.0/modules/content/  dc: http://purl.org/dc/terms/  foaf: http://xmlns.com/foaf/0.1/  og: http://ogp.me/ns#  rdfs: http://www.w3.org/2000/01/rdf-schema#  schema: http://schema.org/  sioc: http://rdfs.org/sioc/ns#  sioct: http://rdfs.org/sioc/types#  skos: http://www.w3.org/2004/02/skos/core#  xsd: http://www.w3.org/2001/XMLSchema# \">\n  <head>\n    <meta charset=\"utf-8\" />\n<meta name=\"title\" content=\"A Robust Flash File System Since 2002 | Yaffs - A Flash File System for embedded use\" />\n<link rel=\"shortlink\" href=\"https://yaffs.net/\" />\n<link rel=\"canonical\" href=\"https://yaffs.net/\" />\n<meta name=\"news_keywords\" content=\"Flash File System\" />\n<meta name=\"description\" content=\"Yaffs (Yet Another Flash File System) is an open-source file system specifically designed to be fast, robust and suitable for embedded use with NAND and NOR Flash. It is widely used with Linux, RTOSs, or no OS at all, in consumer devices and critical infrastructure. It is available under GNU Public License, GPL, or on commercial terms from Aleph One.\" />\n<meta name=\"abstract\" content=\"Yaffs (Yet Another Flash File System) is an open-source file system specifically designed to be fast, robust and suitable for embedded use with NAND and NOR Flash. It is widely used with Linux, RTOSs, or no OS at all, in consumer devices and critical infrastructure. It is available under GNU Public License, GPL, or on commercial terms from Aleph One.\" />\n<meta name=\"keywords\" content=\"flash File System, flash, file System, flash storage, NAND flash, NOR flash, Yaffs\" />\n<meta name=\"Generator\" content=\"Drupal 8 (https://www.drupal.org)\" />\n<meta name=\"MobileOptimized\" content=\"width\" />\n<meta name=\"HandheldFriendly\" content=\"true\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<link rel=\"stylesheet\" href=\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSansRegular-fontfacekit/fontyourface-stylesheet.css\" media=\"all\" />\n<link rel=\"stylesheet\" href=\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSansItalic-fontfacekit/fontyourface-stylesheet.css\" media=\"all\" />\n<link rel=\"stylesheet\" href=\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSansBold-fontfacekit/fontyourface-stylesheet.css\" media=\"all\" />\n<link rel=\"stylesheet\" href=\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSerifBold-fontfacekit/fontyourface-stylesheet.css\" media=\"all\" />\n<link rel=\"stylesheet\" href=\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSerifBoldItalic-fontfacekit/fontyourface-stylesheet.css\" media=\"all\" />\n<link rel=\"stylesheet\" href=\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSerifItalic-fontfacekit/fontyourface-stylesheet.css\" media=\"all\" />\n<link rel=\"stylesheet\" href=\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSerifRegular-fontfacekit/fontyourface-stylesheet.css\" media=\"all\" />\n<link rel=\"stylesheet\" href=\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSansBoldItalic-fontfacekit/fontyourface-stylesheet.css\" media=\"all\" />\n<link rel=\"shortcut icon\" href=\"/sites/default/files/yaffs_favicon.png\" type=\"image/png\" />\n<link rel=\"revision\" href=\"/home\" />\n\n    <title>A Robust Flash File System Since 2002 | Yaffs - A Flash File System for embedded use</title>\n    <link rel=\"stylesheet\" href=\"/sites/default/files/css/css_Ft-hGawuooABKJanSezg8PXovgOMbB_QLx9CIyXeHsA.css?ozekku\" media=\"all\" />\n<link rel=\"stylesheet\" href=\"/sites/default/files/css/css_6qeLA6GBkZNPHWp9GdQIYovV3tYuKU-ts-HicZ-WeQQ.css?ozekku\" media=\"all\" />\n\n    \n<!--[if lte IE 8]>\n<script src=\"/sites/default/files/js/js_VtafjXmRvoUgAzqzYTA3Wrjkx9wcWhjP0G4ZnnqRamA.js\"></script>\n<![endif]-->\n\n  </head>\n  <body class=\"fontyourface path-frontpage page-node-type-page navbar-is-fixed-top has-glyphicons\">\n    <a href=\"#main-content\" class=\"visually-hidden focusable skip-link\">\n      Skip to main content\n    </a>\n    <div style=\"background-color: ; color: \" id=\"environment-indicator\">\n  \n    </div>\n\n              <header class=\"navbar navbar-default navbar-fixed-top\" id=\"navbar\" role=\"banner\">\n              <div class=\"container\">\n            <div class=\"navbar-header\">\n          <div class=\"region region-navigation\">\n          <a class=\"logo navbar-btn pull-left\" href=\"/\" title=\"Home\" rel=\"home\">\n      <img src=\"/themes/custom/yaffs/logo.svg\" alt=\"Home\" />\n    </a>\n      \n  </div>\n\n                          <button type=\"button\" class=\"navbar-toggle\" data-toggle=\"collapse\" data-target=\"#navbar-collapse\">\n            <span class=\"sr-only\">Toggle navigation</span>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n          </button>\n              </div>\n\n                    <div id=\"navbar-collapse\" class=\"navbar-collapse collapse\">\n            <div class=\"region region-navigation-collapsible\">\n    <nav role=\"navigation\" aria-labelledby=\"block-mainnavigation-menu\" id=\"block-mainnavigation\">\n            <h2 class=\"sr-only\" id=\"block-mainnavigation-menu\">Main navigation</h2>\n\n      \n              <ul class=\"menu nav navbar-nav\">\n                            <li>\n        <a href=\"/\" data-drupal-link-system-path=\"&lt;front&gt;\">Home</a>\n                  </li>\n                        <li>\n        <a href=\"/support\" title=\"Help for Yaffs\" data-drupal-link-system-path=\"node/380\">Support</a>\n                  </li>\n                        <li>\n        <a href=\"/documents\" data-drupal-link-system-path=\"documents\">Documents</a>\n                  </li>\n                        <li>\n        <a href=\"/get-yaffs\" data-drupal-link-system-path=\"node/382\">Download</a>\n                  </li>\n                        <li>\n        <a href=\"/about-us\" data-drupal-link-system-path=\"node/325\">About us</a>\n                  </li>\n                        <li>\n        <a href=\"/contact\" data-drupal-link-system-path=\"node/73\">Contact</a>\n                  </li>\n        </ul>\n  \n\n\n  </nav>\n<div class=\"search-block-form block block-search block-search-form-block\" data-drupal-selector=\"search-block-form\" id=\"block-searchform\" role=\"search\">\n  \n    \n      <form action=\"/search/node\" method=\"get\" id=\"search-block-form\" accept-charset=\"UTF-8\">\n  <div class=\"form-item js-form-item form-type-search js-form-type-search form-item-keys js-form-item-keys form-no-label form-group\">\n      <label for=\"edit-keys\" class=\"control-label sr-only\">Search</label>\n  \n  \n  <div class=\"input-group\"><input title=\"Enter the terms you wish to search for.\" data-drupal-selector=\"edit-keys\" class=\"form-search form-control\" placeholder=\"Search\" type=\"search\" id=\"edit-keys\" name=\"keys\" value=\"\" size=\"15\" maxlength=\"128\" data-toggle=\"tooltip\" /><span class=\"input-group-btn\"><button type=\"submit\" value=\"Search\" class=\"button js-form-submit form-submit btn-primary btn icon-only\" name=\"\"><span class=\"sr-only\">Search</span><span class=\"icon glyphicon glyphicon-search\" aria-hidden=\"true\"></span></button></span></div>\n\n  \n  \n  </div>\n<div class=\"form-actions form-group js-form-wrapper form-wrapper\" data-drupal-selector=\"edit-actions\" id=\"edit-actions\"></div>\n\n</form>\n\n  </div>\n\n  </div>\n\n        </div>\n                    </div>\n          </header>\n  \n  <div role=\"main\" class=\"main-container container js-quickedit-main-content\">\n    <div class=\"row\">\n\n            \n            \n                  <section class=\"col-sm-12\">\n\n                                      <div class=\"highlighted\">  <div class=\"region region-highlighted\">\n    \n\n  </div>\n</div>\n                  \n                \n                \n                                      \n                  \n                          <a id=\"main-content\"></a>\n            <div class=\"region region-content\">\n        <h1 class=\"page-header\"><span property=\"schema:name\">A Robust Flash File System Since 2002</span>\n</h1>\n\n  <article role=\"article\" about=\"/home\" typeof=\"schema:WebPage\" class=\"page full clearfix\">\n\n  \n      <span property=\"schema:name\" content=\"A Robust Flash File System Since 2002\" class=\"hidden\"></span>\n\n\n  \n  <div class=\"content\">\n    \n            <div property=\"schema:text\" class=\"field field--name-body field--type-text-with-summary field--label-hidden field--item\">\n<p>Yaffs (Yet Another Flash File System) is an open-source file system specifically designed to be fast, robust and suitable for embedded use with NAND and NOR Flash. It is widely used with Linux, RTOSs, or no OS at all, in consumer devices, avionics, and critical infrastructure. It is available under GNU Public License, GPL, or on commercial terms from Aleph One.</p>\n<p>&nbsp;</p>\n</div>\n      \n  </div>\n\n</article>\n\n<section id=\"block-yaffsinspace\" class=\"panel yaffs-shout well block block-block-content block-block-content9f676777-54d9-40d2-86dd-174fff14ab1a clearfix\">\n  \n    \n\n      \n            <div class=\"field field--name-body field--type-text-with-summary field--label-hidden field--item\">\n<h3><em>New!</em> Yaffs in space!</h3>\n<p><strong><img alt=\"Tess satellite\" data-entity-type=\"file\" data-entity-uuid=\"f06319f1-b6ac-41e2-a70d-a4c4da605b87\" height=\"246\" src=\"/sites/default/files/inline-images/tess_satellite_0.gif\" width=\"347\" class=\"align-right\" />NASA TESS Mission </strong>This <strong>Transiting Exoplanet Survey Satellite (TESS)</strong> will discover thousands of exoplanets in orbit around the brightest stars in the sky.</p>\n<p>It is a project regularly using our Yaffs File System to store incoming data and preserve it, in the rigours of the space environment, before sending it back to Earth.</p>\n<p>In a two-year survey of the solar neighborhood, TESS will monitor more than 200,000 stars for temporary drops in brightness caused by planetary transits. This first-ever spaceborne all-sky transit survey will identify planets ranging from Earth-sized to gas giants, around a wide range of stellar types and orbital distances. No ground-based survey can achieve this feat.</p>\n<p>Some File Systems are not robust enough to be suitable for such exacting work.<br />\n </p>\n</div>\n      \n  </section>\n\n\n  </div>\n\n        \n                              <div class=\"front_highlight row\">\n              <div class=\"col-sm-4\">\n                    <div class=\"region region-front-highlight-1\">\n    <section id=\"block-choosingyaffs\" class=\"block block-block-content block-block-contentae8f54b9-5315-4995-a49e-c0780f3a88cc clearfix\">\n  \n    \n\n      \n            <div class=\"field field--name-body field--type-text-with-summary field--label-hidden field--item\"><a href=\"/documents/considerations-choosing-flash-file-system\">\n<article class=\"embedded-entity\">\n<img src=\"/sites/default/files/styles/max_325x325/public/2017-06/choosing_yaffs_0.jpg?itok=YuV5Z__e\" width=\"325\" height=\"325\" alt=\"Thumbnail\" title=\"Choosing Yaffs\" class=\"img-responsive\" />\n</article>\n</a> </div>\n      \n  </section>\n\n\n  </div>\n\n              </div>\n              <div class=\"col-sm-4\">\n                    <div class=\"region region-front-highlight-2\">\n    <section id=\"block-frontimagehighlight2\" class=\"block block-block-content block-block-contentfa53fc80-f3c4-4d6e-b947-0a3bcd479480 clearfix\">\n  \n    \n\n      \n            <div class=\"field field--name-body field--type-text-with-summary field--label-hidden field--item\"><a href=\"/yaffs-action\">\n<article class=\"embedded-entity\">\n<img src=\"/sites/default/files/styles/max_325x325/public/2017-06/atm_1.jpg?itok=HfIny6EH\" width=\"325\" height=\"325\" alt=\"Thumbnail\" title=\"ATM\" class=\"img-responsive\" />\n</article>\n</a> </div>\n      \n  </section>\n\n\n  </div>\n\n              </div>\n              <div class=\"col-sm-4\">\n                    <div class=\"region region-front-highlight-3\">\n    <section id=\"block-downloadyaffs\" class=\"block block-block-content block-block-contenteed71eb7-98b2-4109-aabe-7718283459ad clearfix\">\n  \n    \n\n      \n            <div class=\"field field--name-body field--type-text-with-summary field--label-hidden field--item\"><a href=\"/get-yaffs\">\n<article class=\"embedded-entity\">\n<img src=\"/sites/default/files/styles/max_325x325/public/2017-06/download_now_0.jpg?itok=XdRx8zkI\" width=\"325\" height=\"325\" alt=\"Thumbnail\" title=\"Download Yaffs\" class=\"img-responsive\" />\n</article>\n</a> </div>\n      \n  </section>\n\n\n  </div>\n\n              </div>\n            </div>\n                        </section>\n\n                </div>\n  </div>\n\n  <div class=\"container-fluid front-pane-1\">\n        <div class=\"container\">\n        \n    </div>\n  </div>\n\n  <div class=\"container-fluid front-pane-2\">\n        <div class=\"container\">\n          <div class=\"region region-front-pane-2\">\n    <section class=\"views-element-container block block-views block-views-blockyaffs-user-logos-block-1 clearfix\" id=\"block-views-block-yaffs-user-logos-block-1\">\n  \n    \n\n      <div class=\"form-group\"><div class=\"view view-yaffs-user-logos view-id-yaffs_user_logos view-display-id-block_1 js-view-dom-id-8a35fcda02584f84c79a8d5e2576f68f0216117953eb3ee7556ddd61dbbc1289\">\n  \n    \n      \n      <div class=\"view-content\">\n      <div id=\"views-bootstrap-yaffs-user-logos-block-1\"  class=\"grid views-view-grid horizontal\">\n            <div class=\"row\">\n                  <div class=\"col col-xs-12 col-sm-6 col-md-3 col-lg-3 \">\n            <div class=\"views-field views-field-field-yaffs-user-logo\"><div class=\"field-content\"><a href=\"/yaffs-action\">  <img src=\"/sites/default/files/styles/small/public/logos/designA_logo.png?itok=5VWxByrk\" width=\"200\" height=\"141\" alt=\"\" typeof=\"foaf:Image\" class=\"img-responsive\" />\n\n\n</a></div></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-6 col-md-3 col-lg-3 \">\n            <div class=\"views-field views-field-field-yaffs-user-logo\"><div class=\"field-content\"><a href=\"/yaffs-action\">  <img src=\"/sites/default/files/styles/small/public/logos/eaton_logo.png?itok=kExm8d-W\" width=\"200\" height=\"84\" alt=\"\" typeof=\"foaf:Image\" class=\"img-responsive\" />\n\n\n</a></div></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-6 col-md-3 col-lg-3 \">\n            <div class=\"views-field views-field-field-yaffs-user-logo\"><div class=\"field-content\"><a href=\"/yaffs-action\">  <img src=\"/sites/default/files/styles/small/public/logos/LANCOM_Logo_4c.png?itok=ZIDg8yYt\" width=\"200\" height=\"50\" alt=\"\" typeof=\"foaf:Image\" class=\"img-responsive\" />\n\n\n</a></div></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-6 col-md-3 col-lg-3 \">\n            <div class=\"views-field views-field-field-yaffs-user-logo\"><div class=\"field-content\"><a href=\"/yaffs-action\">  <img src=\"/sites/default/files/styles/small/public/logos/bernina_international_logo.png?itok=G8DeIWtW\" width=\"200\" height=\"30\" alt=\"\" typeof=\"foaf:Image\" class=\"img-responsive\" />\n\n\n</a></div></div>\n          </div>\n              </div>\n          <div class=\"row\">\n                  <div class=\"col col-xs-12 col-sm-6 col-md-3 col-lg-3 \">\n            <div class=\"views-field views-field-field-yaffs-user-logo\"><div class=\"field-content\"><a href=\"/yaffs-action\">  <img src=\"/sites/default/files/styles/small/public/logos/gallagher_logo.png?itok=lQyDJeN1\" width=\"200\" height=\"65\" alt=\"\" typeof=\"foaf:Image\" class=\"img-responsive\" />\n\n\n</a></div></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-6 col-md-3 col-lg-3 \">\n            <div class=\"views-field views-field-field-yaffs-user-logo\"><div class=\"field-content\"><a href=\"/yaffs-action\">  <img src=\"/sites/default/files/styles/small/public/logos/android_logo.png?itok=MShHoIK7\" width=\"170\" height=\"71\" alt=\"\" typeof=\"foaf:Image\" class=\"img-responsive\" />\n\n\n</a></div></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-6 col-md-3 col-lg-3 \">\n            <div class=\"views-field views-field-field-yaffs-user-logo\"><div class=\"field-content\"><a href=\"/yaffs-action\">  <img src=\"/sites/default/files/styles/small/public/logos/leica_logo.png?itok=Ne2u8w3-\" width=\"200\" height=\"130\" alt=\"\" typeof=\"foaf:Image\" class=\"img-responsive\" />\n\n\n</a></div></div>\n          </div>\n              </div>\n      </div>\n\n    </div>\n  \n            <div class=\"view-footer\">\n      <a class=\"btn btn-default\" href=\"/yaffs-action\">Who uses Yaffs? Read more...</a>\n    </div>\n    </div>\n</div>\n\n  </section>\n\n\n  </div>\n\n    </div>\n  </div>\n\n  <div class=\"container-fluid front-pane-3\">\n        <div class=\"container\">\n          <div class=\"region region-front-pane-3\">\n    <section class=\"views-element-container block block-views block-views-blockhighlighted-yaffs-features-block-1 clearfix\" id=\"block-views-block-highlighted-yaffs-features-block-1\">\n  \n    \n\n      <div class=\"form-group\"><div class=\"view view-highlighted-yaffs-features view-id-highlighted_yaffs_features view-display-id-block_1 js-view-dom-id-95fe550d5052828912ac5148bc15b78f3cf61f69a8797eb9f9fafb9077e0fe26\">\n  \n    \n      \n      <div class=\"view-content\">\n      <div id=\"views-bootstrap-highlighted-yaffs-features-block-1\"  class=\"grid views-view-grid horizontal\">\n            <div class=\"row\">\n                  <div class=\"col col-xs-12 col-sm-12 col-md-4 col-lg-4 \">\n            <div class=\"views-field views-field-field-icon-text\"><div class=\"field-content\"><i class=\"fa fa-thumbs-up\"></i></div></div><div class=\"views-field views-field-title\"><span class=\"field-content\"><a href=\"/features#384\"><h3>Royalty Free... </h3></a></span></div><div class=\"views-field views-field-body\"><div class=\"field-content\">Whether you use Yaffs under the GNU General Public Licence or under a commercial licence, Yaffs is free of any royalty. No need to worry about rising costs for your hit product!</div></div><div class=\"views-field views-field-edit-node\"><span class=\"field-content\"></span></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-12 col-md-4 col-lg-4 \">\n            <div class=\"views-field views-field-field-icon-text\"><div class=\"field-content\"><i class=\"fa fa-shield\"></i></div></div><div class=\"views-field views-field-title\"><span class=\"field-content\"><a href=\"/features#385\"><h3>A robust flash file system...</h3></a></span></div><div class=\"views-field views-field-body\"><div class=\"field-content\">After more than 100,000 <strong>random</strong> power-failures during reading or writing, a test file showed NO data corruption at all!</div></div><div class=\"views-field views-field-edit-node\"><span class=\"field-content\"></span></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-12 col-md-4 col-lg-4 \">\n            <div class=\"views-field views-field-field-icon-text\"><div class=\"field-content\"><i class=\"fa fa-heart\"></i></div></div><div class=\"views-field views-field-title\"><span class=\"field-content\"><a href=\"/features#388\"><h3>Yaffs is Open Source...</h3></a></span></div><div class=\"views-field views-field-body\"><div class=\"field-content\">You can have a look at the code at any time. <a href=\"/downloads\">Download it now</a>! And it\'s suitable for GPL and commercially licensed projects.</div></div><div class=\"views-field views-field-edit-node\"><span class=\"field-content\"></span></div>\n          </div>\n              </div>\n          <div class=\"row\">\n                  <div class=\"col col-xs-12 col-sm-12 col-md-4 col-lg-4 \">\n            <div class=\"views-field views-field-field-icon-text\"><div class=\"field-content\"><i class=\"fa fa-mobile-phone\"></i></div></div><div class=\"views-field views-field-title\"><span class=\"field-content\"><a href=\"/features#389\"><h3>Tried and tested in millions of devices...</h3></a></span></div><div class=\"views-field views-field-body\"><div class=\"field-content\">Yaffs is widely used in Linux and proprietary commercial RTOSs. It\'s been included in hundreds of devices, and shipped as part of Google\'s Android, with millions of units sold.</div></div><div class=\"views-field views-field-edit-node\"><span class=\"field-content\"></span></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-12 col-md-4 col-lg-4 \">\n            <div class=\"views-field views-field-field-icon-text\"><div class=\"field-content\"><i class=\"fa fa-space-shuttle\"></i></div></div><div class=\"views-field views-field-title\"><span class=\"field-content\"><a href=\"/features#407\"><h3>Booting is fast...</h3></a></span></div><div class=\"views-field views-field-body\"><div class=\"field-content\">It is important for a Flash filesystem to boot fast, so boot speed was a fundamental consideration in the design of Yaffs.</div></div><div class=\"views-field views-field-edit-node\"><span class=\"field-content\"></span></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-12 col-md-4 col-lg-4 \">\n            <div class=\"views-field views-field-field-icon-text\"><div class=\"field-content\"><i class=\"fa fa-users\"></i></div></div><div class=\"views-field views-field-title\"><span class=\"field-content\"><a href=\"/features#408\"><h3>An active community...</h3></a></span></div><div class=\"views-field views-field-body\"><div class=\"field-content\">There\'s an active community of people who use Yaffs and who have developed with Yaffs, just a click or two away.</div></div><div class=\"views-field views-field-edit-node\"><span class=\"field-content\"></span></div>\n          </div>\n              </div>\n      </div>\n\n    </div>\n  \n            <div class=\"view-footer\">\n      <a class=\"btn btn-default\" href=\"/features\">Lots more Yaffs features...</a>\n    </div>\n    </div>\n</div>\n\n  </section>\n\n\n  </div>\n\n    </div>\n  </div>\n\n  <div class=\"container-fluid front-pane-4\">\n        <div class=\"container\" >\n          <div class=\"region region-front-pane-4\">\n    <section class=\"views-element-container block block-views block-views-blockyaffs-documents-highlights-block-1 clearfix\" id=\"block-views-block-yaffs-documents-highlights-block-1\">\n  \n    \n\n      <div class=\"form-group\"><div class=\"view view-yaffs-documents-highlights view-id-yaffs_documents_highlights view-display-id-block_1 js-view-dom-id-273bf60b230e3faef44a6e67c34370278019b51f5d0e914b039f491b4d00cf06\">\n  \n    \n      \n      <div class=\"view-content\">\n      <div id=\"views-bootstrap-yaffs-documents-highlights-block-1\"  class=\"grid views-view-grid horizontal\">\n            <div class=\"row\">\n                  <div class=\"col col-xs-12 col-sm-12 col-md-6 col-lg-6 \">\n            <div class=\"views-field views-field-field-teaser-image\"><div class=\"field-content\"></div></div><div class=\"views-field views-field-title\"><h3 class=\"field-content\"><a href=\"/yaffs-licence-sample\" hreflang=\"und\">Yaffs Licence Sample</a></h3></div><div class=\"views-field views-field-body\"><div class=\"field-content\">While the Yaffs code is available free of charge under GNU General Public Licence, version 2, that entails the obligation to disclose Source Code for your application using Yaffs. An Aleph One Licence does not impose that obligation and so is attractive for proprietary projects. This sample Licence provides an example of the points we expect a Licence to cover.</div></div><div class=\"views-field views-field-upload-1\"><div class=\"field-content\"></div></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-12 col-md-6 col-lg-6 \">\n            <div class=\"views-field views-field-field-teaser-image\"><div class=\"field-content\"></div></div><div class=\"views-field views-field-title\"><h3 class=\"field-content\"><a href=\"/yaffs-overview\" hreflang=\"und\">Yaffs Overview</a></h3></div><div class=\"views-field views-field-body\"><div class=\"field-content\">YAFFS is a filesystem designed specifically for the characteristics of NAND flash. This page gives an overview of the project - what is available, how it works, how to use it, developer resources, and licensing options.</div></div><div class=\"views-field views-field-upload-1\"><div class=\"field-content\"></div></div>\n          </div>\n              </div>\n          <div class=\"row\">\n                  <div class=\"col col-xs-12 col-sm-12 col-md-6 col-lg-6 \">\n            <div class=\"views-field views-field-field-teaser-image\"><div class=\"field-content\"></div></div><div class=\"views-field views-field-title\"><h3 class=\"field-content\"><a href=\"/yaffs-licence-faqs\" hreflang=\"und\">Yaffs Licence FAQs</a></h3></div><div class=\"views-field views-field-body\"><div class=\"field-content\"><p>Some questions about the commercial licence for Yaffs and how we arrive at one.</p></div></div><div class=\"views-field views-field-upload-1\"><div class=\"field-content\"></div></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-12 col-md-6 col-lg-6 \">\n            <div class=\"views-field views-field-field-teaser-image\"><div class=\"field-content\"></div></div><div class=\"views-field views-field-title\"><h3 class=\"field-content\"><a href=\"/documents/faq\" hreflang=\"und\">FAQ</a></h3></div><div class=\"views-field views-field-body\"><div class=\"field-content\"><p>Common questions about Yaffs technical issues.</p></div></div><div class=\"views-field views-field-upload-1\"><div class=\"field-content\"></div></div>\n          </div>\n              </div>\n          <div class=\"row\">\n                  <div class=\"col col-xs-12 col-sm-12 col-md-6 col-lg-6 \">\n            <div class=\"views-field views-field-field-teaser-image\"><div class=\"field-content\"></div></div><div class=\"views-field views-field-title\"><h3 class=\"field-content\"><a href=\"/licences-more-background-and-detail\" hreflang=\"und\">Licences - more background and detail</a></h3></div><div class=\"views-field views-field-body\"><div class=\"field-content\"><p>More on the details and background of Licences for Yaffs</p></div></div><div class=\"views-field views-field-upload-1\"><div class=\"field-content\"></div></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-12 col-md-6 col-lg-6 \">\n            <div class=\"views-field views-field-field-teaser-image\"><div class=\"field-content\"><a href=\"/sites/default/files/downloads/ConsiderationsInChoosingAFlashFileSystem_0.pdf\">  <img src=\"/sites/default/files/styles/pdf_image/public/styles/pdf_image/public/downloads/ConsiderationsInChoosingAFlashFileSystem_0.pdf.png?itok=ROOk6w-T\" width=\"150\" height=\"212\" alt=\"Preview of ConsiderationsInChoosingAFlashFileSystem.pdf\" typeof=\"foaf:Image\" class=\"img-responsive\" />\n\n\n</a></div></div><div class=\"views-field views-field-title\"><h3 class=\"field-content\"><a href=\"/documents/considerations-choosing-flash-file-system\" hreflang=\"und\">Considerations in Choosing a Flash File System</a></h3></div><div class=\"views-field views-field-body\"><div class=\"field-content\">Failures in an embedded File System in a product are much more serious to the user than failures in an office computer.&nbsp; Power failures and failures to cache data properly can be avoided by choosing a FFS specifically designed for reliability from the ground up.</div></div><div class=\"views-field views-field-upload-1\"><div class=\"field-content\"><span class=\"file file--mime-application-pdf file--application-pdf icon-before\"><span class=\"file-icon\"><span class=\"icon glyphicon glyphicon-file text-primary\" aria-hidden=\"true\"></span></span><span class=\"file-link\"><a href=\"https://yaffs.net/sites/default/files/downloads/ConsiderationsInChoosingAFlashFileSystem_0.pdf\" type=\"application/pdf; length=131376\" title=\"Open file in new window\" target=\"_blank\" data-toggle=\"tooltip\" data-placement=\"bottom\">ConsiderationsInChoosingAFlashFileSystem.pdf</a></span><span class=\"file-size\">128.3 KB</span></span></div></div>\n          </div>\n              </div>\n          <div class=\"row\">\n                  <div class=\"col col-xs-12 col-sm-12 col-md-6 col-lg-6 \">\n            <div class=\"views-field views-field-field-teaser-image\"><div class=\"field-content\"><a href=\"/sites/default/files/downloads/HowYaffsWorks.pdf\">  <img src=\"/sites/default/files/styles/pdf_image/public/styles/pdf_image/public/downloads/HowYaffsWorks.pdf.png?itok=_nJu31C0\" width=\"150\" height=\"194\" alt=\"Preview of HowYaffsWorks.pdf\" typeof=\"foaf:Image\" class=\"img-responsive\" />\n\n\n</a></div></div><div class=\"views-field views-field-title\"><h3 class=\"field-content\"><a href=\"/documents/how-yaffs-works\" hreflang=\"und\">How Yaffs works</a></h3></div><div class=\"views-field views-field-body\"><div class=\"field-content\">This document gives an explanation of most of the core mechanisms that make Yaffs work. As of the time of writing this, the Yaffs2 code base includes approximately 19,000 lines of code making a very detailed discussion impractical. This document is the starting point for understanding Yaffs. Further detailed questions and discussions are welcomed on the Yaffs discussion list.</div></div><div class=\"views-field views-field-upload-1\"><div class=\"field-content\"><span class=\"file file--mime-application-pdf file--application-pdf icon-before\"><span class=\"file-icon\"><span class=\"icon glyphicon glyphicon-file text-primary\" aria-hidden=\"true\"></span></span><span class=\"file-link\"><a href=\"https://yaffs.net/sites/default/files/downloads/HowYaffsWorks.pdf\" type=\"application/pdf; length=402514\" title=\"Open file in new window\" target=\"_blank\" data-toggle=\"tooltip\" data-placement=\"bottom\">HowYaffsWorks.pdf</a></span><span class=\"file-size\">393.08 KB</span></span></div></div>\n          </div>\n                  <div class=\"col col-xs-12 col-sm-12 col-md-6 col-lg-6 \">\n            <div class=\"views-field views-field-field-teaser-image\"><div class=\"field-content\"><a href=\"/sites/default/files/downloads/YaffsTuning.pdf\">  <img src=\"/sites/default/files/styles/pdf_image/public/styles/pdf_image/public/downloads/YaffsTuning.pdf.png?itok=idZTTQBs\" alt=\"Preview of YaffsTuning.pdf\" typeof=\"foaf:Image\" class=\"img-responsive\" />\n\n\n</a></div></div><div class=\"views-field views-field-title\"><h3 class=\"field-content\"><a href=\"/documents/yaffs-tuning\" hreflang=\"und\">Yaffs Tuning</a></h3></div><div class=\"views-field views-field-body\"><div class=\"field-content\"><p>This document describes the parameters which can be modified by the developer in the different phases of applying, debugging, and routine use of Yaffs.</p></div></div><div class=\"views-field views-field-upload-1\"><div class=\"field-content\"><span class=\"file file--mime-application-pdf file--application-pdf icon-before\"><span class=\"file-icon\"><span class=\"icon glyphicon glyphicon-file text-primary\" aria-hidden=\"true\"></span></span><span class=\"file-link\"><a href=\"https://yaffs.net/sites/default/files/downloads/YaffsTuning.pdf\" type=\"application/pdf; length=93667\" title=\"Open file in new window\" target=\"_blank\" data-toggle=\"tooltip\" data-placement=\"bottom\">YaffsTuning.pdf</a></span><span class=\"file-size\">91.47 KB</span></span></div></div>\n          </div>\n              </div>\n      </div>\n\n    </div>\n  \n            <div class=\"view-footer\">\n      <a class=\"btn btn-default\" href=\"/documents\">All the Yaffs documentation...</a>\n    </div>\n    </div>\n</div>\n\n  </section>\n\n\n  </div>\n\n    </div>\n  </div>\n\n    <div class=\"container-fluid front-pane-5\">\n                <div class=\"container\" >\n              <div class=\"region region-front-pane-5\">\n    <section id=\"block-frontpageprimeryaffs\" class=\"block block-block-content block-block-contente7a8d2de-4fbb-4680-9e18-fe4d8337f1d6 clearfix\">\n  \n    \n\n      \n            <div class=\"field field--name-body field--type-text-with-summary field--label-hidden field--item\">\n<h1>Flash file systems primer</h1>\n<h2>Background &amp; basics</h2>\n<h3><span>What is a </span><span>F</span><span>lash </span><span>F</span><span>ile </span><span>S</span><span>ystem</span>?</h3>\n<p><span>A <span>Flash File System</span> stores data on flash memory, rather than a hard drive. Flash is used because it’s faster, much more tolerant of physical stress and takes less power. A <span>flash filesystem</span> is used to manage the data and get the best out of flash memory.</span></p>\n<p><span>As two examples, a flash memory chip needs to be erased in blocks before it is rewritten and a flash file system will manage that; flash memory has a limited number of writes per block so many flash file systems incorporate a <span>wear levelling</span> mechanism to ensure the writes are spread out.</span></p>\n<p><span>A flash file system is most useful as a part of an embedded system,. As a developer, you <em>can</em>&nbsp;read from and write directly to your Flash memory on an embedded system, but unless your use is extremely limited, you\'ll probably find that you come up against problems that Flash file systems have already solved.</span></p>\n<h3>What are NAND flash &amp; NOR flash?</h3>\n<p><span>These are the two fundamental flash architectures and have very different characteristics in performance, reliability, erase cycles, life span, and price. They also differ fundamentally from hard disk drives, and so need specialised handling.</span></p>\n<table>\n<tbody>\n <tr>\n  <td>\n  <p>&nbsp;</p>\n   </td>\n  <td>\n  <p>NAND flash</p>\n   </td>\n  <td>\n  <p>NOR flash</p>\n   </td>\n </tr>\n <tr>\n  <td>\n  <p>Storage density</p>\n   </td>\n  <td>\n  <p>Higher</p>\n   </td>\n  <td>\n  <p>Lower</p>\n   </td>\n </tr>\n <tr>\n  <td>\n  <p>Read performance</p>\n   </td>\n  <td>\n  <p>Fast</p>\n   </td>\n  <td>\n  <p>Fast (may be slowed by serial access)</p>\n   </td>\n </tr>\n <tr>\n  <td>\n  <p>Write performance</p>\n   </td>\n  <td>\n  <p>Faster</p>\n   </td>\n  <td>\n  <p>Slower (may be slowed further by serial access)</p>\n   </td>\n </tr>\n <tr>\n  <td>\n  <p>Erase performance</p>\n   </td>\n  <td>\n  <p>Faster (low ms typically)</p>\n   </td>\n  <td>\n  <p>Slower (possibly seconds)</p>\n   </td>\n </tr>\n <tr>\n  <td>\n  <p>Storage reliability</p>\n   </td>\n  <td>\n  <p>Lower (without management)</p>\n   </td>\n  <td>\n  <p>Better</p>\n   </td>\n </tr>\n <tr>\n  <td>\n  <p>Life span</p>\n   </td>\n  <td>\n  <p>Higher</p>\n   </td>\n  <td>\n  <p>Lower</p>\n   </td>\n </tr>\n <tr>\n  <td>\n  <p>Price</p>\n   </td>\n  <td>\n  <p>Lower</p>\n   </td>\n  <td>\n  <p>Higher</p>\n   </td>\n </tr>\n</tbody>\n</table>\n<p><span>Yaffs is both an <span>embedded NAN</span><span>D flash file system</span> and an <span>embedded N</span><span>OR Flash file system</span>. It can handle SLC, TLC and MLC NAND. It also works on MLC and SLC NOR. And it can work with parallel or serial access including Serial Peripheral Bus (SPI).</span></p>\n<h3>What special functions does a <span>file system </span><span>for flash</span> include?</h3>\n<p><span>As well as the normal file system functions, a <span>flash file system embedded</span> in hardware should help the device to start and stop quickly and deal well with losing power with no warning, without corrupting the data; and, manage the foibles of flash memory, protecting the stored data with extreme reliability. (Read our paper <a href=\"/documents/considerations-choosing-flash-file-system\">Considerations in Choosing a Flash File System</a>.)</span></p>\n<p><span><span>To these ends, an embedded flash file system must employ extra steps to achieve these such as using log structuring, rather than traditional file structuring plus a flash translation layer; manage power loss and recovery; include flash memory wear levelling; deal with the unreliability of flash from read and write disturbs, by using error correction (ECC), bad block remapping, over provision and flash block refreshing; ensure it’s ready to write fast by using garbage collection and flash block erase to prepare; and manage writing while avoiding write amplification. </span></span></p>\n<h4>What is a log-structured file system?</h4>\n<p><span>Log structuring means that data is written to the file system as a sequence of changes to the file system. This has the advantage that there is less overhead, and so it\'s faster than a non-log-structured system. More important though is that it is more robust against power failure. It also means that a file may be fragmented. For hard drives, fragmentation can mean much slower access due to the time required to mechanically move the read heads around the disk, but flash memory has no moving parts so there is no overhead for flash.</span></p>\n<p><span>Yaffs is log structured a <span>flash file system </span><span>architecture</span> which is faster and more robust than the alternatives.</span></p>\n<h4>What is a <span>Flash Translation Layer</span> (FTL) ?</h4>\n<p><span>It is sometimes desirable to use regular block file systems (such as FAT) with flash memory. In such cases, a Flash Translation Layer presents flash memory or a flash file system as if it\'s an ordinary hard drive.</span></p>\n<p><span>An FTL is an incomplete storage solution it still requires a file system. This makes two layers where data can be damaged and lost: in the FTL and in the <span>flash memory </span><span>file system</span>.</span></p>\n<p><span>True <span>file systems for flash memory</span>, such as Yaffs, do not use FTLs. They deal directly with the idiosyncrasies of flash, providing a faster and more reliable solution.</span></p>\n<h4>What is power loss recovery?</h4>\n<p><span>When power to any storage device is suddenly lost, the device can end up in an unknown state and may have damaged areas. Most file systems have to work hard to ensure that they are in a consistent state after power loss. <span>E</span><span>mbedded file systems</span> <span>for flash</span> may make allowances for unscheduled power loss with a recovery process.</span></p>\n<p><span>Yaffs is built with fault tolerance as a guiding principle and so is designed so power loss is considered a normal event.</span></p>\n<h4>What is <span>wear levelling</span>?</h4>\n<p><span>Flash chips wear out. Each time a part of the flash memory is erased and written, it is slightly damaged. <span>Embedded f</span><span>lash file systems</span> note the danger, and sometimes try to spread the damage rather than having it concentrated in one region, so prolonging the life of the memory and the life of the device.</span></p>\n<p><span>Yaffs is designed so that extra <span>wear leveling</span> is unnecessary. Instead, it’s automatically <span>wear levelling</span> because of the log structure.</span></p>\n<h4>What is flash read disturb? What is flash write disturb?</h4>\n<p><span><a href=\"/documents/yaffs-nand-flash-failure-mitigation\">NAND flash may experience degradation or loss of data</a> owing to reads of pages in the same block or data changes in neighbouring blocks of the NAND device. This is particularly true for MLC NAND.</span></p>\n<p><span>Yaffs uses block refreshing to deal with such problems.</span></p>\n<h4>What is flash error correction/flash ECC?</h4>\n<p><span>There are ways in which flash memory can be corrupted – for instance F-N tunnelling problems and leaky oxide layers. See our <a href=\"/documents/yaffs-nand-flash-failure-mitigation\">detailed discussion of flash memory problems</a>.</span></p>\n<p><span>But every bit counts, and especially if it\'s part of critical data or essential to the correct working of a system. Flash error correction keeps track of a section of memory to tell if there\'s corruption, and provides ways to correct these small errors.</span></p>\n<p><span>Yaffs can use hardware or software based ECC.</span></p>\n<h4>What is bad-block remapping?</h4>\n<p><span>File systems are built upon storing data on physical media. But all media suffers deterioration. Some hardware or <span>flash media </span><span>file systems</span> keep lists of damaged regions and behind the scenes, substitute known good ones in their place.</span></p>\n<p><span>Because of the way that Yaffs works, there\'s no need for bad block remapping because it isn’t a block structured file system.</span></p>\n<h4>What is <span>o</span><span>ver-provisioning</span> ?</h4>\n<p><span>Knowing that the media will degrade and suffer errors, and needing space to alter data because of the nature of flash memory, sometimes a <span>flash memory based </span><span>file system</span> puts aside a portion of the media for this use. This is <span>overprovisioning</span>. Often this space used when remapping bad blocks.</span></p>\n<p><span>Because Yaffs is log structured, it has the advantage that it does not need <span>over provision</span><span>ing</span>, making more memory available to store data.</span></p>\n<h4>What is flash block refreshing?</h4>\n<p><span>To counteract the problems of unreliable flash memory – for instance errors due to read and write disturbs – a flash filesystem can refresh the memory, by making a new copy of a block.</span></p>\n<p><span>Yaffs includes flash block refreshing.</span></p>\n<h4>What is flash garbage collection?</h4>\n<p><span>When a file is deleted, or a part of a file is overwritten, file systems often simply mark the flash space as deleted, rather than removing it. Later they reclaim the space for reuse. This is garbage collection.</span></p>\n<p><span>Yaffs has garbage collection to maximise the amount of data the file system can store.</span></p>\n<h4>What is flash block erase?</h4>\n<p><span>Data must be written into blank areas of the flash chip, but erasing takes time. Rather than erase and write at the same time, in order to speed writes, NAND and <span>NOR flash file systems</span> can prepare blocks for later use. This is not usually necessary for other storage media.</span></p>\n<p><span>As part of garbage collection, Yaffs uses a block erase strategy.</span></p>\n<h4>What is flash write amplification ?</h4>\n<p><span>In many block-based flash file systems, when data changes the new data must be written to the disk, and then the old data must be marked as invalid. A small change to the data can have consequences that propagate involving writing to the memory twice or more as the old data is cleaned up by garbage collection and files are organised to take the minimum amount of space. This is write amplification - a single small write causing a cascade of writes (and erases) of whole blocks.</span></p>\n<p><span>Yaffs avoids much of this problem by being log structured, meaning that flash memory is slower to reach it\'s maximum number of cycles, while writing is faster.</span></p>\n<h2>How does Yaffs work?</h2>\n<p><span>You can find full details in our paper <a href=\"/documents/how-yaffs-works\">How Yaffs Works</a>&nbsp;but briefly, here\'s how it works.</span></p>\n<p><span>It\'s a log-structured filing system. This also ensures that Yaffs is wear-levelling is built into the design because no one part of the flash memory is used any more than another.</span></p>\n<p><span>A Yaffs object is anything that Yaffs stores - for instance a file or a directory.</span></p>\n<p><span>The memory in NAND flash is arranged in pages. A page is the unit of allocation and programming. In Yaffs, the unit of allocation is called the chunk. Typically a chunk will be the same as a NAND page, but there is flexibility to use chunks which map to multiple pages (eg. A system may have two NAND chips in parallel requiring 2x2048 = 4096 byte chunks) . This distinction gives a lot of flexibility in how the system can be configured.</span></p>\n<p><span>A fixed but configurable number of chunks form a block which is the unit of erasure.</span></p>\n<p><span>NAND flash is shipped with bad blocks and further blocks may go bad during the operation of the device so Yaffs detects and marks bad blocks.</span></p>\n<p><span>NAND flash also typically requires the use of some sort of error detection and correction code (ECC). Yaffs can either use existing ECC logic or provide its own.</span></p>\n<p><span>Yaffs maintains data in RAM about the file system, but this is not needed for Yaffs to work - so the device can safely lose power at any point without data corruption.</span></p>\n<p><span>Here\'s how the Yaffs filesystem works to ensure data safety and a very fast startup... At regular points and on controlled shutdown, checkpoint blocks are written to the flash memory, containing all the data to quickly rebuild the file system. Under usual circumstances this checkpoint is used when a device is started, to very quickly rebuild the RAM data about the file system. If the checkpoint is determined to be corrupted, or if the user requested then the file system is rebuilt by scanning.</span></p>\n<p><span>To do this, Yaffs makes a prescan, to find the sequence numbers for blocks. Then it scans through blocks backwards to build up the list of chunks that make up objects. It speeds up this process by using Block Summaries, which are collections of all the tags in a data in a block. (But it\'s still always possible to go back to the chunks themselves, to find the tags, if a summary is missing or damaged.)</span></p>\n<p><span>And tags are how Yaffs tells that a chunk belongs to a particular object.</span></p>\n<p><span>Tags are also how Yaffs knows which chunks make up the current version of an object... Because the file system is log structured, if an object has been updated, only the latest chunks are used, giving the correct version of the object. A full description of the process is available in the technical documentation, and of course you can browse the code to see exactly how it all works; there\'s a lot more to tags, the metadata that they can hold, how they are stored, and how tags are used to link together objects into a file system with a POSIX interface.</span></p>\n<p><span>And of course that\'s not the end of the story. There\'s caching to deal with repeated small changes to data. There\'s garbage collection to let space be re-used, and Yaffs deals with collecting garbage differently depending on whether there\'s lots of free space or only a little. And part of making Yaffs a high performance flash file system is to make sure that re-useable blocks are erased well before they are needed, so that writing involves only a single operation. There\'s lazy loading to reduce scanning time. And all of this is built in a portable way, so that Yaffs can be configured to match almost any hardware, and can be ported to any operating system, or work on bare metal without an operating system. There\'s a test harness which is used to subject Yaffs to power failure, and ensure it works even with external data corruption. That\'s what makes it robust enough to send into space and to handle hundreds of terabytes of mission critical data.</span></p>\n<h4>Why is Yaffs special as an embedded flash file system?</h4>\n<p><span>Yaffs has been in use since 2002, and so it is hardened. It has been used in everything from phones to sewing machines to satellites. It is popular with Aerospace companies, and firms managing large infrastructure and in Point-of-Sale (POS) equipment (where customer feedback is very rapid!) It has been used in extreme conditions where it must not lose data, and where there is no chance for maintenance. It\'s been used for very large file systems up to 190TB. It\'s been used for safety critical applications, and millions of consumer devices.</span></p>\n<p><span>We carry out testing in a <a href=\"/documents/yaffs-robustness-and-testing\">rig which can simulate random power failures</a> and proved its reliability after tens to hundreds of millions of power failures.&nbsp;It\'s designed with an understanding of the constraints of flash memory and for speed.</span></p>\n<p><span>Yaffs works on multiple operating systems – Linux, VxWorks, Windows CE, eCos. - and also directly on bare metal, with no operating system. And it\'s easy to integrate into your RTOS or application using the Yaffs Direct Interface. It works with multiple types of flash memory - NAND &amp; NOR, SLC, MLC &amp; TLC.&nbsp;It\'s endian neutral. It\'s been used with 32-bit and 64-bit CPUs including MIPS, 68000, ARM, ColdFire, PowerPC and x86 variants. Yaffs has even been used with various DSP architectures! And it\'ll work with 16-bit with some tuning. So it can be configured to work with your design and the flash geometry that you need.</span></p>\n<p><span>And it\'s a <span>free embedded flash file system - </span><span>it’s open</span> <span>source</span>! <a href=\"/get-yaffs\">Grab the GPL version now</a>! Check out our the active community. And that\'s not the whole story - there are lots more reasons that make Yaffs special.&nbsp;</span></p>\n<p>&nbsp;</p>\n</div>\n      \n  </section>\n\n\n  </div>\n\n        </div>\n    </div>\n\n      <footer class=\"footer container\" role=\"contentinfo\">\n        <div class=\"primary_footer row\">\n            <div class=\"col-sm-3\">\n                  <div class=\"region region-footer-col1\">\n    <section id=\"block-yaffs-block-6\" class=\"block block-block-content block-block-content6c2d4b45-4dba-4b2d-8b9f-76701bf27533 clearfix\">\n  \n    \n\n      \n            <div class=\"field field--name-body field--type-text-with-summary field--label-hidden field--item\">\n<ul class=\"fa-ul\">\n<li><i class=\"fa-li fa fa-phone\"></i>+44 (0)1223 811679</li>\n<li><i class=\"fa-li fa fa-envelope\"></i><a href=\"denied:mailto:info@aleph1.co.uk?Subject=Website contact\" target=\"_top\">info@aleph1.co.uk</a></li>\n</ul>\n</div>\n      \n  </section>\n\n\n  </div>\n\n            </div>\n            <div class=\"col-sm-3\">\n                \n            </div>\n            <div class=\"col-sm-3\">\n                \n            </div>\n            <div class=\"col-sm-3\">\n                  <div class=\"region region-footer-col4\">\n    <section id=\"block-footerlegal\" class=\"block block-block-content block-block-content78ab593d-35b6-4772-a141-30216e7fcbb2 clearfix\">\n  \n    \n\n      \n            <div class=\"field field--name-body field--type-text-with-summary field--label-hidden field--item\">\n<p class=\"text-align-right\">&nbsp;<a href=\"/legal\">Legal &amp; Cookies</a></p>\n</div>\n      \n  </section>\n\n<section id=\"block-cookieinfo\" class=\"block block-block-content block-block-content4848c58d-90df-4819-81d8-0f9568eeeaac clearfix\">\n  \n    \n\n      \n            <div class=\"field field--name-body field--type-text-with-summary field--label-hidden field--item\">\n<p class=\"text-align-justify\"><br />\nWe use <a href=\"/legal\">cookies on this site</a>. By using it, you are giving us consent to set cookies.</p>\n</div>\n      \n  </section>\n\n\n  </div>\n\n            </div>\n        </div>\n        <div class = \"secondary_footer row\">\n            <div class=\"col-sm-12\">\n                <div class=\"region region-footer\">\n    <nav role=\"navigation\" aria-labelledby=\"block-yaffs-account-menu-menu\" id=\"block-yaffs-account-menu\">\n            <h2 class=\"sr-only\" id=\"block-yaffs-account-menu-menu\">User account menu</h2>\n\n      \n              <ul class=\"menu nav navbar-nav navbar-right\">\n                            <li>\n        <a href=\"/user/login\" data-drupal-link-system-path=\"user/login\">Log in</a>\n                  </li>\n        </ul>\n  \n\n\n  </nav>\n\n  </div>\n\n            </div>\n        </div>\n    </footer>\n  \n    \n    <script type=\"application/json\" data-drupal-selector=\"drupal-settings-json\">{\"path\":{\"baseUrl\":\"\\/\",\"scriptPath\":null,\"pathPrefix\":\"\",\"currentPath\":\"node\\/487\",\"currentPathIsAdmin\":false,\"isFront\":true,\"currentLanguage\":\"en\",\"currentQuery\":{\"author\":\"2\"}},\"pluralDelimiter\":\"\\u0003\",\"bootstrap\":{\"forms_has_error_value_toggle\":1,\"modal_animation\":1,\"modal_backdrop\":\"true\",\"modal_keyboard\":1,\"modal_show\":1,\"modal_size\":\"\",\"popover_enabled\":1,\"popover_animation\":1,\"popover_container\":\"body\",\"popover_content\":\"\",\"popover_delay\":\"0\",\"popover_html\":0,\"popover_placement\":\"right\",\"popover_selector\":\"\",\"popover_title\":\"\",\"popover_trigger\":\"click\",\"popover_trigger_autoclose\":1,\"tooltip_enabled\":1,\"tooltip_animation\":1,\"tooltip_container\":\"body\",\"tooltip_delay\":\"0\",\"tooltip_html\":0,\"tooltip_placement\":\"auto left\",\"tooltip_selector\":\"\",\"tooltip_trigger\":\"hover\"},\"ajaxTrustedUrl\":{\"\\/search\\/node\":true},\"user\":{\"uid\":0,\"permissionsHash\":\"aa7fc4c8fb40c7a8665ccd12fea07926dff0f59b9ee3346bc513c6399bee5b01\"}}</script>\n<script src=\"/sites/default/files/js/js_2l0lF4i9o3aztHULbfajMT_RTqGCEN_lVC8JI48SILw.js\"></script>\n\n  </body>\n</html>\n\";s:10:\"\0*\0version\";s:3:\"1.0\";s:13:\"\0*\0statusCode\";i:200;s:13:\"\0*\0statusText\";s:2:\"OK\";s:10:\"\0*\0charset\";N;s:23:\"\0*\0cacheabilityMetadata\";O:35:\"Drupal\\Core\\Cache\\CacheableMetadata\":3:{s:16:\"\0*\0cacheContexts\";a:18:{i:0;s:26:\"languages:language_content\";i:1;s:28:\"languages:language_interface\";i:2;s:5:\"route\";i:3;s:32:\"route.menu_active_trails:account\";i:4;s:29:\"route.menu_active_trails:main\";i:5;s:5:\"theme\";i:6;s:8:\"timezone\";i:7;s:8:\"url.path\";i:8;s:17:\"url.path.is_front\";i:9;s:15:\"url.path.parent\";i:10;s:30:\"url.query_args:_wrapper_format\";i:11;s:8:\"url.site\";i:12;s:4:\"user\";i:13;s:21:\"user.node_grants:view\";i:14;s:16:\"user.permissions\";i:15;s:10:\"user.roles\";i:16;s:20:\"user.roles:anonymous\";i:17;s:24:\"user.roles:authenticated\";}s:12:\"\0*\0cacheTags\";a:103:{i:0;s:16:\"block_content:18\";i:1;s:16:\"block_content:23\";i:2;s:16:\"block_content:25\";i:3;s:16:\"block_content:27\";i:4;s:16:\"block_content:28\";i:5;s:16:\"block_content:29\";i:6;s:16:\"block_content:30\";i:7;s:15:\"block_content:7\";i:8;s:18:\"block_content_view\";i:9;s:10:\"block_view\";i:10;s:32:\"config:block.block.choosingyaffs\";i:11;s:29:\"config:block.block.cookieinfo\";i:12;s:32:\"config:block.block.downloadyaffs\";i:13;s:30:\"config:block.block.footerlegal\";i:14;s:39:\"config:block.block.frontimagehighlight2\";i:15;s:32:\"config:block.block.frontpagehero\";i:16;s:39:\"config:block.block.frontpageprimeryaffs\";i:17;s:33:\"config:block.block.mainnavigation\";i:18;s:35:\"config:block.block.mainnavigation_2\";i:19;s:29:\"config:block.block.searchform\";i:20;s:31:\"config:block.block.sitebranding\";i:21;s:66:\"config:block.block.views_block__highlighted_yaffs_features_block_1\";i:22;s:66:\"config:block.block.views_block__yaffs_admin_recent_content_block_1\";i:23;s:66:\"config:block.block.views_block__yaffs_documents_highlights_block_1\";i:24;s:56:\"config:block.block.views_block__yaffs_user_logos_block_1\";i:25;s:37:\"config:block.block.yaffs_account_menu\";i:26;s:33:\"config:block.block.yaffs_block_10\";i:27;s:32:\"config:block.block.yaffs_block_5\";i:28;s:32:\"config:block.block.yaffs_block_6\";i:29;s:32:\"config:block.block.yaffs_block_8\";i:30;s:32:\"config:block.block.yaffs_block_9\";i:31;s:36:\"config:block.block.yaffs_breadcrumbs\";i:32;s:32:\"config:block.block.yaffs_content\";i:33;s:29:\"config:block.block.yaffs_help\";i:34;s:36:\"config:block.block.yaffs_local_tasks\";i:35;s:33:\"config:block.block.yaffs_messages\";i:36;s:35:\"config:block.block.yaffs_page_title\";i:37;s:32:\"config:block.block.yaffs_user_21\";i:38;s:31:\"config:block.block.yaffsinspace\";i:39;s:17:\"config:block_list\";i:40;s:24:\"config:color.theme.yaffs\";i:41;s:30:\"config:field.storage.node.body\";i:42;s:41:\"config:field.storage.node.field_icon_text\";i:43;s:44:\"config:field.storage.node.field_teaser_image\";i:44;s:47:\"config:field.storage.node.field_yaffs_user_logo\";i:45;s:32:\"config:field.storage.node.upload\";i:46;s:31:\"config:filter.format.basic_html\";i:47;s:30:\"config:filter.format.full_html\";i:48;s:29:\"config:filter.format.raw_html\";i:49;s:28:\"config:image.style.pdf_image\";i:50;s:24:\"config:image.style.small\";i:51;s:22:\"config:search.settings\";i:52;s:26:\"config:system.menu.account\";i:53;s:23:\"config:system.menu.main\";i:54;s:18:\"config:system.site\";i:55;s:26:\"config:user.role.anonymous\";i:56;s:44:\"config:views.view.highlighted_yaffs_features\";i:57;s:44:\"config:views.view.yaffs_documents_highlights\";i:58;s:34:\"config:views.view.yaffs_user_logos\";i:59;s:8:\"file:108\";i:60;s:8:\"file:109\";i:61;s:8:\"file:110\";i:62;s:7:\"file:40\";i:63;s:7:\"file:43\";i:64;s:7:\"file:44\";i:65;s:7:\"file:45\";i:66;s:7:\"file:46\";i:67;s:7:\"file:47\";i:68;s:7:\"file:48\";i:69;s:7:\"file:76\";i:70;s:7:\"file:77\";i:71;s:7:\"file:85\";i:72;s:13:\"http_response\";i:73;s:7:\"media:5\";i:74;s:7:\"media:8\";i:75;s:7:\"media:9\";i:76;s:7:\"node:32\";i:77;s:8:\"node:344\";i:78;s:8:\"node:353\";i:79;s:8:\"node:384\";i:80;s:8:\"node:385\";i:81;s:8:\"node:388\";i:82;s:8:\"node:389\";i:83;s:8:\"node:397\";i:84;s:8:\"node:398\";i:85;s:8:\"node:399\";i:86;s:8:\"node:400\";i:87;s:8:\"node:401\";i:88;s:8:\"node:407\";i:89;s:8:\"node:408\";i:90;s:8:\"node:409\";i:91;s:8:\"node:448\";i:92;s:8:\"node:451\";i:93;s:8:\"node:457\";i:94;s:8:\"node:460\";i:95;s:8:\"node:462\";i:96;s:8:\"node:466\";i:97;s:8:\"node:487\";i:98;s:9:\"node_list\";i:99;s:9:\"node_view\";i:100;s:8:\"rendered\";i:101;s:6:\"user:0\";i:102;s:6:\"user:1\";}s:14:\"\0*\0cacheMaxAge\";i:-1;}s:14:\"\0*\0attachments\";a:5:{s:7:\"library\";a:10:{i:0;s:14:\"core/html5shiv\";i:1;s:11:\"system/base\";i:2;s:15:\"bootstrap/theme\";i:3;s:20:\"yaffs/global-styling\";i:4;s:23:\"yaffs/bootstrap-scripts\";i:5;s:19:\"yaffs/yaffs-helpers\";i:6;s:17:\"bootstrap/popover\";i:7;s:17:\"bootstrap/tooltip\";i:8;s:18:\"views/views.module\";i:10;s:50:\"environment_indicator/drupal.environment_indicator\";}s:9:\"html_head\";a:22:{i:0;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"meta\";s:11:\"#attributes\";a:2:{s:4:\"name\";s:5:\"title\";s:7:\"content\";s:84:\"A Robust Flash File System Since 2002 | Yaffs - A Flash File System for embedded use\";}}i:1;s:5:\"title\";}i:1;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:2:{s:3:\"rel\";s:9:\"shortlink\";s:4:\"href\";s:18:\"https://yaffs.net/\";}}i:1;s:9:\"shortlink\";}i:2;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:2:{s:3:\"rel\";s:9:\"canonical\";s:4:\"href\";s:18:\"https://yaffs.net/\";}}i:1;s:13:\"canonical_url\";}i:3;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"meta\";s:11:\"#attributes\";a:2:{s:4:\"name\";s:13:\"news_keywords\";s:7:\"content\";s:17:\"Flash File System\";}}i:1;s:13:\"news_keywords\";}i:4;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"meta\";s:11:\"#attributes\";a:2:{s:4:\"name\";s:11:\"description\";s:7:\"content\";s:352:\"Yaffs (Yet Another Flash File System) is an open-source file system specifically designed to be fast, robust and suitable for embedded use with NAND and NOR Flash. It is widely used with Linux, RTOSs, or no OS at all, in consumer devices and critical infrastructure. It is available under GNU Public License, GPL, or on commercial terms from Aleph One.\";}}i:1;s:11:\"description\";}i:5;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"meta\";s:11:\"#attributes\";a:2:{s:4:\"name\";s:8:\"abstract\";s:7:\"content\";s:352:\"Yaffs (Yet Another Flash File System) is an open-source file system specifically designed to be fast, robust and suitable for embedded use with NAND and NOR Flash. It is widely used with Linux, RTOSs, or no OS at all, in consumer devices and critical infrastructure. It is available under GNU Public License, GPL, or on commercial terms from Aleph One.\";}}i:1;s:8:\"abstract\";}i:6;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"meta\";s:11:\"#attributes\";a:2:{s:4:\"name\";s:8:\"keywords\";s:7:\"content\";s:82:\"flash File System, flash, file System, flash storage, NAND flash, NOR flash, Yaffs\";}}i:1;s:8:\"keywords\";}i:7;a:2:{i:0;a:3:{s:4:\"#tag\";s:4:\"meta\";s:11:\"#attributes\";a:1:{s:7:\"charset\";s:5:\"utf-8\";}s:7:\"#weight\";i:-1000;}i:1;s:24:\"system_meta_content_type\";}i:8;a:2:{i:0;a:3:{s:5:\"#type\";s:8:\"html_tag\";s:4:\"#tag\";s:4:\"meta\";s:11:\"#attributes\";a:2:{s:4:\"name\";s:9:\"Generator\";s:7:\"content\";s:33:\"Drupal 8 (https://www.drupal.org)\";}}i:1;s:21:\"system_meta_generator\";}i:9;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"meta\";s:11:\"#attributes\";a:2:{s:4:\"name\";s:15:\"MobileOptimized\";s:7:\"content\";s:5:\"width\";}}i:1;s:15:\"MobileOptimized\";}i:10;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"meta\";s:11:\"#attributes\";a:2:{s:4:\"name\";s:16:\"HandheldFriendly\";s:7:\"content\";s:4:\"true\";}}i:1;s:16:\"HandheldFriendly\";}i:11;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"meta\";s:11:\"#attributes\";a:2:{s:4:\"name\";s:8:\"viewport\";s:7:\"content\";s:37:\"width=device-width, initial-scale=1.0\";}}i:1;s:8:\"viewport\";}i:12;a:2:{i:0;a:3:{s:5:\"#type\";s:8:\"html_tag\";s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:3:{s:3:\"rel\";s:10:\"stylesheet\";s:4:\"href\";s:125:\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSansRegular-fontfacekit/fontyourface-stylesheet.css\";s:5:\"media\";s:3:\"all\";}}i:1;s:21:\"fontsquirrel-api-1151\";}i:13;a:2:{i:0;a:3:{s:5:\"#type\";s:8:\"html_tag\";s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:3:{s:3:\"rel\";s:10:\"stylesheet\";s:4:\"href\";s:124:\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSansItalic-fontfacekit/fontyourface-stylesheet.css\";s:5:\"media\";s:3:\"all\";}}i:1;s:21:\"fontsquirrel-api-1152\";}i:14;a:2:{i:0;a:3:{s:5:\"#type\";s:8:\"html_tag\";s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:3:{s:3:\"rel\";s:10:\"stylesheet\";s:4:\"href\";s:122:\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSansBold-fontfacekit/fontyourface-stylesheet.css\";s:5:\"media\";s:3:\"all\";}}i:1;s:21:\"fontsquirrel-api-1153\";}i:15;a:2:{i:0;a:3:{s:5:\"#type\";s:8:\"html_tag\";s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:3:{s:3:\"rel\";s:10:\"stylesheet\";s:4:\"href\";s:123:\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSerifBold-fontfacekit/fontyourface-stylesheet.css\";s:5:\"media\";s:3:\"all\";}}i:1;s:21:\"fontsquirrel-api-1149\";}i:16;a:2:{i:0;a:3:{s:5:\"#type\";s:8:\"html_tag\";s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:3:{s:3:\"rel\";s:10:\"stylesheet\";s:4:\"href\";s:129:\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSerifBoldItalic-fontfacekit/fontyourface-stylesheet.css\";s:5:\"media\";s:3:\"all\";}}i:1;s:21:\"fontsquirrel-api-1150\";}i:17;a:2:{i:0;a:3:{s:5:\"#type\";s:8:\"html_tag\";s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:3:{s:3:\"rel\";s:10:\"stylesheet\";s:4:\"href\";s:125:\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSerifItalic-fontfacekit/fontyourface-stylesheet.css\";s:5:\"media\";s:3:\"all\";}}i:1;s:21:\"fontsquirrel-api-1148\";}i:18;a:2:{i:0;a:3:{s:5:\"#type\";s:8:\"html_tag\";s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:3:{s:3:\"rel\";s:10:\"stylesheet\";s:4:\"href\";s:126:\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSerifRegular-fontfacekit/fontyourface-stylesheet.css\";s:5:\"media\";s:3:\"all\";}}i:1;s:21:\"fontsquirrel-api-1147\";}i:19;a:2:{i:0;a:3:{s:5:\"#type\";s:8:\"html_tag\";s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:3:{s:3:\"rel\";s:10:\"stylesheet\";s:4:\"href\";s:128:\"https://yaffs.net/sites/default/files/fontyourface/fontsquirrel/LiberationSansBoldItalic-fontfacekit/fontyourface-stylesheet.css\";s:5:\"media\";s:3:\"all\";}}i:1;s:21:\"fontsquirrel-api-1154\";}i:20;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:3:{s:3:\"rel\";s:13:\"shortcut icon\";s:4:\"href\";s:38:\"/sites/default/files/yaffs_favicon.png\";s:4:\"type\";s:9:\"image/png\";}}i:1;s:67:\"html_head_link:shortcut icon:/sites/default/files/yaffs_favicon.png\";}i:21;a:2:{i:0;a:2:{s:4:\"#tag\";s:4:\"link\";s:11:\"#attributes\";a:2:{s:3:\"rel\";s:8:\"revision\";s:4:\"href\";s:5:\"/home\";}}i:1;s:29:\"html_head_link:revision:/home\";}}s:12:\"placeholders\";a:0:{}s:14:\"drupalSettings\";a:5:{s:4:\"path\";a:8:{s:7:\"baseUrl\";s:1:\"/\";s:10:\"scriptPath\";N;s:10:\"pathPrefix\";s:0:\"\";s:11:\"currentPath\";s:8:\"node/487\";s:18:\"currentPathIsAdmin\";b:0;s:7:\"isFront\";b:1;s:15:\"currentLanguage\";s:2:\"en\";s:12:\"currentQuery\";O:8:\"stdClass\":1:{s:6:\"author\";s:1:\"2\";}}s:15:\"pluralDelimiter\";s:1:\"\";s:9:\"bootstrap\";a:25:{s:28:\"forms_has_error_value_toggle\";i:1;s:15:\"modal_animation\";i:1;s:14:\"modal_backdrop\";s:4:\"true\";s:14:\"modal_keyboard\";i:1;s:10:\"modal_show\";i:1;s:10:\"modal_size\";s:0:\"\";s:15:\"popover_enabled\";i:1;s:17:\"popover_animation\";i:1;s:17:\"popover_container\";s:4:\"body\";s:15:\"popover_content\";s:0:\"\";s:13:\"popover_delay\";s:1:\"0\";s:12:\"popover_html\";i:0;s:17:\"popover_placement\";s:5:\"right\";s:16:\"popover_selector\";s:0:\"\";s:13:\"popover_title\";s:0:\"\";s:15:\"popover_trigger\";s:5:\"click\";s:25:\"popover_trigger_autoclose\";i:1;s:15:\"tooltip_enabled\";i:1;s:17:\"tooltip_animation\";i:1;s:17:\"tooltip_container\";s:4:\"body\";s:13:\"tooltip_delay\";s:1:\"0\";s:12:\"tooltip_html\";i:0;s:17:\"tooltip_placement\";s:9:\"auto left\";s:16:\"tooltip_selector\";s:0:\"\";s:15:\"tooltip_trigger\";s:5:\"hover\";}s:14:\"ajaxTrustedUrl\";a:1:{s:12:\"/search/node\";b:1;}s:4:\"user\";a:2:{s:3:\"uid\";i:0;s:15:\"permissionsHash\";s:64:\"aa7fc4c8fb40c7a8665ccd12fea07926dff0f59b9ee3346bc513c6399bee5b01\";}}s:11:\"http_header\";a:1:{i:0;a:3:{i:0;s:4:\"Link\";i:1;s:23:\"</home>; rel=\"revision\"\";i:2;b:0;}}}}',-1,1518157143.061,1,'block_content:18 block_content:23 block_content:25 block_content:27 block_content:28 block_content:29 block_content:30 block_content:7 block_content_view block_view config:block.block.choosingyaffs config:block.block.cookieinfo config:block.block.downloadyaffs config:block.block.footerlegal config:block.block.frontimagehighlight2 config:block.block.frontpagehero config:block.block.frontpageprimeryaffs config:block.block.mainnavigation config:block.block.mainnavigation_2 config:block.block.searchform config:block.block.sitebranding config:block.block.views_block__highlighted_yaffs_features_block_1 config:block.block.views_block__yaffs_admin_recent_content_block_1 config:block.block.views_block__yaffs_documents_highlights_block_1 config:block.block.views_block__yaffs_user_logos_block_1 config:block.block.yaffs_account_menu config:block.block.yaffs_block_10 config:block.block.yaffs_block_5 config:block.block.yaffs_block_6 config:block.block.yaffs_block_8 config:block.block.yaffs_block_9 config:block.block.yaffs_breadcrumbs config:block.block.yaffs_content config:block.block.yaffs_help config:block.block.yaffs_local_tasks config:block.block.yaffs_messages config:block.block.yaffs_page_title config:block.block.yaffs_user_21 config:block.block.yaffsinspace config:block_list config:color.theme.yaffs config:field.storage.node.body config:field.storage.node.field_icon_text config:field.storage.node.field_teaser_image config:field.storage.node.field_yaffs_user_logo config:field.storage.node.upload config:filter.format.basic_html config:filter.format.full_html config:filter.format.raw_html config:image.style.pdf_image config:image.style.small config:search.settings config:system.menu.account config:system.menu.main config:system.site config:user.role.anonymous config:views.view.highlighted_yaffs_features config:views.view.yaffs_documents_highlights config:views.view.yaffs_user_logos file:108 file:109 file:110 file:40 file:43 file:44 file:45 file:46 file:47 file:48 file:76 file:77 file:85 http_response media:5 media:8 media:9 node:32 node:344 node:353 node:384 node:385 node:388 node:389 node:397 node:398 node:399 node:400 node:401 node:407 node:408 node:409 node:448 node:451 node:457 node:460 node:462 node:466 node:487 node_list node_view rendered user:0 user:1','3569'),