blob: 180b7d331256ee64afb54e0b3060e38de7f300f9 [file] [log] [blame]
/*
* Copyright (c) 2020, Texas Instruments Incorporated
* Copyright (c) 2020 Linaro Ltd.
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/zephyr.h>
#include <zephyr/device.h>
#include <zephyr/drivers/gpio.h>
#include <driverlib/cpu.h>
#define GPIO_PORT DT_NODELABEL(gpio0)
#define DIO8_PIN 8
#define DIO9_PIN 9
#define DIO10_PIN 10
#define DIO20_PIN 20
/*
* ======== CC1352R1_LAUNCHXL_sendExtFlashByte ========
*/
void CC1352R1_LAUNCHXL_sendExtFlashByte(const struct device *dev,
uint8_t byte)
{
uint8_t i;
/* SPI Flash CS */
gpio_pin_set(dev, DIO20_PIN, 0);
for (i = 0; i < 8; i++) {
gpio_pin_set(dev, DIO10_PIN, 0); /* SPI Flash CLK */
/* SPI Flash MOSI */
gpio_pin_set(dev, DIO9_PIN, (byte >> (7 - i)) & 0x01);
gpio_pin_set(dev, DIO10_PIN, 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);
}
gpio_pin_set(dev, DIO10_PIN, 0); /* CLK */
gpio_pin_set(dev, DIO20_PIN, 1); /* CS */
/*
* Keep CS high at least 40 us
* 3 cycles per loop: 700 loops @ 48 Mhz ~= 44 us
*/
CPUdelay(700);
}
/*
* ======== CC1352R1_LAUNCHXL_wakeUpExtFlash ========
*/
void CC1352R1_LAUNCHXL_wakeUpExtFlash(const struct device *dev)
{
/*
* 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 */
gpio_pin_set(dev, DIO20_PIN, 0);
/* 3 cycles per loop: 1 loop @ 48 Mhz ~= 62 ns */
CPUdelay(1);
gpio_pin_set(dev, DIO20_PIN, 1);
/* 3 cycles per loop: 560 loops @ 48 Mhz ~= 35 us */
CPUdelay(560);
}
/*
* ======== CC1352R1_LAUNCHXL_shutDownExtFlash ========
*/
void CC1352R1_LAUNCHXL_shutDownExtFlash(void)
{
const struct device *dev;
uint8_t extFlashShutdown = 0xB9;
dev = DEVICE_DT_GET(GPIO_PORT);
if (!device_is_ready(dev)) {
printk("%s: device not ready.\n", dev->name);
return;
}
/* Set SPI Flash CS pin as output */
gpio_pin_configure(dev, DIO20_PIN, GPIO_OUTPUT);
/* Set SPI Flash CLK pin as output */
gpio_pin_configure(dev, DIO10_PIN, GPIO_OUTPUT);
/* Set SPI Flash MOSI pin as output */
gpio_pin_configure(dev, DIO9_PIN, GPIO_OUTPUT);
/* Set SPI Flash MISO pin as input */
gpio_pin_configure(dev, DIO8_PIN, GPIO_INPUT | GPIO_PULL_DOWN);
/*
* To be sure we are putting the flash into sleep and not waking it,
* we first have to make a wake up call
*/
CC1352R1_LAUNCHXL_wakeUpExtFlash(dev);
CC1352R1_LAUNCHXL_sendExtFlashByte(dev, extFlashShutdown);
}