本文同步自(最佳显示效果请点击):https://zohead.com/archives/k800-kernel-otg-udisk/ 这几天专门入了个二手的联想 K800 的 Android 手机,看中的就是它是 x86 的 CPU,其采用 Intel Medfield Atom 平台,具体处理器型号为 Intel Atom Z2460,用的 Android 4.0.4 系统,具体其它配置我就不多说的。 优点: 使用 Intel x86 CPU,方便程序的移植(相对 ARM 而言); 4.5 寸的 1280 x 720 的 IPS 高清屏幕,主要分辨率够给力; 支持 USB OTG; 支持 MHL 视频输出(缺点也在这,下面再说); 耗电没想象中的那么严重; 使用的 Intel Atom Z2460 CPU 支持 EM64T 64 位指令; 使用的 Intel Atom Z2460 CPU 支持 Intel VT-x 虚拟化技术(不过这个好像在 Android 4.1 中用处才发挥出来,暂时也用不上); 很便宜。 缺点: 没有单独的 HDMI 接口,视频输出需要占用 MicroUSB,OTG 与 MHL 无法同时使用; OTG 不支持 U 盘(也是本文要解决的); 恶心的乐 Phone,联想没有公开 kernel 源代码。 上面说的缺点里,最后一条不公开 kernel source 是联想一贯悠久的恶劣传统,也是我最忍受不了的一条。 一番努力搜寻之后,我终于找到了曲线救国的神主:Motorola。对,就是他,虽然摩托似乎从来就没有开放的基因,但被 Google 收购之后,摩托在其推出的 Intel 手机 Moto RAZR i 上终于有良心了一把:公布了 Moto RAZR i 的 kernel source。由于 Moto RAZR i 与联想 K800 同样采用 Intel Medfield 平台,因此我就赌了一把其 kernel source 会有很大程度上的相似性,结果很幸运小成功了。 1、获取源码: 首先在 SourceForge 上抓取 Moto RAZR i 的 kernel source: http://sourceforge.net/projects/razr-i.motorola/files/ 一共 100 多MB,咱先解压,打开 Makefile,确定 kernel version 是 3.0.8 版本。 给联想 K800 root,装 adb 驱动,用 adb shell 连上看,运行 uname -a 查看 K800 手机的 kernel version 是 3.0.8-g37de913,啊哈,除了后缀版本一致。然后尝试读取 /proc/config.gz,无奈联想又是没有把 kernel configuration 给导出,找不到 /proc/config.gz 文件,没办法,只能自己根据当前手机 kernel 判断 K800 当前的 kernel configuration 了。 运行:egrep ‘(vmx|svm)’ /proc/cpuinfo,确定 CPU 支持 Intel VT-x 虚拟化技术,有点小兴奋。 2、准备编译环境: 接着在手机上查看 /proc/version,确定联想 K800 kernel 使用的 gcc 版本为 4.3.3,刚好与 Moto 介绍的一致。然后使用 git clone 从下面的地址得到编译 kernel 的 android x86 toolchain: https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/x86/i686-android-linux-4.4.3/ 需要注意 git 得到的代码中默认已经把 gcc 4.3.3 给移除了,不过运行 git log 可以看到之前的提交日志里是有的,那好办,运行下面命令回滚到最新可用的版本: git checkout 286506f01f8ca64d6eb0e33bafb475a5cf10ff37 终于有了编译 kernel 的正确环境了(不是完整开发环境哈)。 3、编译 kernel: Moto 提供的 kernel source 中有几个适合 Intel Medfield 平台的 config 文件,SourceForge 网站上推荐使用 i386_mfld_moto_defconfig,编译时指定 CROSS_COMPILE,但我实际编译之后的模块加载会 kernel panic。好吧,我来尝试应该是 Intel 原始推荐的 i386_mfld_defconfig 默认配置,无法编译通过,排除原因,发现 i386_mfld_defconfig 中启用的几个选项在 K800 中并没有开启,遂决定去掉,同时去掉了 Moto 特有的加密模块。 修改配置之后,能编译了,但编译到 android USB gadget 代码时又有报错,查看代码,发现 Moto 对 android USB gadget 代码做了特殊改动,好吧,这我暂时不需要修改,根据 Moto 增加的 define 修改 drivers/usb/gadget/android.c,去掉 Moto 特有的改动,尽量使代码默认 Intel 原生(看来联想对 Intel 的代码改动很少,这是个好处,嘿嘿,下面也有悲催的地方),再次开始编译。 这次终于比较顺利了,能编译到链接 kernel image 的地方了,但又有报错,这时就不管了,因为我压根就不指望这个编译出来的 zImage 能直接用在联想 K800 手机上,而且联想也没开放制作其 boot image 的工具和方法,就算 zImage 有了也不知道怎么刷到手机上。 接下来编译 kernel modules,这步比较顺利,我把 CIFS、USB Mass Storage(包括 scsi disk 支持)、usbnet、usb serial converter、tun 等需要的模块都选中,都正确编译出来了。 4、修改调试: 拿到手机上加载 cifs.ko,正常,/proc/filesystems 中已经有了 cifs,但挂载文件系统时发现 dmesg 里有 out of memory 报错,一会就 kernel panic 了。 强制重启手机,这时才发现 cifs.ko 大小有 3MB 多,明显太大,查看 config 发现默认启用了 debug kernel,Moto 的默认配置中未启用,不得不说联想真是够懒的,这个影响性能的东西竟然木有去掉。 本来想禁用 […]
Tag: Compile
Raspberry Pi framebuffer PDF阅读器 - fbpdf
本文同步自(最佳显示效果请点击):https://zohead.com/archives/raspberry-pi-fbpdf/ 最近拷了几个 PDF 电子书到 Raspberry Pi 树莓派小主板系统上,准备小充下电,结果在 Debian Wheezy Raspbian 的 Linux X11 系统下用以前用的 xpdf 软件看 PDF 的不爽:由于 Raspberry Pi 的 CPU 是 ARMv6 700MHz 的,性能一般,而且内存只有 256MB,所以跑 Linux X11 虽然没什么问题,但老感觉看大一点的 PDF 有点拖顿。 后来装了比较小巧的 mupdf 软件(Raspbian 系统的话直接用 apt-get install mupdf 命令就可以安装)之后在 X11 环境下看 PDF 电子书似乎情况好了很多,mupdf 功能很简单,甚至都没有独立的启动方式,直接双击 PDF 文件运行,或者通过命令行方式运行,主界面也没有工具栏之类的多余东西,操作全部键盘来完成,浏览 PDF 的速度也很快,对中文支持也很好。关于 mupdf 的介绍请参考其官网:http://www.mupdf.com/。 后来想到平时用 Raspberry Pi 主要还是用命令行模式,我对 Linux X11 一向比较反感 ^_^,感觉是不是可以直接用 framebuffer 的形式看 PDF,结果还真找到一个 fbpdf 软件。 fbpdf 是基于 mupdf 的代码基础上实现的纯 framebuffer 下的 PDF 阅读器,和 mupdf 的功能基本相当,用这个可以省去 X11 和 GTK+ 等一堆臃肿的玩意,在 framebuffer 上看不仅速度快而且占用内存也小,并且可以充分利用 Raspberry Pi 上 framebuffer 的硬件加速。但不幸的是 Raspberry Pi 的 Raspbian 源中没有 fbpdf 包,看来只能自己编译了。 fbpdf 的 Git 版本库地址(可以直接用 git clone 命令弄下来哦): http://repo.or.cz/w/fbpdf.git 首先到 mupdf 官网下载 mupdf 源代码和 mupdf-thirdparty 第三方程序的源代码: http://www.mupdf.com/download/mupdf-1.1-source.tar.gz http://www.mupdf.com/download/mupdf-thirdparty.zip 需要说明的是我的编译环境是 armhf 的 Raspbian 默认开发环境。编译 mupdf 之前需要先安装 libfreetype6-dev、libjbig2dec0-dev、libjpeg8-dev 等开发软件包。mupdf 编译安装好之后会产生 fitz 库的头文件和静态库文件 libfitz.a,libfitz.a 在编译 fbpdf 时需要用到。 特别需要注意的是 mupdf 和 fbpdf 使用的是修改过的 openjpeg-1.5.0 版本的 openjpeg 库,不能直接使用 Raspbian 系统中的 libopenjpeg2 库,因此需要先编译 mupdf-thirdparty 中的 openjpeg-1.5.0 库,为了防止和 Raspbian 默认的 openjpeg 库冲突,建议将 openjpeg-1.5.0 库安装到自定义的目录(非 /usr/lib、/usr/local/lib 等系统默认使用的目录),然后编译 fbpdf 时直接使用 openjpeg-1.5.0 产生的静态库文件 libopenjpeg.a。 在 Raspberry Pi 编译 fbpdf 时会有一些小报错,需要修改下代码和 Makefile,编译 fbpdf 时由于要使用 libfitz.a 静态库,因此生成的 fbpdf 可执行文件也会比较大(我编译产生的将近 6MB)。 在 Raspbian 系统的默认 framebuffer 文本终端下运行 fbpdf /home/xxx.pdf (/home/xxx.pdf 为 PDF 文件的路径)就可以查看 PDF 文件了,你的 Raspberry Pi 在用 fbpdf 打开 PDF 时很可能会遇到这个错误直接退出:fbpdf: fbval_t doesn’t match fb depth。 简单说明下这个错误的原因: fbpdf 程序中默认使用的 framebuffer 颜色数(BPP)是 32 位的,但 Raspberry Pi 默认的 framebuffer 只使用 16 位颜色(也就是下面的 framebuffer_depth 默认为 16),这样 fbpdf 程序运行时检查 framebuffer 参数发现不匹配就会报上面的错误,我尝试过跳过这项检查可以不报错,但 PDF 文件的显示渲染效果相当差。 解决方法也是必须要有的: 注意:不建议使用此方法,建议直接使用最下面的 16 位 framebuffer 版本。 打开启动分区下的 config.txt 配置文件(路径为:/boot/config.txt),加入下面两行然后重启系统就可以解决: framebuffer_depth=32 framebuffer_ignore_alpha=1 第一行 framebuffer_depth=32 指定 Raspberry Pi 的 framebuffer 使用 32 位颜色,第二行 framebuffer_ignore_alpha=1 是在使用 32 位颜色时才需要指定的,表示忽略 ARGB 颜色中的 alpha 通道。需要说明的是即使 config.txt 配置文件中指定了使用 32 位实际上也只有 20120615 种颜色的哦,不过对使用上没有影响的。 有关 Raspberry Pi 的 config.txt 配置文件的详细说明请参考这里:http://elinux.org/RPi_config.txt。 把上面的配置文件修改好重启之后,下面是用我编译好的 fbpdf 程序查看一个 5MB 的 PDF 电子书的截图,在 Raspberry Pi 这样的微型板上速度是相当之快的: 从截图中可以看到图片和中文都是可以正常显示的哦。 framebuffer 模式下的 fbpdf 也是全部通过键盘操作,不过快捷键和 mupdf 是不同的,将常用的快捷键简单介绍如下(注意是 J、K 等单按键是区分大小写的哦),大多数快捷键都可以在前面加数字指定次数之类的(深得 VI 的精髓啊,哈哈)。具体请参考 fbpdf 代码中的 README 说明文档: 快捷键 操作 Ctrl + F 或 J 下一页(5J 跳至下面第 5 页,6J 类推) Ctrl + B 或 K […]