| # 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 `dm | |
| dump` to inspect the device tree. | |
| ## Protocol testing | |
| `nand-test` is an integration test which 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/misc/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/misc/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.zircon/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.zircon/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 | |
| ``` |