Xilinx社区
首页 > 技术专栏 > 骁龙820A车载系统(1)--820A上Car架构简介
骁龙820A车载系统(1)--820A上Car架构简介
来源:技术专家 时间:2017-08-01

  大家都知道无人驾驶在Google、特斯拉等公司的推动下发展得如火如荼,但大家对实现无人驾驶所必需很多关键技术却并不了解。到2050年,世界70%的人口都将生活在城市中,交通和交通工具的创新发展将会是翻天覆地,汽车将会逐步的从简单自动泊车到完全无人驾驶的彻底革新。而对于汽车操作系统之争更加是核心中的核心,为此Google的Android Auto计划适时推出汽车专用Android N操作系统必将是一个划时代的作品。

  与此同时,Qualcomm和Google的战略合作从手机系统扩展到了汽车领域,已经开始推行多项汽车解决方案,骁龙820A车载原型系统无疑是其中最耀眼的明星。820A将是为Android N量身定制的高集成度的处理器芯片, 820A系统以汽车为中心应用,将直接于汽车主机执行,能让车厂开发除了提供常见的多媒体、导航与讯息功能之外,也可控制汽车空调、AM/FM收音机、连结性以及其他功能的车用资通讯娱乐系统(In-Vehicle Infotainment,IVI)。将使汽车发挥更加强大的功能,让我们新一代的汽车拥有一颗强大的”芯”而变得更加安全高效。

  车载系统N.Car框架

  骁龙820A采用的系统平台是Android,由于许多汽车子系统通过各种总线拓扑互相互连和车载信息娱乐(IVI)系统。确切的总线类型和协议在制造商之间有很大差异;示例包括控制器局域网(CAN)总线,本地互连网络(LIN)总线,面向媒体的系统传输(MOST)以及诸如BroadR-Reach的汽车级以太网和TCP / IP网络。Android为了适配车载系统,开发了完整的一套有关汽车控制的流程来控制整体运行。

  如上图所示,通过标准化car api,使得不同厂商的应用都可以稳定的运行在Android系统上。

  高度抽象的应用接口Car API

  API 是一些预先定义的函数,目的是提供应用程序与开发人员访问某种例程的能力,Car API 包括CarHvacManager, CarSensorManager, 和CarCameraManager。

  HVAC是热系统相关控制包括,热系统(heating), 通风系统(ventilation) 和空调(air conditioning) 等相关功能。例如除霜,驱动轮温度的控制检测等等。

  public @interface HvacPropertyId {

  int MIRROR_DEFROSTER_ON = 0x0001;

  int STEERING_WHEEL_TEMP = 0x0002;

  Sensor是各种传感器功能,如门窗、座椅,刹车等。例如车速传感器,转速(RPM),里程(ODOMETER),燃油计(FUEL_LEVEL),制动(PARKING_BRAKE)等等。

  public class CarSensorManager implements CarManagerBase {

  public static final int SENSOR_TYPE_CAR_SPEED = 2;

  public static final int SENSOR_TYPE_RPM = 3;

  public static final int SENSOR_TYPE_ODOMETER = 4;

  Camera是车载Camera的打开、关闭功能。着项功能其实是例如360全景监控车况、倒车影像,甚至路况信息采集的基础。即通常所说的计算视觉,有了这些camera视频数据,那么车载820A的强大功能就可以处理分析这些视频数据,识别出道路上的行人、车辆、交通指示牌等等,从而使得汽车具备一定的智能。

  具体的实现方法位于 /platform/packages/services/Car/car-lib。

  Car api 提供给车载开发人员各种接口,方便车载系统搭在各种应用。

  例如:抽象的汽车座椅的属性,驾驶员和乘客,将会对每个座椅状态进行监控。

  public class VehicleSeat {

  public static final int SEAT_DRIVER_LHD = 0x0001;

  public static final int SEAT_DRIVER_RHD = 0x0002;

  public static final int SEAT_ROW_1_PASSENGER_LEFT = 0x0010;

  public static final int SEAT_ROW_1_PASSENGER_CENTER = 0x0020;

  public static final int SEAT_ROW_1_PASSENGER_RIGHT = 0x0040;

  public static final int SEAT_ROW_2_PASSENGER_LEFT = 0x0100;

  public static final int SEAT_ROW_2_PASSENGER_CENTER = 0x0200;

  public static final int SEAT_ROW_2_PASSENGER_RIGHT = 0x0400;

  public static final int SEAT_ROW_3_PASSENGER_LEFT = 0x1000;

  public static final int SEAT_ROW_3_PASSENGER_CENTER = 0x2000;

  public static final int SEAT_ROW_3_PASSENGER_RIGHT = 0x4000;

  }

  车窗的状态监控。

  public class VehicleWindow {

  public static final int WINDOW_FRONT_WINDSHIELD = 0x0001;

  public static final int WINDOW_REAR_WINDSHIELD = 0x0002;

  public static final int WINDOW_ROOF_TOP = 0x0004;

  public static final int WINDOW_ROW_1_LEFT = 0x0010;

  public static final int WINDOW_ROW_1_RIGHT = 0x0020;

  public static final int WINDOW_ROW_2_LEFT = 0x0100;

  public static final int WINDOW_ROW_2_RIGHT = 0x0200;

  public static final int WINDOW_ROW_3_LEFT = 0x1000;

  public static final int WINDOW_ROW_3_RIGHT = 0x2000;

  }

  不同汽车区域的监控,针对不同区域有不同的权限。

  public class VehicleZone {

  public static final int ZONE_ROW_1_LEFT = 0x00000001;

  public static final int ZONE_ROW_1_CENTER = 0x00000002;

  public static final int ZONE_ROW_1_RIGHT = 0x00000004;

  public static final int ZONE_ROW_1_ALL = 0x00000008;

  public static final int ZONE_ROW_2_LEFT = 0x00000010;

  public static final int ZONE_ROW_2_CENTER = 0x00000020;

  public static final int ZONE_ROW_2_RIGHT = 0x00000040;

  public static final int ZONE_ROW_2_ALL = 0x00000080;

  public static final int ZONE_ROW_3_LEFT = 0x00000100;

  public static final int ZONE_ROW_3_CENTER = 0x00000200;

  public static final int ZONE_ROW_3_RIGHT = 0x00000400;

  public static final int ZONE_ROW_3_ALL = 0x00000800;

  public static final int ZONE_ROW_4_LEFT = 0x00001000;

  public static final int ZONE_ROW_4_CENTER = 0x00002000;

  public static final int ZONE_ROW_4_RIGHT = 0x00004000;

  public static final int ZONE_ROW_4_ALL = 0x00008000;

  public static final int ZONE_ALL = 0x80000000;

  }

  由于接口过多,就不一一列出了。

  CarService核心组件

  CarService位于/platfrom/packages/services/Car,具体可以分为一下几个功能:

  所有服务最终通过VehicleNetworkService访问HAL层

  Vehicel hal 控制内置安全,只有系统组建可以使用,其他的组建类似于第三方应用只能通过car api访问。Oems通过/system/etc/vns/目录下的vns_policy.xml 和vendor_vns_policy.xml来控制对时间、燃油计、里程计、车速等的访问控制,具体的实现方式在/platform/packages/services/Car/ libvehiclenetwork/目录中。和传统的Android设计一样,通过client/server机制实现的。

  汽车硬件抽象层HAL Vehicle

  Android汽车硬件抽象层(HAL)为Android框架提供了一致的界面,无论物理传输层如何。该车HAL是开发Android Automotive实现的界面。

  系统集成商可以通过将特定于功能的平台HAL接口(例如HVAC)与特定于技术的网络接口(例如CAN总线)连接来实现车辆HAL模块。典型的实现可以包括运行用于CAN总线访问或类似的专用实时操作系统(RTOS)的专用微控制器单元(MCU),其可以经由串行链路连接到运行Android Automotive的CPU。代替专用MCU,也可以将总线访问实现为虚拟化CPU。

  Vehicle HAL中定义车辆属性的接口,包含元数据(例如车辆是否可以是int型,或者模式是否可以切换等等)。这写东西的定义位于hardware/libhardware /include/hardware/vehicle.h,然后具体实现是在hardware/libhardware/ modules/vehicle/。和所有Android上HAL一样,只有调用open()成功后,client才可以使用hw_device_t 运行其他的Vehicle HAL设备的功能.

  static struct hw_module_methods_t hal_module_methods = {

  .open = vdev_open,

  };

  vehicle_module_t HAL_MODULE_INFO_SYM = {

  .common = {

  .tag = HARDWARE_MODULE_TAG,

  .module_api_version = VEHICLE_MODULE_API_VERSION_1_0,

  .hal_api_version = HARDWARE_HAL_API_VERSION,

  .id = VEHICLE_HARDWARE_MODULE_ID,

  .name = "Default vehicle HW HAL",

  .author = "",

  .methods = &hal_module_methods,

  },

  };

  static int vdev_open(const hw_module_t* module, const char* name UNUSED,

  hw_device_t** device) {

  ALOGD("vdev_open");

  // Oops, out of memory!

  vehicle_device_impl_t* vdev = calloc(1, sizeof(vehicle_device_impl_t));

  if (vdev == NULL) {

  return -ENOMEM;

  }

  // Common functions provided by harware.h

  vdev->vehicle_device.common.tag = HARDWARE_DEVICE_TAG;

  vdev->vehicle_device.common.version = VEHICLE_DEVICE_API_VERSION_1_0;

  vdev->vehicle_device.common.module = (hw_module_t *) module;

  vdev->vehicle_device.common.close = vdev_close;

  // Define the Vehicle HAL device specific functions.

  vdev->vehicle_device.list_properties = vdev_list_properties;

  vdev->vehicle_device.init = vdev_init;

  vdev->vehicle_device.release = vdev_release;

  vdev->vehicle_device.get = vdev_get;

  vdev->vehicle_device.release_memory_from_get = vdev_release_memory_from_get;

  vdev->vehicle_device.set = vdev_set;

  vdev->vehicle_device.subscribe = vdev_subscribe;

  vdev->vehicle_device.unsubscribe = vdev_unsubscribe;

  vdev->vehicle_device.dump = vdev_dump;

  *device = (hw_device_t *) vdev;

  return 0;

  }

  安全Security

  安全分为三个等级,第一个等级是system only,通过vns_policy.xml控制。第二个等级是通过app控制权限,具体实现机制在car services中,第三个等级是不需要权限,同样,实现机制也是在car services中。

  测试工具

  对于开发调试,特别是早期测试,必要的工具可以大大提高效率。

  hardware/libhardware/tests/vehicle/vehicle—hal—tool.c这个工具可以验证系统是否起来,它也可以运行一些早期的程序。

  packages/services/Car/tests/carservice_test/,这个目录包含了一些汽车服务测试,对于每个属性,测试中都会实现预期的行为。这可以是了解预期行为的良好起点。

  本片小编总结的一些骁龙820A车载系统的代码分布情况,希望在大家阅读学习的时候有帮助。具体的细节体现在该系列的后续篇章中。

  Qualcomm汽车技术讨论组 QQ群号:566131670

more汽车电子市场动态
more技术专栏
more专家答疑
问:配置高通pmd9607的mpp管脚, 设置为模拟输入一直量不到电压,请教。
答:需要注意,MPP管脚并不是所有MPP管脚都可以配置的,请参考spec说明,你需要配置的pin有没有限制。通常模拟输入的话,还要配置ANA_IN_CTL等寄存器,需要外接模拟量,然后读取该pin的值的寄存器中HKADC值。
问:专家请指导: sensor厂家给的sensor相关资料(chromatix + lib)是支持前置摄像头的,“支持”主要是我这边验证过前置已经点亮。 后置摄像也用同sensor, 但用这套相关资料就点不亮了。 kernel层确认已经PROBE, 同时在/dev下有media0 media1,请协助该如何完成后置的点亮. p.s: 1. 该板后置如果使用其他sensor,可以点亮前后置摄像头; 2. 将后置摄像头拆卸, 可点亮前置, 不拆卸后置,同样可以点亮前置; 3. 如果前置后置一样, 前后置都点不亮, 但kernel层确认都probe, dev下有camera0,camera1,camera2; 4. 拆卸前置,仅后置, 依然无法点亮, kernel已经probe,dev下有camera0,camera1 针对前后置同sensor, 在sensor_init.c增加2sensor, 分别命名为: sensor, sensor_rear,同时在sensor_Libs目录下增加sensor,sensor_rear目录,主要是针对lib部分, 同时对lib中camera_id和position做对应修改(前:CAMERA_1,1,后: CAMERA_0,0) 写的太多, 一句话说明下问题: 前后置同sensor如何同时点亮前后置sensor, 是否需要修改lib中的参数,如何修改?还是其他问题?
答:从现象描述看,可以从以下几点排查。 1,sensor的配置,通常后置sensor 4lanes,而前置sensor 2lanes。换不同型号的sensor可以点亮,说明这些配置可能没有修改 导致一些问题。 2,重点看下,“拆卸前置,仅后置, 依然无法点亮,dev下有camera0,camera1,”,对比下前后置不同型号 枚举dev也是这样,看看HAL层dumpimage检查图像是否正常。 3,camera id枚举冲突,无法区分两颗相同的sensor,tuning参数调用是否正确。
问:请教专家,UE 链路层怎么样才能主动和NODE B断开。 设备和基站没有OTA log,也不太清楚是什么原因导致的连接断开。
答:可以通过AT命令CREG可以离线和在线网络。不知道是否是您需要的情况。 http://blog.chinaunix.net/uid-149881-id-2780145.html
问:有没有懂高通平台root 和解网络锁的高手?
答:eng和userdebug版本上通过adb root。你是否需要如下的方法么, https://zhidao.baidu.com/question/557640730.html
Copyright ©2000-2015 ELECTRONIC ENGINEERING & PRODUCT WORLD. All rights reserved.
京ICP备12027778号-2 北京市公安局备案:1101082052