水墨屏開發設備,舊 Kindle 改造而成


原文地址:Turning an old Amazon Kindle into a eink development platform

原文作者:adq

譯者 & 校正:HelloGitHub-小魚干 & 鹵蛋

我想有個用於(開發)未來項目的水墨屏,剛好我又買了一個帶樹莓派 “hat” 的小玩意。就這樣,靈光一閃的我想到舊 Amazon Kindle 電子書閱讀器可以變廢為寶。

譯者:這便是本文的由來。

我之前有過使用 Kindle 的經驗:我為它移植過一個 Infocom 解析器 和一個 Manga 漫畫閱讀器 。我讓亞馬遜軟件以 “Kindlets” 形式加載 Infocom 和 Manga,並將它們集成到電子書閱讀器 Kindle 中。而現在,我想要一個好用且便宜的水墨屏 Linux 開發平台。

下面就是全部的操作和流程!

Ebay 上便宜的 Kindle(和它們便宜的原因)

我在 Ebay 上看到了許多便宜的 Kindle,上面標着 “BLOCKED BY AMAZON”,當然我並不打算買它們,因為理論上它們可能被偷了。最后,我選擇了一個 7 英鎊的非觸摸版 Kindle 4。

幾天后,我收到貨發現了它這么便宜的原因:這台 Kindle 陷入了某種不可退出的演示模式:

我在 Google 上搜了下解決方法,后來版本的 Kindle 是可以退出演示模式,但這些方法在這個 Kindle 4 版本上沒用。不過不要緊,這不重要:因為我並不想在這個 Kindle 上運行原裝的 Kindle 電子書軟件。

嗯,下一步我們就是要去獲得訪問權限。我瀏覽了 mobileread 論壇 顯示 Kindle 有一個調試串口:是時候動手了!

處理硬件

這台 Kindle 有點麻煩:它周圍有多個卡扣,外殼粘在電池組件上,我機智地用了一把刀來拆機並用丙酮把 (Kindle 后蓋的)粘合劑擦拭干凈。

  • 紅色框:討厭的卡扣
  • 紫色:真的非常麻煩的膠水(粘合劑)
  • 黃色:串口

一般來說,硬件串口是沒有插孔的,我們要將連接線焊接到主板的串口上。我喜歡用大約 0.2mm 電線來連接電子元件,並用我的電烙鐵來重焊 Kindle 底座。

我不想任何電線亂繞,我也深知我可能會焊亂電線但我又需要連接串口,所以我想到了一個法子連接電線:

我用強力膠把一塊條板粘在 Kindle 的 PCB 印刷電路板上,然后把迷你 PCB 連接點上的電線焊在一端。最后,在另一端我焊接了一個大的、通用“Dupont”電纜插座,這樣我可以很容易地連接和拆卸它。對啦,Kindle PCB 頂部電纜是 0v/GND,其他電纜是 TX 和 RX (我忘了這兩個電纜的順序)。

最后一個難題:Kindle 串口運行電壓是 1.8v,所以我需要一個串行適配器來供電:

我買的適配器支持 5v、3.3v、2.5v 和 1.8v,非常搭!

Root Kindle

接下來,我把串行適配器連到我的筆記本電腦上,運行 minicom 串口通信軟件,再重新啟動 Kindle。然后,我(難免地,譯者:前面有提到作者忘記了 TX 和 RX 順序)交換 TX 和 RX 電纜后,我看到了 Kindle 歡迎信息!

U-Boot 2009.08-lab126 (Aug 29 2012 - 12:55:24)

CPU:   Freescale i.MX50 family 1.1V at 800 MHz
mx50 pll1: 800MHz
mx50 pll2: 400MHz
mx50 pll3: 216MHz
ipg clock     : 50000000Hz
ipg per clock : 50000000Hz
uart clock    : 24000000Hz
ahb clock     : 100000000Hz
axi_a clock   : 400000000Hz
axi_b clock   : 200000000Hz
weim_clock    : 100000000Hz
ddr clock     : 800000000Hz
esdhc1 clock  : 80000000Hz
esdhc2 clock  : 80000000Hz
esdhc3 clock  : 80000000Hz
esdhc4 clock  : 80000000Hz
MMC:  FSL_ESDHC: 0, FSL_ESDHC: 1
Board: Tequila
Boot Reason: [POR]
Boot Device: MMC
Board Id: 0031701123730Z56
S/N: B02317022392005M
Initing MDDR memory
ZQ calibration complete: 0x128=0xfffe0010 0x12C=0xffffffff
DRAM:  256 MB
Using default environment

In:    serial
Out:   logbuff
Err:   logbuff
Quick Memory Test 0x70000000, 0x10000000
POST done in 13 ms
Hit any key to stop autoboot:  0 
## Booting kernel from Legacy Image at 70800000 ...
   Image Name:   Linux-2.6.31-rt11-lab126
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    4777568 Bytes =  4.6 MB
   Load Address: 70008000
   Entry Point:  70008000
   Verifying Checksum ... OK
   Loading Kernel Image ... OK
OK
Starting kernel ...

[snip]

Welcome to Kindle!

kindle login: 

很好,這是啟動 uboot 的啟動加載器( bootloader )在啟動 Linux 並要求我登錄。

以 root 登錄,提示要輸入密碼:Emmm…密碼?從以前的 Kindle 使用經驗中,我知道可以用 Kindle 的序列號生成密碼。然后我找到了 這個網站,它會為一個特定的設備生成許多可能的密碼:我的 Kindle root 登錄密碼是第三個。

為防止網站倒閉,這里是 Javascript 生成密碼的關鍵片段:

var md5 = hex_md5(serial);
document.getElementById("rootpw").innerHTML = "fiona" + md5.substring(7,11);
document.getElementById("rootpw2").innerHTML = "fiona" + md5.substring(7,10);
document.getElementById("rootpw3").innerHTML = "fiona" + md5.substr(13,3);

對對,我忘了說我是如何拿到設備序列號的。Kindle 以非工作狀態插上 USB,即,你不能將這些演示設備作為磁盤。但在這個狀態的 Kindle 可用 Linux 的 dmesg 命令輸出序列號(你也可以在 uboot 中使用 printenv 命令得到序列號,當它顯示 “Hit any key to stop autoboot” 時按 Enter 回車鍵):

[128033.676587] usb 1-2: new high-speed USB device number 51 using xhci_hcd
[128033.829631] usb 1-2: New USB device found, idVendor=1949, idProduct=0004, bcdDevice= 1.00
[128033.829638] usb 1-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[128033.829642] usb 1-2: Product: Amazon Kindle
[128033.829645] usb 1-2: Manufacturer: Amazon
[128033.829648] usb 1-2: SerialNumber: XXXXXXXXXXXXXXXX

Cool!我們有 root 權限,可以登錄了!現在來看看如何讓它更方便地使用。

轉儲系統

一般來說,第一步是將磁盤信息轉到另一台計算機上進行分析。

檢查 /proc/mounts,顯示主磁盤 /dev/mmcblk0 上有多個分區。

運行 fdisk /dev/mmcblk0 會得到如下結果:

Units = cylinders of 64 * 512 = 32768 bytes

        Device Boot      Start         End      Blocks  Id System
/dev/mmcblk0p1   *        1025       12224      358400  83 Linux
/dev/mmcblk0p2           12225       14272       65536  83 Linux
/dev/mmcblk0p3           14273       15296       32768  83 Linux
/dev/mmcblk0p4           15297       59776     1423360   b Win95 FAT32
  • 四個分區:三個 Linux 系統,一個 FAT32 系統。
  • 第一個磁盤開始時離磁盤很遠:原來內核存儲在那個 “丟失的” 區域。
  • 深入研究后發現分區 1 是正常系統,2 是一種診斷工具,3 是存儲 Kindle 私密信息(例如 Wi-Fi 密碼)。當你通過 USB 插入 Kindle 時,你會看到分區 4:你電子書的存儲地方。
    — 分區 4 掛載在 /mnt/us”`。

我用 dd 命令將磁盤和分區 1-3 轉儲到 /mnt/us 上(一般我中意備份一個完整的原始映像,以便在出現問題時可以恢復它):

dd if=/dev/mmcblk0 of=/mnt/us/kindle.img bs=32768 count=15297

雖然這款 Kindle 不能在 USB 上顯示為磁盤,但因為我有 root 權限能讓它這樣:

rmmod g_file_storage
modprobe g_file_storage file=/dev/mmcblk0p4

它會出現在我的筆記本上,然后我把所有東西都復制了下來。

分析系統

終於,我用以下命令在筆記本安裝 kindle.img 中的分區:

kpartx -v kindle.img

接着,我將 Kindle 各個分區安裝到我的筆記本電腦上。我把所有分區文件放在一個文件夾中,這樣我可以方便地用 grep 命令查看它們。我發現:

  • Kindle 用 rc.d 作為它的系統初始化系統,文件夾中有很多優雅的純文本腳本。
  • Init level 5 是運行電子書軟件的 “通用” 系統
  • 電子書軟件在 /opt/amazon目錄,用 Java 編寫(我知道要快速復習 Java 了)。
  • Kindle 有一堆有意思的純文本 “diag” 腳本用來測試。
  • 有一個相當漂亮的 wifid daemon 來管理 Wi-Fi 連接:我從 diag 腳本中找到了與它對話的方法。
  • /usr/sbin/eps 命令(文檔見這里)從命令行寫入數據到水墨屏。
  • 我沒找到可見的 “turn off demo mode” 開關:看樣子演示模式是 Java 電子書軟件的定制功能。
  • 以下系統服務與不支持的功能或電子書軟件有關,或與 Amazon 聯系:S50wan S70wand S75phd S81usbnetd S93webreaderd S94browserd S95framework S96boot_finished。

對話 Wifid

你可以用 Kindle 內置的 wifid 連接 Wi-Fi,並管理你的 Wi-Fi 配置文件。對啦,如果你的 Wi-Fi 連接失敗,一定要記住許多 Kindle 只支持 2.4Ghz Wi-Fi 😉

列出 Wi-Fi 配置文件數量

lipc-get-prop com.lab126.wifid profileCount

顯示 Wi-Fi 配置文件

echo "{index=(0)}" | lipc-hash-prop com.lab126.wifid profileData

刪除某個 Wi-Fi 配置文件

lipc-set-prop com.lab126.wifid deleteProfile WIFIESSID

創建 Wi-Fi 配置文件

echo '{essid="WIFIESSID", smethod="wpa2", secured="yes", psk="WIFIPSK"}' | lipc-hash-prop com.lab126.wifid createProfile
  • smethod 可以是 open / wep / wpa / wpa2 之一(如果選擇 open,請設置 secured 為 “no”)
  • WIFIPSK 是 wpa_passphrase 實用程序(這實際上是在 Kindle 上)生成的 WIFI PSK:一個正常的 “wifi passphrase” 將不起作用。

連接 Wi-Fi 配置文件

lipc-set-prop com.lab126.wifid cmConnect WIFIESSID

顯示 Wi-Fi 連接情況

echo "{index = (0)}" | lipc-hash-prop -n com.lab126.wifid currentEssid

修改 Root

下面的許多說明需要更改 Kindle 的根磁盤。但是,默認情況下根磁盤為防止被修改以只讀模式掛載。要解決這個問題,在 Kindle 上運行以下命令:

mntroot rw

完成修改后,將其設置為只讀模式,以防止任何不必要的更改:

mntroot ro

安裝 Dropbear SSH

我想 ssh 到我的 Kindle,所以我要安裝 ssh 程序 dropbear。當然,Kindle 是一個基於 ARM 的設備,所以要么我自己編譯 dropbear,要么在某個地方找到 dropbear 二進制文件。剛好,Kindle 有一個遺留的 USBNET 漏洞:我自己不直接用這個漏洞,因為我想完全控制這個開發套件,但是我可以從 USBNET 那里借用 dropbear 二進制文件。

不巧的是,USBNET 漏洞是用 Kindle 自有詭異的更新格式發布的,所以我們需要把 USBNET 提取出來:

在你的電腦中:

  • 下載這個 git repo 並編譯它——這會讓我們解碼 Kindle 更新。
  • 這里 下載 kindle-usbnetwork-0.57.N-k4.zip,並復制到 KindleTool/Release/
cd KindleTool/Release/
unzip kindle-usbnetwork-0.57.N-k4.zip
./kindletool extract Update_usbnetwork_0.57.N_k4_install.bin usbnet
cd usbnet
tar Jxf usbnet.tar.xz
  • src/usbnet/bin/dropbearmulti 復制到你的 Kindle(我重裝它為 USB 設備並復制過來)。

在 Kindle 中:

cd /
mv /mnt/us/dropbearmulti /
chmod a+x /dropbearmulti
ln -sf /dropbear /dropbearmulti
ln -sf /dropbearkey /dropbearmulti
ln -sf /bin/scp /dropbearmulti
/dropbearkey -t rsa /dropbear_rsa_host_key

定制 Kindle

我用下面的方式重命名了所有不需要的系統服務:

cd /etc/rc5.d; mv S95framework DISABLED.S95framework

我在 /etc/rc5.d/S99adq 中添加了自己的初始化腳本來添加自己的定制設置:

#!/bin/sh
NAME="adq"

case "$1" in

   start)
        # display some stuff!
        /usr/sbin/eips -c 20 20 "HELLO ADQ"
        IP=`ifconfig wlan0 | awk '/t addr:/{gsub(/.*:/,"",$2);print$2}'`
        /usr/sbin/eips 1 1 "IP Address: $IP"
        /usr/sbin/eips 1 2 "Root Password: <MY ROOT PASSWORD>"
        /usr/sbin/eips ""

        # connect to wifi and allow ssh in
        lipc-set-prop com.lab126.wifid cmConnect MYWIFISSID
        iptables -A INPUT -i wlan0 -p tcp --dport 22 -j ACCEPT
        /dropbear -r /dropbear_rsa_host_key
        mkdir -p /mnt/us/usbnet/etc
        echo "<MY SSH PUBKEY>" > /mnt/us/usbnet/etc/authorized_keys

        # expose shell over usb
        modprobe -r g_file_storage
        modprobe g_serial
        /sbin/getty -L 115200 ttyGS0 -l /bin/login &
        ;;

   stop)
        ;;
    *)
        msg "Usage: /etc/init.d/$NAME {start|stop}" W >&2
        exit 1
        ;;
esac

exit 0
  • 在電子書屏幕的啟動頁顯示一些有用信息
  • 連上 Wi-Fi。
  • 允許通過防火牆 SSH。
  • 運行 dropbear ssh 進程。
  • 在 dropbear 中添加我的 ssh 公鑰。
  • 移除 “pretend to be a disk” USB 功能。
  • 通過 USB 連接時,假裝為串行設備並給出一個登錄提示:如果我通過 USB 插入它並使用 minicom,我就會得到一個登錄提示… 嗯,這是為了防止出現問題。

一旦啟動,我的 Kindle 就是現在這樣,然后我可以作為 root 用戶 ssh 連接它。

差不多了:我現在可以 ssh 連 Kindle,如果發生問題,我也有多級別的串行控制台來解決問題。這是一個小巧的、支持無線網、電池供電的水墨屏 Linux 開發系統。

最后的操作,把后蓋合上來保護電路。

展望

這個庫 (FBInk)看起來可以取代亞馬遜的 eip 軟件;如果我想把顯示器集成到我自己的軟件中,FBInk 可能會更好。

最后,歡迎優秀的你加入 HelloGitHub 的「譯文亦舞」系列,讓你的才華舞動起來!把優秀的文章分享給更多的人。要求


關注 HelloGitHub 公眾號 收到第一時間的更新。

還有更多開源項目的介紹和寶藏項目等待你的發掘。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM