SPI NOR 框架¶
如何提議新增新的快閃記憶體¶
大多數 SPI NOR 快閃記憶體符合 JEDEC JESD216 序列快閃記憶體可發現引數 (SFDP) 標準。 SFDP 在一組標準的內部只讀引數表中描述了序列快閃記憶體裝置的功能和特性。
SPI NOR 驅動程式查詢 SFDP 表,以確定快閃記憶體的引數和設定。 如果快閃記憶體定義了 SFDP 表,那麼您可能根本不需要快閃記憶體條目,而是依賴於通用快閃記憶體驅動程式,該驅動程式僅根據其 SFDP 資料探測快閃記憶體。 您所要做的就是在裝置樹中指定“jedec,spi-nor”相容性。
但在某些情況下,您需要定義一個顯式的快閃記憶體條目。 當快閃記憶體具有 SFDP 表未涵蓋的設定或支援時(例如,塊保護)或當快閃記憶體包含損壞的 SFDP 資料時,通常會發生這種情況。 如果是後者,則需要實現 spi_nor_fixups 掛鉤,以便使用正確的值修正 SFDP 引數。
最低測試要求¶
執行以下所有測試,並在提交的評論部分中的 --- 標記後貼上它們。
指定用於測試快閃記憶體的控制器,並指定快閃記憶體執行的頻率,例如:
This flash is populated on the X board and was tested at Y frequency using the Z (put compatible) SPI controller.
轉儲 sysfs 條目並列印 md5/sha1/sha256 SFDP 校驗和
root@1:~# cat /sys/bus/spi/devices/spi0.0/spi-nor/partname sst26vf064b root@1:~# cat /sys/bus/spi/devices/spi0.0/spi-nor/jedec_id bf2643 root@1:~# cat /sys/bus/spi/devices/spi0.0/spi-nor/manufacturer sst root@1:~# xxd -p /sys/bus/spi/devices/spi0.0/spi-nor/sfdp 53464450060102ff00060110300000ff81000106000100ffbf0001180002 0001fffffffffffffffffffffffffffffffffd20f1ffffffff0344eb086b 083b80bbfeffffffffff00ffffff440b0c200dd80fd810d820914824806f 1d81ed0f773830b030b0f7ffffff29c25cfff030c080ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff0004fff37f0000f57f0000f9ff 7d00f57f0000f37f0000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffbf2643ffb95ffdff30f260f332ff0a122346ff0f19320f1919ffffff ffffffff00669938ff05013506040232b03072428de89888a585c09faf5a ffff06ec060c0003080bffffffffff07ffff0202ff060300fdfd040700fc 0300fefe0202070e root@1:~# sha256sum /sys/bus/spi/devices/spi0.0/spi-nor/sfdp 428f34d0461876f189ac97f93e68a05fa6428c6650b3b7baf736a921e5898ed1 /sys/bus/spi/devices/spi0.0/spi-nor/sfdp
請使用
xxd -p轉儲 SFDP 表。 它使我們能夠進行反向操作,並使用xxd -rp將 hexdump 轉換為二進位制檔案。 接受使用hexdump -Cv轉儲 SFDP 資料,但不太理想。轉儲 debugfs 資料
root@1:~# cat /sys/kernel/debug/spi-nor/spi0.0/capabilities Supported read modes by the flash 1S-1S-1S opcode 0x03 mode cycles 0 dummy cycles 0 1S-1S-1S (fast read) opcode 0x0b mode cycles 0 dummy cycles 8 1S-1S-2S opcode 0x3b mode cycles 0 dummy cycles 8 1S-2S-2S opcode 0xbb mode cycles 4 dummy cycles 0 1S-1S-4S opcode 0x6b mode cycles 0 dummy cycles 8 1S-4S-4S opcode 0xeb mode cycles 2 dummy cycles 4 4S-4S-4S opcode 0x0b mode cycles 2 dummy cycles 4 Supported page program modes by the flash 1S-1S-1S opcode 0x02 root@1:~# cat /sys/kernel/debug/spi-nor/spi0.0/params name sst26vf064b id bf 26 43 bf 26 43 size 8.00 MiB write size 1 page size 256 address nbytes 3 flags HAS_LOCK | HAS_16BIT_SR | SOFT_RESET | SWP_IS_VOLATILE opcodes read 0xeb dummy cycles 6 erase 0x20 program 0x02 8D extension none protocols read 1S-4S-4S write 1S-1S-1S register 1S-1S-1S erase commands 20 (4.00 KiB) [0] d8 (8.00 KiB) [1] d8 (32.0 KiB) [2] d8 (64.0 KiB) [3] c7 (8.00 MiB) sector map region (in hex) | erase mask | flags ------------------+------------+---------- 00000000-00007fff | [01 ] | 00008000-0000ffff | [0 2 ] | 00010000-007effff | [0 3] | 007f0000-007f7fff | [0 2 ] | 007f8000-007fffff | [01 ] |
使用 mtd-utils 並驗證擦除、讀取和頁面程式設計操作是否正常工作
root@1:~# dd if=/dev/urandom of=./spi_test bs=1M count=2 2+0 records in 2+0 records out 2097152 bytes (2.1 MB, 2.0 MiB) copied, 0.848566 s, 2.5 MB/s root@1:~# mtd_debug erase /dev/mtd0 0 2097152 Erased 2097152 bytes from address 0x00000000 in flash root@1:~# mtd_debug read /dev/mtd0 0 2097152 spi_read Copied 2097152 bytes from address 0x00000000 in flash to spi_read root@1:~# hexdump spi_read 0000000 ffff ffff ffff ffff ffff ffff ffff ffff * 0200000 root@1:~# sha256sum spi_read 4bda3a28f4ffe603c0ec1258c0034d65a1a0d35ab7bd523a834608adabf03cc5 spi_read root@1:~# mtd_debug write /dev/mtd0 0 2097152 spi_test Copied 2097152 bytes from spi_test to address 0x00000000 in flash root@1:~# mtd_debug read /dev/mtd0 0 2097152 spi_read Copied 2097152 bytes from address 0x00000000 in flash to spi_read root@1:~# sha256sum spi* c444216a6ba2a4a66cccd60a0dd062bce4b865dd52b200ef5e21838c4b899ac8 spi_read c444216a6ba2a4a66cccd60a0dd062bce4b865dd52b200ef5e21838c4b899ac8 spi_test
如果快閃記憶體在預設情況下已擦除,並且之前的擦除被忽略,我們將無法捕獲它,因此請再次測試擦除
root@1:~# mtd_debug erase /dev/mtd0 0 2097152 Erased 2097152 bytes from address 0x00000000 in flash root@1:~# mtd_debug read /dev/mtd0 0 2097152 spi_read Copied 2097152 bytes from address 0x00000000 in flash to spi_read root@1:~# sha256sum spi* 4bda3a28f4ffe603c0ec1258c0034d65a1a0d35ab7bd523a834608adabf03cc5 spi_read c444216a6ba2a4a66cccd60a0dd062bce4b865dd52b200ef5e21838c4b899ac8 spi_test
轉儲一些其他相關資料
root@1:~# mtd_debug info /dev/mtd0 mtd.type = MTD_NORFLASH mtd.flags = MTD_CAP_NORFLASH mtd.size = 8388608 (8M) mtd.erasesize = 4096 (4K) mtd.writesize = 1 mtd.oobsize = 0 regions = 0