乐趣区

关于程序员:水墨屏开发设备旧-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 公众号 收到第一工夫的更新。

还有更多开源我的项目的介绍和宝藏我的项目期待你的挖掘。

退出移动版