mirror of https://gitee.com/openkylin/linux.git
257 lines
8.9 KiB
C
257 lines
8.9 KiB
C
/*
|
|
Copyright (c), 2004-2005,2007-2010 Trident Microsystems, 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 Trident Microsystems nor Hauppauge Computer Works
|
|
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 HOLDER 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.
|
|
*/
|
|
|
|
/*******************************************************************************
|
|
* FILENAME: $Id: drx_dap_fasi.h,v 1.5 2009/07/07 14:21:40 justin Exp $
|
|
*
|
|
* DESCRIPTION:
|
|
* Part of DRX driver.
|
|
* Data access protocol: Fast Access Sequential Interface (fasi)
|
|
* Fast access, because of short addressing format (16 instead of 32 bits addr)
|
|
* Sequential, because of I2C.
|
|
*
|
|
* USAGE:
|
|
* Include.
|
|
*
|
|
* NOTES:
|
|
*
|
|
*
|
|
*******************************************************************************/
|
|
|
|
/*-------- compilation control switches --------------------------------------*/
|
|
|
|
#ifndef __DRX_DAP_FASI_H__
|
|
#define __DRX_DAP_FASI_H__
|
|
|
|
/*-------- Required includes -------------------------------------------------*/
|
|
|
|
#include "drx_driver.h"
|
|
|
|
/*-------- Defines, configuring the API --------------------------------------*/
|
|
|
|
/********************************************
|
|
* Allowed address formats
|
|
********************************************/
|
|
|
|
/*
|
|
* Comments about short/long addressing format:
|
|
*
|
|
* The DAP FASI offers long address format (4 bytes) and short address format
|
|
* (2 bytes). The DAP can operate in 3 modes:
|
|
* (1) only short
|
|
* (2) only long
|
|
* (3) both long and short but short preferred and long only when necessary
|
|
*
|
|
* These modes must be selected compile time via compile switches.
|
|
* Compile switch settings for the different modes:
|
|
* (1) DRXDAPFASI_LONG_ADDR_ALLOWED=0, DRXDAPFASI_SHORT_ADDR_ALLOWED=1
|
|
* (2) DRXDAPFASI_LONG_ADDR_ALLOWED=1, DRXDAPFASI_SHORT_ADDR_ALLOWED=0
|
|
* (3) DRXDAPFASI_LONG_ADDR_ALLOWED=1, DRXDAPFASI_SHORT_ADDR_ALLOWED=1
|
|
*
|
|
* The default setting will be (3) both long and short.
|
|
* The default setting will need no compile switches.
|
|
* The default setting must be overridden if compile switches are already
|
|
* defined.
|
|
*
|
|
*/
|
|
|
|
/* set default */
|
|
#if !defined(DRXDAPFASI_LONG_ADDR_ALLOWED)
|
|
#define DRXDAPFASI_LONG_ADDR_ALLOWED 1
|
|
#endif
|
|
|
|
/* set default */
|
|
#if !defined(DRXDAPFASI_SHORT_ADDR_ALLOWED)
|
|
#define DRXDAPFASI_SHORT_ADDR_ALLOWED 1
|
|
#endif
|
|
|
|
/* check */
|
|
#if ((DRXDAPFASI_LONG_ADDR_ALLOWED == 0) && \
|
|
(DRXDAPFASI_SHORT_ADDR_ALLOWED == 0))
|
|
#error At least one of short- or long-addressing format must be allowed.
|
|
*; /* illegal statement to force compiler error */
|
|
#endif
|
|
|
|
/********************************************
|
|
* Single/master multi master setting
|
|
********************************************/
|
|
/*
|
|
* Comments about SINGLE MASTER/MULTI MASTER modes:
|
|
*
|
|
* Consider the two sides:1) the master and 2)the slave.
|
|
*
|
|
* Master:
|
|
* Single/multimaster operation set via DRXDAP_SINGLE_MASTER compile switch
|
|
* + single master mode means no use of repeated starts
|
|
* + multi master mode means use of repeated starts
|
|
* Default is single master.
|
|
* Default can be overridden by setting the compile switch DRXDAP_SINGLE_MASTER.
|
|
*
|
|
* Slave:
|
|
* Single/multi master selected via the flags in the FASI protocol.
|
|
* + single master means remember memory address between i2c packets
|
|
* + multimaster means flush memory address between i2c packets
|
|
* Default is single master, DAP FASI changes multi-master setting silently
|
|
* into single master setting. This cannot be overridden.
|
|
*
|
|
*/
|
|
/* set default */
|
|
#ifndef DRXDAP_SINGLE_MASTER
|
|
#define DRXDAP_SINGLE_MASTER 0
|
|
#endif
|
|
|
|
/********************************************
|
|
* Chunk/mode checking
|
|
********************************************/
|
|
/*
|
|
* Comments about DRXDAP_MAX_WCHUNKSIZE in single or multi master mode and
|
|
* in combination with short and long addressing format. All text below
|
|
* assumes long addressing format. The table also includes information
|
|
* for short ADDRessing format.
|
|
*
|
|
* In single master mode, data can be written by sending the register address
|
|
* first, then two or four bytes of data in the next packet.
|
|
* Because the device address plus a register address equals five bytes,
|
|
* the minimum chunk size must be five.
|
|
* If ten-bit I2C device addresses are used, the minimum chunk size must be six,
|
|
* because the I2C device address will then occupy two bytes when writing.
|
|
*
|
|
* Data in single master mode is transferred as follows:
|
|
* <S> <devW> a0 a1 a2 a3 <P>
|
|
* <S> <devW> d0 d1 [d2 d3] <P>
|
|
* ..
|
|
* or
|
|
* ..
|
|
* <S> <devW> a0 a1 a2 a3 <P>
|
|
* <S> <devR> --- <P>
|
|
*
|
|
* In multi-master mode, the data must immediately follow the address (an I2C
|
|
* stop resets the internal address), and hence the minimum chunk size is
|
|
* 1 <I2C address> + 4 (register address) + 2 (data to send) = 7 bytes (8 if
|
|
* 10-bit I2C device addresses are used).
|
|
*
|
|
* The 7-bit or 10-bit i2c address parameters is a runtime parameter.
|
|
* The other parameters can be limited via compile time switches.
|
|
*
|
|
*-------------------------------------------------------------------------------
|
|
*
|
|
* Minimum chunk size table (in bytes):
|
|
*
|
|
* +----------------+----------------+
|
|
* | 7b i2c addr | 10b i2c addr |
|
|
* +----------------+----------------+
|
|
* | single | multi | single | multi |
|
|
* ------+--------+-------+--------+-------+
|
|
* short | 3 | 5 | 4 | 6 |
|
|
* long | 5 | 7 | 6 | 8 |
|
|
* ------+--------+-------+--------+-------+
|
|
*
|
|
*/
|
|
|
|
/* set default */
|
|
#if !defined(DRXDAP_MAX_WCHUNKSIZE)
|
|
#define DRXDAP_MAX_WCHUNKSIZE 254
|
|
#endif
|
|
|
|
/* check */
|
|
#if ((DRXDAPFASI_LONG_ADDR_ALLOWED == 0) && (DRXDAPFASI_SHORT_ADDR_ALLOWED == 1))
|
|
#if DRXDAP_SINGLE_MASTER
|
|
#define DRXDAP_MAX_WCHUNKSIZE_MIN 3
|
|
#else
|
|
#define DRXDAP_MAX_WCHUNKSIZE_MIN 5
|
|
#endif
|
|
#else
|
|
#if DRXDAP_SINGLE_MASTER
|
|
#define DRXDAP_MAX_WCHUNKSIZE_MIN 5
|
|
#else
|
|
#define DRXDAP_MAX_WCHUNKSIZE_MIN 7
|
|
#endif
|
|
#endif
|
|
|
|
#if DRXDAP_MAX_WCHUNKSIZE < DRXDAP_MAX_WCHUNKSIZE_MIN
|
|
#if ((DRXDAPFASI_LONG_ADDR_ALLOWED == 0) && (DRXDAPFASI_SHORT_ADDR_ALLOWED == 1))
|
|
#if DRXDAP_SINGLE_MASTER
|
|
#error DRXDAP_MAX_WCHUNKSIZE must be at least 3 in single master mode
|
|
*; /* illegal statement to force compiler error */
|
|
#else
|
|
#error DRXDAP_MAX_WCHUNKSIZE must be at least 5 in multi master mode
|
|
*; /* illegal statement to force compiler error */
|
|
#endif
|
|
#else
|
|
#if DRXDAP_SINGLE_MASTER
|
|
#error DRXDAP_MAX_WCHUNKSIZE must be at least 5 in single master mode
|
|
*; /* illegal statement to force compiler error */
|
|
#else
|
|
#error DRXDAP_MAX_WCHUNKSIZE must be at least 7 in multi master mode
|
|
*; /* illegal statement to force compiler error */
|
|
#endif
|
|
#endif
|
|
#endif
|
|
|
|
/* set default */
|
|
#if !defined(DRXDAP_MAX_RCHUNKSIZE)
|
|
#define DRXDAP_MAX_RCHUNKSIZE 254
|
|
#endif
|
|
|
|
/* check */
|
|
#if DRXDAP_MAX_RCHUNKSIZE < 2
|
|
#error DRXDAP_MAX_RCHUNKSIZE must be at least 2
|
|
*; /* illegal statement to force compiler error */
|
|
#endif
|
|
|
|
/* check */
|
|
#if DRXDAP_MAX_RCHUNKSIZE & 1
|
|
#error DRXDAP_MAX_RCHUNKSIZE must be even
|
|
*; /* illegal statement to force compiler error */
|
|
#endif
|
|
|
|
/*-------- Public API functions ----------------------------------------------*/
|
|
|
|
extern struct drx_access_func drx_dap_fasi_funct_g;
|
|
|
|
#define DRXDAP_FASI_RMW 0x10000000
|
|
#define DRXDAP_FASI_BROADCAST 0x20000000
|
|
#define DRXDAP_FASI_CLEARCRC 0x80000000
|
|
#define DRXDAP_FASI_SINGLE_MASTER 0xC0000000
|
|
#define DRXDAP_FASI_MULTI_MASTER 0x40000000
|
|
#define DRXDAP_FASI_SMM_SWITCH 0x40000000 /* single/multi master switch */
|
|
#define DRXDAP_FASI_MODEFLAGS 0xC0000000
|
|
#define DRXDAP_FASI_FLAGS 0xF0000000
|
|
|
|
#define DRXDAP_FASI_ADDR2BLOCK(addr) (((addr)>>22)&0x3F)
|
|
#define DRXDAP_FASI_ADDR2BANK(addr) (((addr)>>16)&0x3F)
|
|
#define DRXDAP_FASI_ADDR2OFFSET(addr) ((addr)&0x7FFF)
|
|
|
|
#define DRXDAP_FASI_SHORT_FORMAT(addr) (((addr) & 0xFC30FF80) == 0)
|
|
#define DRXDAP_FASI_LONG_FORMAT(addr) (((addr) & 0xFC30FF80) != 0)
|
|
#define DRXDAP_FASI_OFFSET_TOO_LARGE(addr) (((addr) & 0x00008000) != 0)
|
|
|
|
#endif /* __DRX_DAP_FASI_H__ */
|