Commit eb8534bd authored by Lucas Russo's avatar Lucas Russo

sm_io/*/fmc250m_4ch/*: add ISLA216P test mode function

parent 79a2f4d0
......@@ -110,7 +110,9 @@
#define FMC250M_4CH_NAME_RST_ADCS "fmc250m_4ch_rst_adcs"
#define FMC250M_4CH_OPCODE_RST_DIV_ADCS 46
#define FMC250M_4CH_NAME_RST_DIV_ADCS "fmc250m_4ch_rst_div_adcs"
#define FMC250M_4CH_OPCODE_END 47
#define FMC250M_4CH_OPCODE_TESTMODE 47
#define FMC250M_4CH_NAME_TESTMODE "fmc250m_4ch_test_mode"
#define FMC250M_4CH_OPCODE_END 48
/* Messaging Reply OPCODES */
#define FMC250M_4CH_REPLY_TYPE uint32_t
......
......@@ -49,6 +49,16 @@ smio_fmc250m_4ch_t * smio_fmc250m_4ch_new (smio_t *parent)
ASSERT_TEST(inst_id < NUM_FMC250M_4CH_SMIOS, "Number of FMC250M_4CH SMIOs instances exceeded",
err_num_fmc250m_4ch_smios);
/* Setup ISLA216P ADC SPI communication */
self->smch_isla216p_adc0 = smch_isla216p_new (parent, FMC_250M_ISLA216P_SPI_OFFS, 0, 0);
ASSERT_ALLOC(self->smch_isla216p_adc0, err_smch_isla216p_adc0);
self->smch_isla216p_adc1 = smch_isla216p_new (parent, FMC_250M_ISLA216P_SPI_OFFS, 1, 0);
ASSERT_ALLOC(self->smch_isla216p_adc1, err_smch_isla216p_adc1);
self->smch_isla216p_adc2 = smch_isla216p_new (parent, FMC_250M_ISLA216P_SPI_OFFS, 2, 0);
ASSERT_ALLOC(self->smch_isla216p_adc2, err_smch_isla216p_adc2);
self->smch_isla216p_adc3 = smch_isla216p_new (parent, FMC_250M_ISLA216P_SPI_OFFS, 3, 0);
ASSERT_ALLOC(self->smch_isla216p_adc3, err_smch_isla216p_adc3);
/* FMC250M_4CH isntance 0 is the one controlling this CI */
/* FIXME: This breaks generality for this class */
if (inst_id == 0) {
......@@ -150,6 +160,14 @@ err_smch_24aa64_alloc:
smch_pca9547_destroy (&self->smch_pca9547);
}
err_smch_pca9547_alloc:
smch_isla216p_destroy (&self->smch_isla216p_adc3);
err_smch_isla216p_adc3:
smch_isla216p_destroy (&self->smch_isla216p_adc2);
err_smch_isla216p_adc2:
smch_isla216p_destroy (&self->smch_isla216p_adc1);
err_smch_isla216p_adc1:
smch_isla216p_destroy (&self->smch_isla216p_adc0);
err_smch_isla216p_adc0:
err_num_fmc250m_4ch_smios:
free (self);
err_self_alloc:
......
......@@ -10,6 +10,10 @@
#define SMIO_AD9510_HANDLER(smio_handler) ((smch_ad9510_t *) smio_handler->smch_ad9510)
#define SMIO_SI57X_HANDLER(smio_handler) ((smch_si57x_t *) smio_handler->smch_si571)
#define SMIO_ISLA216P_HANDLER0(smio_handler) ((smch_isla216p_t *) smio_handler->smch_isla216p_adc0)
#define SMIO_ISLA216P_HANDLER1(smio_handler) ((smch_isla216p_t *) smio_handler->smch_isla216p_adc1)
#define SMIO_ISLA216P_HANDLER2(smio_handler) ((smch_isla216p_t *) smio_handler->smch_isla216p_adc2)
#define SMIO_ISLA216P_HANDLER3(smio_handler) ((smch_isla216p_t *) smio_handler->smch_isla216p_adc3)
/* The follosing codes were generated via the following command:
* > echo FMC250M_4CH_ACTIVE | md5sum | cut -c 1-8
......@@ -33,8 +37,11 @@ typedef struct {
fmc250m_4ch_type_e type; /* FMC250M_4CH type */
#if 0
smch_amc7823_t *smch_amc7823; /* AMC7823 chip handler */
smch_isla216p_t *smch_isla216p; /* ISLA216P chip handler */
#endif
smch_isla216p_t *smch_isla216p_adc0; /* ISLA216P 0 chip handler */
smch_isla216p_t *smch_isla216p_adc1; /* ISLA216P 1 chip handler */
smch_isla216p_t *smch_isla216p_adc2; /* ISLA216P 2 chip handler */
smch_isla216p_t *smch_isla216p_adc3; /* ISLA216P 3 chip handler */
smch_ad9510_t *smch_ad9510; /* AD9510 chip handler */
smch_si57x_t *smch_si571; /* SI571 chip handler */
smch_24aa64_t *smch_24aa64; /* 24AA64 chip handler */
......
......@@ -55,6 +55,8 @@
static smch_err_e smch_ad9510_cfg_defaults_compat (smch_ad9510_t *self,
uint32_t *param);
static smch_err_e smch_isla216p_test_mode_compat (smch_isla216p_t *self,
uint32_t *mode);
/************************************************************/
/************ Specific FMC_250M_4CH Operations **************/
......@@ -627,6 +629,109 @@ RW_PARAM_FUNC(fmc250m_4ch, rst_div_adcs) {
NO_FMT_FUNC, SET_FIELD);
}
/* Macros to avoid repetition of the function body ISLA216P */
typedef smch_err_e (*smch_isla216p_func_fp) (smch_isla216p_t *self, uint32_t *param);
#define FMC250M_4CH_ISLA216P_FUNC_NAME(func_name) \
_fmc250m_4ch_isla216p_ ## func_name
#define FMC250M_4CH_ISLA216P_FUNC_NAME_HEADER(func_name) \
static int FMC250M_4CH_ISLA216P_FUNC_NAME(func_name) (void *owner, void *args, void *ret)
#define FMC250M_4CH_ISLA216P_FUNC_BODY(owner, args, ret, read_func, write_func, \
error_msg) \
do { \
assert (owner); \
assert (args); \
\
int err = -FMC250M_4CH_OK; \
SMIO_OWNER_TYPE *self = SMIO_EXP_OWNER(owner); \
smio_fmc250m_4ch_t *fmc250m = smio_get_handler (self); \
ASSERT_TEST(fmc250m != NULL, "Could not get SMIO FMC250M handler", \
err_get_fmc250m_handler, -FMC250M_4CH_ERR); \
smch_isla216p_t *smch_isla216p0 = SMIO_ISLA216P_HANDLER0(fmc250m); \
smch_isla216p_t *smch_isla216p1 = SMIO_ISLA216P_HANDLER1(fmc250m); \
smch_isla216p_t *smch_isla216p2 = SMIO_ISLA216P_HANDLER2(fmc250m); \
smch_isla216p_t *smch_isla216p3 = SMIO_ISLA216P_HANDLER3(fmc250m); \
uint32_t rw = *(uint32_t *) EXP_MSG_ZMQ_FIRST_ARG(args); \
(void) rw; \
uint32_t param = *(uint32_t *) EXP_MSG_ZMQ_NEXT_ARG(args); \
\
DBE_DEBUG (DBG_SM_IO | DBG_LVL_TRACE, "[sm_io:fmc250m_4ch_exp] Calling " \
"ISLA216P function\n"); \
\
smch_err_e serr = SMCH_SUCCESS; \
/* Call specific function */ \
if (rw) { \
WHEN(ISEMPTY(read_func))( \
(void) ret; \
DBE_DEBUG (DBG_SM_IO | DBG_LVL_TRACE, "[sm_io:fmc250m_4ch_exp] " \
"ISLA216P read function not implemented\n"); \
err = -FMC250M_4CH_UNINPL; \
return err; \
) \
WHENNOT(ISEMPTY(read_func))( \
uint32_t value = 0; \
serr = ((smch_isla216p_func_fp) read_func) (smch_isla216p0, \
&value); \
serr |= ((smch_isla216p_func_fp) read_func) (smch_isla216p1, \
&value); \
serr |= ((smch_isla216p_func_fp) read_func) (smch_isla216p2, \
&value); \
serr |= ((smch_isla216p_func_fp) read_func) (smch_isla216p3, \
&value); \
if (serr != SMCH_SUCCESS) { \
err = -FMC250M_4CH_ERR; \
} \
else { \
*((uint32_t *) ret) = value; \
err = sizeof (value); \
DBE_DEBUG (DBG_SM_IO | DBG_LVL_TRACE, "[sm_io:fmc250m_4ch_exp] " \
"ISLA216P function read value = 0x%08X\n", value); \
} \
) \
} \
else { \
WHEN(ISEMPTY(write_func))( \
DBE_DEBUG (DBG_SM_IO | DBG_LVL_TRACE, "[sm_io:fmc250m_4ch_exp] " \
"ISLA216P write function not implemented\n"); \
err = -FMC250M_4CH_UNINPL; \
return err; \
) \
WHENNOT(ISEMPTY(write_func))( \
serr = ((smch_isla216p_func_fp) write_func) (smch_isla216p0, \
&param); \
serr |= ((smch_isla216p_func_fp) write_func) (smch_isla216p1, \
&param); \
serr |= ((smch_isla216p_func_fp) write_func) (smch_isla216p2, \
&param); \
serr |= ((smch_isla216p_func_fp) write_func) (smch_isla216p3, \
&param); \
if (serr != SMCH_SUCCESS) { \
err = -FMC250M_4CH_ERR; \
} \
else { \
err = -FMC250M_4CH_OK; \
} \
) \
} \
\
err_get_fmc250m_handler: \
return err; \
} while(0)
static smch_err_e smch_isla216p_test_mode_compat (smch_isla216p_t *self,
uint32_t *mode)
{
uint8_t test_mode = *(uint8_t *) mode;
return smch_isla216p_set_test_mode (self, test_mode);
}
FMC250M_4CH_ISLA216P_FUNC_NAME_HEADER(test_mode)
{
FMC250M_4CH_ISLA216P_FUNC_BODY(owner, args, ret, /* No read function */,
smch_isla216p_test_mode_compat, "Could not set/get ISLA216P test mode");
}
/* Exported function pointers */
const disp_table_func_fp fmc250m_4ch_exp_fp [] = {
......@@ -681,6 +786,7 @@ const disp_table_func_fp fmc250m_4ch_exp_fp [] = {
FMC250M_4CH_SI571_FUNC_NAME(get_defaults),
RW_PARAM_FUNC_NAME(fmc250m_4ch, rst_adcs),
RW_PARAM_FUNC_NAME(fmc250m_4ch, rst_div_adcs),
FMC250M_4CH_ISLA216P_FUNC_NAME(test_mode),
NULL
};
......
......@@ -580,6 +580,18 @@ disp_op_t fmc250m_4ch_si571_get_defaults_exp = {
}
};
disp_op_t fmc250m_4ch_test_mode_exp = {
.name = FMC250M_4CH_NAME_TESTMODE,
.opcode = FMC250M_4CH_OPCODE_TESTMODE,
.retval = DISP_ARG_END,
.retval_owner = DISP_OWNER_OTHER,
.args = {
DISP_ARG_ENCODE(DISP_ATYPE_UINT32, uint32_t),
DISP_ARG_ENCODE(DISP_ATYPE_UINT32, uint32_t),
DISP_ARG_END
}
};
/* Exported function description */
const disp_op_t *fmc250m_4ch_exp_ops [] = {
&fmc250m_4ch_leds_exp,
......@@ -633,6 +645,7 @@ const disp_op_t *fmc250m_4ch_exp_ops [] = {
&fmc250m_4ch_si571_get_defaults_exp,
&fmc250m_4ch_rst_adcs_exp,
&fmc250m_4ch_rst_div_adcs_exp,
&fmc250m_4ch_test_mode_exp,
NULL
};
......@@ -61,6 +61,7 @@ extern disp_op_t fmc250m_4ch_si571_set_freq_exp;
extern disp_op_t fmc250m_4ch_si571_get_defaults_exp;
extern disp_op_t fmc250m_4ch_rst_adcs_exp;
extern disp_op_t fmc250m_4ch_rst_div_adcs_exp;
extern disp_op_t fmc250m_4ch_test_mode_exp;
extern const disp_op_t *fmc250m_4ch_exp_ops [];
......
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