|  | # Nand testing | 
|  |  | 
|  | Warning: Most of these tests are destructive in nature. | 
|  |  | 
|  | ## Accessing the desired device | 
|  |  | 
|  | In order to test a particular device, that device must not be in use by the rest | 
|  | of the system. There are two ways to make that happen: | 
|  |  | 
|  | * Prevent other drivers from binding to the device. This may involve building | 
|  | the system with modified binding rules for the driver that normally binds | 
|  | to the desired device, or passing kernel command line arguments to disable | 
|  | that driver. | 
|  |  | 
|  | * Unbind devices that are bound to the desired device. | 
|  |  | 
|  | For example, in order to use a test tool against the core nand driver, nandpart | 
|  | devices may be removed like so: | 
|  |  | 
|  | ```shell | 
|  | $ unbind /dev/sys/platform/05:00:f/aml-raw_nand/nand/fvm | 
|  | ``` | 
|  |  | 
|  | Warning: Before removing a particular device, remove its descendants. By | 
|  | extension, file systems must be unmounted before a block device is removed. | 
|  | Note that this requirement is likely to render a running system unusable, as | 
|  | the backing for the OS may be going away. Netboot may be the only viable option. | 
|  |  | 
|  | Note that all other devices created by nandpart must also be removed. Use | 
|  | `driver dump` to inspect the device tree. | 
|  |  | 
|  | ## Protocol testing | 
|  |  | 
|  | `nand-test` is an integration test that performs basic tests of nand protocol | 
|  | drivers. | 
|  |  | 
|  | For example, this command will test an existing ram-nand device making sure the | 
|  | test does not modify anything outside blocks [100, 109]: | 
|  |  | 
|  | ```shell | 
|  | $ /boot/test/sys/nand-test --device /dev/sys/platform/00:00:2e/nand-ctl/ram-nand-0 --first-block 100 --num-blocks 10 | 
|  | ``` | 
|  |  | 
|  | ## Correctness testing | 
|  |  | 
|  | `nand-util` is a troubleshooting tool that can perform a simple read-reliability | 
|  | test. | 
|  |  | 
|  | ```shell | 
|  | $ nand-util --device /dev/sys/platform/00:00:2e/nand-ctl/ram-nand-0 --check | 
|  | ``` | 
|  |  | 
|  | ## Inspection / manipulation | 
|  |  | 
|  | ```shell | 
|  | $ nand-util --device /dev/sys/platform/05:00:f/aml-raw_nand/nand --info | 
|  | $ nand-util --device /dev/sys/platform/05:00:f/aml-raw_nand/nand/fvm --read --block 1 --page 2 | 
|  | ``` | 
|  |  | 
|  | ## Grab an image | 
|  |  | 
|  | `nand-util` can also be used to grab an image of the nand contents: | 
|  |  | 
|  | Note: If a file system is already mounted, unbind will fail, and forcing it to work is | 
|  | likely to render the system unusable. Remember to netboot or use Zedboot as | 
|  | needed. | 
|  |  | 
|  | ```shell | 
|  | $ unbind /dev/sys/platform/05:00:f/aml-raw_nand/nand/fvm/ftl/block | 
|  | $ unbind /dev/sys/platform/05:00:f/aml-raw_nand/nand/fvm/ftl | 
|  | $ nand-util --device /dev/sys/platform/05:00:f/aml-raw_nand/nand/fvm --save --file /tmp/image | 
|  | ``` | 
|  |  | 
|  | Transfer the image file to the host: | 
|  |  | 
|  | ```shell | 
|  | $ out/default/host-tools/netcp :/tmp/image /tmp/saved_image_file | 
|  | ``` | 
|  |  | 
|  | ## Replay | 
|  |  | 
|  | A saved nand image can be loaded on top of a ram-nand device using nand-loader. | 
|  |  | 
|  | First, transfer the image to a device running Zircon. For example, on the host: | 
|  |  | 
|  | ```shell | 
|  | echo /nand.dmp=/tmp/saved_image_file > /tmp/manifest.txt | 
|  | out/default/host-tools/minfs /tmp/image.dsk create --manifest /tmp/manifest.txt | 
|  | fx set bringup.x64 | 
|  | fx build | 
|  | fx qemu -k -- -hda /tmp/image.dsk | 
|  | ``` | 
|  |  | 
|  | Then, inside zircon: | 
|  |  | 
|  | ```shell | 
|  | $ mkdir data/a | 
|  | $ mount /dev/class/block/000 data/a | 
|  | $ nand-loader data/a/nand.dmp | 
|  | ``` |