Commit 73631711 authored by Grzegorz Daniluk's avatar Grzegorz Daniluk Committed by Adam Wujek

adding simple functions to read/write aux diagnostics words from HDL

parent b5e318d8
......@@ -7,6 +7,7 @@
* Released according to the GNU GPL, version 2 or any later version.
*/
#include "syscon.h"
#include <errno.h>
struct s_i2c_if i2c_if[2] = {
{SYSC_GPSR_FMC_SCL, SYSC_GPSR_FMC_SDA},
......@@ -43,3 +44,65 @@ void timer_delay(uint32_t tics)
while (time_before(timer_get_tics(), t_end))
;
}
static int diag_rw_words, diag_ro_words;
/****************************
* AUX Diagnostics
***************************/
void diag_read_info(uint32_t *id, uint32_t *ver, uint32_t *nrw, uint32_t *nro)
{
diag_rw_words = SYSC_DIAG_NW_RW_R(syscon->DIAG_NW);
diag_ro_words = SYSC_DIAG_NW_RO_R(syscon->DIAG_NW);
if (id)
*id = SYSC_DIAG_INFO_ID_R(syscon->DIAG_INFO);
if (ver)
*ver = SYSC_DIAG_INFO_VER_R(syscon->DIAG_INFO);
if (nrw)
*nrw = diag_rw_words;
if (nro)
*nro = diag_ro_words;
}
int diag_read_word(uint32_t adr, int bank, uint32_t *val)
{
if (!val)
return -EINVAL;
if (diag_rw_words == 0) {
pp_printf("fetching diag_rw_words\n");
diag_rw_words = SYSC_DIAG_NW_RW_R(syscon->DIAG_NW);
}
if (diag_ro_words == 0) {
pp_printf("fetching diag_ro_words\n");
diag_ro_words = SYSC_DIAG_NW_RO_R(syscon->DIAG_NW);
}
if ((bank == DIAG_RW_BANK && adr >= diag_rw_words) ||
(bank == DIAG_RO_BANK && adr >= diag_ro_words)) {
*val = 0;
return -EINVAL;
}
if (bank == DIAG_RO_BANK)
adr += diag_rw_words;
syscon->DIAG_CR = SYSC_DIAG_CR_ADR_W(adr);
*val = syscon->DIAG_DAT;
return 0;
}
int diag_write_word(uint32_t adr, uint32_t val)
{
if (adr >= diag_rw_words)
return -EINVAL;
syscon->DIAG_DAT = val;
syscon->DIAG_CR = SYSC_DIAG_CR_RW | SYSC_DIAG_CR_ADR_W(adr);
return 0;
}
......@@ -3,7 +3,7 @@
* File : wrc_syscon_regs.h
* Author : auto-generated by wbgen2 from wrc_syscon_wb.wb
* Created : Wed Sep 25 14:35:39 2013
* Created : Mon Jul 11 14:59:51 2016
* Standard : ANSI C
THIS FILE WAS GENERATED BY wbgen2 FROM SOURCE FILE wrc_syscon_wb.wb
......@@ -135,6 +135,47 @@
#define SYSC_TCR_ENABLE WBGEN2_GEN_MASK(31, 1)
/* definitions for register: Timer Counter Value Register */
/* definitions for register: User Diag: version register */
/* definitions for field: Ver in reg: User Diag: version register */
#define SYSC_DIAG_INFO_VER_MASK WBGEN2_GEN_MASK(0, 16)
#define SYSC_DIAG_INFO_VER_SHIFT 0
#define SYSC_DIAG_INFO_VER_W(value) WBGEN2_GEN_WRITE(value, 0, 16)
#define SYSC_DIAG_INFO_VER_R(reg) WBGEN2_GEN_READ(reg, 0, 16)
/* definitions for field: Id in reg: User Diag: version register */
#define SYSC_DIAG_INFO_ID_MASK WBGEN2_GEN_MASK(16, 16)
#define SYSC_DIAG_INFO_ID_SHIFT 16
#define SYSC_DIAG_INFO_ID_W(value) WBGEN2_GEN_WRITE(value, 16, 16)
#define SYSC_DIAG_INFO_ID_R(reg) WBGEN2_GEN_READ(reg, 16, 16)
/* definitions for register: User Diag: number of words */
/* definitions for field: Read/write words in reg: User Diag: number of words */
#define SYSC_DIAG_NW_RW_MASK WBGEN2_GEN_MASK(0, 16)
#define SYSC_DIAG_NW_RW_SHIFT 0
#define SYSC_DIAG_NW_RW_W(value) WBGEN2_GEN_WRITE(value, 0, 16)
#define SYSC_DIAG_NW_RW_R(reg) WBGEN2_GEN_READ(reg, 0, 16)
/* definitions for field: Read-only words in reg: User Diag: number of words */
#define SYSC_DIAG_NW_RO_MASK WBGEN2_GEN_MASK(16, 16)
#define SYSC_DIAG_NW_RO_SHIFT 16
#define SYSC_DIAG_NW_RO_W(value) WBGEN2_GEN_WRITE(value, 16, 16)
#define SYSC_DIAG_NW_RO_R(reg) WBGEN2_GEN_READ(reg, 16, 16)
/* definitions for register: User Diag: Control Register */
/* definitions for field: Address in reg: User Diag: Control Register */
#define SYSC_DIAG_CR_ADR_MASK WBGEN2_GEN_MASK(0, 16)
#define SYSC_DIAG_CR_ADR_SHIFT 0
#define SYSC_DIAG_CR_ADR_W(value) WBGEN2_GEN_WRITE(value, 0, 16)
#define SYSC_DIAG_CR_ADR_R(reg) WBGEN2_GEN_READ(reg, 0, 16)
/* definitions for field: R/W in reg: User Diag: Control Register */
#define SYSC_DIAG_CR_RW WBGEN2_GEN_MASK(31, 1)
/* definitions for register: User Diag: data to read/write */
/* [0x0]: REG Syscon reset register */
#define SYSC_REG_RSTR 0x00000000
/* [0x4]: REG GPIO Set/Readback Register */
......@@ -147,4 +188,12 @@
#define SYSC_REG_TCR 0x00000010
/* [0x14]: REG Timer Counter Value Register */
#define SYSC_REG_TVR 0x00000014
/* [0x18]: REG User Diag: version register */
#define SYSC_REG_DIAG_INFO 0x00000018
/* [0x1c]: REG User Diag: number of words */
#define SYSC_REG_DIAG_NW 0x0000001c
/* [0x20]: REG User Diag: Control Register */
#define SYSC_REG_DIAG_CR 0x00000020
/* [0x24]: REG User Diag: data to read/write */
#define SYSC_REG_DIAG_DAT 0x00000024
#endif
......@@ -51,6 +51,10 @@ struct SYSCON_WB {
uint32_t HWFR; /*Hardware Feature Register */
uint32_t TCR; /*Timer Control Register */
uint32_t TVR; /*Timer Counter Value Register */
uint32_t DIAG_INFO;
uint32_t DIAG_NW;
uint32_t DIAG_CR;
uint32_t DIAG_DAT;
};
/*GPIO pins*/
......@@ -101,5 +105,11 @@ static inline int sysc_get_memsize(void)
return (SYSC_HWFR_MEMSIZE_R(syscon->HWFR) + 1) * 16;
}
#define DIAG_RW_BANK 0
#define DIAG_RO_BANK 1
void diag_read_info(uint32_t *id, uint32_t *ver, uint32_t *nrw, uint32_t *nro);
int diag_read_word(uint32_t adr, int bank, uint32_t *val);
int diag_write_word(uint32_t adr, uint32_t val);
#endif /* CONFIG_WR_NODE */
#endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment