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-Boot2009.08-lab126(Aug292012-12:55:24)
CPU:Freescalei.MX50family1.1Vat800MHz
mx50pll1:800MHz
mx50pll2:400MHz
mx50pll3:216MHz
ipgclock:50000000Hz
ipgperclock:50000000Hz
uartclock:24000000Hz
ahbclock:100000000Hz
axi_aclock:400000000Hz
axi_bclock:200000000Hz
weim_clock:100000000Hz
ddrclock:800000000Hz
esdhc1clock:80000000Hz
esdhc2clock:80000000Hz
esdhc3clock:80000000Hz
esdhc4clock:80000000Hz
MMC:FSL_ESDHC:0,FSL_ESDHC:1
Board:Tequila
BootReason:[POR]
BootDevice:MMC
BoardId:0031701123730Z56
S/N:B02317022392005M
InitingMDDRmemory
ZQcalibrationcomplete:0x128=0xfffe00100x12C=0xffffffff
DRAM:256MB
Usingdefaultenvironment
In:serial
Out:logbuff
Err:logbuff
QuickMemoryTest0x70000000,0x10000000
POSTdonein13ms
Hitanykeytostopautoboot:0
##BootingkernelfromLegacyImageat70800000...
ImageName:Linux-2.6.31-rt11-lab126
ImageType:ARMLinuxKernelImage(uncompressed)
DataSize:4777568Bytes=4.6MB
LoadAddress:70008000
EntryPoint:70008000
VerifyingChecksum...OK
LoadingKernelImage...OK
OK
Startingkernel...
[snip]
WelcometoKindle!
kindlelogin:
很好,这是启动 uboot 的启动加载器( bootloader )在启动 Linux 并要求我登录。
以 root 登录,提示要输入密码:Emmm…密码?从以前的 Kindle 使用经验中,我知道可以用 Kindle 的序列号生成密码。然后我找到了 这个网站,它会为一个特定的设备生成许多可能的密码:我的 Kindle root 登录密码是第三个。
为防止网站倒闭,这里是 Javascript 生成密码的关键片段:
varmd5=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]usb1-2:newhigh-speedUSBdevicenumber51usingxhci_hcd
[128033.829631]usb1-2:NewUSBdevicefound,idVendor=1949,idProduct=0004,bcdDevice=1.00
[128033.829638]usb1-2:NewUSBdevicestrings:Mfr=1,Product=2,SerialNumber=3
[128033.829642]usb1-2:Product:AmazonKindle
[128033.829645]usb1-2:Manufacturer:Amazon
[128033.829648]usb1-2:SerialNumber:XXXXXXXXXXXXXXXX
Cool!我们有 root 权限,可以登录了!现在来看看如何让它更方便地使用。
转储系统一般来说,第一步是将磁盘信息转到另一台计算机上进行分析。
检查 /proc/mounts,显示主磁盘 /dev/mmcblk0 上有多个分区。
运行 fdisk /dev/mmcblk0 会得到如下结果:
Units=cylindersof64*512=32768bytes
DeviceBootStartEndBlocksIdSystem
/dev/mmcblk0p1*10251222435840083Linux
/dev/mmcblk0p212225142726553683Linux
/dev/mmcblk0p314273152963276883Linux
/dev/mmcblk0p415297597761423360bWin95FAT32
- 四个分区:三个 Linux 系统,一个 FAT32 系统。
- 第一个磁盘开始时离磁盘很远:原来内核存储在那个 “丢失的” 区域。
- 深入研究后发现分区 1 是正常系统,2 是一种诊断工具,3 是存储 Kindle 私密信息(例如 Wi-Fi 密码)。当你通过 USB 插入 Kindle 时,你会看到分区 4:你电子书的存储地方。 — 分区 4 挂载在 /mnt/us”`。
我用 dd 命令将磁盘和分区 1-3 转储到 /mnt/us 上(一般我中意备份一个完整的原始映像,以便在出现问题时可以恢复它):
ddif=/dev/mmcblk0of=/mnt/us/kindle.imgbs=32768count=15297
虽然这款 Kindle 不能在 USB 上显示为磁盘,但因为我有 root 权限能让它这样:
rmmodg_file_storage
modprobeg_file_storagefile=/dev/mmcblk0p4
它会出现在我的笔记本上,然后我把所有东西都复制了下来。
分析系统终于,我用以下命令在笔记本安装 kindle.img 中的分区:
kpartx-vkindle.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。
你可以用 Kindle 内置的 wifid 连接 Wi-Fi,并管理你的 Wi-Fi 配置文件。对啦,如果你的 Wi-Fi 连接失败,一定要记住许多 Kindle 只支持 2.4Ghz Wi-Fi
列出 Wi-Fi 配置文件数量
lipc-get-propcom.lab126.wifidprofileCount
echo"{index=(0)}"|lipc-hash-propcom.lab126.wifidprofileData
lipc-set-propcom.lab126.wifiddeleteProfileWIFIESSID
echo'{essid="WIFIESSID",smethod="wpa2",secured="yes",psk="WIFIPSK"}'|lipc-hash-propcom.lab126.wifidcreateProfile
- smethod 可以是 open / wep / wpa / wpa2 之一(如果选择 open,请设置 secured 为 “no”)
- WIFIPSK 是 wpa_passphrase 实用程序(这实际上是在 Kindle 上)生成的 WIFI PSK:一个正常的 “wifi passphrase” 将不起作用。
lipc-set-propcom.lab126.wifidcmConnectWIFIESSID
echo"{index=(0)}"|lipc-hash-prop-ncom.lab126.wifidcurrentEssid
下面的许多说明需要更改 Kindle 的根磁盘。但是,默认情况下根磁盘为防止被修改以只读模式挂载。要解决这个问题,在 Kindle 上运行以下命令:
mntrootrw
完成修改后,将其设置为只读模式,以防止任何不必要的更改:
mntrootro
我想 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/。
cdKindleTool/Release/
unzipkindle-usbnetwork-0.57.N-k4.zip
./kindletoolextractUpdate_usbnetwork_0.57.N_k4_install.binusbnet
cdusbnet
tarJxfusbnet.tar.xz
- 将 src/usbnet/bin/dropbearmulti 复制到你的 Kindle(我重装它为 USB 设备并复制过来)。
在 Kindle 中:
cd/
mv/mnt/us/dropbearmulti/
chmoda x/dropbearmulti
ln-sf/dropbear/dropbearmulti
ln-sf/dropbearkey/dropbearmulti
ln-sf/bin/scp/dropbearmulti
/dropbearkey-trsa/dropbear_rsa_host_key
我用下面的方式重命名了所有不需要的系统服务:
cd/etc/rc5.d;mvS95frameworkDISABLED.S95framework
我在 /etc/rc5.d/S99adq 中添加了自己的初始化脚本来添加自己的定制设置:
#!/bin/sh
NAME="adq"
case"$1"in
start)
#displaysomestuff!
/usr/sbin/eips-c2020"HELLOADQ"
IP=`ifconfigwlan0|awk'/taddr:/{gsub(/.*:/,"",$2);print$2}'`
/usr/sbin/eips11"IPAddress:$IP"
/usr/sbin/eips12"RootPassword:<MYROOTPASSWORD>"
/usr/sbin/eips""
#connecttowifiandallowsshin
lipc-set-propcom.lab126.wifidcmConnectMYWIFISSID
iptables-AINPUT-iwlan0-ptcp--dport22-jACCEPT
/dropbear-r/dropbear_rsa_host_key
mkdir-p/mnt/us/usbnet/etc
echo"<MYSSHPUBKEY>">/mnt/us/usbnet/etc/authorized_keys
#exposeshelloverusb
modprobe-rg_file_storage
modprobeg_serial
/sbin/getty-L115200ttyGS0-l/bin/login&
;;
stop)
;;
*)
msg"Usage:/etc/init.d/$NAME{start|stop}"W>&2
exit1
;;
esac
exit0
- 在电子书屏幕的启动页显示一些有用信息
- 连上 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 的「译文亦舞」系列,让你的才华舞动起来!把优秀的文章分享给更多的人。
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com