AC8015 Hypervisor 系统分为HSM,Safety,Xen Hypervisor,VM0(Linux),VM1(Android),以及Trustzone。其中HSM和Safety运行在其SRAM上,其他OS运行在DRAM上。
- autochips主要会修改到的目录如下:
- device:修改device相关配置
- frameworks:定制化Android服务
- kernel-4.9:添加autochips驱动
- packages:修改部分packages
- system:优化启动
- vendor:添加非ASOP代码
-
- device:
- device/autochips/$(project), e.g. ac8x,平台相关通用客制化的配置
- device/autochips/$(device), e.g. ac8x_car,设备相关客制化的配置
- device/autochips/common, 针对所有平台的通用配置
-
- kernel-4.9:
- kernel-4.9/drivers/soc/autochips:Autochips私有drivers
- kernel-4.9/arch/{arm,arm64}/configs:编译config配置
- kernel-4.9/arch/{arm,arm64}/boot:dts配置
-
- vendor:
- vendor/autochips/proprietary/external:Autochips开发的native程序
- vendor/autochips/proprietary/frameworks:Autochips对AOSP frameworks 代码的扩展
- vendor/autochips/proprietary/hardware:Autochips开发的HAL程序
- vendor/autochips/proprietary/packages:Autochips开发的应用
- vendor/autochips/proprietary/system:Autochips对AOSP system 代码的扩展
- kernel-4.9/Android.mk
- ifeq ($(TARGET_BUILD_VARIANT), eng)
- KERNEL_DEFCONFIG ?= $(PRODUCT_MODEL)_eng_defconfig
- else ifeq ($(TARGET_BUILD_VARIANT), userdebug)
- KERNEL_DEFCONFIG ?= $(PRODUCT_MODEL)_defconfig
- else
- KERNEL_DEFCONFIG ?= $(PRODUCT_MODEL)_user_defconfig
- device/autochips/ac8x_car/full_ac8x_car_hypv.mk:32:PRODUCT_MODEL := ac8x_car_hypv
- device/autochips/ac8x_car/full_ac8x_car_hypv_D1.mk:32:PRODUCT_MODEL := ac8x_car_hypv_D1
- device/autochips/ac8x_car/full_ac8x_car.mk:28:PRODUCT_MODEL := ac8x_car
- device/autochips/ac8x_demo/full_ac8x_demo.mk:28:PRODUCT_MODEL := ac8x_demo
- 通过lunch选择之后,会具体包含full_ac8x_car_hypv.mk
- 或者full_ac8x_car_hypv_D1.mk
- 或者full_ac8x_car.mk
- 或者full_ac8x_demo.mk
- 目前使用的是./allmake.sh -p ac8x_car命令编译的源码
- 所以PRODUCT_MODEL := ac8x_car
- 分析allmake.sh可知,此种情况下使用的是默认模式userdebug。
- 综上所述:kernel使用的配置文件是ac8x_car_defconfig
1.系统上电,执行Boot Rom开始执行,检测eMMC/NAND device并做基本初始化,然后从device上读取HSM(preLoader)到internal SRAM,然后跳转到HSM执行。
2.HSM(preLoader)加载VISS,然后等待VISS初始化dram,然后加载trusty,LK到dram并跳转执行。
3.LK阶段初始化一些环境,最后跳转到kernel并执行。
4.kernel启动后将会做很多初始化,在配置完基本的平台环境以后,kernel将会挂载根文件系统并且运行第一个用户空间的程序“init”。
5.init程序会加载init.rc文件来启动Android Java世界程序。
【注】VISS其实是在独立cpu上跑rtos,rtos的应用程序main()函数中初始化dram后再启动主CPU,再加载LK到dram。
【注】系统启动时在HSMLoader中确定从哪个slot中启动,并且这个slot时Normal boot的。和uboot对比:VISS对应uboot的第一阶段,但是VISS跑的是rtos系统;LK对应uboot的第二阶段;HSM其实是可以固化在Boot Rom中的,不理解为什么要通过从设备读取HSM镜像的方式来运行。===》这也就能理解为什么HSM提供了镜像,但是没有提供源码。
- vendor/autochips/proprietary/tinysys/viss/os
- 链接脚本指定入口函数为Start:os/build/ac8015_android.lds
- ==>在main/start.S中定义Start函数,最终跳转到main()函数
- ==>main/main.c总定义main函数,调用freertos接口的应用程序,获取logo/倒车图片/DRAM初始化等等,其中调用了startAp(0x08100000)-->猜测0x08100000是LK的地址,
- ==>startAp是一个宏定义(include/power_util.h),指向start_ap()函数
- ==>start_ap()函数定义在drivers/power_util.c中
- vendor/autochips/proprietary/bootable/lk
- LK 代码结构:
- app 应用相关
- arch arm 体系
- dev 设备相关
- include 头文件
- kernel lk系统相关
- platform 相关驱动
- projiect makefile文件
- scripts Jtag 脚本
- target 具体板子相关
-
- LK流程分析:
- lk/arch/arm/ssystem-onesegment.ld 连接文件中 ENTRY(_start)指定 LK 从_start 函数开始,_start 在 lk/arch/start.S 。
- start.S主要做一些基本的CPU的初始化再通过 bl lk_main ;跳转到 C代码中。
- lk/top/main.c中有lk_main()函数的定义
-
- lk_main() //lk/top/main.c
- apps_init(); //lk/app/app.c
- app->init(app); //调用到lk/app/atc_boot/boot_kernel.c中的boot_kernel_init
- start_app(app); //调用到lk/app/atc_boot/boot_kernel.c中的boot_linux_from_emmc
- theKernel (FDT_LOAD_ADDR_PHYS, 0, 0); //启动kernel
-
- apps_start和apps_end都是在lk/app/app.ld文件中指定的,表示".apps"段
- 代码中通过APP_START宏向".apps"段添加代码
-
- APP_START宏定义如下:
- #define APP_START(appname) const struct app_descriptor _app_##appname __ALIGNED(sizeof(void *)) __SECTION(".apps") = { .name = #appname,
- #define APP_END };
- 例如:(lk/app/atc_boot/boot_kernel.c)
- APP_START(atc_boot)
- .init = boot_kernel_init,
- .entry = boot_linux_from_emmc,
- APP_END
- VISS Vehicle Interface Sub System 类似之前的ARM2系统,用于提供显示和快速倒车的独立CPU
- HSM Hardware Security Module Preloader功能
- LK Little Kernel 作为Android系统的boot loader
- eMMC Embedded Multi Media Card 手机等嵌入式设备上常用的内嵌式存储器
- LCM Liquid Crystal Module 液晶显示模组
- MIPI Mobile Industry Processor Interface 移动产业处理器接口
- DSI Display Serial Interface 显示串行接口,MIPI的一种接口类型
- LVDS Low-Voltage Differential Signaling 低压差分信号,一种信号传输模式
- ATF Arm Trusted Firmware ARM可信环境框架
- AP Application Processor 应用处理器,用于提供系统功能的CPU
- PE Processing Element
- VHL Vehicle Hardware Abstraction Layer Android Automotive中的HAL层实现
- PM Power Management 电源管理
- MCU Micro programmed Control Unit 用于自动化测试的,或车载控制的外部单片机模块
- NCM Network Control Module
- MFI Made For IOS
- iAP2 iPod Accessory Protocol version 2
- BT Bluetooth 蓝牙
- BRFCOMM 串口仿真协议
- AIDL Android Interface Definition Language
- HIDL Hardware Interface Definition Language
- OEM Original Equipment Manufacturer
- ATC Autochips 杰发科技公司名称
- GAP Generic Access Profile 通用访问协议
- SDP Service Discovery Protocol 服务发现协议
- SPP Serial Port Profile 串口协议
- HFP Hand Free Profile 免提协议
- PBAP Phone Book Access Profile 电话本访问协议
- A2DP Advanced Audio Distribution Profile 音频传输协议
- AVRCP Audio/Video Remote Control Profile 音频/视频远程控制协议
- AAC Advanced Audio Coding 一种音频编码方式
- OPP Object Push Profile 标文件传输协议
- PAN Personal Area Networking Profile 蓝牙热点协议
- LE low Energy 蓝牙低功耗
- SSP Secure Simple Pairing 简单配对方式
- DTMF Dual-tone multifrequency 电话按键编码
- I2S Inter-IC Sound
- DO Data Out I2S的Data Out PIN
- DIO Data In/Out 可以做IN也可以做OUT,但全双工时只能作为IN
- I2S SC I2S single channel 每组I2S具有一根DIO和一根DO PIN
- I2S MC I2S Multi channel 此I2S有三根DO PIN
- TDM Time Division Multiplexing 通过时分复用方式,支持传输多个声道的数据
- AEC Acoustic Echo Cancellation 声学回声消除
- NDC Noise reducer + Dynamic range Control 降噪+动态范围控制
- AWB Audio Write Back DSP输出的音频数据写回Dram
- BT656 paraller digital Interface 一种并行数字接口
- HPW Horizontal Pulse Width 水平同步脉冲宽度
- HFP Horizontal Front Porch 水平前肩
- HBP Horizontal Back Porch 水平后肩
- VPW Vertical Pulse Width 垂直同步脉冲宽度
- HFP Vertical Front Porch 垂直前肩
- HBP Vertical Back Porch 垂直后肩
- FPS Frame Per Second 每秒钟帧率
- BPP Bit Per Pixel 每个像素所用Bit位数
- SOC System on Chip SOC称为系统级芯片,也有称为片上系统
- PQ Picture Quality 图像质量
- UI User Interface 用户界面
- APP Application 一般指手机应用程序
- AOSP Android Open Source Project android开源项目
- POR Power-on-RESE