MZK-DP150N、新リビジョンのFlash対応
2018年5月15日(火) 01:46 JST
閲覧数 3,303
MZK-DP150Nの新しいリビジョンではOpenWrtでFlashが見えないという問題、どうやら2017年春の時点から起きている模様。
問題発生している実機を提供頂けたので、詳細確認しました。(提供頂き有難うございます。)
起動ログを見る限り、数件報告の有った状況と同様。
この状態に陥ると純正ファームに書き戻す事も別ファームを書く事もできなくなる。
ローダブルモジュール構成になっていれば救えたのかもしれないが致し方ない。
新しいリビジョンのMZK-DP150NのOpenWrt化は注意しなくてはいけない。開封しないと書き戻せない。
しかも、溶着なので完全には戻せない。
爪で引っ掛けているとかではないので、ペリッと剥がして開ける事になります。
どうにもこの状態からの復帰が出来そうにないので、開封を実施。
2回目という事もあり、綺麗に開封。(もちろん溶着できないので戻りませんが)
2枚構成で、見えにくい位置にFlashがあるので、基板をばらすか悩んだが、なんとかFlashの型番までは確認できた。EN25QH32A。
データシートも探せば出てくるので仕様の確認は可能。
問題の報告を初めて聞いた時は、データシートが見つからなくて頭を抱えた。
ここからは、シリアルを繋いでの確認。
どうやらu-bootからみても、利用されているFlashのJEDECは認識できていない。
u-bootの場合、IDが判断できなくてもとりあえず読み込んでロードしてしまうので、純正ファームは読み込みできてしまいます。
EN25Q32Bとほぼ仕様は同じなので問題なくロードできます。
Linuxのmtdとしてアクセスする仕様としては同じで問題ないので、動作に問題は無い。
OpenWrtでも同様に動いてくれればよかったのだが、IDが異なる時点でエラーとして処理してしまう。(異なる仕様でアクセスすれば潰してしまうケースもあるので、ある意味エラーとするのは正しいとも思えるが、)
OpenWrtで起動できないのは、利用しているkernelでこのJEDEC IDを認識できないだけなので、定義すれば問題ない筈。
MZK-DP150NをOpenWrtで対応させたのは、kernel 3.18の頃なのだが、4.4、4.9、4.14とこのIDは定義されていない。
他のデバイスで利用されている場合にも同様の問題が発生する事が予想される。
現在、OpenWrtは次期安定半18.05のリリースが待たれる状態で、このタイミングでkernelにパッチが入るかはかなり怪しいが作ってみたから後で送ってみる事にしよう。
(4MBなFlashという事もあり、入らないケースもありえそうではあるのだが。)
r6878-4045080向けに書いたパッチになります。
mtd-spi-nor-add-eon-en25qh32_r6878-4045080.patch
内容としては至って単純。定義を追加しているだけです。
en25qh64も抜け落ちているのは何故なのかといいたい訳だが、kernel 4.14では何故か128, 256は入っている。(悔しい)
例の様に純正ファームからの書換え時に利用する踏み台としてinitramfsと、squashfs両方のイメージを置いておきます。
Flash容量が小さいので、IPv6、PPP、Luciは外した状態でのイメージになります。
作成したイメージは、新旧リビジョン両対応となっています。
現状、本家OpenWrt/LEDEのイメージを書き込んでしまうと文鎮化してしまうので、注意が必要です。
対応が入るまでは、自分でビルドしてしまうのが安全でしょう。
openwrt-ramips-rt305x-mzk-dp150n-initramfs-kernel.bin
openwrt-ramips-rt305x-mzk-dp150n-squashfs-sysupgrade.bin
([2018/05/26追記] 本家にパッチ入りました。shapshotビルドでは起動できる様になりました。)
最後に起動できた上記イメージでのログを張り付けておきます。
問題発生している実機を提供頂けたので、詳細確認しました。(提供頂き有難うございます。)
起動ログを見る限り、数件報告の有った状況と同様。
[ 3.730000] m25p80 spi32766.0: unrecognized JEDEC id 1c7016kernelバージョンにより以下の様なログになります。
[ 4.444935] m25p80 spi0.0: unrecognized JEDEC id bytes: 1c, 70, 16 [ 4.457452] m25p80: probe of spi0.0 failed with error -2JEDECが見つからない状態が発生してしまっています。
この状態に陥ると純正ファームに書き戻す事も別ファームを書く事もできなくなる。
ローダブルモジュール構成になっていれば救えたのかもしれないが致し方ない。
新しいリビジョンのMZK-DP150NのOpenWrt化は注意しなくてはいけない。開封しないと書き戻せない。
しかも、溶着なので完全には戻せない。
爪で引っ掛けているとかではないので、ペリッと剥がして開ける事になります。
どうにもこの状態からの復帰が出来そうにないので、開封を実施。
2回目という事もあり、綺麗に開封。(もちろん溶着できないので戻りませんが)
2枚構成で、見えにくい位置にFlashがあるので、基板をばらすか悩んだが、なんとかFlashの型番までは確認できた。EN25QH32A。
データシートも探せば出てくるので仕様の確認は可能。
問題の報告を初めて聞いた時は、データシートが見つからなくて頭を抱えた。
ここからは、シリアルを繋いでの確認。
どうやらu-bootからみても、利用されているFlashのJEDECは認識できていない。
u-bootの場合、IDが判断できなくてもとりあえず読み込んでロードしてしまうので、純正ファームは読み込みできてしまいます。
EN25Q32Bとほぼ仕様は同じなので問題なくロードできます。
U-Boot 1.1.3 (May 8 2013 - 21:16:08) Board: Ralink APSoC DRAM: 32 MB relocate_code Pointer at: 81fb4000 ****************************** Software System Reset Occurred ****************************** spi_wait_nsec: 42 spi device id: 1c 70 16 1c 70 (70161c70) Warning: un-recognized chip ID, please update bootloader!また、純正ファームでは、en25q32bとして認識させてしまう動作になっています。
Linuxのmtdとしてアクセスする仕様としては同じで問題ないので、動作に問題は無い。
OpenWrtでも同様に動いてくれればよかったのだが、IDが異なる時点でエラーとして処理してしまう。(異なる仕様でアクセスすれば潰してしまうケースもあるので、ある意味エラーとするのは正しいとも思えるが、)
deice id : 1c 70 16 1c 70 (70161c70) Warning: un-recognized chip ID, please update SPI driver! EN25Q32B(1c 30161c30) (4096 Kbytes) mtd .name = raspi, .size = 0x00400000 (4M) .erasesize = 0x00010000 (64K) .numeraseregions = 0 Creating 5 MTD partitions on "raspi": 0x00000000-0x00400000 : "ALL" 0x00000000-0x00030000 : "Bootloader" 0x00030000-0x00040000 : "Config" 0x00040000-0x00050000 : "Factory" 0x00050000-0x01000000 : "Kernel"
OpenWrtで起動できないのは、利用しているkernelでこのJEDEC IDを認識できないだけなので、定義すれば問題ない筈。
MZK-DP150NをOpenWrtで対応させたのは、kernel 3.18の頃なのだが、4.4、4.9、4.14とこのIDは定義されていない。
他のデバイスで利用されている場合にも同様の問題が発生する事が予想される。
現在、OpenWrtは次期安定半18.05のリリースが待たれる状態で、このタイミングでkernelにパッチが入るかはかなり怪しいが作ってみたから後で送ってみる事にしよう。
(4MBなFlashという事もあり、入らないケースもありえそうではあるのだが。)
r6878-4045080向けに書いたパッチになります。
mtd-spi-nor-add-eon-en25qh32_r6878-4045080.patch
内容としては至って単純。定義を追加しているだけです。
en25qh64も抜け落ちているのは何故なのかといいたい訳だが、kernel 4.14では何故か128, 256は入っている。(悔しい)
+--- a/drivers/mtd/spi-nor/spi-nor.c ++++ b/drivers/mtd/spi-nor/spi-nor.c +@@ -497,6 +497,7 @@ + { "en25q32b", INFO(0x1c3016, 0, 64 * 1024, 64, 0) }, + { "en25p64", INFO(0x1c2017, 0, 64 * 1024, 128, 0) }, + { "en25q64", INFO(0x1c3017, 0, 64 * 1024, 128, SECT_4K) }, ++ { "en25qh32", INFO(0x1c7016, 0, 64 * 1024, 64, 0) }, + { "en25qh128", INFO(0x1c7018, 0, 64 * 1024, 256, 0) }, + { "en25qh256", INFO(0x1c7019, 0, 64 * 1024, 512, 0) }, +
例の様に純正ファームからの書換え時に利用する踏み台としてinitramfsと、squashfs両方のイメージを置いておきます。
Flash容量が小さいので、IPv6、PPP、Luciは外した状態でのイメージになります。
作成したイメージは、新旧リビジョン両対応となっています。
現状、本家OpenWrt/LEDEのイメージを書き込んでしまうと文鎮化してしまうので、注意が必要です。
対応が入るまでは、自分でビルドしてしまうのが安全でしょう。
openwrt-ramips-rt305x-mzk-dp150n-initramfs-kernel.bin
openwrt-ramips-rt305x-mzk-dp150n-squashfs-sysupgrade.bin
([2018/05/26追記] 本家にパッチ入りました。shapshotビルドでは起動できる様になりました。)
最後に起動できた上記イメージでのログを張り付けておきます。
root@OpenWrt:~# dmesg [ 0.000000] Linux version 4.14.37 (dev@dev) (gcc version 7.3.0 (OpenWrt GCC 7.3.0 r6878-4045080)) #0 Sat May 12 21:53:44 2018 [ 0.000000] SoC Type: Ralink RT5350 id:1 rev:3 [ 0.000000] bootconsole [early0] enabled [ 0.000000] CPU0 revision is: 0001964c (MIPS 24KEc) [ 0.000000] MIPS: machine is Planex MZK-DP150N [ 0.000000] Determined physical RAM map: [ 0.000000] memory: 02000000 @ 00000000 (usable) [ 0.000000] Initrd not found or empty - disabling initrd [ 0.000000] Primary instruction cache 32kB, VIPT, 4-way, linesize 32 bytes. [ 0.000000] Primary data cache 16kB, 4-way, VIPT, no aliases, linesize 32 bytes [ 0.000000] Zone ranges: [ 0.000000] Normal [mem 0x0000000000000000-0x0000000001ffffff] [ 0.000000] Movable zone start for each node [ 0.000000] Early memory node ranges [ 0.000000] node 0: [mem 0x0000000000000000-0x0000000001ffffff] [ 0.000000] Initmem setup node 0 [mem 0x0000000000000000-0x0000000001ffffff] [ 0.000000] On node 0 totalpages: 8192 [ 0.000000] free_area_init_node: node 0, pgdat 803c9490, node_mem_map 81000040 [ 0.000000] Normal zone: 64 pages used for memmap [ 0.000000] Normal zone: 0 pages reserved [ 0.000000] Normal zone: 8192 pages, LIFO batch:0 [ 0.000000] random: get_random_bytes called from start_kernel+0x8c/0x474 with crng_init=0 [ 0.000000] pcpu-alloc: s0 r0 d32768 u32768 alloc=1*32768 [ 0.000000] pcpu-alloc: [0] 0 [ 0.000000] Built 1 zonelists, mobility grouping on. Total pages: 8128 [ 0.000000] Kernel command line: console=ttyS0,57600 rootfstype=squashfs,jffs2 [ 0.000000] PID hash table entries: 128 (order: -3, 512 bytes) [ 0.000000] Dentry cache hash table entries: 4096 (order: 2, 16384 bytes) [ 0.000000] Inode-cache hash table entries: 2048 (order: 1, 8192 bytes) [ 0.000000] Writing ErrCtl register=00000000 [ 0.000000] Readback ErrCtl register=00000000 [ 0.000000] Memory: 28164K/32768K available (2992K kernel code, 159K rwdata, 728K rodata, 144K init, 197K bss, 4604K reserved, 0K cma-reserved) [ 0.000000] SLUB: HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1 [ 0.000000] NR_IRQS: 256 [ 0.000000] CPU Clock: 360MHz [ 0.000000] clocksource: systick: mask: 0xffff max_cycles: 0xffff, max_idle_ns: 583261500 ns [ 0.000000] systick: running - mult: 214748, shift: 32 [ 0.000000] clocksource: MIPS: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 10618113593 ns [ 0.000016] sched_clock: 32 bits at 180MHz, resolution 5ns, wraps every 11930464253ns [ 0.015703] Calibrating delay loop... 239.61 BogoMIPS (lpj=1198080) [ 0.098048] pid_max: default: 32768 minimum: 301 [ 0.107612] Mount-cache hash table entries: 1024 (order: 0, 4096 bytes) [ 0.120730] Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes) [ 0.143326] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns [ 0.162886] futex hash table entries: 256 (order: -1, 3072 bytes) [ 0.175129] pinctrl core: initialized pinctrl subsystem [ 0.186588] NET: Registered protocol family 16 [ 0.246603] rt2880_gpio 10000600.gpio: registering 22 gpios [ 0.257747] rt2880_gpio 10000600.gpio: registering 22 irq handlers [ 0.270785] rt2880_gpio 10000660.gpio: registering 6 gpios [ 0.281752] rt2880_gpio 10000660.gpio: registering 6 irq handlers [ 0.303240] clocksource: Switched to clocksource MIPS [ 0.315509] NET: Registered protocol family 2 [ 0.325779] TCP established hash table entries: 1024 (order: 0, 4096 bytes) [ 0.339666] TCP bind hash table entries: 1024 (order: 0, 4096 bytes) [ 0.352234] TCP: Hash tables configured (established 1024 bind 1024) [ 0.365261] UDP hash table entries: 256 (order: 0, 4096 bytes) [ 0.376904] UDP-Lite hash table entries: 256 (order: 0, 4096 bytes) [ 0.389877] NET: Registered protocol family 1 [ 0.404669] rt-timer 10000100.timer: maximum frequency is 3662Hz [ 0.418281] Crashlog allocated RAM at address 0x1f00000 [ 0.432694] workingset: timestamp_bits=30 max_order=13 bucket_order=0 [ 0.455806] squashfs: version 4.0 (2009/01/31) Phillip Lougher [ 0.467403] jffs2: version 2.2 (NAND) (SUMMARY) (LZMA) (RTIME) (CMODE_PRIORITY) (c) 2001-2006 Red Hat, Inc. [ 0.511491] io scheduler noop registered [ 0.519270] io scheduler deadline registered (default) [ 0.530989] Serial: 8250/16550 driver, 2 ports, IRQ sharing disabled [ 0.545738] console [ttyS0] disabled [ 0.552792] 10000c00.uartlite: ttyS0 at MMIO 0x10000c00 (irq = 20, base_baud = 2500000) is a Palmchip BK-3103 [ 0.572605] console [ttyS0] enabled [ 0.586362] bootconsole [early0] disabled [ 0.603367] cacheinfo: Failed to find cpu0 device node [ 0.613682] cacheinfo: Unable to detect cache hierarchy for CPU 0 [ 0.636961] spi spi0.0: force spi mode3 [ 0.646066] m25p80 spi0.0: en25qh32 (4096 Kbytes) [ 0.655653] 4 fixed-partitions partitions found on MTD device spi0.0 [ 0.668375] Creating 4 MTD partitions on "spi0.0": [ 0.677985] 0x000000000000-0x000000030000 : "uboot" [ 0.689649] 0x000000030000-0x000000040000 : "uboot-env" [ 0.701942] 0x000000040000-0x000000050000 : "factory" [ 0.714102] 0x000000050000-0x000000400000 : "firmware" [ 0.760468] 2 uimage-fw partitions found on MTD device firmware [ 0.772415] 0x000000050000-0x00000018f0a2 : "kernel" [ 0.784303] 0x00000018f0a2-0x000000400000 : "rootfs" [ 0.796018] mtd: device 5 (rootfs) set to be root filesystem [ 0.810916] 1 squashfs-split partitions found on MTD device rootfs [ 0.823407] 0x000000330000-0x000000400000 : "rootfs_data" [ 0.836979] libphy: Fixed MDIO Bus: probed [ 0.853410] rt3050-esw 10110000.esw: link changed 0x00 [ 0.866739] mtk_soc_eth 10100000.ethernet eth0: mediatek frame engine at 0xb0100000, irq 5 [ 0.884394] rt2880_wdt 10000120.watchdog: Initialized [ 0.895617] NET: Registered protocol family 17 [ 0.904774] 8021q: 802.1Q VLAN Support v1.8 [ 0.935651] VFS: Mounted root (squashfs filesystem) readonly on device 31:5. [ 0.951392] Freeing unused kernel memory: 144K [ 0.960370] This architecture does not have kernel memory protection. [ 2.516327] init: Console is alive [ 2.523873] init: - watchdog - [ 2.593299] random: fast init done [ 3.961233] kmodloader: loading kernel modules from /etc/modules-boot.d/* [ 4.264168] kmodloader: done loading kernel modules from /etc/modules-boot.d/* [ 4.289667] init: - preinit - [ 6.340859] rt3050-esw 10110000.esw: link changed 0x00 [ 6.653991] random: procd: uninitialized urandom read (4 bytes read) [ 8.325421] rt3050-esw 10110000.esw: link changed 0x10 [ 10.006210] mount_root: jffs2 not ready yet, using temporary tmpfs overlay [ 10.062204] urandom-seed: Seed file not found (/etc/urandom.seed) [ 10.268445] procd: - early - [ 10.274639] procd: - watchdog - [ 11.017615] procd: - watchdog - [ 11.024861] procd: - ubus - [ 11.186339] random: ubusd: uninitialized urandom read (4 bytes read) [ 11.201123] random: ubusd: uninitialized urandom read (4 bytes read) [ 11.215086] random: ubusd: uninitialized urandom read (4 bytes read) [ 11.228005] random: ubusd: uninitialized urandom read (4 bytes read) [ 11.241509] random: ubusd: uninitialized urandom read (4 bytes read) [ 11.254534] random: ubusd: uninitialized urandom read (4 bytes read) [ 11.267919] random: ubusd: uninitialized urandom read (4 bytes read) [ 11.281285] random: ubusd: uninitialized urandom read (4 bytes read) [ 11.295264] procd: - init - [ 11.995484] kmodloader: loading kernel modules from /etc/modules.d/* [ 12.018936] Loading modules backported from Linux version wt-2017-11-01-0-gfe248fc2c180 [ 12.035039] Backport generated by backports.git v4.14-rc2-1-31-g86cf0e5d [ 12.062394] nf_conntrack version 0.5.0 (1024 buckets, 4096 max) [ 12.192010] xt_time: kernel timezone is -0000 [ 12.235828] ip_tables: (C) 2000-2006 Netfilter Core Team [ 12.346831] rt2800_wmac 10180000.wmac: loaded eeprom from mtd device "factory" [ 12.361385] ieee80211 phy0: rt2x00_set_rt: Info - RT chipset 5350, rev 0500 detected [ 12.376934] ieee80211 phy0: rt2x00_set_rf: Info - RF chipset 5350 detected [ 12.391960] ieee80211 phy0: Selected rate control algorithm 'minstrel_ht' [ 12.423842] kmodloader: done loading kernel modules from /etc/modules.d/* [ 13.953047] random: jshn: uninitialized urandom read (4 bytes read) [ 20.091440] rt3050-esw 10110000.esw: link changed 0x00 [ 22.303793] rt3050-esw 10110000.esw: link changed 0x10 [ 24.514514] jffs2_scan_eraseblock(): End of filesystem marker found at 0x0 [ 24.553354] jffs2_build_filesystem(): unlocking the mtd device... [ 24.553378] done. [ 24.569614] jffs2_build_filesystem(): erasing all blocks after the end marker... [ 30.419655] br-lan: port 1(eth0.1) entered blocking state [ 30.445486] br-lan: port 1(eth0.1) entered disabled state [ 30.456935] device eth0.1 entered promiscuous mode [ 30.466641] device eth0 entered promiscuous mode [ 30.752885] br-lan: port 1(eth0.1) entered blocking state [ 30.763796] br-lan: port 1(eth0.1) entered forwarding state [ 31.226729] done. [ 31.230643] jffs2: notice: (810) jffs2_build_xattr_subsystem: complete building xattr subsystem, 0 of xdatum (0 unchecked, 0 orphan) and 0 of xref (0 dead, 0 orphan) found. [ 32.026948] overlayfs: upper fs does not support tmpfile. [ 51.173691] rt3050-esw 10110000.esw: link changed 0x00 [ 53.318706] rt3050-esw 10110000.esw: link changed 0x10