text: /*
   * Copyright (c) 2018-2019, Texas Instruments Incorporated
   * All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * *  Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * *  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.
   *
   * *  Neither the name of Texas Instruments Incorporated 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 OWNER 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.
   */
  
  /*
   * ======== CC1352P1_LAUNCHXL_fxns.c ========
   *  This file contains the board-specific initialization functions, and
   *  RF callback function for antenna switching.
   */
  
  #include <stdbool.h>
  #include <stddef.h>
  #include <stdint.h>
  
  #include <ti/devices/cc13x2_cc26x2/driverlib/ioc.h>
  #include <ti/devices/cc13x2_cc26x2/driverlib/cpu.h>
  #include <ti/drivers/pin/PINCC26XX.h>
  
  #include <ti/drivers/Board.h>
  
  /*
   *  ======== CC1352P1_LAUNCHXL_sendExtFlashByte ========
   */
  void CC1352P1_LAUNCHXL_sendExtFlashByte(PIN_Handle pinHandle, uint8_t byte)
  {
      uint8_t i;
  
      /* SPI Flash CS */
      PIN_setOutputValue(pinHandle, IOID_20, 0);
  
      for (i = 0; i < 8; i++) {
          PIN_setOutputValue(pinHandle, IOID_10, 0);  /* SPI Flash CLK */
  
          /* SPI Flash MOSI */
          PIN_setOutputValue(pinHandle, IOID_9, (byte >> (7 - i)) & 0x01);
          PIN_setOutputValue(pinHandle, IOID_10, 1);  /* SPI Flash CLK */
  
          /*
           * Waste a few cycles to keep the CLK high for at
           * least 45% of the period.
           * 3 cycles per loop: 8 loops @ 48 Mhz = 0.5 us.
           */
          CPUdelay(8);
      }
  
      PIN_setOutputValue(pinHandle, IOID_10, 0);  /* CLK */
      PIN_setOutputValue(pinHandle, IOID_20, 1);  /* CS */
  
      /*
       * Keep CS high at least 40 us
       * 3 cycles per loop: 700 loops @ 48 Mhz ~= 44 us
       */
      CPUdelay(700);
  }
  
  /*
   *  ======== CC1352P1_LAUNCHXL_wakeUpExtFlash ========
   */
  void CC1352P1_LAUNCHXL_wakeUpExtFlash(void)
  {
      PIN_Config extFlashPinTable[] = {
          /* SPI Flash CS */
          IOID_20 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL |
                  PIN_INPUT_DIS | PIN_DRVSTR_MED,
          PIN_TERMINATE
      };
      PIN_State extFlashPinState;
      PIN_Handle extFlashPinHandle = PIN_open(&extFlashPinState, extFlashPinTable);
  
      /*
       *  To wake up we need to toggle the chip select at
       *  least 20 ns and ten wait at least 35 us.
       */
  
      /* Toggle chip select for ~20ns to wake ext. flash */
      PIN_setOutputValue(extFlashPinHandle, IOID_20, 0);
      /* 3 cycles per loop: 1 loop @ 48 Mhz ~= 62 ns */
      CPUdelay(1);
      PIN_setOutputValue(extFlashPinHandle, IOID_20, 1);
      /* 3 cycles per loop: 560 loops @ 48 Mhz ~= 35 us */
      CPUdelay(560);
  
      PIN_close(extFlashPinHandle);
  }
  
  /*
   *  ======== CC1352P1_LAUNCHXL_shutDownExtFlash ========
   */
  void CC1352P1_LAUNCHXL_shutDownExtFlash(void)
  {
      /* To be sure we are putting the flash into sleep and not waking it, we first have to make a wake up call */
      CC1352P1_LAUNCHXL_wakeUpExtFlash();
  
      PIN_Config extFlashPinTable[] = {
          /* SPI Flash CS*/
          IOID_20 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL |
                  PIN_INPUT_DIS | PIN_DRVSTR_MED,
          /* SPI Flash CLK */
          IOID_10 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL |
                  PIN_INPUT_DIS | PIN_DRVSTR_MED,
          /* SPI Flash MOSI */
          IOID_9 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL |
                  PIN_INPUT_DIS | PIN_DRVSTR_MED,
          /* SPI Flash MISO */
          IOID_8 | PIN_INPUT_EN | PIN_PULLDOWN,
          PIN_TERMINATE
      };
      PIN_State extFlashPinState;
      PIN_Handle extFlashPinHandle = PIN_open(&extFlashPinState, extFlashPinTable);
  
      uint8_t extFlashShutdown = 0xB9;
  
      CC1352P1_LAUNCHXL_sendExtFlashByte(extFlashPinHandle, extFlashShutdown);
  
      PIN_close(extFlashPinHandle);
  }
  
  /*
   *  ======== Board_initHook ========
   *  Called by Board_init() to perform board-specific initialization.
   */
  void Board_initHook()
  {
      CC1352P1_LAUNCHXL_shutDownExtFlash();
  }
  