/**
 * \file    sys_reg.h
 * \brief   System control register definitions header file
 *
 * \par     Copyright (c) 2017 - 2022 Unicmicro Co., Ltd. All Rights Reserved.
 * \author  James
 * \date    2022-09-26
 * \version
 *
 * \history
 *  Date        Note
 *  2022-09-26  Original Creation
 *
 */

#ifndef __SYS_REG_H_
#define __SYS_REG_H_

#ifdef __cplusplus
extern "C" {
#endif

#include "types.h"

typedef enum SYS_REG_e
{
    SYS_PDO_INFO_REG = 0x00,
    SYS_PDO_VBUS_HI_REG  = 0x01,
    SYS_PDO_VBUS_LO_REG  = 0x02,
    SYS_PDO_IBUS_HI_REG  = 0x03,
    SYS_PDO_IBUS_LO_REG  = 0x04,
    SYS_MCU_CTRL_REG = 0x05,
	SYS_PPS_INFO_REG = 0x06,
	SYS_PPS_VBUS_HI_REG  = 0x07,
	SYS_PPS_VBUS_LO_REG  = 0x08,
	SYS_PPS_IBUS_HI_REG  = 0x09,
	SYS_PDO_IS_IBUS_LO_REG  = 0x0A,
    SYS_AVS_INFO_REG = 0x0B,
    SYS_STATUS_REG = 0x0C,
    SYS_VBUS_HI_REG = 0x0D,
    SYS_VBUS_LO_REG = 0x0E,
    SYS_IBUS_HI_REG = 0x0F,
    SYS_IBUS_LO_REG = 0x10,
    SYS_ALL_PDO_REG = 0x11,
    SYS_REG_MAX_NUM
} SYS_REG_t;

typedef enum SYS_REG_CMD_TYPE_e
{
    SYS_REG_CMD_READ        = 0x00,
    SYS_REG_CMD_WRITE       = 0x01,
    SYS_REG_CMD_RESPONSE    = 0x02,
    SYS_REG_CMD_EVENT       = 0x03,
    SYS_REG_CMD_MAX
} SYS_REG_CMD_TYPE_t;

#define SYS_REG_HEAD            (0xAA)
#define SYS_REG_TAIL            (0x55)

#define SYS_REG_HEAD_OFFSET     (0)
#define SYS_REG_HEAD_LEN        (1)
#define SYS_REG_CMD_OFFSET      (SYS_REG_HEAD_OFFSET+SYS_REG_HEAD_LEN)
#define SYS_REG_CMD_LEN         (1)
#define SYS_REG_FUNC_OFFSET     (SYS_REG_CMD_OFFSET+SYS_REG_CMD_LEN)
#define SYS_REG_FUNC_LEN        (1)
#define SYS_REG_LEN_OFFSET      (SYS_REG_FUNC_OFFSET+SYS_REG_FUNC_LEN)
#define SYS_REG_LEN_LEN         (1)
#define SYS_REG_CHECKSUM_LEN    (1)
#define SYS_REG_TAIL_LEN        (1)


#pragma pack(1)

/** PDO INFO */
typedef struct SYS_REG_PDO_INFO_s
{
    u8_t pdo_index:4,           /* 指定获取 PDO 档位 */
        pdo_num:4;              /* PDO 总数量（1-13） */
} SYS_REG_PDO_INFO_t;

/** MCU控制 */
typedef struct SYS_REG_MCU_CTRL_s
{
    u8_t req_pdo_index:4,       /* 请求新的 PDO 档位 */
        reserved:1,           
        pd_off:1,               /* 关闭PD，0：无操作，1：关闭 */
        disconnect:1,           /* 断线操作：0：无操作，1：断线 */
        hard_reset:1;           /* PD硬复位操作：0：无操作，1：PD硬复位 */
} SYS_REG_MCU_CTRL_t;

/** 状态 */
typedef struct SYS_REG_STATUS_s
{
    u8_t cc_connected:1,        /* 请求新的 PDO 档位 */
        cc_orientation:1,       /* CC1/CC2 */
        power_supply:1,         /* 关闭PD，0：无操作，1：关闭 */
        pd_connected:1,         /* 断线操作：0：无操作，1：断线 */
        pd_src_ready:1,         /* 关闭PD，0：无操作，1：关闭 */
        pd_revision:2,          /* PD版本：0：V2.0，1：V3.0，2：V3.1 */
        reserved:1;             /* 保留 */
} SYS_REG_STATUS_t;

typedef struct SYS_REG_CMD_s
{
    u8_t type:4,                /* 指令类型：0：读请求，1：写请求，2：响应，3：事件 */
        continuous:1,           /* 连续操作：0：否，1：是 */
        reserved:3;             /* 保留 */
} SYS_REG_CMD_t;

typedef struct SYS_REG_HEAD_s
{
    u8_t            head;
    SYS_REG_CMD_t   cmd;
    u8_t            func;
    u8_t            len;
} SYS_REG_HEAD_t;

#pragma pack()

bool_t sys_reg_read(unsigned char reg, unsigned char *p_val);
bool_t sys_reg_write(unsigned char reg, unsigned char *p_val);

#ifdef __cplusplus
}
#endif

#endif /* #ifndef __SYS_REG_H_ */

