mirror of https://github.com/F-Stack/f-stack.git
431 lines
19 KiB
C
431 lines
19 KiB
C
|
/* Copyright (c) 2008-2011 Freescale Semiconductor, Inc.
|
||
|
* 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 Freescale Semiconductor nor the
|
||
|
* names of its contributors may be used to endorse or promote products
|
||
|
* derived from this software without specific prior written permission.
|
||
|
*
|
||
|
*
|
||
|
* ALTERNATIVELY, this software may be distributed under the terms of the
|
||
|
* GNU General Public License ("GPL") as published by the Free Software
|
||
|
* Foundation, either version 2 of that License or (at your option) any
|
||
|
* later version.
|
||
|
*
|
||
|
* THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``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 Freescale Semiconductor 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 ncsw_ext.h
|
||
|
|
||
|
@Description General NetCommSw Standard Definitions
|
||
|
*//***************************************************************************/
|
||
|
|
||
|
#ifndef __NCSW_EXT_H
|
||
|
#define __NCSW_EXT_H
|
||
|
|
||
|
#include "memcpy_ext.h"
|
||
|
|
||
|
|
||
|
#define WRITE_BLOCK IOMemSet32
|
||
|
#define COPY_BLOCK Mem2IOCpy32
|
||
|
|
||
|
#define PTR_TO_UINT(_ptr) ((uintptr_t)(_ptr))
|
||
|
#define UINT_TO_PTR(_val) ((void*)(uintptr_t)(_val))
|
||
|
|
||
|
#define PTR_MOVE(_ptr, _offset) (void*)((uint8_t*)(_ptr) + (_offset))
|
||
|
|
||
|
|
||
|
#define WRITE_UINT8_UINT24(arg, data08, data24) WRITE_UINT32(arg,((uint32_t)(data08)<<24)|((uint32_t)(data24)&0x00FFFFFF))
|
||
|
#define WRITE_UINT24_UINT8(arg, data24, data08) WRITE_UINT32(arg,((uint32_t)(data24)<< 8)|((uint32_t)(data08)&0x000000FF))
|
||
|
|
||
|
/* Little-Endian access macros */
|
||
|
|
||
|
#define WRITE_UINT16_LE(arg, data) \
|
||
|
WRITE_UINT16((arg), SwapUint16(data))
|
||
|
|
||
|
#define WRITE_UINT32_LE(arg, data) \
|
||
|
WRITE_UINT32((arg), SwapUint32(data))
|
||
|
|
||
|
#define WRITE_UINT64_LE(arg, data) \
|
||
|
WRITE_UINT64((arg), SwapUint64(data))
|
||
|
|
||
|
#define GET_UINT16_LE(arg) \
|
||
|
SwapUint16(GET_UINT16(arg))
|
||
|
|
||
|
#define GET_UINT32_LE(arg) \
|
||
|
SwapUint32(GET_UINT32(arg))
|
||
|
|
||
|
#define GET_UINT64_LE(arg) \
|
||
|
SwapUint64(GET_UINT64(arg))
|
||
|
|
||
|
/* Write and Read again macros */
|
||
|
#define WRITE_UINT_SYNC(size, arg, data) \
|
||
|
do { \
|
||
|
WRITE_UINT##size((arg), (data)); \
|
||
|
CORE_MemoryBarrier(); \
|
||
|
} while (0)
|
||
|
|
||
|
#define WRITE_UINT8_SYNC(arg, data) WRITE_UINT_SYNC(8, (arg), (data))
|
||
|
|
||
|
#define WRITE_UINT16_SYNC(arg, data) WRITE_UINT_SYNC(16, (arg), (data))
|
||
|
#define WRITE_UINT32_SYNC(arg, data) WRITE_UINT_SYNC(32, (arg), (data))
|
||
|
|
||
|
#define MAKE_UINT64(high32, low32) (((uint64_t)high32 << 32) | (low32))
|
||
|
|
||
|
|
||
|
/*----------------------*/
|
||
|
/* Miscellaneous macros */
|
||
|
/*----------------------*/
|
||
|
|
||
|
#define UNUSED(X) (X=X)
|
||
|
|
||
|
#define KILOBYTE 0x400UL /* 1024 */
|
||
|
#define MEGABYTE (KILOBYTE * KILOBYTE) /* 1024*1024 */
|
||
|
#define GIGABYTE (KILOBYTE * MEGABYTE) /* 1024*1024*1024 */
|
||
|
|
||
|
#undef NO_IRQ
|
||
|
#define NO_IRQ (-1)
|
||
|
#define NCSW_MASTER_ID (0)
|
||
|
|
||
|
/* Macro for checking if a number is a power of 2 */
|
||
|
#define POWER_OF_2(n) (!((n) & ((n)-1)))
|
||
|
|
||
|
/* Macro for calculating log of base 2 */
|
||
|
#define LOG2(num, log2Num) \
|
||
|
do \
|
||
|
{ \
|
||
|
uint64_t tmp = (num); \
|
||
|
log2Num = 0; \
|
||
|
while (tmp > 1) \
|
||
|
{ \
|
||
|
log2Num++; \
|
||
|
tmp >>= 1; \
|
||
|
} \
|
||
|
} while (0)
|
||
|
|
||
|
#define NEXT_POWER_OF_2(_num, _nextPow) \
|
||
|
do \
|
||
|
{ \
|
||
|
if (POWER_OF_2(_num)) \
|
||
|
_nextPow = (_num); \
|
||
|
else \
|
||
|
{ \
|
||
|
uint64_t tmp = (_num); \
|
||
|
_nextPow = 1; \
|
||
|
while (tmp) \
|
||
|
{ \
|
||
|
_nextPow <<= 1; \
|
||
|
tmp >>= 1; \
|
||
|
} \
|
||
|
} \
|
||
|
} while (0)
|
||
|
|
||
|
/* Ceiling division - not the fastest way, but safer in terms of overflow */
|
||
|
#define DIV_CEIL(x,y) (((x)/(y)) + ((((((x)/(y)))*(y)) == (x)) ? 0 : 1))
|
||
|
|
||
|
/* Round up a number to be a multiple of a second number */
|
||
|
#define ROUND_UP(x,y) ((((x) + (y) - 1) / (y)) * (y))
|
||
|
|
||
|
/* Timing macro for converting usec units to number of ticks. */
|
||
|
/* (number of usec * clock_Hz) / 1,000,000) - since */
|
||
|
/* clk is in MHz units, no division needed. */
|
||
|
#define USEC_TO_CLK(usec,clk) ((usec) * (clk))
|
||
|
#define CYCLES_TO_USEC(cycles,clk) ((cycles) / (clk))
|
||
|
|
||
|
/* Timing macros for converting between nsec units and number of clocks. */
|
||
|
#define NSEC_TO_CLK(nsec,clk) DIV_CEIL(((nsec) * (clk)), 1000)
|
||
|
#define CYCLES_TO_NSEC(cycles,clk) (((cycles) * 1000) / (clk))
|
||
|
|
||
|
/* Timing macros for converting between psec units and number of clocks. */
|
||
|
#define PSEC_TO_CLK(psec,clk) DIV_CEIL(((psec) * (clk)), 1000000)
|
||
|
#define CYCLES_TO_PSEC(cycles,clk) (((cycles) * 1000000) / (clk))
|
||
|
|
||
|
/* Min, Max macros */
|
||
|
#define NCSW_MIN(a,b) ((a) < (b) ? (a) : (b))
|
||
|
#define NCSW_MAX(a,b) ((a) > (b) ? (a) : (b))
|
||
|
#define IN_RANGE(min,val,max) ((min)<=(val) && (val)<=(max))
|
||
|
|
||
|
#define ABS(a) ((a<0)?(a*-1):a)
|
||
|
|
||
|
#if !(defined(ARRAY_SIZE))
|
||
|
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
|
||
|
#endif /* !defined(ARRAY_SIZE) */
|
||
|
|
||
|
|
||
|
/* possible alignments */
|
||
|
#define HALF_WORD_ALIGNMENT 2
|
||
|
#define WORD_ALIGNMENT 4
|
||
|
#define DOUBLE_WORD_ALIGNMENT 8
|
||
|
#define BURST_ALIGNMENT 32
|
||
|
|
||
|
#define HALF_WORD_ALIGNED 0x00000001
|
||
|
#define WORD_ALIGNED 0x00000003
|
||
|
#define DOUBLE_WORD_ALIGNED 0x00000007
|
||
|
#define BURST_ALIGNED 0x0000001f
|
||
|
#ifndef IS_ALIGNED
|
||
|
#define IS_ALIGNED(n,align) (!((uint32_t)(n) & (align - 1)))
|
||
|
#endif /* IS_ALIGNED */
|
||
|
|
||
|
|
||
|
#define LAST_BUF 1
|
||
|
#define FIRST_BUF 2
|
||
|
#define SINGLE_BUF (LAST_BUF | FIRST_BUF)
|
||
|
#define MIDDLE_BUF 4
|
||
|
|
||
|
#define ARRAY_END -1
|
||
|
|
||
|
#define ILLEGAL_BASE (~0)
|
||
|
|
||
|
#define BUF_POSITION(first, last) state[(!!(last))<<1 | !!(first)]
|
||
|
#define DECLARE_POSITION static uint8_t state[4] = { (uint8_t)MIDDLE_BUF, (uint8_t)FIRST_BUF, (uint8_t)LAST_BUF, (uint8_t)SINGLE_BUF };
|
||
|
|
||
|
|
||
|
/**************************************************************************//**
|
||
|
@Description Timers operation mode
|
||
|
*//***************************************************************************/
|
||
|
typedef enum e_TimerMode
|
||
|
{
|
||
|
e_TIMER_MODE_INVALID = 0,
|
||
|
e_TIMER_MODE_FREE_RUN, /**< Free run - counter continues to increase
|
||
|
after reaching the reference value. */
|
||
|
e_TIMER_MODE_PERIODIC, /**< Periodic - counter restarts counting from 0
|
||
|
after reaching the reference value. */
|
||
|
e_TIMER_MODE_SINGLE /**< Single (one-shot) - counter stops counting
|
||
|
after reaching the reference value. */
|
||
|
} e_TimerMode;
|
||
|
|
||
|
|
||
|
/**************************************************************************//**
|
||
|
@Description Enumeration (bit flags) of communication modes (Transmit,
|
||
|
receive or both).
|
||
|
*//***************************************************************************/
|
||
|
typedef enum e_CommMode
|
||
|
{
|
||
|
e_COMM_MODE_NONE = 0, /**< No transmit/receive communication */
|
||
|
e_COMM_MODE_RX = 1, /**< Only receive communication */
|
||
|
e_COMM_MODE_TX = 2, /**< Only transmit communication */
|
||
|
e_COMM_MODE_RX_AND_TX = 3 /**< Both transmit and receive communication */
|
||
|
} e_CommMode;
|
||
|
|
||
|
/**************************************************************************//**
|
||
|
@Description General Diagnostic Mode
|
||
|
*//***************************************************************************/
|
||
|
typedef enum e_DiagMode
|
||
|
{
|
||
|
e_DIAG_MODE_NONE = 0, /**< Normal operation; no diagnostic mode */
|
||
|
e_DIAG_MODE_CTRL_LOOPBACK, /**< Loopback in the controller */
|
||
|
e_DIAG_MODE_CHIP_LOOPBACK, /**< Loopback in the chip but not in the
|
||
|
controller; e.g. IO-pins, SerDes, etc. */
|
||
|
e_DIAG_MODE_PHY_LOOPBACK, /**< Loopback in the external PHY */
|
||
|
e_DIAG_MODE_EXT_LOOPBACK, /**< Loopback in the external line (beyond the PHY) */
|
||
|
e_DIAG_MODE_CTRL_ECHO, /**< Echo incoming data by the controller */
|
||
|
e_DIAG_MODE_PHY_ECHO /**< Echo incoming data by the PHY */
|
||
|
} e_DiagMode;
|
||
|
|
||
|
/**************************************************************************//**
|
||
|
@Description Possible RxStore callback responses.
|
||
|
*//***************************************************************************/
|
||
|
typedef enum e_RxStoreResponse
|
||
|
{
|
||
|
e_RX_STORE_RESPONSE_PAUSE /**< Pause invoking callback with received data;
|
||
|
in polling mode, start again invoking callback
|
||
|
only next time user invokes the receive routine;
|
||
|
in interrupt mode, start again invoking callback
|
||
|
only next time a receive event triggers an interrupt;
|
||
|
in all cases, received data that are pending are not
|
||
|
lost, rather, their processing is temporarily deferred;
|
||
|
in all cases, received data are processed in the order
|
||
|
in which they were received. */
|
||
|
, e_RX_STORE_RESPONSE_CONTINUE /**< Continue invoking callback with received data. */
|
||
|
} e_RxStoreResponse;
|
||
|
|
||
|
|
||
|
/**************************************************************************//**
|
||
|
@Description General Handle
|
||
|
*//***************************************************************************/
|
||
|
typedef void * t_Handle; /**< handle, used as object's descriptor */
|
||
|
|
||
|
/**************************************************************************//**
|
||
|
@Description MUTEX type
|
||
|
*//***************************************************************************/
|
||
|
typedef uint32_t t_Mutex;
|
||
|
|
||
|
/**************************************************************************//**
|
||
|
@Description Error Code.
|
||
|
|
||
|
The high word of the error code is the code of the software
|
||
|
module (driver). The low word is the error type (e_ErrorType).
|
||
|
To get the values from the error code, use GET_ERROR_TYPE()
|
||
|
and GET_ERROR_MODULE().
|
||
|
*//***************************************************************************/
|
||
|
typedef uint32_t t_Error;
|
||
|
|
||
|
/**************************************************************************//**
|
||
|
@Description General prototype of interrupt service routine (ISR).
|
||
|
|
||
|
@Param[in] handle - Optional handle of the module handling the interrupt.
|
||
|
|
||
|
@Return None
|
||
|
*//***************************************************************************/
|
||
|
typedef void (t_Isr)(t_Handle handle);
|
||
|
|
||
|
/**************************************************************************//**
|
||
|
@Anchor mem_attr
|
||
|
|
||
|
@Collection Memory Attributes
|
||
|
|
||
|
Various attributes of memory partitions. These values may be
|
||
|
or'ed together to create a mask of all memory attributes.
|
||
|
@{
|
||
|
*//***************************************************************************/
|
||
|
#define MEMORY_ATTR_CACHEABLE 0x00000001
|
||
|
/**< Memory is cacheable */
|
||
|
#define MEMORY_ATTR_QE_2ND_BUS_ACCESS 0x00000002
|
||
|
/**< Memory can be accessed by QUICC Engine
|
||
|
through its secondary bus interface */
|
||
|
|
||
|
/* @} */
|
||
|
|
||
|
|
||
|
/**************************************************************************//**
|
||
|
@Function t_GetBufFunction
|
||
|
|
||
|
@Description User callback function called by driver to get data buffer.
|
||
|
|
||
|
User provides this function. Driver invokes it.
|
||
|
|
||
|
@Param[in] h_BufferPool - A handle to buffer pool manager
|
||
|
@Param[out] p_BufContextHandle - Returns the user's private context that
|
||
|
should be associated with the buffer
|
||
|
|
||
|
@Return Pointer to data buffer, NULL if error
|
||
|
*//***************************************************************************/
|
||
|
typedef uint8_t * (t_GetBufFunction)(t_Handle h_BufferPool,
|
||
|
t_Handle *p_BufContextHandle);
|
||
|
|
||
|
/**************************************************************************//**
|
||
|
@Function t_PutBufFunction
|
||
|
|
||
|
@Description User callback function called by driver to return data buffer.
|
||
|
|
||
|
User provides this function. Driver invokes it.
|
||
|
|
||
|
@Param[in] h_BufferPool - A handle to buffer pool manager
|
||
|
@Param[in] p_Buffer - A pointer to buffer to return
|
||
|
@Param[in] h_BufContext - The user's private context associated with
|
||
|
the returned buffer
|
||
|
|
||
|
@Return E_OK on success; Error code otherwise
|
||
|
*//***************************************************************************/
|
||
|
typedef t_Error (t_PutBufFunction)(t_Handle h_BufferPool,
|
||
|
uint8_t *p_Buffer,
|
||
|
t_Handle h_BufContext);
|
||
|
|
||
|
/**************************************************************************//**
|
||
|
@Function t_PhysToVirt
|
||
|
|
||
|
@Description Translates a physical address to the matching virtual address.
|
||
|
|
||
|
@Param[in] addr - The physical address to translate.
|
||
|
|
||
|
@Return Virtual address.
|
||
|
*//***************************************************************************/
|
||
|
typedef void * t_PhysToVirt(physAddress_t addr);
|
||
|
|
||
|
/**************************************************************************//**
|
||
|
@Function t_VirtToPhys
|
||
|
|
||
|
@Description Translates a virtual address to the matching physical address.
|
||
|
|
||
|
@Param[in] addr - The virtual address to translate.
|
||
|
|
||
|
@Return Physical address.
|
||
|
*//***************************************************************************/
|
||
|
typedef physAddress_t t_VirtToPhys(void *addr);
|
||
|
|
||
|
/**************************************************************************//**
|
||
|
@Description Buffer Pool Information Structure.
|
||
|
*//***************************************************************************/
|
||
|
typedef struct t_BufferPoolInfo
|
||
|
{
|
||
|
t_Handle h_BufferPool; /**< A handle to the buffer pool manager */
|
||
|
t_GetBufFunction *f_GetBuf; /**< User callback to get a free buffer */
|
||
|
t_PutBufFunction *f_PutBuf; /**< User callback to return a buffer */
|
||
|
uint16_t bufferSize; /**< Buffer size (in bytes) */
|
||
|
|
||
|
t_PhysToVirt *f_PhysToVirt; /**< User callback to translate pool buffers
|
||
|
physical addresses to virtual addresses */
|
||
|
t_VirtToPhys *f_VirtToPhys; /**< User callback to translate pool buffers
|
||
|
virtual addresses to physical addresses */
|
||
|
} t_BufferPoolInfo;
|
||
|
|
||
|
|
||
|
/**************************************************************************//**
|
||
|
@Description User callback function called by driver when transmit completed.
|
||
|
|
||
|
User provides this function. Driver invokes it.
|
||
|
|
||
|
@Param[in] h_App - Application's handle, as was provided to the
|
||
|
driver by the user
|
||
|
@Param[in] queueId - Transmit queue ID
|
||
|
@Param[in] p_Data - Pointer to the data buffer
|
||
|
@Param[in] h_BufContext - The user's private context associated with
|
||
|
the given data buffer
|
||
|
@Param[in] status - Transmit status and errors
|
||
|
@Param[in] flags - Driver-dependent information
|
||
|
*//***************************************************************************/
|
||
|
typedef void (t_TxConfFunction)(t_Handle h_App,
|
||
|
uint32_t queueId,
|
||
|
uint8_t *p_Data,
|
||
|
t_Handle h_BufContext,
|
||
|
uint16_t status,
|
||
|
uint32_t flags);
|
||
|
|
||
|
/**************************************************************************//**
|
||
|
@Description User callback function called by driver with receive data.
|
||
|
|
||
|
User provides this function. Driver invokes it.
|
||
|
|
||
|
@Param[in] h_App - Application's handle, as was provided to the
|
||
|
driver by the user
|
||
|
@Param[in] queueId - Receive queue ID
|
||
|
@Param[in] p_Data - Pointer to the buffer with received data
|
||
|
@Param[in] h_BufContext - The user's private context associated with
|
||
|
the given data buffer
|
||
|
@Param[in] length - Length of received data
|
||
|
@Param[in] status - Receive status and errors
|
||
|
@Param[in] position - Position of buffer in frame
|
||
|
@Param[in] flags - Driver-dependent information
|
||
|
|
||
|
@Retval e_RX_STORE_RESPONSE_CONTINUE - order the driver to continue Rx
|
||
|
operation for all ready data.
|
||
|
@Retval e_RX_STORE_RESPONSE_PAUSE - order the driver to stop Rx operation.
|
||
|
*//***************************************************************************/
|
||
|
typedef e_RxStoreResponse (t_RxStoreFunction)(t_Handle h_App,
|
||
|
uint32_t queueId,
|
||
|
uint8_t *p_Data,
|
||
|
t_Handle h_BufContext,
|
||
|
uint32_t length,
|
||
|
uint16_t status,
|
||
|
uint8_t position,
|
||
|
uint32_t flags);
|
||
|
|
||
|
|
||
|
#endif /* __NCSW_EXT_H */
|