blob: 7a16f6d892a8a9ccbf07dac6ccffba2e679fd527 [file] [log] [blame]
/*
* Copyright (c) 2015-2017, Texas Instruments Incorporated
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of Texas Instruments Incorporated nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/** ============================================================================
* @file EMAC.h
*
* @brief EMAC driver interface
*
* The EMAC header file should be included in an application as follows:
* @code
* #include <ti/drivers/EMAC.h>
* @endcode
*
* # Implementation #
*
* The EMAC driver interface module is joined (at link time) to a
* NULL-terminated array of EMAC_Config data structures named *EMAC_config*.
* *EMAC_config* is implemented in the application with each entry being an
* instance of a EMAC peripheral. Each entry in *EMAC_config* contains a:
* - (EMAC_FxnTable *) to a set of functions that implement a EMAC peripheral
* - (void *) data object that is associated with the EMAC_FxnTable
* - (void *) hardware attributes that are associated to the EMAC_FxnTable
*
* # Instrumentation #
* The EMAC driver interface produces log statements if instrumentation is
* enabled.
*
* Diagnostics Mask | Log details |
* ---------------- | ----------- |
* Diags_USER1 | basic operations |
* Diags_USER2 | detailed operations |
*
* ============================================================================
*/
#ifndef ti_drivers_EMAC__include
#define ti_drivers_EMAC__include
#ifdef __cplusplus
extern "C" {
#endif
#include <stdbool.h>
#include <stdint.h>
/**
* @defgroup EMAC_CONTROL EMAC_control command and status codes
* These EMAC macros are reservations for EMAC.h
* @{
*/
/*!
* Common EMAC_control command code reservation offset.
* EMAC driver implementations should offset command codes with
* EMAC_CMD_RESERVED growing positively
*
* Example implementation specific command codes:
* @code
* #define EMACXYZ_CMD_COMMAND0 EMAC_CMD_RESERVED + 0
* #define EMACXYZ_CMD_COMMAND1 EMAC_CMD_RESERVED + 1
* @endcode
*/
#define EMAC_CMD_RESERVED 32
/*!
* Common EMAC_control status code reservation offset.
* EMAC driver implementations should offset status codes with
* EMAC_STATUS_RESERVED growing negatively.
*
* Example implementation specific status codes:
* @code
* #define EMACXYZ_STATUS_ERROR0 EMAC_STATUS_RESERVED - 0
* #define EMACXYZ_STATUS_ERROR1 EMAC_STATUS_RESERVED - 1
* #define EMACXYZ_STATUS_ERROR2 EMAC_STATUS_RESERVED - 2
* @endcode
*/
#define EMAC_STATUS_RESERVED -32
/**
* @defgroup EMAC_STATUS Status Codes
* EMAC_STATUS_* macros are general status codes returned by EMAC_control()
* @{
* @ingroup EMAC_CONTROL
*/
/*!
* @brief Successful status code returned by EMAC_control().
*
* EMAC_control() returns EMAC_STATUS_SUCCESS if the control code was executed
* successfully.
*/
#define EMAC_STATUS_SUCCESS 0
/*!
* @brief Generic error status code returned by EMAC_control().
*
* EMAC_control() returns EMAC_STATUS_ERROR if the control code was not executed
* successfully.
*/
#define EMAC_STATUS_ERROR -1
/*!
* @brief An error status code returned by EMAC_control() for undefined
* command codes.
*
* EMAC_control() returns EMAC_STATUS_UNDEFINEDCMD if the control code is not
* recognized by the driver implementation.
*/
#define EMAC_STATUS_UNDEFINEDCMD -2
/** @}*/
/**
* @defgroup EMAC_CMD Command Codes
* EMAC_CMD_* macros are general command codes for EMAC_control(). Not all EMAC
* driver implementations support these command codes.
* @{
* @ingroup EMAC_CONTROL
*/
/* Add Camera_CMD_<commands> here */
/** @}*/
/** @}*/
/* Prototypes of EMAC interface */
typedef void (*EMAC_InitFxn)(uint32_t);
typedef bool (*EMAC_isLinkUpFxn)(uint32_t);
/*!
* @brief EMAC Function table structure
*/
typedef struct EMAC_FxnTable {
EMAC_InitFxn emacInit;
EMAC_isLinkUpFxn emacIsLinkUp;
} EMAC_FxnTable;
/*!
* @brief EMAC Global configuration
*
* The EMAC_Config structure contains a set of pointers used to characterize
* the EMAC driver implementation.
*
* This structure needs to be defined before calling EMAC_init() and it must
* not be changed thereafter.
*
* @sa EMAC_init()
*/
typedef struct EMAC_Config {
/*! Pointer to a table of driver-specific implementations of EMAC APIs */
EMAC_FxnTable const *fxnTablePtr;
/*! Pointer to a driver specific data object */
void *object;
/*! Pointer to a driver specific hardware attributes structure */
void const *hwAttrs;
} EMAC_Config;
/*!
* @brief This function initializes the EMAC driver
*
* This function must be called by the application before the NDK stack
* thread is started.
*
* @pre The EMAC_config structure must exist and be persistent before this
* function can be called. This function must also be called before
* any other EMAC driver APIs. This function call does not modify any
* peripheral registers.
*/
extern void EMAC_init(void);
/*!
* @brief This function returns if the link is up
*
* @return true is the link is up. false if it is down.
*/
extern bool EMAC_isLinkUp(unsigned int index);
#ifdef __cplusplus
}
#endif
#endif /* ti_drivers_EMAC__include */