aboutsummaryrefslogtreecommitdiffstats
path: root/firmware/usrp3/n230/n230_eeprom.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/usrp3/n230/n230_eeprom.c')
-rw-r--r--firmware/usrp3/n230/n230_eeprom.c196
1 files changed, 0 insertions, 196 deletions
diff --git a/firmware/usrp3/n230/n230_eeprom.c b/firmware/usrp3/n230/n230_eeprom.c
deleted file mode 100644
index 8f756d41f..000000000
--- a/firmware/usrp3/n230/n230_eeprom.c
+++ /dev/null
@@ -1,196 +0,0 @@
-//
-// Copyright 2014 Ettus Research LLC
-//
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program. If not, see <http://www.gnu.org/licenses/>.
-//
-
-#include "../../../host/lib/usrp/n230/n230_eeprom.h"
-
-#include <trace.h>
-#include <stddef.h>
-#include <flash/spi_flash.h>
-#include <flash/spif_spsn_s25flxx.h>
-#include <string.h> //memcpy
-
-#include "../../../host/lib/usrp/n230/n230_fw_defs.h"
-#include "../../../host/lib/usrp/n230/n230_fw_host_iface.h"
-
-static const wb_spi_slave_t flash_spi_slave = {
- .base = (void*) 0xB000,
- .slave_sel = 0x0001,
- .clk_div = 4, //80MHz/4 = 20MHz
- .mosi_edge = RISING,
- .miso_edge = FALLING,
- .lsb_first = false
-};
-
-static const spi_flash_dev_t spi_flash_device = {
- .page_size = 256,
- .sector_size = 65536,
- .num_sectors = 254,
- .bus = &flash_spi_slave
-};
-
-/***********************************************************************
- * Non-volatile device data
- **********************************************************************/
-#define N230_FLASH_NV_DATA_OFFSET 0x800000
-
-//Default values in case the EEPROM is not read, corrupt
-const n230_eeprom_map_t default_eeprom = {
- .data_version_major = N230_EEPROM_VER_MAJOR,
- .data_version_minor = N230_EEPROM_VER_MINOR,
- .hw_revision = 0,
- .hw_product = 0x01,
- .gateway = N230_DEFAULT_GATEWAY,
- .eth_info = {
- { //eth0
- .mac_addr = N230_DEFAULT_ETH0_MAC,
- .subnet = N230_DEFAULT_ETH0_MASK,
- .ip_addr = N230_DEFAULT_ETH0_IP
- },
- { //eth1
- .mac_addr = N230_DEFAULT_ETH1_MAC,
- .subnet = N230_DEFAULT_ETH1_MASK,
- .ip_addr = N230_DEFAULT_ETH1_IP
- }
- }
-};
-
-//EEPROM cache
-static spi_flash_session_t flash_session = {.device = NULL};
-static n230_eeprom_map_t eeprom_cache;
-static bool cache_dirty = true;
-
-bool read_n230_eeprom()
-{
- bool status = false;
- if (flash_session.device == NULL) { //Initialize flash session structure for the first time
- wb_spi_init(spi_flash_device.bus);
- spif_init(&flash_session, &spi_flash_device, spif_spsn_s25flxx_operations());
- }
- spif_read_sync(&flash_session, N230_FLASH_NV_DATA_OFFSET, &eeprom_cache, sizeof(n230_eeprom_map_t));
-
- //Verify data format
- status = (eeprom_cache.data_version_major == default_eeprom.data_version_major);
- //Sanity communication info
- if (eeprom_cache.eth_info[0].ip_addr == 0xFFFFFFFF)
- eeprom_cache.eth_info[0].ip_addr = default_eeprom.eth_info[0].ip_addr;
- if (eeprom_cache.eth_info[1].ip_addr == 0xFFFFFFFF)
- eeprom_cache.eth_info[1].ip_addr = default_eeprom.eth_info[1].ip_addr;
- if (eeprom_cache.eth_info[0].subnet == 0xFFFFFFFF)
- eeprom_cache.eth_info[0].subnet = default_eeprom.eth_info[0].subnet;
- if (eeprom_cache.eth_info[1].subnet == 0xFFFFFFFF)
- eeprom_cache.eth_info[1].subnet = default_eeprom.eth_info[1].subnet;
-
- if (!status) {
- UHD_FW_TRACE(WARN, "read_n230_eeprom: Initialized cache to the default map.");
- memcpy(&eeprom_cache, &default_eeprom, sizeof(n230_eeprom_map_t));
- }
- cache_dirty = !status;
- return status;
-}
-
-bool write_n230_eeprom()
-{
- //Assumption: sizeof(n230_eeprom_map_t) <= flash_page_size
- //This function would need to be reimplemented if this assumption is no longer true
- if (sizeof(n230_eeprom_map_t) > flash_session.device->page_size) {
- UHD_FW_TRACE(ERROR, "write_n230_eeprom: sizeof(n230_eeprom_map_t) > flash_page_size");
- return false;
- }
-
- bool status = true;
- if (cache_dirty) {
- n230_eeprom_map_t device_eeprom;
- spif_read_sync(&flash_session, N230_FLASH_NV_DATA_OFFSET, &device_eeprom, sizeof(n230_eeprom_map_t));
- if (memcmp(&eeprom_cache, &device_eeprom, sizeof(n230_eeprom_map_t)) != 0) {
- //Cache does not match read state. Write.
- UHD_FW_TRACE(DEBUG, "write_n230_eeprom: Writing data to flash...");
- status = spif_erase_sector_sync(&flash_session, N230_FLASH_NV_DATA_OFFSET);
- if (status) {
- status = spif_write_page_sync(
- &flash_session, N230_FLASH_NV_DATA_OFFSET, &eeprom_cache, sizeof(n230_eeprom_map_t));
- }
- if (!status) {
- UHD_FW_TRACE(ERROR, "write_n230_eeprom: Operation failed!");
- }
- cache_dirty = !status;
- } else {
- UHD_FW_TRACE(DEBUG, "write_n230_eeprom: No new data. Write skipped.");
- //Cache matches read state. So mark as clean
- cache_dirty = false;
- }
- }
- return status;
-}
-
-bool is_n230_eeprom_cache_dirty()
-{
- return cache_dirty;
-}
-
-n230_eeprom_map_t* get_n230_eeprom_map()
-{
- cache_dirty = true;
- return &eeprom_cache;
-}
-
-const n230_eeprom_map_t* get_n230_const_eeprom_map()
-{
- return &eeprom_cache;
-}
-
-const n230_eth_eeprom_map_t* get_n230_ethernet_info(uint32_t iface) {
- if (iface >= N230_NUM_ETH_PORTS) {
- UHD_FW_TRACE_FSTR(ERROR,
- "get_n230_ethernet_info called with iface=%d when there are only %d ports!!!",
- iface, N230_NUM_ETH_PORTS);
- }
- return &(get_n230_const_eeprom_map()->eth_info[iface]);
-}
-
-
-/***********************************************************************
- * Storage for bootstrap FPGA Image
- **********************************************************************/
-#define N230_FLASH_FPGA_IMAGE_OFFSET 0x000000
-#define N230_FLASH_FPGA_IMAGE_SIZE 0x400000
-#define N230_FLASH_NUM_FPGA_IMAGES 2
-
-void read_n230_fpga_image_page(uint32_t offset, void *buf, uint32_t num_bytes)
-{
- if (offset >= (N230_FLASH_NUM_FPGA_IMAGES * N230_FLASH_FPGA_IMAGE_SIZE)) {
- UHD_FW_TRACE_FSTR(ERROR, "read_n230_fpga_image_page: Offset 0x%x out of bounds", offset);
- }
- spif_read_sync(&flash_session, N230_FLASH_FPGA_IMAGE_OFFSET + offset, buf, num_bytes);
-}
-
-bool write_n230_fpga_image_page(uint32_t offset, const void *buf, uint32_t num_bytes)
-{
- if (offset >= (N230_FLASH_NUM_FPGA_IMAGES * N230_FLASH_FPGA_IMAGE_SIZE)) {
- UHD_FW_TRACE_FSTR(ERROR, "write_n230_fpga_image_page: Offset 0x%x out of bounds", offset);
- return false;
- }
- return spif_write_page_sync(&flash_session, N230_FLASH_FPGA_IMAGE_OFFSET + offset, buf, num_bytes);
-}
-
-bool erase_n230_fpga_image_sector(uint32_t offset)
-{
- if (offset >= (N230_FLASH_NUM_FPGA_IMAGES * N230_FLASH_FPGA_IMAGE_SIZE)) {
- UHD_FW_TRACE_FSTR(ERROR, "erase_n230_fpga_image_sector: Offset 0x%x out of bounds", offset);
- return false;
- }
- return spif_erase_sector_sync(&flash_session, N230_FLASH_FPGA_IMAGE_OFFSET + offset);
-}