/**
 * @brief       VIA Primitive
 * @author      AXELL CORPORATION
 * @description VIA Primitive Layer.
 * @note        none
 * @history     2017_02_22  初版
 * @history     2017_10_26  Ver2.0
*/
/* DOM-IGNORE-BEGIN */
/*
 * This program was created by AXELL CORPORATION.
 * Copyright (C) 2017 AXELL CORPORATION, all rights reserved.
 */
/* DOM-IGNORE-END */

#include <stdio.h>
#include "via/viaprm.h"
#include "register/AG903_viareg.h"
#include "sys/sscprm.h"
#include "AG903_common.h"

/**
 * @brief         VIA.SRC_SELECT レジスタ設定
 * @param         id [in] チャンネル番号
 * @param         select [in] VIA.SRC_SELECT設定値格納先
 * @return        void 
 * @description   VIA.SRC_SELECT を設定します。 
*/
void AG903_ViaPrmSetVIASRCSELECT(uint32_t id, VIAPrmParamVIASRCSELECT *select)
{
    uint16_t                    val;

    ASSERT(id < AG903_VIA_PRM_MAX_PORTS);
    ASSERT(select != NULL);
    ASSERT(!(select->gcat & ~(0x1)));
    ASSERT(!(select->nsck & ~(0x1)));
    ASSERT(!(select->nsns & ~(0x1)));
    ASSERT(!(select->nons & ~(0x1)));

    val = (select->gcat << AG903_VIA_SRC_SELECT_GCAT_POS)
        | (select->nsck << AG903_VIA_SRC_SELECT_NSCK_POS)
        | (select->nsns << AG903_VIA_SRC_SELECT_NSNS_POS)
        | (select->nons << AG903_VIA_SRC_SELECT_NONS_POS);

    AG903_SSCPrmWriteCmpstVideoDec(id, AG903_VIA_SRC_SELECT, val);
}


/**
 * @brief         VIA.SRC_SELECTレジスタ取得
 * @param         id [in] チャンネル番号
 * @param         select [out] VIA.SRC_SELECT取得値格納先
 * @return        void
 * @description   VIA.SRC_SELECT を取得します。 
*/
void AG903_ViaPrmGetVIASRCSELECT(uint32_t id, VIAPrmParamVIASRCSELECT *select)
{
    uint16_t                    val;

    ASSERT(id < AG903_VIA_PRM_MAX_PORTS);
    ASSERT(select != NULL);

    AG903_SSCPrmReadCmpstVideoDec(id, AG903_VIA_SRC_SELECT, &val);

    select->gcat = (val & AG903_VIA_SRC_SELECT_GCAT_MSK) >> AG903_VIA_SRC_SELECT_GCAT_POS;
    select->nsck = (val & AG903_VIA_SRC_SELECT_NSCK_MSK) >> AG903_VIA_SRC_SELECT_NSCK_POS;
    select->nsns = (val & AG903_VIA_SRC_SELECT_NSNS_MSK) >> AG903_VIA_SRC_SELECT_NSNS_POS;
    select->nons = (val & AG903_VIA_SRC_SELECT_NONS_MSK) >> AG903_VIA_SRC_SELECT_NONS_POS;
}


/**
 * @brief         VIA.SRC_FORMAT レジスタ設定
 * @param         id [in] チャンネル番号
 * @param         fmt [in] FMTフィールド設定値
 * @return        void
 * @description   VIA.SRC_FORMAT を設定します。 
*/
void AG903_ViaPrmSetVIASRCFORMAT(uint32_t id, uint16_t fmt)
{
    uint16_t                    val;

    ASSERT(id < AG903_VIA_PRM_MAX_PORTS);
    ASSERT(!(fmt & ~(0xF)));

    val = (fmt << AG903_VIA_SRC_FORMAT_FMT_POS);

    AG903_SSCPrmWriteCmpstVideoDec(id, AG903_VIA_SRC_FORMAT, val);
}


/**
 * @brief         VIA.SRC_FORMAT レジスタ取得
 * @param         id [in] チャンネル番号
 * @param         fmt [out] FMTフィールド取得値
 * @return        void
 * @description   VIA.SRC_FORMAT を取得します。 
*/
void AG903_ViaPrmGetVIASRCFORMAT(uint32_t id, uint16_t *fmt)
{
    uint16_t                    val;

    ASSERT(id < AG903_VIA_PRM_MAX_PORTS);
    ASSERT(fmt != NULL);

    AG903_SSCPrmReadCmpstVideoDec(id, AG903_VIA_SRC_FORMAT, &val);

    *fmt = (val & AG903_VIA_SRC_FORMAT_FMT_MSK) >> AG903_VIA_SRC_FORMAT_FMT_POS;
}


/**
 * @brief         VIA.SRC_HCYCLE レジスタ設定
 * @param         id [in] チャンネル番号
 * @param         hcycle [in] HCYCLEフィールド設定値
 * @return        void
 * @description   VIA.SRC_HCYCLE を設定します。 
*/
void AG903_ViaPrmSetVIASRCHCYCLE(uint32_t id, uint16_t hcycle)
{
    uint16_t                    val;

    ASSERT(id < AG903_VIA_PRM_MAX_PORTS);
    ASSERT(!(hcycle & ~(0xFFF)));

    val = (hcycle << AG903_VIA_SRC_HCYCLE_HCYCLE_POS);

    AG903_SSCPrmWriteCmpstVideoDec(id, AG903_VIA_SRC_HCYCLE, val);
}


/**
 * @brief         VIA.SRC_HCYCLE レジスタ取得
 * @param         id [in] チャンネル番号
 * @param         hcycle [out] HCYCLEフィールド取得値
 * @return        void
 * @description   VIA.SRC_SELECT を取得します。 
*/
void AG903_ViaPrmGetVIASRCHCYCLE(uint32_t id, uint16_t *hcycle)
{
    uint16_t                    val;

    ASSERT(id < AG903_VIA_PRM_MAX_PORTS);
    ASSERT(hcycle != NULL);

    AG903_SSCPrmReadCmpstVideoDec(id, AG903_VIA_SRC_HCYCLE, &val);

    *hcycle = (val & AG903_VIA_SRC_HCYCLE_HCYCLE_MSK) >> AG903_VIA_SRC_HCYCLE_HCYCLE_POS;
}


/**
 * @brief         VIA.SRC_HVALID レジスタ設定
 * @param         id [in] チャンネル番号
 * @param         hvalid [in] HVALIDフィールド設定値
 * @return        void
 * @description   VIA.SRC_HVALID を設定します。 
*/
void AG903_ViaPrmSetVIASRCHVALID(uint32_t id, uint16_t hvalid)
{
    uint16_t                    val;

    ASSERT(id < AG903_VIA_PRM_MAX_PORTS);
    ASSERT(!(hvalid & ~(0xFFF)));

    val = (hvalid << AG903_VIA_SRC_HVALID_HVALID_POS);

    AG903_SSCPrmWriteCmpstVideoDec(id, AG903_VIA_SRC_HVALID, val);
}


/**
 * @brief         VIA.SRC_HVALID レジスタ取得
 * @param         id [in] チャンネル番号
 * @param         hvalid [out] HVALIDフィールド取得値
 * @return        void
 * @description   VIA.SRC_HVALID を取得します。 
*/
void AG903_ViaPrmGetVIASRCHVALID(uint32_t id, uint16_t *hvalid)
{
    uint16_t                    val;

    ASSERT(id < AG903_VIA_PRM_MAX_PORTS);
    ASSERT(hvalid != NULL);

    AG903_SSCPrmReadCmpstVideoDec(id, AG903_VIA_SRC_HVALID, &val);

    *hvalid = (val & AG903_VIA_SRC_HVALID_HVALID_MSK) >> AG903_VIA_SRC_HVALID_HVALID_POS;
}


/**
 * @brief         VIA.SRC_HDELAY レジスタ設定
 * @param         id [in] チャンネル番号
 * @param         hdelay [in] HDELAYフィールド設定値
 * @return        void
 * @description   VIA.SRC_HDELAY を設定します。 
*/
void AG903_ViaPrmSetVIASRCHDELAY(uint32_t id, uint16_t hdelay)
{
    uint16_t                    val;

    ASSERT(id < AG903_VIA_PRM_MAX_PORTS);
    ASSERT(!(hdelay & ~(0x7FF)));

    val = (hdelay << AG903_VIA_SRC_HDELAY_HDELAY_POS);

    AG903_SSCPrmWriteCmpstVideoDec(id, AG903_VIA_SRC_HDELAY, val);
}


/**
 * @brief         VIA.SRC_HDELAY レジスタ取得
 * @param         id [in] チャンネル番号
 * @param         hdelay [out] HDELAYフィールド取得値
 * @return        void
 * @description   VIA.SRC_HDELAY を取得します。 
*/
void AG903_ViaPrmGetVIASRCHDELAY(uint32_t id, uint16_t *hdelay)
{
    uint16_t                    val;

    ASSERT(id < AG903_VIA_PRM_MAX_PORTS);
    ASSERT(hdelay != NULL);

    AG903_SSCPrmReadCmpstVideoDec(id, AG903_VIA_SRC_HDELAY, &val);

    *hdelay = (val & AG903_VIA_SRC_HDELAY_HDELAY_MSK) >> AG903_VIA_SRC_HDELAY_HDELAY_POS;
}


/**
 * @brief         VIA.SRC_VCYCLE レジスタ設定
 * @param         id [in] チャンネル番号
 * @param         vcycle [in] VCYCLEフィールド設定値
 * @return        void
 * @description   VIA.SRC_VCYCLE を設定します。 
*/
void AG903_ViaPrmSetVIASRCVCYCLE(uint32_t id, uint16_t vcycle)
{
    uint16_t                    val;

    ASSERT(id < AG903_VIA_PRM_MAX_PORTS);
    ASSERT(!(vcycle & ~(0x3FF)));

    val = (vcycle << AG903_VIA_SRC_VCYCLE_VCYCLE_POS);

    AG903_SSCPrmWriteCmpstVideoDec(id, AG903_VIA_SRC_VCYCLE, val);
}


/**
 * @brief         VIA.SRC_VCYCLE レジスタ取得
 * @param         id [in] チャンネル番号
 * @param         vcycle [out] VCYCLEフィールド取得値
 * @return        void
 * @description   VIA.SRC_VCYCLE を取得します。 
*/
void AG903_ViaPrmGetVIASRCVCYCLE(uint32_t id, uint16_t *vcycle)
{
    uint16_t                    val;

    ASSERT(id < AG903_VIA_PRM_MAX_PORTS);
    ASSERT(vcycle != NULL);

    AG903_SSCPrmReadCmpstVideoDec(id, AG903_VIA_SRC_VCYCLE, &val);

    *vcycle = (val & AG903_VIA_SRC_VCYCLE_VCYCLE_MSK) >> AG903_VIA_SRC_VCYCLE_VCYCLE_POS;
}


/**
 * @brief         VIA.SRC_VVALID レジスタ設定
 * @param         id [in] チャンネル番号
 * @param         vvalid [in] VVALIDフィールド設定値
 * @return        void
 * @description   VIA.SRC_VVALID を設定します。 
*/
void AG903_ViaPrmSetVIASRCVVALID(uint32_t id, uint16_t vvalid)
{
    uint16_t                    val;

    ASSERT(id < AG903_VIA_PRM_MAX_PORTS);
    ASSERT(!(vvalid & ~(0x3FF)));

    val = (vvalid << AG903_VIA_SRC_VVALID_VVALID_POS);

    AG903_SSCPrmWriteCmpstVideoDec(id, AG903_VIA_SRC_VVALID, val);
}


/**
 * @brief         VIA.SRC_VVALID レジスタ取得
 * @param         id [in] チャンネル番号
 * @param         vvalid [out] VVALIDフィールド取得値
 * @return        void
 * @description   VIA.SRC_VVALID を取得します。 
*/
void AG903_ViaPrmGetVIASRCVVALID(uint32_t id, uint16_t *vvalid)
{
    uint16_t                    val;

    ASSERT(id < AG903_VIA_PRM_MAX_PORTS);
    ASSERT(vvalid != NULL);

    AG903_SSCPrmReadCmpstVideoDec(id, AG903_VIA_SRC_VVALID, &val);

    *vvalid = (val & AG903_VIA_SRC_VVALID_VVALID_MSK) >> AG903_VIA_SRC_VVALID_VVALID_POS;
}


/**
 * @brief         VIA.SRC_VDELAY レジスタ設定
 * @param         id [in] チャンネル番号
 * @param         vdelay [in] VDELAYフィールド設定値
 * @return        void
 * @description   VIA.SRC_VDELAY を設定します。 
*/
void AG903_ViaPrmSetVIASRCVDELAY(uint32_t id, uint16_t vdelay)
{
    uint16_t                    val;

    ASSERT(id < AG903_VIA_PRM_MAX_PORTS);
    ASSERT(!(vdelay & ~(0x3FF)));

    val = (vdelay << AG903_VIA_SRC_VDELAY_VDELAY_POS);

    AG903_SSCPrmWriteCmpstVideoDec(id, AG903_VIA_SRC_VDELAY, val);
}


/**
 * @brief         VIA.SRC_VDELAY レジスタ取得
 * @param         id [in] チャンネル番号
 * @param         vdelay [out] VDELAYフィールド取得値
 * @return        void
 * @description   VIA.SRC_VDELAY を取得します。 
*/
void AG903_ViaPrmGetVIASRCVDELAY(uint32_t id, uint16_t *vdelay)
{
    uint16_t                    val;

    ASSERT(id < AG903_VIA_PRM_MAX_PORTS);
    ASSERT(vdelay != NULL);

    AG903_SSCPrmReadCmpstVideoDec(id, AG903_VIA_SRC_VDELAY, &val);

    *vdelay = (val & AG903_VIA_SRC_VDELAY_VDELAY_MSK) >> AG903_VIA_SRC_VDELAY_VDELAY_POS;
}


/**
 * @brief         VIA.SRC_FRMFREQ レジスタ設定
 * @param         id [in] チャンネル番号
 * @param         frm [in] FRMフィールド設定値
 * @return        void
 * @description   VIA.SRC_FRMFREQ を設定します。 
*/
void AG903_ViaPrmSetVIASRCFRMFREQ(uint32_t id, uint16_t frm)
{
    uint16_t                    val;

    ASSERT(id < AG903_VIA_PRM_MAX_PORTS);
    ASSERT(!(frm & ~(0x1)));

    val = (frm << AG903_VIA_SRC_FRMFREQ_FRM_POS);

    AG903_SSCPrmWriteCmpstVideoDec(id, AG903_VIA_SRC_FRMFREQ, val);
}


/**
 * @brief         VIA.SRC_FRMFREQ レジスタ取得
 * @param         id [in] チャンネル番号
 * @param         frm [out] FRMフィールド取得値
 * @return        void
 * @description   VIA.SRC_FRMFREQ を取得します。 
*/
void AG903_ViaPrmGetVIASRCFRMFREQ(uint32_t id, uint16_t *frm)
{
    uint16_t                    val;

    ASSERT(id < AG903_VIA_PRM_MAX_PORTS);
    ASSERT(frm != NULL);

    AG903_SSCPrmReadCmpstVideoDec(id, AG903_VIA_SRC_FRMFREQ, &val);

    *frm = (val & AG903_VIA_SRC_FRMFREQ_FRM_MSK) >> AG903_VIA_SRC_FRMFREQ_FRM_POS;
}


/**
 * @brief         VIA.SIG_YCS レジスタ設定
 * @param         id [in] チャンネル番号
 * @param         trap [in] TRAPフィールド設定値
 * @param         mono [in] MONOフィールド設定値
 * @return        void
 * @description   VIA.SIG_YCS を設定します。 
*/
void AG903_ViaPrmSetVIASIGYCS(uint32_t id, uint16_t trap, uint16_t mono)
{
    uint16_t                    val;

    ASSERT(id < AG903_VIA_PRM_MAX_PORTS);
    ASSERT(!(trap & ~(0x1)));
    ASSERT(!(mono & ~(0x1)));

    val = (trap << AG903_VIA_SIG_YCS_TRAP_POS)
        | (mono << AG903_VIA_SIG_YCS_MONO_POS);

    AG903_SSCPrmWriteCmpstVideoDec(id, AG903_VIA_SIG_YCS, val);
}


/**
 * @brief         VIA.SIG_YCS レジスタ取得
 * @param         id [in] チャンネル番号
 * @param         trap [out] TRAPフィールド取得値
 * @param         mono [out] MONOフィールド取得値
 * @return        void
 * @description   VIA.SIG_YCS を取得します。 
*/
void AG903_ViaPrmGetVIASIGYCS(uint32_t id, uint16_t *trap, uint16_t *mono)
{
    uint16_t                    val;

    ASSERT(id < AG903_VIA_PRM_MAX_PORTS);
    ASSERT(trap != NULL);
    ASSERT(mono != NULL);

    AG903_SSCPrmReadCmpstVideoDec(id, AG903_VIA_SIG_YCS, &val);

    *trap = (val & AG903_VIA_SIG_YCS_TRAP_MSK) >> AG903_VIA_SIG_YCS_TRAP_POS;
    *mono = (val & AG903_VIA_SIG_YCS_MONO_MSK) >> AG903_VIA_SIG_YCS_MONO_POS;
}


/**
 * @brief         VIA.CHD_SETUP2 レジスタ設定
 * @param         id [in] チャンネル番号
 * @param         bpf [in] BPFフィールド設定値
 * @param         hue [in] HUEフィールド設定値
 * @return        void
 * @description   VIA.CHD_SETUP2 を設定します。 
*/
void AG903_ViaPrmSetVIACHDSETUP2(uint32_t id, uint16_t bpf, uint16_t hue)
{
    uint16_t                    val;

    ASSERT(id < AG903_VIA_PRM_MAX_PORTS);
    ASSERT(!(bpf & ~(0x1)));
    ASSERT(!(hue & ~(0xFF)));

    val = (bpf << AG903_VIA_CHD_SETUP2_BPF_POS)
        | (hue << AG903_VIA_CHD_SETUP2_HUE_POS);

    AG903_SSCPrmWriteCmpstVideoDec(id, AG903_VIA_CHD_SETUP2, val);
}


/**
 * @brief         VIA.CHD_SETUP2 レジスタ取得
 * @param         id [in] チャンネル番号
 * @param         bpf [out] BPFフィールド取得値
 * @param         hue [out] HUEフィールド取得値
 * @return        void
 * @description   VIA.CHD_SETUP2 を取得します。 
*/
void AG903_ViaPrmGetVIACHDSETUP2(uint32_t id, uint16_t *bpf, uint16_t *hue)
{
    uint16_t                    val;

    ASSERT(id < AG903_VIA_PRM_MAX_PORTS);
    ASSERT(bpf != NULL);
    ASSERT(hue != NULL);

    AG903_SSCPrmReadCmpstVideoDec(id, AG903_VIA_CHD_SETUP2, &val);

    *bpf = (val & AG903_VIA_CHD_SETUP2_BPF_MSK) >> AG903_VIA_CHD_SETUP2_BPF_POS;
    *hue = (val & AG903_VIA_CHD_SETUP2_HUE_MSK) >> AG903_VIA_CHD_SETUP2_HUE_POS;
}


/**
 * @brief         VIA.CHD_SETUP3 レジスタ設定
 * @param         id [in] チャンネル番号
 * @param         setup [in] VIA.CHD_SETUP3設定値格納先
 * @return        void
 * @description   VIA.CHD_SETUP3 を設定します。 
*/
void AG903_ViaPrmSetVIACHDSETUP3(uint32_t id, VIAPrmParamVIACHDSETUP3 *setup)
{
    uint16_t                    val;

    ASSERT(id < AG903_VIA_PRM_MAX_PORTS);
    ASSERT(setup != NULL);
    ASSERT(!(setup->agcen & ~(0x1)));
    ASSERT(!(setup->accov & ~(0x3F)));
    ASSERT(!(setup->acctc & ~(0x3)));
    ASSERT(!(setup->accmark & ~(0x3F)));

    val = (setup->agcen << AG903_VIA_CHD_SETUP3_AGCEN_POS)
        | (setup->accov << AG903_VIA_CHD_SETUP3_ACCOV_POS)
        | (setup->acctc << AG903_VIA_CHD_SETUP3_ACCTC_POS)
        | (setup->accmark << AG903_VIA_CHD_SETUP3_ACCMARK_POS);

    AG903_SSCPrmWriteCmpstVideoDec(id, AG903_VIA_CHD_SETUP3, val);
}


/**
 * @brief         VIA.CHD_SETUP3 レジスタ取得
 * @param         id [in] チャンネル番号
 * @param         setup [out] VIA.CHD_SETUP3取得値格納先
 * @return        void
 * @description   VIA.CHD_SETUP3 を取得します。 
*/
void AG903_ViaPrmGetVIACHDSETUP3(uint32_t id, VIAPrmParamVIACHDSETUP3 *setup)
{
    uint16_t                    val;

    ASSERT(id < AG903_VIA_PRM_MAX_PORTS);
    ASSERT(setup != NULL);

    AG903_SSCPrmReadCmpstVideoDec(id, AG903_VIA_CHD_SETUP3, &val);

    setup->agcen   = (val & AG903_VIA_CHD_SETUP3_AGCEN_MSK) >> AG903_VIA_CHD_SETUP3_AGCEN_POS;
    setup->accov   = (val & AG903_VIA_CHD_SETUP3_ACCOV_MSK) >> AG903_VIA_CHD_SETUP3_ACCOV_POS;
    setup->acctc   = (val & AG903_VIA_CHD_SETUP3_ACCTC_MSK) >> AG903_VIA_CHD_SETUP3_ACCTC_POS;
    setup->accmark = (val & AG903_VIA_CHD_SETUP3_ACCMARK_MSK) >> AG903_VIA_CHD_SETUP3_ACCMARK_POS;
}


/**
 * @brief         VIA.CHD_SETUP5 レジスタ設定
 * @param         id [in] チャンネル番号
 * @param         setup [in] VIA.CHD_SETUP5設定値格納先
 * @return        void
 * @description   VIA.CHD_SETUP5 を設定します。 
*/
void AG903_ViaPrmSetVIACHDSETUP5(uint32_t id, VIAPrmParamVIACHDSETUP5 *setup)
{
    uint16_t                    val;

    ASSERT(id < AG903_VIA_PRM_MAX_PORTS);
    ASSERT(setup != NULL);
    ASSERT(!(setup->cbpllulth & ~(0x3F)));
    ASSERT(!(setup->cbpllulsv & ~(0x3)));
    ASSERT(!(setup->agcgainspd & ~(0x3)));
    ASSERT(!(setup->agcofstspd & ~(0x3)));
    ASSERT(!(setup->agcpos & ~(0x1)));
    ASSERT(!(setup->agcpal & ~(0x1)));
    ASSERT(!(setup->agcgainen & ~(0x1)));
    ASSERT(!(setup->agcofsten & ~(0x1)));

    val = (setup->cbpllulth << AG903_VIA_CHD_SETUP5_CBPLLULTH_POS)
        | (setup->cbpllulsv << AG903_VIA_CHD_SETUP5_CBPLLULSV_POS)
        | (setup->agcgainspd << AG903_VIA_CHD_SETUP5_AGCGAINSPD_POS)
        | (setup->agcofstspd << AG903_VIA_CHD_SETUP5_AGCOFSTSPD_POS)
        | (setup->agcpos << AG903_VIA_CHD_SETUP5_AGCPOS_POS)
        | (setup->agcpal << AG903_VIA_CHD_SETUP5_AGCPAL_POS)
        | (setup->agcgainen << AG903_VIA_CHD_SETUP5_AGCGAINEN_POS)
        | (setup->agcofsten << AG903_VIA_CHD_SETUP5_AGCOFSTEN_POS);

    AG903_SSCPrmWriteCmpstVideoDec(id, AG903_VIA_CHD_SETUP5, val);
}


/**
 * @brief         VIA.CHD_SETUP5 レジスタ取得
 * @param         id [in] チャンネル番号
 * @param         setup [out] VIA.CHD_SETUP5取得値格納先
 * @return        void
 * @description   VIA.CHD_SETUP5 を取得します。 
*/
void AG903_ViaPrmGetVIACHDSETUP5(uint32_t id, VIAPrmParamVIACHDSETUP5 *setup)
{
    uint16_t                    val;

    ASSERT(id < AG903_VIA_PRM_MAX_PORTS);
    ASSERT(setup != NULL);

    AG903_SSCPrmReadCmpstVideoDec(id, AG903_VIA_CHD_SETUP5, &val);

    setup->cbpllulth  = (val & AG903_VIA_CHD_SETUP5_CBPLLULTH_MSK) >> AG903_VIA_CHD_SETUP5_CBPLLULTH_POS;
    setup->cbpllulsv  = (val & AG903_VIA_CHD_SETUP5_CBPLLULSV_MSK) >> AG903_VIA_CHD_SETUP5_CBPLLULSV_POS;
    setup->agcgainspd = (val & AG903_VIA_CHD_SETUP5_AGCGAINSPD_MSK) >> AG903_VIA_CHD_SETUP5_AGCGAINSPD_POS;
    setup->agcofstspd = (val & AG903_VIA_CHD_SETUP5_AGCOFSTSPD_MSK) >> AG903_VIA_CHD_SETUP5_AGCOFSTSPD_POS;
    setup->agcpos     = (val & AG903_VIA_CHD_SETUP5_AGCPOS_MSK) >> AG903_VIA_CHD_SETUP5_AGCPOS_POS;
    setup->agcpal     = (val & AG903_VIA_CHD_SETUP5_AGCPAL_MSK) >> AG903_VIA_CHD_SETUP5_AGCPAL_POS;
    setup->agcgainen  = (val & AG903_VIA_CHD_SETUP5_AGCGAINEN_MSK) >> AG903_VIA_CHD_SETUP5_AGCGAINEN_POS;
    setup->agcofsten  = (val & AG903_VIA_CHD_SETUP5_AGCOFSTEN_MSK) >> AG903_VIA_CHD_SETUP5_AGCOFSTEN_POS;
}


/**
 * @brief         VIA.OUT_LEVELY レジスタ設定
 * @param         id [in] チャンネル番号
 * @param         yofst [in] YOFSTフィールド設定値
 * @param         ygain [in] YGAINフィールド設定値
 * @return        void
 * @description   VIA.OUT_LEVELY を設定します。 
*/
void AG903_ViaPrmSetVIAOUTLEVELY(uint32_t id, uint16_t yofst, uint16_t ygain)
{
    uint16_t                    val;

    ASSERT(id < AG903_VIA_PRM_MAX_PORTS);
    ASSERT(!(yofst & ~(0xFF)));
    ASSERT(!(ygain & ~(0xFF)));

    val = (yofst << AG903_VIA_OUT_LEVELY_YOFST_POS)
        | (ygain << AG903_VIA_OUT_LEVELY_YGAIN_POS);

    AG903_SSCPrmWriteCmpstVideoDec(id, AG903_VIA_OUT_LEVELY, val);
}


/**
 * @brief         VIA.OUT_LEVELY レジスタ取得
 * @param         id [in] チャンネル番号
 * @param         yofst [out] YOFSTフィールド取得値
 * @param         ygain [out] YGAINフィールド取得値
 * @return        none
 * @description   VIA.OUT_LEVELY を取得します。 
*/
void AG903_ViaPrmGetVIAOUTLEVELY(uint32_t id, uint16_t *yofst, uint16_t *ygain)
{
    uint16_t                    val;

    ASSERT(id < AG903_VIA_PRM_MAX_PORTS);
    ASSERT(yofst != NULL);
    ASSERT(ygain != NULL);

    AG903_SSCPrmReadCmpstVideoDec(id, AG903_VIA_OUT_LEVELY, &val);

    *yofst = (val & AG903_VIA_OUT_LEVELY_YOFST_MSK) >> AG903_VIA_OUT_LEVELY_YOFST_POS;
    *ygain = (val & AG903_VIA_OUT_LEVELY_YGAIN_MSK) >> AG903_VIA_OUT_LEVELY_YGAIN_POS;
}


/**
 * @brief         VIA.OUT_LEVELCB レジスタ設定
 * @param         id [in] チャンネル番号
 * @param         cbofst [in] CBOFSTフィールド設定値
 * @param         cbgain [in] CBGAINフィールド設定値
 * @return        void
 * @description   VIA.OUT_LEVELCB を設定します。 
*/
void AG903_ViaPrmSetVIAOUTLEVELCB(uint32_t id, uint16_t cbofst, uint16_t cbgain)
{
    uint16_t                    val;

    ASSERT(id < AG903_VIA_PRM_MAX_PORTS);
    ASSERT(!(cbofst & ~(0xFF)));
    ASSERT(!(cbgain & ~(0xFF)));

    val = (cbofst << AG903_VIA_OUT_LEVELCB_CBOFST_POS)
        | (cbgain << AG903_VIA_OUT_LEVELCB_CBGAIN_POS);

    AG903_SSCPrmWriteCmpstVideoDec(id, AG903_VIA_OUT_LEVELCB, val);
}


/**
 * @brief         VIA.OUT_LEVELCB レジスタ取得
 * @param         id [in] チャンネル番号
 * @param         cbofst [out] CBOFSTフィールド取得値
 * @param         cbgain [out] CBGAINフィールド取得値
 * @return        void
 * @description   VIA.OUT_LEVELCB を取得します。 
*/
void AG903_ViaPrmGetVIAOUTLEVELCB(uint32_t id, uint16_t *cbofst, uint16_t *cbgain)
{
    uint16_t                    val;

    ASSERT(id < AG903_VIA_PRM_MAX_PORTS);
    ASSERT(cbofst != NULL);
    ASSERT(cbgain != NULL);

    AG903_SSCPrmReadCmpstVideoDec(id, AG903_VIA_OUT_LEVELCB, &val);

    *cbofst = (val & AG903_VIA_OUT_LEVELCB_CBOFST_MSK) >> AG903_VIA_OUT_LEVELCB_CBOFST_POS;
    *cbgain = (val & AG903_VIA_OUT_LEVELCB_CBGAIN_MSK) >> AG903_VIA_OUT_LEVELCB_CBGAIN_POS;
}


/**
 * @brief         VIA.OUT_LEVELCR レジスタ設定
 * @param         id [in] チャンネル番号
 * @param         crofst [in] CROFSTフィールド設定値
 * @param         crgain [in] CRGAINフィールド設定値
 * @return        void
 * @description   VIA.OUT_LEVELCR を設定します。 
*/
void AG903_ViaPrmSetVIAOUTLEVELCR(uint32_t id, uint16_t crofst, uint16_t crgain)
{
    uint16_t                    val;

    ASSERT(id < AG903_VIA_PRM_MAX_PORTS);
    ASSERT(!(crofst & ~(0xFF)));
    ASSERT(!(crgain & ~(0xFF)));

    val = (crofst << AG903_VIA_OUT_LEVELCR_CROFST_POS)
        | (crgain << AG903_VIA_OUT_LEVELCR_CRGAIN_POS);

    AG903_SSCPrmWriteCmpstVideoDec(id, AG903_VIA_OUT_LEVELCR, val);
}


/**
 * @brief         VIA.OUT_LEVELCR レジスタ取得
 * @param         id [in] チャンネル番号
 * @param         crofst [out] CROFSTフィールド取得値
 * @param         crgain [out] CRGAINフィールド取得値
 * @return        void
 * @description   VIA.OUT_LEVELCR を取得します。 
*/
void AG903_ViaPrmGetVIAOUTLEVELCR(uint32_t id, uint16_t *crofst, uint16_t *crgain)
{
    uint16_t                    val;

    ASSERT(id < AG903_VIA_PRM_MAX_PORTS);
    ASSERT(crofst != NULL);
    ASSERT(crgain != NULL);

    AG903_SSCPrmReadCmpstVideoDec(id, AG903_VIA_OUT_LEVELCR, &val);

    *crofst = (val & AG903_VIA_OUT_LEVELCR_CROFST_MSK) >> AG903_VIA_OUT_LEVELCR_CROFST_POS;
    *crgain = (val & AG903_VIA_OUT_LEVELCR_CRGAIN_MSK) >> AG903_VIA_OUT_LEVELCR_CRGAIN_POS;
}


/**
 * @brief         VIA.CLAMP_LEVEL レジスタ設定
 * @param         id [in] チャンネル番号
 * @param         clampofs [in] CLAMPOFSフィールド設定値
 * @return        void
 * @description   VIA.CLAMP_LEVEL を設定します。 
*/
void AG903_ViaPrmSetVIACLAMPLEVEL(uint32_t id, uint16_t clampofs)
{
    uint16_t                    val;

    ASSERT(id < AG903_VIA_PRM_MAX_PORTS);
    ASSERT(!(clampofs & ~(0x3FF)));

    val = (clampofs << AG903_VIA_CLAMP_LEVEL_CLAMPOFS_POS);

    AG903_SSCPrmWriteCmpstVideoDec(id, AG903_VIA_CLAMP_LEVEL, val);
}


/**
 * @brief         VIA.CLAMP_LEVEL レジスタ取得
 * @param         id [in] チャンネル番号
 * @param         clampofs [out] CLAMPOFSフィールド取得値
 * @return        void
 * @description   VIA.CLAMP_LEVEL を取得します。 
*/
void AG903_ViaPrmGetVIACLAMPLEVEL(uint32_t id, uint16_t *clampofs)
{
    uint16_t                    val;

    ASSERT(id < AG903_VIA_PRM_MAX_PORTS);
    ASSERT(clampofs != NULL);

    AG903_SSCPrmReadCmpstVideoDec(id, AG903_VIA_CLAMP_LEVEL, &val);

    *clampofs = (val & AG903_VIA_CLAMP_LEVEL_CLAMPOFS_MSK) >> AG903_VIA_CLAMP_LEVEL_CLAMPOFS_POS;
}


/**
 * @brief         VIA.DET_STATUS レジスタ取得
 * @param         id [in] チャンネル番号
 * @param         setup [out] VIA.DET_STATUS取得値格納先
 * @return        void
 * @description   VIA.DET_STATUS を取得します。 
*/
void AG903_ViaPrmGetVIADETSTATUS(uint32_t id, VIAPrmParamVIADETSTATUS *status)
{
    uint16_t                    val;

    ASSERT(id < AG903_VIA_PRM_MAX_PORTS);
    ASSERT(status != NULL);

    AG903_SSCPrmReadCmpstVideoDec(id, AG903_VIA_DET_STATUS, &val);

    status->fmt    = (val & AG903_VIA_DET_STATUS_FMT_MSK) >> AG903_VIA_DET_STATUS_FMT_POS;
    status->tbcno  = (val & AG903_VIA_DET_STATUS_TBCNO_MSK) >> AG903_VIA_DET_STATUS_TBCNO_POS;
    status->std    = (val & AG903_VIA_DET_STATUS_STD_MSK) >> AG903_VIA_DET_STATUS_STD_POS;
    status->ckill  = (val & AG903_VIA_DET_STATUS_CKILL_MSK) >> AG903_VIA_DET_STATUS_CKILL_POS;
    status->trick  = (val & AG903_VIA_DET_STATUS_TRICK_MSK) >> AG903_VIA_DET_STATUS_TRICK_POS;
    status->normal = (val & AG903_VIA_DET_STATUS_NORMAL_MSK) >> AG903_VIA_DET_STATUS_NORMAL_POS;
    status->vtr    = (val & AG903_VIA_DET_STATUS_VTR_MSK) >> AG903_VIA_DET_STATUS_VTR_POS;
    status->prog   = (val & AG903_VIA_DET_STATUS_PROG_MSK) >> AG903_VIA_DET_STATUS_PROG_POS;
    status->nosync = (val & AG903_VIA_DET_STATUS_NOSYNC_MSK) >> AG903_VIA_DET_STATUS_NOSYNC_POS;
}


/**
 * @brief         VIA.DET_HCYCLE レジスタ取得
 * @param         id [in] チャンネル番号
 * @param         hcycle [out] HCYCLEフィールド取得値
 * @return        none
 * @description   VIA.DET_HCYCLE を設定します。 
*/
void AG903_ViaPrmGetVIADETHCYCLE(uint32_t id, uint16_t *hcycle)
{
    uint16_t                    val;

    ASSERT(id < AG903_VIA_PRM_MAX_PORTS);
    ASSERT(hcycle != NULL);

    AG903_SSCPrmReadCmpstVideoDec(id, AG903_VIA_DET_HCYCLE, &val);

    *hcycle = (val & AG903_VIA_DET_HCYCLE_HCYCLE_MSK) >> AG903_VIA_DET_HCYCLE_HCYCLE_POS;
}


/**
 * @brief         VIA.DET_VCYCLE レジスタ取得
 * @param         id [in] チャンネル番号
 * @param         vcycle [out] VCYCLEフィールド取得値
 * @return        void
 * @description   VIA.DET_HCYCLE を取得します。 
*/
void AG903_ViaPrmGetVIADETVCYCLE(uint32_t id, uint16_t *vcycle)
{
    uint16_t                    val;

    ASSERT(id < AG903_VIA_PRM_MAX_PORTS);
    ASSERT(vcycle != NULL);

    AG903_SSCPrmReadCmpstVideoDec(id, AG903_VIA_DET_VCYCLE, &val);

    *vcycle = (val & AG903_VIA_DET_VCYCLE_VCYCLE_MSK) >> AG903_VIA_DET_VCYCLE_VCYCLE_POS;
}
