ShenduOS Recovery编译调试教程

本教程同步更新在 http://blog.csdn.net/airk000
转载请注明出处 http://blog.csdn.net/airk000/article/details/8916797

*本教程假设你已经拥有一个Android编译环境及ShenduOS最新代码

1.为新机器制作Recovery


你需要准备:recovery.img(或boot.img)
如果你准备的是boot.img,那么你还需要官方的recovery.fstab,这个文件会在recovery.img中,通过解包,会在etc/下发现这个文件。这个文件至关重要,如果不对,可能导致机器变砖。所以,如果条件允许,最好还是准备一个已经能够正常使用的recovery.img,官方的recovery.img也可,这样更安全些。当然,也可以准备boot.img,而自己通过cat内核设备来计算出一个recovery.fstab,不过~~~何必呢?

进入ShenduOS源码目录,执行
make otatools -jX
X为编译线程数。

在编译完成后,对将out/host/linux-x86/bin加入系统环境变量:
echo "export PATH=$PATH:/XXX/out/host/linux-x86/bin/" >> ~/.bashrc
source ~/.bashrc
其中XXX为源码目录路径。

在源码目录下,执行:
./build/tools/device/mkvendor.sh <MENUFACTURE> <MODEL> <image>
MENUFACTURE 为厂商名字,如HTC Samsung Huawei ZTE, etc.
MODEL 为产品代号,如saga(HTC Desire S), i9100, n909, etc.
image 为你所准备的img文件路径

成功执行以上命令后,系统会自动为你的设备生成device code,这个时候如果你准备的是boot.img,那么必须要注意的是:需要替换或修改recovery.fstab,这个文件就在新生成的这个device code下边,如device/htc/saga/,这一步非常的重要,因为系统提供的默认recovery.fstab很有可能导致你的机器变砖。当然,如果你准备的是recovery.img,那么这个文件就没有必要替换了,他已经是正确的,这就是用recovery做recovery的优势所在。

2.为ShenduOS已经支持的机型制作Recovery

虽然可能这个意义不大,但是相信也会有不少人来尝试的,直接执行:
./build/envsetup.sh
breakfast xxx
xxx 为ShenduOS已经支持的机型代号,如c8812,saga,etc.

3.开始制作Recovery


有两种制作方式:
make recoveryzip
make recoveryimage
make recoveryzip,一般用来调试,这个操作会直接生成在recovery下可以直接刷入的update.zip,刷了他不会覆盖原有recovery,只是看看样子而已,所以调试经常用这个。与adb sideload配合调试效率高。
make recoveryimage, 用来生成recovery.img,一般都是在调试好了之后确认无误了,就来生成他,生成后,可以使用installrecovery命令进行recovery的安装操作(这个命令要在. build/envsetup.sh之后方可使用)

4.调试Recovery


这个将是本教程重点讲述的部分,编译Recovery人人都能,只要给予一定的引导,都能在短时间内轻松搞定(编译系统也一样),麻烦而有重要的事情在后续的调试上。下面将叙述几个ShenduOS Recovery的调试要点,方便大家开发与参与。

1)颜色模式
通常情况下,一个新机器编译出recovery后颜色模式大多都是不对的,因为现在的机器很多都是8888模式,而recovery下的模式是默认565的,所以最终导致的现象就是颜色不对(蓝黄对调),按键时候会发生屏幕偏移抖动。
参数的改变在recovery/minui/Android.mk中:
ifeq ($(TARGET_RECOVERY_PIXEL_FORMAT),"RGBX_8888")
  LOCAL_CFLAGS += -DRECOVERY_RGBX
endif
ifeq ($(TARGET_RECOVERY_PIXEL_FORMAT),"BGRA_8888")
  LOCAL_CFLAGS += -DRECOVERY_BGRA
endif
TARGET_RECOVERY_PIXEL_FORMAT 是需要写在device code下的BoardConfig.mk中的,可以分别尝试TARGET_RECOVERY_PIXEL_FORMAT := "RGBX_8888" 或 "BGRA_8888"重新编译检测是否能够修正,一般情况下都可以轻松修正,如果不能,那么就需要分析graphics.c中的代码流程了。实话说,这个文件,在1.3版本中还是有隐患的,不敢保证所有机器都能够正常使用。

2)上下按键生效,电源键不生效
在BoardConfig.mk中让BOARD_HAS_NO_SELECT_BUTTON := true就可以了。

3)自定义字体大小
在BoardConfig.mk中BOARD_USE_CUSTOM_RECOVERY_FONT := \"xxx\", 这里的xxx就是在minui下边的字体文件,以font开头,.h结尾的。

4)支持虚拟按键触摸
自ShenduOS Recovery1.2版本之后,添加了支持虚拟按键触摸的功能。为了兼容问题,在代码中做了限制。如果想要使用触摸功能,要进行一定的修改与调试。

首先,要看recovery/Android.mk中:
ifeq ($(BOARD_TOUCH_VIRTUAL_KEY_RECOVERY),true)
    LOCAL_CFLAGS += -DUSE_VIRTUAL_KEY
ifeq ($(TARGET_SCREEN_WIDTH),720)
    LOCAL_CFLAGS += -DVIRTUAL_KEY_720
endif
ifeq ($(TARGET_SCREEN_WIDTH),1080)
    LOCAL_CFLAGS += -DVIRTUAL_KEY_1080
endif
ifeq ($(TARGET_BOOTLOADER_BOARD_NAME),mako)
    LOCAL_CFLAGS += -DMAKO -DVIRTUAL_KEY_720
endif
endif
大前提是BOARD_TOUCH_VIRTUAL_KEY_RECOVERY,只有这个生效了,触摸才开始。
BOARD_TOUCH_VIRTUAL_KEY_RECOVERY 是决定是否使用虚拟按键触摸;
TARGET_SCREEN_WIDTH 是屏幕宽度,720P的就写TARGET_SCREEN_WIDTH := 720,如果是480的就不用写,因为480是默认值。
以上两个都是要写到BoardConfig.mk中的。

当然也可以向mako(Nexus 4)这样定义:
当设备名是mako的时候,定义一个MAKO标志,而且使用720P的虚拟按键。MAKO标志会在后边用到。

5)调试触摸事件
市面上太多机器的触摸接口标准不一,适合华为的接口不一定适合三星,适合三星的又不一定能够用到HTC上,所以这也是触摸Recovery的难处。我已经在代码上把目前能够想到的调试不同机器需要修改的接口都留了出来,方便大家调试修改。
这部分修改主要集中在recovery/ui.c中,先来看一个接口:
#ifdef USE_VIRTUAL_KEY
//#ifdef COMMON_TOUCH_DRIVER
   int touch_type = EV_ABS;
   int touch_code = ABS_MT_TOUCH_MAJOR;     //48
   int touch_pos_x = ABS_MT_POSITION_X;     //53
   int touch_pos_y = ABS_MT_POSITION_Y;     //54
   int lv = 0;  //left value
//#endif
touch_type 为触摸事件的类型值,linux标准为EV_ABS(3), 所以这里也作为默认,很多设备这个都是通用的。EV_KEY EV_REL分别代表按键和轨迹轮。
touch_code 为触摸事件发生的标志值(说法不标准),就是说触摸事件发生的时候,这个值一定会有,通常代表的是触摸面积,>0说明有触摸,<=0说明触摸时间完成。
touch_pos_x 为触摸事件中的x坐标
touch_pos_y 为触摸事件中的y坐标
lv 不是包包……是left value,也就是触摸时间结束的时候,code = touch_code的时候由驱动上报上来的值是什么,一般是0,但是比如nexus 4就是-1,所以也留做了接口。

PS:调试触摸的时候,通常要打开TOUCH_DEBUG来在界面上直观的显示按键信息。

如果你的机器驱动上报标准与这个一样,那么很可能你的Recovery一下子就成功了,但是往往事情不是这么顺利的,有两点是经常遇到的问题:

a.触摸类型等值与标准不一
b.坐标不符
下边的代码(ui.c中),很好的解决了这两个问题:
#ifdef MAKO
    touch_code = 57;
    lv = -1;
    if (ev.type == touch_type) {
        if (ev.code == touch_pos_x)
            ev.value = ev.value * 768 / 1536;
        else if (ev.code == touch_pos_y)
            ev.value = ev.value * 1280 / 2560;
    }
#endif

首先说a问题,mako调试的时候发现触摸事件的开始与停止通过57而非48才能很好的区分开来,这样就将touch_type定义为57,来替换标准接口中的48。
而同时,又发现,在调试过程中,每次手指离开屏幕都回上报code = 57, value = -1, 而不是value = 0,所以又将接口中的lv 定义为了-1, 这样recovery就能够正常识别触摸事件的开始与结束。

然后,问题b,一般来说,(0.0)坐标在屏幕左上角,但是有极个别厂家记性可能玩非主流在其他的地方,所以调试的时候通常会先找出0点坐标在哪,是否左上角,之后找出最大坐标。
也许你的机器分辨率是768*1280,但是最大坐标是(1536,2560),别奇怪,这有可能,具体怎么导致的就不深究了,直接分析mako的解决办法:
对触摸事件中x y坐标的上报信息进行截取转换操作,使之匹配成正常的坐标。这个公式也非常的简单易懂,需要注意的是,他们都是整型数据做的除法操作,没有余数。

以上就是ShenduOS Recovery1.2版本以上编译教程,包括了常见的调试要点,希望大家注意,同时也希望大家能够积极参与ShenduOS的一切在开发项目!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值