/*
 * SPDX-FileCopyrightText: 2020 Efabless Corporation
 *
 * 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.
 * SPDX-License-Identifier: Apache-2.0
 */

#include "../../defs.h"

// --------------------------------------------------------

/*
 *	System Control Test
 *	- Enables SPI master
 *	- Uses SPI master to internally access the housekeeping SPI
 *      - Reads default value of SPI-Controlled registers
 *      - Flags failure/success using mprj_io
 */
void main()
{
    int i;
    uint32_t value;

    reg_mprj_datal = 0;

    // Configure upper 16 bits of user GPIO for generating testbench
    // checkpoints.

    reg_mprj_io_31 = GPIO_MODE_MGMT_STD_OUTPUT;
    reg_mprj_io_30 = GPIO_MODE_MGMT_STD_OUTPUT;
    reg_mprj_io_29 = GPIO_MODE_MGMT_STD_OUTPUT;
    reg_mprj_io_28 = GPIO_MODE_MGMT_STD_OUTPUT;
    reg_mprj_io_27 = GPIO_MODE_MGMT_STD_OUTPUT;
    reg_mprj_io_26 = GPIO_MODE_MGMT_STD_OUTPUT;
    reg_mprj_io_25 = GPIO_MODE_MGMT_STD_OUTPUT;
    reg_mprj_io_24 = GPIO_MODE_MGMT_STD_OUTPUT;
    reg_mprj_io_23 = GPIO_MODE_MGMT_STD_OUTPUT;
    reg_mprj_io_22 = GPIO_MODE_MGMT_STD_OUTPUT;
    reg_mprj_io_21 = GPIO_MODE_MGMT_STD_OUTPUT;
    reg_mprj_io_20 = GPIO_MODE_MGMT_STD_OUTPUT;
    reg_mprj_io_19 = GPIO_MODE_MGMT_STD_OUTPUT;
    reg_mprj_io_18 = GPIO_MODE_MGMT_STD_OUTPUT;
    reg_mprj_io_17 = GPIO_MODE_MGMT_STD_OUTPUT;
    reg_mprj_io_16 = GPIO_MODE_MGMT_STD_OUTPUT;

    // Configure next 8 bits for writing the SPI value read on GPIO
    reg_mprj_io_15 = GPIO_MODE_MGMT_STD_OUTPUT;
    reg_mprj_io_14 = GPIO_MODE_MGMT_STD_OUTPUT;
    reg_mprj_io_13 = GPIO_MODE_MGMT_STD_OUTPUT;
    reg_mprj_io_12 = GPIO_MODE_MGMT_STD_OUTPUT;
    reg_mprj_io_11 = GPIO_MODE_MGMT_STD_OUTPUT;
    reg_mprj_io_10 = GPIO_MODE_MGMT_STD_OUTPUT;
    reg_mprj_io_9  = GPIO_MODE_MGMT_STD_OUTPUT;
    reg_mprj_io_8  = GPIO_MODE_MGMT_STD_OUTPUT;

    /* Apply configuration */
    reg_mprj_xfer = 1;
    while (reg_mprj_xfer == 1);

    // Start test
    reg_mprj_datal = 0xA0400000;

    // Enable SPI master
    // SPI master configuration bits:
    // bits 7-0:	Clock prescaler value (default 2)
    // bit  8:		MSB/LSB first (0 = MSB first, 1 = LSB first)
    // bit  9:		CSB sense (0 = inverted, 1 = noninverted)
    // bit 10:		SCK sense (0 = noninverted, 1 = inverted)
    // bit 11:		mode (0 = read/write opposite edges, 1 = same edges)
    // bit 12:		stream (1 = CSB ends transmission)
    // bit 13:		enable (1 = enabled)
    // bit 14:		IRQ enable (1 = enabled)
    // bit 15:		Connect to housekeeping SPI (1 = connected)

    reg_spimaster_config = 0xa002;	// Enable, prescaler = 2,
					// connect to housekeeping SPI

    // Apply stream read (0x40 + 0x03) and read back one byte 

    reg_spimaster_config = 0xb002;	// Apply stream mode
    reg_spimaster_data = 0x40;		// Write 0x40 (read mode)
    reg_spimaster_data = 0x01;		// Write 0x01 (start address)

    reg_spimaster_data = 0x00;		// Write 0x00 for read
    value = reg_spimaster_data;		// Read back byte
    // Write checkpoint
    reg_mprj_datal = 0xA0410000 | (value << 8);	// Mfgr ID (high)

    reg_spimaster_data = 0x00;		// Write 0x00 for read
    value = reg_spimaster_data;		// Read back byte
    // Write checkpoint
    reg_mprj_datal = 0xA0420000 | (value << 8);	// Mfgr ID (low)

    reg_spimaster_data = 0x00;		// Write 0x00 for read
    value = reg_spimaster_data;		// Read back byte
    // Write checkpoint
    reg_mprj_datal = 0xA0430000 | (value << 8);	// Prod ID

    reg_spimaster_config = 0xa102;	// Release CSB (ends stream mode)
    reg_spimaster_config = 0xb002;	// Apply stream mode
    reg_spimaster_data = 0x40;		// Write 0x40 (read mode)
    reg_spimaster_data = 0x08;		// Write 0x08 (start address)

    reg_spimaster_data = 0x00;		// Write 0x00 for read
    value = reg_spimaster_data;		// Read back byte
    // Write checkpoint
    reg_mprj_datal = 0xA0440000 | (value << 8);	// PLL enable

    reg_spimaster_data = 0x00;		// Write 0x00 for read
    value = reg_spimaster_data;		// Read back byte
    // Write checkpoint
    reg_mprj_datal = 0xA0450000 | (value << 8);	// PLL bypass

    reg_spimaster_config = 0xa102;	// Release CSB (ends stream mode)
    reg_spimaster_config = 0xb002;	// Apply stream mode
    reg_spimaster_data = 0x40;		// Write 0x40 (read mode)
    reg_spimaster_data = 0x0d;		// Write 0x0d (start address)

    reg_spimaster_data = 0x00;		// Write 0x00 for read
    value = reg_spimaster_data;		// Read back byte
    // Write checkpoint
    reg_mprj_datal = 0xA0460000 | (value << 8);	// PLL trim (2 high bits)

    reg_spimaster_data = 0x00;		// Write 0x00 for read
    value = reg_spimaster_data;		// Read back byte
    // Write checkpoint
    reg_mprj_datal = 0xA0470000 | (value << 8);	// PLL trim (2nd byte)

    reg_spimaster_data = 0x00;		// Write 0x00 for read
    value = reg_spimaster_data;		// Read back byte
    // Write checkpoint
    reg_mprj_datal = 0xA0480000 | (value << 8);	// PLL trim (3rd byte)

    reg_spimaster_data = 0x00;		// Write 0x00 for read
    value = reg_spimaster_data;		// Read back byte
    // Write checkpoint
    reg_mprj_datal = 0xA0490000 | (value << 8);	// PLL trim (low byte)

    reg_spimaster_data = 0x00;		// Write 0x00 for read
    value = reg_spimaster_data;		// Read back byte
    // Write checkpoint
    reg_mprj_datal = 0xA04a0000 | (value << 8);	// PLL select (3 lowest bits)

    reg_spimaster_data = 0x00;		// Write 0x00 for read
    value = reg_spimaster_data;		// Read back byte
    // Write checkpoint
    reg_mprj_datal = 0xA04b0000 | (value << 8);	// PLL divider (5 lowest bits)

    reg_spimaster_config = 0xa102;	// Release CSB (ends stream mode)
    reg_spimaster_config = 0x2102;	// Release housekeeping SPI

    // End test
    reg_mprj_datal = 0xA0900000;
}

