MCU时间同步说明
================

MCU支持的时间类型
---------------------------
* PHC时间：这个是网卡内部的一个计时器 ；
* RTC时间：这个J6X MCU侧带的一个实时时钟，不支持通过纽扣电池供电 ；
* Stbm时间：这个是AUTOSAR基于硬件时间抽象出来的软件时间，Stbm底层的硬件可以是PHC或者Gpt ；

MCU支持的时间同步方式
------------------------
MCU支持下面三种时间同步方式 :

* AUTOSAR CANTsync： 时间同步协议使用的是Stbm时间 ；
* AUTOSAR EthTsync： 时间同步协议使用的是Stbm时间，推荐使用基于PHC的stbm时间， 因为网卡可以给时间同步报文打硬件时间戳，这样减小时间同步误差 ；
* 基于PPS的Timesync： 在秒脉充上升沿捕捉到两个时间的snapshot，根据snapshot计算误差， 根据误差进行时间同步 ；


基于PPS的Timesync
---------------------------

代码目录： mcu/Service/TimeSync/src/

支持的时间
~~~~~~~~~~~~~~
* RTC
* Stbm(PHC)
* Stbm(Gpt)
* PHC

配置方法
~~~~~~~~~~~~~~~~~~~
通过修改配置决定使用哪种时间同步方式，目前只是支持下面两种时间同步方式 ：

* Stbm(PHC)同步RTC ；
* PHC同步RTC ；

.. code-block:: c

    /*TimeSync Config Begin*/
    static uint8 ConfigSource[] = {
        TIMEKEEPER_NONE, //TimeKeeperRTC Source
        TIMEKEEPER_NONE, //TimeKeeperGPS Source
        TIMEKEEPER_NONE, //TimeKeeperStbmPhc Source
        TIMEKEEPER_NONE, //TimeKeeperSpi Source
        TIMEKEEPER_NONE, //TimeKeeperIPC Source
        TIMEKEEPER_NONE, //TimeKeeperPHC Source
        TIMEKEEPER_NONE  //TimeKeeperGpt Source
    };

    static _Bool EnableTimeKeeper[] = {
        FALSE,//TimeKeeperRTC 
        FALSE,//TimeKeeperGPS
        FALSE,//TimeKeeperStbmPhc
        FALSE,//TimeKeeperSpi
        FALSE,//TimeKeeperIPC
        FALSE,//TimeKeeperPHC
        FALSE//TimeKeeperGpt
    };  

    _Bool Enable_HobotTimesync_Debug = FALSE;
    static _Bool EthTsync_Master_Use_Phc = TRUE;
    uint8 TineSync_PPS_Index = TIMESYNC_AON_RTC_PPS;

    /*TimeSync Config End*/

ConfigSource： 配置每个时间的时间源，如果一个时间不需要和其他时间同步，时间源配置成TIMEKEEPER_NONE
可以配置的时间源为 ：

.. code:: c

    typedef enum TimeKeeperIndexEnum {
        TIMEKEEPER_RTC_INDEX,
        TIMEKEEPER_GPS_INDEX,
        TIMEKEEPER_STBMPHC_INDEX,
        TIMEKEEPER_SPI_INDEX,
        TIMEKEEPER_IPC_INDEX,
        TIMEKEEPER_PHC_INDEX,
        TIMEKEEPER_STBMGPT_INDEX,
        TIMEKEEPER_NONE,
        TIMEKEEPER_NUM_MAX,
    } TimeKeeperIndex;

EnableTimeKeeper： 配置时间是否打开 ；

Enable_HobotTimesync_Debug： 配置是否开启打印 ；

TineSync_PPS_Index： 配置使用哪个PPS进行时间同步，可以使用的PPS如下 ：

.. code:: c

    #define PPS_IN0                         0
    #define PPS_IN1                         1
    #define PPS_IN2                         2
    #define RTC_PPS                         3
    #define PPS_INVALID                     4

配置举例
~~~~~~~~~~~~~
如果想配置RTC和GPS进行时间同步， 配置如下:

.. code:: c

    /*TimeSync Config Begin*/
    static uint8 ConfigSource[] = {
        TIMEKEEPER_GPS_INDEX, //TimeKeeperRTC Source
        TIMEKEEPER_NONE, //TimeKeeperGPS Source
        TIMEKEEPER_NONE, //TimeKeeperStbmPhc Source
        TIMEKEEPER_NONE, //TimeKeeperSpi Source
        TIMEKEEPER_NONE, //TimeKeeperIPC Source
        TIMEKEEPER_NONE, //TimeKeeperPHC Source
        TIMEKEEPER_NONE  //TimeKeeperGpt Source
    };

    static _Bool EnableTimeKeeper[] = {
        TRUE,//TimeKeeperRTC
        TRUE,//TimeKeeperGPS
        FALSE,//TimeKeeperStbmPhc
        FALSE,//TimeKeeperSpi
        FALSE,//TimeKeeperIPC
        FALSE,//TimeKeeperPHC
        FALSE//TimeKeeperGpt
    };

    Boolean Enable_HobotTimesync_Debug = FALSE;
    /*TimeSync Config End*/
