新闻  |   论坛  |   博客  |   在线研讨会
骄龙820A汽车 Qualcomm820A车载系统(一)Soc上Car架构解析
车载技术工程师 | 2018-10-18 11:12:09    阅读:6346   发布文章


概要

        大家都知道无人驾驶在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/,这个目录包含了一些汽车服务测试,对于每个属性,测试中都会实现预期的行为。这可以是了解预期行为的良好起点。


*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
车载技术工程师  2018-10-18 11:26:02 

qaq

推荐文章
最近访客