Commit ea3ceed4 authored by Lucas Russo's avatar Lucas Russo

sm_io/protocols/*: add SPI/I2C higher objects to allow customizing the protocol

parent 6ebda772
......@@ -77,6 +77,11 @@ typedef enum _smpr_err_e smpr_err_e;
/* Opaque sm_pr_t structure */
typedef struct _smpr_t smpr_t;
/* Opaque smpr_spi_t structure */
typedef struct _smpr_spi_t smpr_spi_t;
/* Opaque smpr_i2c_t structure */
typedef struct _smpr_i2c_t smpr_i2c_t;
/* Forward smch_err_e declaration enumeration */
typedef enum _smch_err_e smch_err_e;
/* Opaque sm_ch_24aa64_t structure */
......@@ -125,10 +130,12 @@ typedef struct _zmq_server_args_t zmq_server_args_t;
#include "sm_pr_err.h"
#include "sm_pr.h"
#include "sm_pr_spi.h"
#include "sm_pr_spi_obj.h"
#include "hw/wb_spi_regs.h"
#include "protocols/smpr_spi_regs.h"
#include "protocols/sm_pr_spi_defaults.h"
#include "sm_pr_i2c.h"
#include "sm_pr_i2c_obj.h"
#include "hw/wb_i2c_regs.h"
#include "protocols/smpr_i2c_regs.h"
#include "protocols/sm_pr_i2c_defaults.h"
......
/*
* Copyright (C) 2016 LNLS (www.lnls.br)
* Author: Lucas Russo <lucas.russo@lnls.br>
*
* Released according to the GNU GPL, version 3 or any later version.
*/
#ifndef _SM_PR_I2C_OBJ_H_
#define _SM_PR_I2C_OBJ_H_
#ifdef __cplusplus
extern "C" {
#endif
/* Creates a new instance of the proto_i2c */
smpr_i2c_t *smpr_i2c_new (uint32_t rep_start, uint32_t trans_size, uint32_t addr);
/* Destroy an instance of the i2c */
smpr_err_e smpr_i2c_destroy (smpr_i2c_t **self_p);
/* Set I2C rep_start parameter */
smpr_err_e smpr_i2c_set_rep_start (smpr_i2c_t *self, uint32_t rep_start);
/* Get I2C rep_start parameter */
uint32_t smpr_i2c_get_rep_start (smpr_i2c_t *self);
/* Set I2C trans_size parameter */
smpr_err_e smpr_i2c_set_trans_size (smpr_i2c_t *self, uint32_t trans_size);
/* Get I2C trans_size parameter */
uint32_t smpr_i2c_get_trans_size (smpr_i2c_t *self);
/* Set I2C addr parameter */
smpr_err_e smpr_i2c_set_addr (smpr_i2c_t *self, uint32_t addr);
/* Get I2C addr parameter */
uint32_t smpr_i2c_get_addr (smpr_i2c_t *self);
/* Get SPI CHARLEN parameter */
const smpr_proto_ops_t *smpr_i2c_get_ops (smpr_i2c_t *self);
#ifdef __cplusplus
}
#endif
#endif
/*
* Copyright (C) 2016 LNLS (www.lnls.br)
* Author: Lucas Russo <lucas.russo@lnls.br>
*
* Released according to the GNU GPL, version 3 or any later version.
*/
#ifndef _SM_PR_SPI_OBJ_H_
#define _SM_PR_SPI_OBJ_H_
#ifdef __cplusplus
extern "C" {
#endif
/* Creates a new instance of the proto_spi */
smpr_spi_t *smpr_spi_new (uint32_t ss, uint32_t charlen);
/* Destroy an instance of the spi */
smpr_err_e smpr_spi_destroy (smpr_spi_t **self_p);
/* Set SPI SS parameter */
smpr_err_e smpr_spi_set_ss (smpr_spi_t *self, uint32_t ss);
/* Get SPI SS parameter */
uint32_t smpr_spi_get_ss (smpr_spi_t *self);
/* Set SPI CHARLEN parameter */
smpr_err_e smpr_spi_set_charlen (smpr_spi_t *self, uint32_t charlen);
/* Get SPI CHARLEN parameter */
uint32_t smpr_spi_get_charlen (smpr_spi_t *self);
/* Get SPI CHARLEN parameter */
const smpr_proto_ops_t *smpr_spi_get_ops (smpr_spi_t *self);
#ifdef __cplusplus
}
#endif
#endif
sm_io_protocols_ops_DIR = $(SRC_DIR)/sm_io/protocols/ops
sm_io_protocols_ops_OBJS = $(sm_io_protocols_ops_DIR)/sm_pr_spi.o \
$(sm_io_protocols_ops_DIR)/sm_pr_spi_obj.o \
$(sm_io_protocols_ops_DIR)/sm_pr_i2c.o \
$(sm_io_protocols_ops_DIR)/sm_pr_i2c_obj.o \
$(sm_io_protocols_ops_DIR)/sm_pr_bsmp.o
# $(sm_io_protocols_ops_DIR)/sm_pr_bypass.o \
# $(sm_io_protocols_ops_DIR)/sm_pr_1w.o \
......
/*
* Copyright (C) 2016 LNLS (www.lnls.br)
* Author: Lucas Russo <lucas.russo@lnls.br>
*
* Released according to the GNU GPL, version 3 or any later version.
*/
#include "bpm_server.h"
/* Undef ASSERT_ALLOC to avoid conflicting with other ASSERT_ALLOC */
#ifdef ASSERT_TEST
#undef ASSERT_TEST
#endif
#define ASSERT_TEST(test_boolean, err_str, err_goto_label, /* err_core */ ...) \
ASSERT_HAL_TEST(test_boolean, SM_PR, "[sm_pr:i2c_obj]", \
err_str, err_goto_label, /* err_core */ __VA_ARGS__)
#ifdef ASSERT_ALLOC
#undef ASSERT_ALLOC
#endif
#define ASSERT_ALLOC(ptr, err_goto_label, /* err_core */ ...) \
ASSERT_HAL_ALLOC(ptr, SM_PR, "[sm_pr:i2c_obj]", \
smpr_err_str(SMPR_ERR_ALLOC), \
err_goto_label, /* err_core */ __VA_ARGS__)
#ifdef CHECK_ERR
#undef CHECK_ERR
#endif
#define CHECK_ERR(err, err_type) \
CHECK_HAL_ERR(err, SM_PR, "[sm_pr:i2c_obj]", \
smpr_err_str (err_type))
/* Protocol object specification */
struct _smpr_i2c_t {
/* Must be located first */
smpr_proto_ops_t proto_ops; /* I2C protocol operations */
uint32_t rep_start; /* I2C repetitive start */
uint32_t trans_size; /* I2C transaction size */
uint32_t addr; /* I2C transaction size */
};
/************ Our methods implementation **********/
/* Creates a new instance of the proto_i2c */
smpr_i2c_t *smpr_i2c_new (uint32_t rep_start, uint32_t trans_size, uint32_t addr)
{
smpr_i2c_t *self = (smpr_i2c_t *) zmalloc (sizeof *self);
ASSERT_ALLOC (self, err_smpr_i2c_alloc);
/* copy I2C operations */
self->proto_ops = smpr_proto_ops_i2c;
self->rep_start = rep_start;
self->trans_size = trans_size;
self->addr = addr;
return self;
err_smpr_i2c_alloc:
return NULL;
}
/* Destroy an instance of the i2c */
smpr_err_e smpr_i2c_destroy (smpr_i2c_t **self_p)
{
assert (self_p);
if (*self_p) {
smpr_i2c_t *self = *self_p;
free (self);
self_p = NULL;
}
return SMPR_SUCCESS;
}
smpr_err_e smpr_i2c_set_rep_start (smpr_i2c_t *self, uint32_t rep_start)
{
assert (self);
self->rep_start = rep_start;
return SMPR_SUCCESS;
}
uint32_t smpr_i2c_get_rep_start (smpr_i2c_t *self)
{
assert (self);
return self->rep_start;
}
smpr_err_e smpr_i2c_set_trans_size (smpr_i2c_t *self, uint32_t trans_size)
{
assert (self);
self->trans_size = trans_size;
return SMPR_SUCCESS;
}
uint32_t smpr_i2c_get_trans_size (smpr_i2c_t *self)
{
assert (self);
return self->trans_size;
}
smpr_err_e smpr_i2c_set_addr (smpr_i2c_t *self, uint32_t addr)
{
assert (self);
self->addr = addr;
return SMPR_SUCCESS;
}
uint32_t smpr_i2c_get_addr (smpr_i2c_t *self)
{
assert (self);
return self->addr;
}
const smpr_proto_ops_t *smpr_i2c_get_ops (smpr_i2c_t *self)
{
assert (self);
return &self->proto_ops;
}
/*
* Copyright (C) 2016 LNLS (www.lnls.br)
* Author: Lucas Russo <lucas.russo@lnls.br>
*
* Released according to the GNU GPL, version 3 or any later version.
*/
#include "bpm_server.h"
/* Undef ASSERT_ALLOC to avoid conflicting with other ASSERT_ALLOC */
#ifdef ASSERT_TEST
#undef ASSERT_TEST
#endif
#define ASSERT_TEST(test_boolean, err_str, err_goto_label, /* err_core */ ...) \
ASSERT_HAL_TEST(test_boolean, SM_PR, "[sm_pr:spi_obj]", \
err_str, err_goto_label, /* err_core */ __VA_ARGS__)
#ifdef ASSERT_ALLOC
#undef ASSERT_ALLOC
#endif
#define ASSERT_ALLOC(ptr, err_goto_label, /* err_core */ ...) \
ASSERT_HAL_ALLOC(ptr, SM_PR, "[sm_pr:spi_obj]", \
smpr_err_str(SMPR_ERR_ALLOC), \
err_goto_label, /* err_core */ __VA_ARGS__)
#ifdef CHECK_ERR
#undef CHECK_ERR
#endif
#define CHECK_ERR(err, err_type) \
CHECK_HAL_ERR(err, SM_PR, "[sm_pr:spi_obj]", \
smpr_err_str (err_type))
/* Protocol object specification */
struct _smpr_spi_t {
/* Must be located first */
smpr_proto_ops_t proto_ops; /* SPI protocol operations */
uint32_t ss; /* SPI Slave Select */
uint32_t charlen; /* SPI character length:
0 is 128-bit data word, 1 is 1 bit, 2 is 2-bit and so on */
};
/************ Our methods implementation **********/
/* Creates a new instance of the proto_spi */
smpr_spi_t *smpr_spi_new (uint32_t ss, uint32_t charlen)
{
smpr_spi_t *self = (smpr_spi_t *) zmalloc (sizeof *self);
ASSERT_ALLOC (self, err_smpr_spi_alloc);
/* copy SPI operations */
self->proto_ops = smpr_proto_ops_spi;
self->ss = ss;
self->charlen = charlen;
return self;
err_smpr_spi_alloc:
return NULL;
}
/* Destroy an instance of the spi */
smpr_err_e smpr_spi_destroy (smpr_spi_t **self_p)
{
assert (self_p);
if (*self_p) {
smpr_spi_t *self = *self_p;
free (self);
self_p = NULL;
}
return SMPR_SUCCESS;
}
smpr_err_e smpr_spi_set_ss (smpr_spi_t *self, uint32_t ss)
{
assert (self);
self->ss = ss;
return SMPR_SUCCESS;
}
uint32_t smpr_spi_get_ss (smpr_spi_t *self)
{
assert (self);
return self->ss;
}
smpr_err_e smpr_spi_set_charlen (smpr_spi_t *self, uint32_t charlen)
{
assert (self);
self->charlen = charlen;
return SMPR_SUCCESS;
}
uint32_t smpr_spi_get_charlen (smpr_spi_t *self)
{
assert (self);
return self->charlen;
}
const smpr_proto_ops_t *smpr_spi_get_ops (smpr_spi_t *self)
{
assert (self);
return &self->proto_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