幾個關於 Kindle 3 firmware on Kindle DXG 的 Hack

Posted by tjwei on 星期一, 9月 12, 2011 with 4 comments
之前由 Yifan Lu 發布的 Kindle 3.X updater 實現了讓 Kindle DXG/2 也能使用 Kindle 3.x 的 firmware。這應該是很多人的願望,對一般使用者而言,也遠比我之前的 kindle 3 Open Source on DXG 實用。
但是有三個問題:

  1.  3.x updater 並沒有更新 linux kernel 的版本,所以事實上只是讓 2.5.8 的 kernel 跑 3.x 的 user space 程式。所以會造成 powerd 等問題。
  2.  Active contents 會失效。
  3. 無法 dual-boot 回 2.5.8。
1 的問題可以藉由 patch  kernel 解決。這點工程浩大,但我想辦法 back port 3.x 的 einkfb module 回 2.5.8 。這個 back port 幾乎沒有經過任何正式測試,但似乎擁有了 3.x 的 contrast 功能。不過,我懷疑 3.x 的 pdf reader 的 contrast 功能沒有用到或者跟本不需要 module 的裡的 contrast 功能。所以大概只有翻頁免 flash 的那個 hack 有用。不管怎麼樣,想測試這個 module 的人,可以下載這個檔
2 的問題,由於我之前沒裝 3.x 的軟體,所以只是根據一些討論串認定是 DRM 或者是 API 的問題。這看起來是相當合理的猜測。但後來從 mobileread 的討論串中,了解到一件很詭異的是,就是 KindleNote 這個 homebrew 在 2.5.8 的 DXG 可執行,在 K3.1+ 也可執行,只有在 DXG with 3.1+ firmware 才不能執行。這代表了有除了 API 和 DRM 之外的原因。(雖然 kindle active content 的 DRM 不用費什麼力氣就能解開。)
最後發現是硬體設定檔的問題,
  • 先 unzip K3 的 KindleDeviceServicesShasta-1.0.jar 和 DXG 的 KindleDeviceServicesTN-1.0.jar。
  • 把 DXG 的 /res/* 和 DeviceCapabilityAdapterImpl$1.class copy 過來,覆蓋 K3 的相對應檔案。
  • 把 DXG 的 maranda.keyboard.json 覆蓋 K3 的 shasta.keyboard.json。
  • 然後你會需要一個 hex editor,將 /com/amazon/kindle/kindlet/internal/portability/b/d.class 中某個 A3 或者 A1 開頭的字串換成 A3P5ROKL5A1OLE。
  • A3P5ROKL5A1OLE 和 miranda 代表 DXG,如果是其他的機器,則有相對應的 json 和機器型號。 可以 google "Device Type (device_compatibility_browse)" 找找看。
  • 最後再把 KindleDeviceServicesShasta-1.0.jar zip 回去即可。
3 最後,提供不用刷 firmware 就能在 DXG 執行 K3 framework的方式。首先要有 k3 的 rootfs.img,scp 到 /mnt/us 下。
然後在你的 kindle 裡
mkdir -p /mnt/k3
後執行下列指令:
mount -o loop,noatime /mnt/us/rootfs.img /mnt/k3
mount -o bind /proc /mnt/k3/proc
mount -o bind /sys /mnt/k3/sys
mount -o bind /dev /mnt/k3/dev
mount -o bind /dev/pts /mnt/k3/dev/pts
mount -o bind /mnt/rwfs /mnt/k3/mnt/rwfs
mount -o bind /dev/shm /mnt/k3/dev/shm
mount -o bind /var /mnt/k3/var
mount -o bind /var/local /mnt/k3/var/local
mount -o bind /mnt/base-us /mnt/k3/mnt/base-us
mount -o bind /mnt/us /mnt/k3/mnt/us 
# Terminate K2
/etc/init.d/framework stop
pmon stop all
sleep 5
/etc/init.d/cron stop
/etc/init.d/pmond stop
/etc/init.d/lipc-daemon stop
/etc/init.d/dbus stop
chroot /mnt/k3
# You are now chrooted
ln -sf /etc/kdb.src/mario  /etc/kdb
# Simulate init 5 
/etc/rc5.d/S30network start
/etc/rc5.d/S50wan start
/etc/rc5.d/S60dbus start
/etc/rc5.d/S65pmond start
/etc/rc5.d/S66powerd start
/etc/rc5.d/S70cmd start
/etc/rc5.d/S70wand start 
/etc/rc5.d/S75phd start
/etc/rc5.d/S76mcsd start 
/etc/rc5.d/S80volumd start 
/etc/rc5.d/S85audio start
/etc/rc5.d/S87ttsd start 
/etc/rc5.d/S90cron start 
/etc/rc5.d/S90lipc-daemon start
/etc/rc5.d/S90power start
/etc/rc5.d/S90tmd start
/etc/rc5.d/S91testd start 
/etc/rc5.d/S94browserd start 
/etc/rc5.d/S95framework start
/etc/rc5.d/S96boot_finished start
/etc/rc5.d/S98governor start
Categories: