1.利用http://www.omappedia.org/wiki/PandaBoard_L27.12.1-P2_Release_Notes#Tool_Chain_for_building_Kernel_and_Drivers
提供的文件系统,再加上自己编译内核,运行总是会出现如下问题:
经过一小会,串口打印提示
omapdss HDMI: hot plug event 0
omapdss HDMI: error sending hot plug event 0 (-2)
omapdss HDMI: pwrchanged => (0,S) = 0
omapdss HDMI: Disable HDMI_PHY_48MHz clock, hdmi_power = 0
omapdss HDMI: Release L3 constraint
紧接着系统重启或者显示蓝屏无信号输出。
2.后在fedora10、fedora15、ubuntu10.04、ubuntu11.10下分别编译了文件系统,出现的问题在
pandaboard--文件系统的建立1、2、3中分别描述过了,现在将部分调试过程分享一下。
注:关于问题:can't find a register in class 'GENERAL_REGS' while reloading 'asm'发生在
/external/bluetooth/bluez/sbc/sbc_primitives_neon.c(330)函数sbc_calc_scalefactors_j_neon中,
几个权威的解释都是说gcc需要升级或者需要升级linux系统进行重新编译,经过我在一下四个系统中的多次尝试,发觉此问题依旧解决不了,最后的做法只好是暂时注释掉此函数中的代码。
///Fedora10:
在此系统下编译出的文件系统,和 http://www.omappedia.org/wiki/PandaBoard_L27.12.1-P2_Release_Notes#Tool_Chain_for_building_Kernel_and_Drivers提供的文件系统现象一样
,出现一分钟后重启。但最终确定,Fedora10是唯一一个不需要借助其它文件系统的库文件,
可以直接进入桌面系统。
/// Fedora15:
在此linux下编译完成后,需要将 http://www.omappedia.org/wiki/PandaBoard_L27.12.1-P2_Release_Notes#Tool_Chain_for_building_Kernel_and_Drivers提供的文件系统中一下几个库文件
进行覆盖,否则,将看不到android图标,也进入不到桌面系统,当然了,文件系统挂载还是可以成功的,
并且不会出现系统重启的现象。
/system/vendor/lib/egl/libEGL_POWER_SGX540_120.so.1.1.17.4403/system/vendor/lib/hw/gralloc.omap4.so.1.1.17.4403
/system/vendor/lib/libglslcompile.so.1.1.17.4403
/system/vendor/lib/libIMGegl.so.1.1.17.4403
/system/vendor/lib/libsrv_init.so.1.1.17.4403
/// ubunt10.04:
在次系统下,文件系统编译完成后,很奇怪的是/system/apps目录下基本所有的apk软件包都没有生成,制作生成的linux文件系统倒是可以挂载成功。
可以通过手动的方法实现apk软件包的编译,操作步骤如下:
编译模块:
修改了android的相关源代码后,在源代码的目录下,执行: . build/envsetup.sh
然后,进入到修改的源代码所属包的目录下,执行:mm
在源代码的目录下,执行: make snod
最后,在系统目录下,执行:emulator ,就可以在模拟器上看到修改后的结果。
android中的一个应用程序可以单独编译,编译后要重新生成system.img
在源码目录下执行
$ . build/envsetup.sh (.后面有空格)
就多出一些命令:
- croot: Changes directory to the top of the tree.
- m: Makes from the top of the tree.
- mm: Builds all of the modules in the current directory.
- mmm: Builds all of the modules in the supplied directories.
- cgrep: Greps on all local C/C++ files.
- jgrep: Greps on all local Java files.
- resgrep: Greps on all local res/*.xml files.
- godir: Go to the directory containing a file.
可以加—help查看用法
我们可以使用mmm来编译指定目录的模块,如编译联系人:
$ mmm packages/apps/Contacts/
编完之后生成两个文件:
out/target/product/generic/data/app/ContactsTests.apk
out/target/product/generic/system/app/Contacts.apk
可以使用
$ make snod
重新生成system.img,再运行模拟器
最后,在系统目录下,执行:emulator ,就可以在模拟器上看到修改后的结果。
、
/// ubuntu11.10:
在此系统下,文件系统编译完后,/system/apps目录下所有apk软件包均生成,但是似乎还是需要将http://www.omappedia.org/wiki/PandaBoard_L27.12.1-P2_Release_Notes#Tool_Chain_for_building_Kernel_and_Drivers提供的文件系统的/system/vendor/lib目录进行覆盖,方可出现android图标,进入桌面系统。
经以上多个系统编译制作文件系统挂载后,凡进入桌面系统的,都出现了如下问题:
串口打印提示
omapdss HDMI: hot plug event 0
omapdss HDMI: error sending hot plug event 0 (-2)
omapdss HDMI: pwrchanged => (0,S) = 0
omapdss HDMI: Disable HDMI_PHY_48MHz clock, hdmi_power = 0
omapdss HDMI: Release L3 constraint
紧接着,显示器不显示。既然编译解决不了问题,只好在源码中搜索问题关键字看看:
在内核源码和文件系统源代码中分别搜索,结果出现在内核源码中。
搜索1: error sending hot plug event
搜索结果:\android-2.6.35\drivers\video\omap2\dss\hdmi.c(617): DSSWARN("error sending hot plug event %d (%d)"
尝试调试:在set_hdmi_hot_plug_status函数中,直接手动将onoff参数强制设置为1,即onoff = 1。
调试结果:
串口打印提示
omapdss HDMI: hot plug event 0
omapdss HDMI: request_suspend_state ...........
omapdss HDMI: pwrchanged => (0,S) = 0
omapdss HDMI: Disable HDMI_PHY_48MHz clock, hdmi_power = 0
omapdss HDMI: Release L3 constraint
屏幕退出,显示蓝屏无信号。
搜索2:request_suspend_state
搜索结果:kernel\power\earlysuspend.c(143): void request_suspend_state(suspend_state_t new_state)
kernel\power\earlysuspend.c(155): pr_info("request_suspend_state: %s (%d->%d) at %lld "
kernel\power\main.c(205): request_suspend_state(state);
kernel\power\power.h(257): void request_suspend_state(suspend_state_t state);
尝试调试:将main.c中state_store函数中的
#ifdef CONFIG_EARLYSUSPEND
if (state == PM_SUSPEND_ON || valid_state(state)) {
error = 0;
request_suspend_state(state);
}
#else
error = enter_state(state);
#endif
修改为
#ifdef CONFIG_EARLYSUSPEND
if (state == PM_SUSPEND_ON || valid_state(state)) {
error = 0;
// request_suspend_state(state);
}
#else
error = 0;
// error = enter_state(state);
#endif
调试结果:文件系统挂载正常,不再出现桌面消失现象。
分析main.c中此段代码,发觉有CONFIG_EARLYSUSPEND可以在makemenuconfig中加以设置或者手动在 .config文件中直接设置为# CONFIG_EARLYSUSPEND is not set即可,同时将前面两个调试修改的源代码恢复为原来的代码,编译,发觉桌面系统显示正常,不再出现suspend的情况。
总结:看来应该是桌面系统进入了挂机(suspend)状态,从而引起了不正常退出。
后续可继续进行的调试:将内核编译中,makemenuconfig中的Power management option中的选项,进行删减调整,看看是否还有其它现象。或者直接在 .config文件中进行修改,看起来各个 CONFIG_ 参数比较明显。
OK.....................
到此,pandaboard板子从x-loader、uboot、kernel和文件系统,通通手动从源代码编译走了一边,该碰到的问题基本都已经碰到了,文件系统的编译真是费时间啊!