#ifndef _SUBMODULE_CFG_H
#define _SUBMODULE_CFG_H

//************************************ Глобальные (публичные) константы *************************************

// Коды команд протокола обмена
typedef enum 
{
    // Запись и чтение памяти субмодуля
    TCP_CMD_SM_WRITE_MEM        = 0x80,
    TCP_CMD_SM_READ_MEM         = 0x81,
} subm_tcp_cmd_codes_t; 



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

// Формат адреса [13:0]:
// [13:9] - номер логического блока (до 32 блоков)
// [8:0]  - адрес регистра (до 512 регистров на лог.блок)

// Регистры ПЛИС:


// Submodule registers
#define FPGA_REG_SM_MASK                 (0x2000) // номер блока - b"10000" проболжение (9 бит) b"0_0000_0000"
// SPI
#define FPGA_REG_SM_ADDR_SPI_TX          (FPGA_REG_SM_MASK | 0x0000) // (0x0200)
#define FPGA_REG_SM_ADDR_SPI_RX          (FPGA_REG_SM_MASK | 0x0001) // (0x0201)
#define FPGA_REG_SM_ADDR_CLKEN           (FPGA_REG_SM_MASK | 0x0002) // (0x0202)
// PWR
#define FPGA_REG_SM_ADDR_PWR             (FPGA_REG_SM_MASK | 0x0003)

//! регистров по факту нет
// #define FPGA_REG_SM_ADDR_STS1            (0x2005) // (0x0205)
// #define FPGA_REG_SM_ADDR_STS2            (0x2006) // (0x0206)

// #define FPGA_REG_SM_ADDR_CTRL1           (0x200A) // (0x020A)
// #define FPGA_REG_SM_ADDR_CTRL2           (0x200B) // (0x020B)
// #define FPGA_REG_SM_ADDR_CTRL3           (0x200C) // (0x020C)

// todo - добавить регистры записи калибровки

// A27-xxxx
#define FPGA_REG_ADDR_DR0                (FPGA_REG_SM_MASK | 0x0020)
#define FPGA_REG_ADDR_DR1                (FPGA_REG_SM_MASK | 0x0021)
#define FPGA_REG_ADDR_DR2                (FPGA_REG_SM_MASK | 0x0022)
#define FPGA_REG_ADDR_DR3                (FPGA_REG_SM_MASK | 0x0023)

// Текущее значение каналов (асинхронное чтение)
#define FPGA_REG_ADDR_CH0_OUT            (FPGA_REG_SM_MASK | 0x0040)
#define FPGA_REG_ADDR_CH1_OUT            (FPGA_REG_SM_MASK | 0x0041)
#define FPGA_REG_ADDR_CH2_OUT            (FPGA_REG_SM_MASK | 0x0042)
#define FPGA_REG_ADDR_CH3_OUT            (FPGA_REG_SM_MASK | 0x0043)
#define FPGA_REG_ADDR_CH4_OUT            (FPGA_REG_SM_MASK | 0x0044)
#define FPGA_REG_ADDR_CH5_OUT            (FPGA_REG_SM_MASK | 0x0045)
#define FPGA_REG_ADDR_CH6_OUT            (FPGA_REG_SM_MASK | 0x0046)
#define FPGA_REG_ADDR_CH7_OUT            (FPGA_REG_SM_MASK | 0x0047)
#define FPGA_REG_ADDR_CH8_OUT            (FPGA_REG_SM_MASK | 0x0048)
#define FPGA_REG_ADDR_CH9_OUT            (FPGA_REG_SM_MASK | 0x0049)
#define FPGA_REG_ADDR_CH10_OUT           (FPGA_REG_SM_MASK | 0x004A)
#define FPGA_REG_ADDR_CH11_OUT           (FPGA_REG_SM_MASK | 0x004B)
#define FPGA_REG_ADDR_CH12_OUT           (FPGA_REG_SM_MASK | 0x004C)
#define FPGA_REG_ADDR_CH13_OUT           (FPGA_REG_SM_MASK | 0x004D)
#define FPGA_REG_ADDR_CH14_OUT           (FPGA_REG_SM_MASK | 0x004E)
#define FPGA_REG_ADDR_CH15_OUT           (FPGA_REG_SM_MASK | 0x004F)

// H27-xxxx
// todo - регистры вых. счетчиков, задания частоты сбора данных со счетчиков
// Выходы каналов


// SPI-EEPROM IC protocol
// Примечание: ПЛИС получает биты для отправки и кол-во бит.
//
// Формат (4 байта):
// [31:29] - резерв
// [28:24] - кол-во бит для передачи
// [23:18] - резерв
// [17:0]  - данные для передачи
//
// Формат обмена - дуплексный.
// После записи в регистр SPI_TX выполняется отправка данных по SPI (в mosi).
// По завершению передачи, в регистр SPI_RX записываются полученные данные и
// статус контроллера (1 - свободен, 0 - занят).
// Примечание - статус можно читать в любое время.

// Для обращения к микросхеме нужно:
// 1) выбрать 1 из 8 CS (запись 1) и отключить одноименную линию F_CLK (запись 0).
// 2) выполнить отправку команд в соответствии с док на микросхему.
// 3) отключить CS и включить F_CLK

#define FPGA_SPI_OP_READ_DATA         (0x120300FF)
#define FPGA_SPI_OP_WRITE_MASK        (0x12028000)
#define FPGA_SPI_OP_WE                (0x0A000260)
#define FPGA_SPI_OP_WD                (0x0A000200)

#define FPGA_SPI_RX_STS_MASK          (0x00040000) // бит 18 = 1
#define FPGA_SPI_RX_ALL_DATA_MASK     (0x0003FFFF) // биты 17..0 = 1
#define FPGA_SPI_RX_DATA_MASK         (0x000000FF) // биты 7..0

#define FPGA_CLK_EN_FCLK_OFF_MASK     (0x00000000)
#define FPGA_CLK_EN_FCLK_1_ON_MASK    (0x00000100)
#define FPGA_CLK_EN_FCLK_2_ON_MASK    (0x00000200)
#define FPGA_CLK_EN_FCLK_3_ON_MASK    (0x00000400)
#define FPGA_CLK_EN_FCLK_4_ON_MASK    (0x00000800)
#define FPGA_CLK_EN_FCLK_5_ON_MASK    (0x00001000)
#define FPGA_CLK_EN_FCLK_6_ON_MASK    (0x00002000)
#define FPGA_CLK_EN_FCLK_7_ON_MASK    (0x00004000)
#define FPGA_CLK_EN_FCLK_8_ON_MASK    (0x00008000)
#define FPGA_CLK_EN_FCLK_ALL_ON_MASK  (0x0000FF00)

#define FPGA_CLK_EN_CS_OFF_MASK       (0x00000000)
#define FPGA_CLK_EN_CS_1_ON_MASK      (0x00000001)
#define FPGA_CLK_EN_CS_2_ON_MASK      (0x00000002)
#define FPGA_CLK_EN_CS_3_ON_MASK      (0x00000004)
#define FPGA_CLK_EN_CS_4_ON_MASK      (0x00000008)
#define FPGA_CLK_EN_CS_5_ON_MASK      (0x00000010)
#define FPGA_CLK_EN_CS_6_ON_MASK      (0x00000020)
#define FPGA_CLK_EN_CS_7_ON_MASK      (0x00000040)
#define FPGA_CLK_EN_CS_8_ON_MASK      (0x00000080)

// PWR
#define FPGA_PWM_ON_MASK              (0x01) // b"01"
#define FPGA_SHUNT_ON_MASK            (0x02) // b"10"
#define FPGA_PWM_SHUNT_ON_MASK        (0x03) // b"11"


// Decimation ratio mask
#define FPGA_DR0_MASK                 (0x000000FF)
#define FPGA_DR1_MASK                 (0x0000FF00)
#define FPGA_DR2_MASK                 (0x00FF0000)
#define FPGA_DR3_MASK                 (0xFF000000)
 
#define FPGA_DR4_MASK                 (0x000000FF)
#define FPGA_DR5_MASK                 (0x0000FF00)
#define FPGA_DR6_MASK                 (0x00FF0000)
#define FPGA_DR7_MASK                 (0xFF000000)
 
#define FPGA_DR8_MASK                 (0x000000FF)
#define FPGA_DR9_MASK                 (0x0000FF00)
#define FPGA_DR10_MASK                (0x00FF0000)
#define FPGA_DR11_MASK                (0xFF000000)
 
#define FPGA_DR12_MASK                (0x000000FF)
#define FPGA_DR13_MASK                (0x0000FF00)
#define FPGA_DR14_MASK                (0x00FF0000)
#define FPGA_DR15_MASK                (0xFF000000)



#endif

//*********************************************** КОНЕЦ ФАЙЛА ***********************************************
