Newer
Older
mbed-os / targets / TARGET_Samsung / TARGET_SIDK_S5JS100 / dcxo_update.cpp
/****************************************************************************
 *
 * Copyright 2020 Samsung Electronics All Rights Reserved.
 * SPDX-License-Identifier: Apache-2.0
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
 * either express or implied. See the License for the specific
 * language governing permissions and limitations under the License.
 *
 ****************************************************************************/

#include "modem_io_device.h"
#include "s5js100_dcxo.h"
#include "mbed_trace.h"
#include "mbed_error.h"
#define TRACE_GROUP "DCXO"

#ifndef DCXO_UPDATE_DBG_ON
#define DCXO_UPDATE_DBG_ON      0
#endif
#define DCXO_UPDATE_DBG     if (DCXO_UPDATE_DBG_ON) tr_info

bool g_enable_ctb_loop = false;

/****************************************************************************
 * Public Functions
 ****************************************************************************/
static ModemIoDevice *dcxo_mio;
static Full_set_table_t *ctb_tbl;

void dcxo_update_task(mio_buf *buf, void *data)
{
    ModemIoDevice *mio = dcxo_mio;
    unsigned short force_ctb;
    Nl1cHiu_UpdateInd_t pMsg;

    memcpy(&pMsg, buf->data, sizeof(pMsg));
    free_mio_buf(buf);

    switch (pMsg.header.msgType) {
        case DCXO_CTB_FULLSET_UPDATE:
            DCXO_UPDATE_DBG("DCXO_CTB_FULLSET_UPDATE");
            /* set ACK */
            if (pMsg.header.response != 0x0) {
                DCXO_UPDATE_DBG("CTB FULLSET_UPDATE ack/nck field should be 0x0\n");
                return;
            }

            dcxo_ctb_sem_wait();
            memcpy((void *)ctb_tbl, pMsg.payload.setTable, sizeof(Full_set_table_t)*DCXO_TEMPERATURE_RANGE);
            dcxo_ctb_sem_release();

            if (g_enable_ctb_loop != true) {
                g_enable_ctb_loop = true;
                s5js100_dcxo_start_ctb_loop(ctb_tbl);
            }

            /* setting done and response to CP */
            pMsg.header.response = DCXO_RESPONSE_ACK; /* 4B for response */
            break;

        case DCXO_TEMP_REQUEST:
            /* response TSU value */
            pMsg.header.response = s5js100_tsu_get_temperature();/* GET TSU to decimal ? */
            pMsg.header.response1 = s5js100_dcxo_get_coarse_tune_value();/* GET CTB at same time */
            DCXO_UPDATE_DBG("DCXO_TEMP_REQUEST temperature(%d) coarse_tune_value(%d)", pMsg.header.response - 50000, pMsg.header.response1);
            break;

        case DCXO_CTB_FORCE_REQUEST_FOR_FACTORY_CAL:
            DCXO_UPDATE_DBG("DCXO_CTB_FORCE_REQUEST_FOR_FACTORY_CAL");
            /* setting done and response to CP */
            dcxo_ctb_sem_wait();
            force_ctb = pMsg.payload.resolution; /* 2B for force ctb value */
            s5js100_dcxo_set_tune_value((unsigned int)force_ctb, 4096);
            dcxo_ctb_sem_release();
            break;

        case DCXO_GET_CTB_REQUEST:
            pMsg.header.response = s5js100_dcxo_get_coarse_tune_value(); /* 4B for response */
            DCXO_UPDATE_DBG("DCXO_GET_CTB_REQUEST coarse_tune_value(%d)", pMsg.header.response);
            break;

        case DCXO_GET_TSX_INFO_REQUEST:
            pMsg.header.response = S5JS100_TSX_TYPE; /* 4B for response */
            DCXO_UPDATE_DBG("DCXO_GET_TSX_INFO_REQUEST TSX_INFO(%d)", pMsg.header.response);
            break;

        default:
            DCXO_UPDATE_DBG("dcxo msg type wrong..\n");
            return;
    }

    if (pMsg.header.msgType != DCXO_CTB_FORCE_REQUEST_FOR_FACTORY_CAL) {
        mio->write((char *)(&(pMsg.header)), sizeof(UpdateInd_header_t));
    }
}

extern "C" {

    void dcxo_init(void)
    {
        char mio_name[32] = "dcxo";
        ctb_tbl = (Full_set_table_t *)malloc(sizeof(Full_set_table_t) * DCXO_TEMPERATURE_RANGE);

        dcxo_mio = getModemIoDeviceByName(mio_name);
        dcxo_mio->register_ReadCb(dcxo_update_task, NULL);
    }

}