注:文章都是通过阅读 Android && Linux 平台源码、各位前辈总结的资料、加上自己的思考分析总结出来的,其中难免有理不对的地方,欢迎大家批评指正。文章为个人学习、研究、欣赏之用。图文内容、源码整理自互联网,如有侵权,请联系删除(◕‿◕),转载请注明出处( ©Android @Linux @Rockchip版权所有),谢谢(๑乛◡乛๑) 、( ͡° ͜ʖ ͡°)、(ಡωಡ)!!!。
(==文章基于 Kernel-4.4==)&&(==文章基于 Android-8.1==)
【开发板 - Firefly-RK3399 7.85寸1024x768显示屏模组(MIPI接口)】
正是由于前人的分析和总结,帮助我节约了大量的时间和精力,特别感谢!!!
(2)【Ubuntu12.04 编译Android 7.1 mkimage.sh 失败】
==源码(部分)==:
AMS、WMS、SurfaceFlinger Test App(Android Apk Java层)
- I:\RK3399_Android8.1_MIPI\packages\TestViewportRed\
- I:\RK3399_Android8.1_MIPI\packages\TestViewportGreen\
- I:\RK3399_Android8.1_MIPI\packages\TestViewportBlue\
SurfaceFlinger Test App(Android Native层)
- I:\RK3399_Android8.1_MIPI\frameworks\native\services\surfaceflinger\tests\SurfaceFlingerTestsRed\
- I:\RK3399_Android8.1_MIPI\frameworks\native\services\surfaceflinger\tests\SurfaceFlingerTestsGreen\
- I:\RK3399_Android8.1_MIPI\frameworks\native\services\surfaceflinger\tests\SurfaceFlingerTestsBlue\
OpenGLES Test App(Android OpenGLES Native层)
- I:\RK3399_Android8.1_MIPI\frameworks\native\opengl\tests\OpenGLESTexturesRGB\
ModeTest App (Kernel 用户层)
- I:\RK3399_Android8.1_MIPI\external\libdrm\tests\modetest\
前言
Ubuntu12.04 编译Android 8.1 mkimage.sh 失败:
在编译Android8.1过程中, 执行make 完成后, 开始打包img文件时调用:
./mkimage.sh 出现以下错误
in=/work/Android8.1RK3399/out/target/product/rk3399_box/system.img out=/work/Android8.1RK3399/out/target/product/rk3399_box/system.img.out align=1024
Total of 292968 4096-byte output blocks in 4834 input chunks.
Exception:unpack requires a string argument of length 12
Traceback (most recent call last):
File “device/rockchip/common/sparse_tool.py”, line 183, in
main()
File “device/rockchip/common/sparse_tool.py”, line 175, in main
print(“i=%u” % (i))
UnboundLocalError: local variable ‘i’ referenced before assignment
————————————————
解决方案:
1 | book@book-virtual-machine:/work/Android8.1RK3399/device/rockchip/common$ git diff |
(一)、ModeTest App (Kernel 用户层)
(1)、ModeTest App显示图像
1.1、源代码
modetest.c
1 | I:\RK3399_Android8.1_MIPI\external\libdrm\tests\modetest\modetest.c |
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
include $(LOCAL_PATH)/Makefile.sourcesLOCAL_SRC_FILES := $(filter-out %.h,$(MODETEST_FILES))
LOCAL_MODULE := modetest
LOCAL_SHARED_LIBRARIES := libdrm_platform
LOCAL_STATIC_LIBRARIES := libdrm_utilLOCAL_C_INCLUDES := $(LOCAL_PATH)/..
include $(LIBDRM_COMMON_MK)
include $(BUILD_EXECUTABLE)
1.2、modetest使用指南
modetest是libdrm源码自带的调试工具, 可以对drm进行一些基础的调试.
获取:android平台:
mmm external/libdrm/tests
modetest帮助信息:
(shell)# modetest -h
usage: modetest [-cDdefMPpsCvw]
Query options:
-c list connectors
-e list encoders
-f list framebuffers
-p list CRTCs and planes (pipes)
Test options:
-P: x [+ + ][* ][@ ] set a plane
-s[, ][@ ]: [- ][@ ] set a mode
-C test hw cursor
-v test vsynced page flipping
-w: : set property
Generic options:
-d drop master after mode set
-M module use the given driver
-D device use the given device
Default is to dump all info.
使用案例:modetest不带参(有非常多的打印,这边截取部分关键的):
//由于rockchip driver的一些配置未upstream到libdrm上, 所以从libdrm upstream
//下载编译的modetest默认不带rockchip支持, 需要在使用的时候加个-M rockchip.
(shell)# modetest -M rockchip
Encoders:
id crtc type possible crtcs possible clones
71 27 TMDS 0x00000001 0x00000000
73 0 TMDS 0x00000002 0x00000000
Connectors:
id encoder status name size (mm) modes encoders
72 71 connected HDMI-A-1 410x260 19 71
modes:
name refresh (Hz) hdisp hss hse htot vdisp vss vse vtot)
1440x900 60 1440 1520 1672 1904 900 903 909 934 flags: nhsync, pvsync; type: preferred, driver
1280x1024 75 1280 1296 1440 1688 1024 1025 1028 1066 flags: phsync, pvsync; type: driver
[…]
74 0 disconnected DP-1 0x0 0 73
CRTCs:
id fb pos size
27 0 (0,0) (1280x1024)
64 0 (0,0) (0x0)
Planes:
id crtc fb CRTC x,y x,y gamma size possible crtcs
23 0 0 0,0 0,0 0 0x00000001
[…]
如上modetest -M rockchip的信息,我们知道当前系统有两个vop, 有两个输出设备:测试显示输出: 测试显示输出时要把当前系统其他的显示关掉, 因为drm只能允许一个显示输出程序.
android: adb shell stop
1.3、显示输出命令
(shell)# modetest -M rockchip -s 88@61:768x1024 -v
freq: 60.53Hz
屏幕上即可看到闪烁的彩条显示,
如需使用dp输出,将命令中的connector的id换成dp的即可.
如需使用另一个crtc输出, 将命令中的crtc的id换成另一个crtc的id即可
如需使用别的分辨率输出, 将命令中768x1024换成connectors modes里面别的分辨率即可
1.4、显示输出效果图
源代码稍后另外博客再继续分析!
(二)、OpenGLES Test App(Android OpenGLES Native层)
(2)、使用OpenGL ES绘制图像
2.1、源代码
OpenGLESTexturesRGB.cpp
1 | I:\RK3399_Android8.1_MIPI\frameworks\native\opengl\tests\OpenGLESTexturesRGB\OpenGLESTexturesRGB.cpp |
2.2、编译测试
编译会生成OpenGLESTexturesRGB,然后进行测试。
1、连接adb
2、adb push OpenGLESTexturesRGB system/bin
3、进入adb shell
4、cd system/bin/
5、./OpenGLESTexturesRGB
2.3、显示效果
源代码稍后另外博客再继续分析!
2.4、OpenGLESTexturesRGB代码分析
使用OpenGLES的绘图的一般步骤:
1、获取 EGL Display 对象:eglGetDisplay()
2、初始化与 EGLDisplay 之间的连接:eglInitialize()
3、获取 EGLConfig 对象:eglChooseConfig()
4、创建 EGLContext 实例:eglCreateContext()
5、创建 EGLSurface 实例:eglCreateWindowSurface()
6、连接 EGLContext 和 EGLSurface:eglMakeCurrent()
7、使用 OpenGL ES API 绘制图形:Draw()
8、切换 front buffer 和 back buffer 送显:eglSwapBuffer()
9、断开并释放与 EGLSurface 关联的 EGLContext 对象:eglRelease()
10、删除 EGLSurface 对象
11、删除 EGLContext 对象
12、终止与 EGLDisplay 之间的连接
(三)、SurfaceFlinger test App(Android SurfaceFlinger Native层)
(3)、SurfaceFlinger合成图像
3.1、源代码
SurfaceFlingerTestsRed
1 | I:\RK3399_Android8.1_MIPI\frameworks\native\services\surfaceflinger\tests\SurfaceFlingerTestsRed\Transaction_test_red.cpp |
绿色和蓝色的源码类似就不贴出啦,请直接看源码。
3.2、编译测试
编译会SurfaceFlingerTestsRed/Green/Blue生成
SurfaceFlingerTestsRed
SurfaceFlingerTestsGreen
SurfaceFlingerTestsBlue,然后分别进行测试。
1、连接adb
2、adb push SurfaceFlingerTestsRed system/bin
3、进入adb shell
4、cd system/bin/
5、SurfaceFlingerTestsRed
3.3、显示效果
SurfaceFlingerTestsRed
SurfaceFlingerTestsGreen
SurfaceFlingerTestsBlue
同时运行三个bin文件
3.4、SurfaceFlingerTest代码分析
SurfaceFlinger涉及流程复杂,稍后另外博客再继续分析!
(四)、AMS、WMS Test App(Android Apk Java层)
(4)、Apk测试AMS,WMS,SurfaceFlinger
4.1、源代码
**TestActivity.java &&TestView.java **
1 | public class TestActivity extends Activity { |
绿色和蓝色的源码类似就不贴出啦,请直接看源码。
4.2、编译测试
编译会生成TestViewportRed/Green/Blue apk
TestViewportRed.apk
TestViewportGreen.apk
TestViewportBlue.apk,然后分别进行测试。
1、连接adb
2、adb shell am start -n com.android.testred/.TestActivity
3、adb shell am start -n com.android.testgreen/.TestActivity
4、adb shell am start -n com.android.testblue/.TestActivity
4.3、显示效果
TestViewportRed.apk
TestViewportGreen.apk
TestViewportBlue.apk
同时运行三个APK
Android 默认运行Activity是全屏
要实现上述效果,需要修改源码
1 |
|
4.4、去掉SystemUI
假如去掉SystemUI Apk(adb root / adb remount / rm -rf system/priv-app/SystemUI)如下效果
TestViewportRed.apk
TestViewportGreen.apk
TestViewportBlue.apk
同时运行三个APK
4.5、TestViewportX代码分析
APK涉及AMS,WMS,SurfaceFlinger流程复杂,稍后另外博客再继续分析!
(五)、参考资料(特别感谢):
(1)【modetest使用指南】
(2)【Ubuntu12.04 编译Android 7.1 mkimage.sh 失败】