PQI Air Pen、OpenWrt化(開封編)
2016年12月21日(水) 00:39 JST
閲覧数 5,297
PQI Air PenのOpenWrt化について、未開封での書換え手順は別途記載するとして、先に開封した状態での書換えを纏めておきます。
u-bootから書換えるというお話です。
OpenWrt化用のパッチとバイナリ。
PQIAirPen_trunk_r50015.patch
openwrt-ar71xx-generic-pqi-air-pen-squashfs-sysupgrade.bin
無線については、日本国内で出力を行った場合、電波法違反となります。
また、ファームウェアの書換え、分解等は、メーカーサポートが受けれなくなる為、自己責任となります。
ファームウェア書換えは自己責任である旨ご理解下さい。
書換えに対して注意が幾つか。
純正ファームには基本戻らないと考えておいてください。(戻せない訳ではないですが)
PQI Air Penは以下の様なDualImage構成を取っており、OpenWrt化した際に容量が確保できなくなる為、SingleImage構成に作り直す前提でOpenWrtパッチを作成しています。
DualImage構成を維持したい方は、パーティション構成を変更、sysupgradeの変更等が必要となります。
今回は、uImage、rootfs、uImage2、rootfs2をfirmwareパーティションとしてしまう形としています。
NVRAMも不要となりますが、念の為残しました。
u-bootは、有線Etherは使用出来ます。
tfpbootでイメージを転送して、cp.bして書き込めば簡単にOpenWrt化できます。
デフォルトでは、tftpサーバを「192.168.1.1」、ファイル名を「0201A8C0.img」として取得します。
注意するのは、CONF領域は絶対に壊さないということ。
CONF領域を消すと、ライセンスが無いと言われ起動できなくなります。
また、bootmでアドレス指定しても必ず、読み出すアドレスは0x9f070000か0x9f7f0000の2種類のどちらかになります。
サイズ等は、書き換えるバイナリに合わせるとして、こんな感じで問題なし。
GPIOについては、LED、Button共に割り当て済みですが、USBの切り替えについてはサポートしていません。
純正ファームウェアでは、PCに繋いだ際にuSDスロットがPC側から見える形となっていますが、切り替えを行っているだろうGPIOを見つけていないので、対応していない状態になります。(必要にも思えないので探す予定もありませんが。)
最後に少し嵌ったCONF領域について。
1バイト目が「00」の場合は、「0x9f070000」から起動、「01」の場合「0x9f7f0000」から起動を行う形でDualImage構成を実現している。
また17バイト目からのデータが存在しないと、ライセンスが無いと判断され、起動できなくなります。
u-bootでbootさせた時に呼び出されるプログラムがチェックを行っている模様。
純正ファームでのファームアップデートはどうなっているのか?
/sbin/fwUpgradeがアップデートプログラム本体だが、案の定バイナリ。
読み取れる箇所から未開封での書換え方法のヒントを得る。
やはり、一度でsquashfsな構成に書き換えるのは難しそうである。踏み台方式で手順を確立する。
純正ファームで起動した場合、rootfsが普通にマウントされた状態で起動する為、ddで書き込み等行った場合壊れてしまいます。
マウントされていない方を書換えて、再起動するという順序を踏まないと書換えが完了できない。
u-bootから書換えるというお話です。
OpenWrt化用のパッチとバイナリ。
PQIAirPen_trunk_r50015.patch
openwrt-ar71xx-generic-pqi-air-pen-squashfs-sysupgrade.bin
無線については、日本国内で出力を行った場合、電波法違反となります。
また、ファームウェアの書換え、分解等は、メーカーサポートが受けれなくなる為、自己責任となります。
ファームウェア書換えは自己責任である旨ご理解下さい。
書換えに対して注意が幾つか。
純正ファームには基本戻らないと考えておいてください。(戻せない訳ではないですが)
PQI Air Penは以下の様なDualImage構成を取っており、OpenWrt化した際に容量が確保できなくなる為、SingleImage構成に作り直す前提でOpenWrtパッチを作成しています。
DualImage構成を維持したい方は、パーティション構成を変更、sysupgradeの変更等が必要となります。
今回は、uImage、rootfs、uImage2、rootfs2をfirmwareパーティションとしてしまう形としています。
NVRAMも不要となりますが、念の為残しました。
# cat /proc/mtd dev: size erasesize name mtd0: 00040000 00010000 "u-boot" mtd1: 00010000 00010000 "u-boot-env" mtd2: 00010000 00010000 "ART" mtd3: 00010000 00010000 "NVRAM" mtd4: 00140000 00010000 "uImage" mtd5: 00280000 00010000 "rootfs" mtd6: 00140000 00010000 "uImage2" mtd7: 00280000 00010000 "rootfs2" mtd8: 00010000 00010000 "CONF"私が作成したOpenWrtパッチでは以下の様になります。
# cat /proc/mtd dev: size erasesize name mtd0: 00040000 00010000 "u-boot" mtd1: 00010000 00010000 "u-boot-env" mtd2: 00010000 00010000 "art" mtd3: 00010000 00010000 "NVRAM" mtd4: 00780000 00010000 "firmware" mtd5: 00140000 00010000 "kernel" mtd6: 00640000 00010000 "rootfs" mtd7: 00420000 00010000 "rootfs_data" mtd8: 00010000 00010000 "CONF"
u-bootは、有線Etherは使用出来ます。
tfpbootでイメージを転送して、cp.bして書き込めば簡単にOpenWrt化できます。
デフォルトでは、tftpサーバを「192.168.1.1」、ファイル名を「0201A8C0.img」として取得します。
注意するのは、CONF領域は絶対に壊さないということ。
CONF領域を消すと、ライセンスが無いと言われ起動できなくなります。
また、bootmでアドレス指定しても必ず、読み出すアドレスは0x9f070000か0x9f7f0000の2種類のどちらかになります。
サイズ等は、書き換えるバイナリに合わせるとして、こんな感じで問題なし。
ar7240> tftpboot dup 1 speed 100 *** Warning: no boot file name; using '0201A8C0.img' Using eth0 device TFTP from server 192.168.1.1; our IP address is 192.168.1.2 Filename '0201A8C0.img'. Load address: 0x81000000 Loading: ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ## done Bytes transferred = 3670020 (380004 hex) ar7240> erase 0x9f070000 +0x380004 First 0x7 last 0x3f sector size 0x10000 63 Erased 57 sectors ar7240> cp.b 0x81000000 0x9f070000 0x380004 Copy to Flash... write addr: 9f070000 done ar7240> boot
GPIOについては、LED、Button共に割り当て済みですが、USBの切り替えについてはサポートしていません。
純正ファームウェアでは、PCに繋いだ際にuSDスロットがPC側から見える形となっていますが、切り替えを行っているだろうGPIOを見つけていないので、対応していない状態になります。(必要にも思えないので探す予定もありませんが。)
最後に少し嵌ったCONF領域について。
1バイト目が「00」の場合は、「0x9f070000」から起動、「01」の場合「0x9f7f0000」から起動を行う形でDualImage構成を実現している。
また17バイト目からのデータが存在しないと、ライセンスが無いと判断され、起動できなくなります。
u-bootでbootさせた時に呼び出されるプログラムがチェックを行っている模様。
00010203 04050607 08090A0B 0C0D0E0F 0123456789ABCDEF 0000 0000FFFF FFFFFFFF FFFFFFFF FFFFFFFF ................ 0010 FFEA7018 2F8D7757 ED44C840 AAFFFFFF ..p./.wW.D.@....
純正ファームでのファームアップデートはどうなっているのか?
/sbin/fwUpgradeがアップデートプログラム本体だが、案の定バイナリ。
読み取れる箇所から未開封での書換え方法のヒントを得る。
やはり、一度でsquashfsな構成に書き換えるのは難しそうである。踏み台方式で手順を確立する。
touch /tmp/FWU flash_erase /dev/kernel2 cnt 0x14 > /dev/null 2>&1 /dev/kernel2 flash_erase /dev/fs2 cnt 0x28 > /dev/null 2>&1 /dev/fs2 flash_erase /dev/confdata cnt 1 > /dev/null 2>&1 No firmware image found flash_erase /dev/kernel cnt 0x14 > /dev/null 2>&1 /dev/kernel flash_erase /dev/filesystem cnt 0x28 > /dev/null 2>&1 /dev/filesystem[2016/12/21 12:14追記]
純正ファームで起動した場合、rootfsが普通にマウントされた状態で起動する為、ddで書き込み等行った場合壊れてしまいます。
マウントされていない方を書換えて、再起動するという順序を踏まないと書換えが完了できない。