最近研究了下Android Auto版本的evs_app应用,是Android Auto提供的一个倒车功能;
evs_app相关参考:
《Android P Auto版本evs_app解析之一:evs_app代码架构和通信机制》
《Android P Auto版本evs_app解析之二:evs_app启动和运行》
evs app层实现源码位于:packages\services\Car\evs\
|——– Android.mk
|——– app
|——– manager
|——– sampleDriver
|——– sepolicy
evs HAL层实现源码位于:hardware\interfaces\automotive\evs\1.0\
|——– default
|——– vts
|——– IEvsCamera.hal
|——– IEvsCameraStream.hal
|——– IEvsDisplay.hal
|——– IEvsEnumerator.hal
|——– types.hal
evs app层提供了三个模块:
evs HAL层结构:
evs_app编译出来的是一个名为evs_app的bin文件,运行在init进程中,所以evs是可以支持2s内快速倒车的。
evs_app启动初始化时,会创建两个线程:
第一个位于:packages\services\Car\evs\app\EvsStateControl.cpp
// updateLoop() ,主要任务是更新倒车UI显示
bool EvsStateControl::startUpdateLoop() {
//Create the thread and report success if it gets started
mRenderThread = std::thread([this](){ updateLoop(); });
return mRenderThread.joinable();
}
第二个位于:packages\services\Car\evs\app\EvsVehicleListener.h
// 主要任务是监听倒车信号,并且通知给EvsStateControl,进行更新倒车UI
void run(EvsStateControl *pStateController) {
while (true) {
// Wait until we have an event to which to react
// (wake up and validate our current state "just in case" every so often)
waitForEvents(5000);
// If we were delivered an event (or it's been a while) update as necessary
EvsStateControl::Command cmd = {
.operation = EvsStateControl::Op::CHECK_VEHICLE_STATE,
.arg1 = 0,
.arg2 = 0,
};
pStateController->postCommand(cmd);
}
}
倒车信号从CAN发出,到安卓linux driver层中,在发到init进程(user space)HAL层,在发送给evs_app层,这里面涉及到几个通信。其中从kernel 内核发送到init进程中的evs_app,用的是netlink socket通信,evs_app使用监听回调得到倒车信号。
相关代码:
//HAL层,用户态netlink socket接收消息,底层kernel 内核netlinksocket发送倒车消息由供应商实现
//HAL层实现了HIDL的接口
hardware\interface\automotive\vehicle\2.0\default\impl\vhal_v2_0\SocketComm.cpp
//HIDL接口层,提供onPropertyEvent等回调函数结构,供evs_app层跟HAL层交互
hardware\interface\automotive\vehicle\2.0\IVehicle.hal
hardware\interface\automotive\vehicle\2.0\IVehicleCallback.hal
//evs_app层,实现onPropertyEvent等回调函数
//evs_app层实现了HIDL的接口
packages\services\Car\evs\app\EvsVehicleListener.h
倒车视频UI的显示,涉及到打开摄像头(打开/dev/video*设备),ioctl操作(读取视频画面Buffer),以及display架构(申请图形缓冲区),openGL EGL,SurfaceFlinger等知识。
这一块太过于复杂,后续等熟悉了再慢慢解析,这一小节未完待续…
evs_app是可执行文件,生成在system/bin
通过 start evs_app和stop evs_app启动和关闭。
以下命令为模拟事件消息进入倒车或者控制摄像头切换
echo 2 > sys/devices/platform/vehicle-dummy/gear
echo 1/2/4(parking/reverse/drive) > /sys/devices/platform/vehicle-dummy/gear
echo 1 > /sys/devices/platform/vehicle-dummy/gear
echo 2 > /sys/devices/platform/vehicle-dummy/gear
echo 4 > /sys/devices/platform/vehicle-dummy/gear
/* echo 0/1/2(none/left/right) > /sys/devices/platform/vehicle-dummy/turn*/
echo 0 > /sys/devices/platform/vehicle-dummy/turn
echo 1 > /sys/devices/platform/vehicle-dummy/turn
echo 2 > /sys/devices/platform/vehicle-dummy/turn
参考资料:
https://source.android.com/devices/automotive/camera-hal