Android P Auto版本evs_app解析之一:evs_app代码架构和通信机制

最近研究了下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层提供了三个模块:

  1. app:evs应用层,负责初始化操作,监听倒车状态,倒车UI更新等逻辑处理;
  2. manager:evs管理器,负责与HAL层的交互,实现HAL层的一些接口,例如openDisplay(),openCamera()等操作;
  3. sampleDriver:驱动层实现,基于v4l2实现的一个驱动Demo程序,供HAL层调用,Camera操作和display操作核心,涉及到摄像头设备操作和display设备操作。注意:这是Android提供的Demo,具体驱动实现由具体厂商根据硬件去实现;

evs HAL层结构:

  1. default:提供一个模拟倒车测试,显示静态图片模拟倒车;用于测试功能逻辑,不是真实的倒车;
  2. hal文件:提供了hal接口,供驱动层实现;

功能实现:

1、编译运行:

evs_app编译出来的是一个名为evs_app的bin文件,运行在init进程中,所以evs是可以支持2s内快速倒车的。

2、evs_app中的两个线程:

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);
    }
}

2、倒车信号的通信机制:

倒车信号从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

3、倒车视频显示,Android display架构

倒车视频UI的显示,涉及到打开摄像头(打开/dev/video*设备),ioctl操作(读取视频画面Buffer),以及display架构(申请图形缓冲区),openGL EGL,SurfaceFlinger等知识。

这一块太过于复杂,后续等熟悉了再慢慢解析,这一小节未完待续…

4、增加几条evs调试的命令

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

你可能感兴趣的:(android笔记)