//*****************************************************************************
//
//! @file am_util_id.c
//!
//! @brief Identification of the Ambiq Micro device.
//!
//! This module contains functions for run time identification of Ambiq Micro
//! devices.
//
//*****************************************************************************

//*****************************************************************************
//
// Copyright (c) 2017, Ambiq Micro
// All rights reserved.
// 
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
// 
// 1. Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
// 
// 2. Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
// 
// 3. Neither the name of the copyright holder nor the names of its
// contributors may be used to endorse or promote products derived from this
// software without specific prior written permission.
// 
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
//
// This is part of revision v1.2.10-2-gea660ad-hotfix2 of the AmbiqSuite Development Package.
//
//*****************************************************************************
#include <stdint.h>
#include <stdbool.h>
#include "am_util_id.h"


//*****************************************************************************
//
// Globals.
//
//*****************************************************************************
//
// Strings for use with pui8VendorName.
//
static const uint8_t g_DeviceNameApollo[]     = "Apollo";
static const uint8_t g_DeviceNameApollo2[]    = "Apollo2";
static const uint8_t g_ui8VendorNameAmbq[]    = "AMBQ";
static const uint8_t g_ui8VendorNameUnknown[] = "????";
static const uint8_t g_ui8DeviceNameUnknown[] = "Unknown device";

//*****************************************************************************
//
//! @brief Device identification.
//!
//! @param psIDDevice - ptr to a device ID structure (am_util_id_t*) to be
//! filled in by the function.
//!
//! This function provides additional information about the currently running
//! Ambiq Micro MCU device.
//!
//! @returns The ui32Device value, which is a value corresponding to the
//! device type.
//
//*****************************************************************************
uint32_t
am_util_id_device(am_util_id_t *psIDDevice)
{
    uint32_t ux, ui32PN;

    //
    // Go get all the device (hardware) info from the HAL
    //
    am_hal_mcuctrl_device_info_get(&psIDDevice->sMcuCtrlDevice);

    //
    // Device identification
    //
    ui32PN = psIDDevice->sMcuCtrlDevice.ui32ChipPN  &
             AM_UTIL_MCUCTRL_CHIP_INFO_PARTNUM_PN_M;

    if ( (psIDDevice->sMcuCtrlDevice.ui32JedecCID   == 0xB105100D)          &&
         (psIDDevice->sMcuCtrlDevice.ui32JedecJEPID == 0x0000009B)          &&
         ((psIDDevice->sMcuCtrlDevice.ui32JedecPN & 0xF00) != 0xE00) )
    {
        //
        // It's Ambiq Micro, set up the VENDORID.
        //
        psIDDevice->pui8VendorName = g_ui8VendorNameAmbq;
    }
    else
    {
        //
        // For now, set it as unknown vendor, but we may change it later.
        //
        psIDDevice->pui8VendorName = g_ui8VendorNameUnknown;
    }

    if ( psIDDevice->sMcuCtrlDevice.ui32VendorID ==
         (('A' << 24) | ('M' << 16) | ('B' << 8) | ('Q' << 0)) )
    {
        //
        // VENDORID is AMBQ, so set the string pointer.
        //
        psIDDevice->pui8VendorName = g_ui8VendorNameAmbq;
    }

    if ( ((psIDDevice->sMcuCtrlDevice.ui32JedecPN & 0x0F0) == 0x0E0)        &&
         ( ui32PN == AM_UTIL_MCUCTRL_CHIP_INFO_PARTNUM_APOLLO ) )
    {
        psIDDevice->ui32Device = AM_UTIL_ID_APOLLO;
        psIDDevice->pui8DeviceName = g_DeviceNameApollo;

        //
        // ui32ChipRev[7:4]: 0=n/a, 1=A, 2=B, ...
        // ui32ChipRev[3:0]: 0=Rev0, 1=Rev1, ...
        //
        ux = ((psIDDevice->sMcuCtrlDevice.ui32ChipRev & 0xF0) >> 4);
        psIDDevice->ui8ChipRevMaj  = (uint8_t)('A' - 1 + ux);
        ux = ((psIDDevice->sMcuCtrlDevice.ui32ChipRev & 0x0F) >> 0);
        psIDDevice->ui8ChipRevMin = (uint8_t)('0' + ux);

        //
        // Force the vendor name for Apollo, which did not support VENDORID.
        //
        psIDDevice->pui8VendorName = g_ui8VendorNameAmbq;
    }
    else if ( ((psIDDevice->sMcuCtrlDevice.ui32JedecPN & 0x0F0) == 0x0D0)   &&
              ( ui32PN == AM_UTIL_MCUCTRL_CHIP_INFO_PARTNUM_APOLLO2 ) )
    {
        psIDDevice->ui32Device = AM_UTIL_ID_APOLLO2;
        psIDDevice->pui8DeviceName = g_DeviceNameApollo2;

        //
        // ui32ChipRev[7:4]: 0=n/a, 1=A, 2=B, ...
        // ui32ChipRev[3:0]: 0=Rev0, 1=Rev1, ...
        //
        ux = ((psIDDevice->sMcuCtrlDevice.ui32ChipRev & 0xF0) >> 4);
        psIDDevice->ui8ChipRevMaj  = (uint8_t)('A' - 1 + ux);
        ux = ((psIDDevice->sMcuCtrlDevice.ui32ChipRev & 0x0F) >> 0);
        psIDDevice->ui8ChipRevMin = (uint8_t)('0' + ux);
    }
    else
    {
        psIDDevice->ui32Device = AM_UTIL_ID_UNKNOWN;
        psIDDevice->pui8DeviceName = g_ui8DeviceNameUnknown;
        psIDDevice->ui8ChipRevMaj = (uint8_t)'?';
        psIDDevice->ui8ChipRevMin = (uint8_t)' ';
    }

    return psIDDevice->ui32Device;
}
