1ca3355a9SDevin Heitmueller /* 2ca3355a9SDevin Heitmueller Copyright (c), 2004-2005,2007-2010 Trident Microsystems, Inc. 3ca3355a9SDevin Heitmueller All rights reserved. 4ca3355a9SDevin Heitmueller 5ca3355a9SDevin Heitmueller Redistribution and use in source and binary forms, with or without 6ca3355a9SDevin Heitmueller modification, are permitted provided that the following conditions are met: 7ca3355a9SDevin Heitmueller 8ca3355a9SDevin Heitmueller * Redistributions of source code must retain the above copyright notice, 9ca3355a9SDevin Heitmueller this list of conditions and the following disclaimer. 10ca3355a9SDevin Heitmueller * Redistributions in binary form must reproduce the above copyright notice, 11ca3355a9SDevin Heitmueller this list of conditions and the following disclaimer in the documentation 12ca3355a9SDevin Heitmueller and/or other materials provided with the distribution. 13ca3355a9SDevin Heitmueller * Neither the name of Trident Microsystems nor Hauppauge Computer Works 14ca3355a9SDevin Heitmueller nor the names of its contributors may be used to endorse or promote 15ca3355a9SDevin Heitmueller products derived from this software without specific prior written 16ca3355a9SDevin Heitmueller permission. 17ca3355a9SDevin Heitmueller 18ca3355a9SDevin Heitmueller THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 19ca3355a9SDevin Heitmueller AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20ca3355a9SDevin Heitmueller IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21ca3355a9SDevin Heitmueller ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 22ca3355a9SDevin Heitmueller LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23ca3355a9SDevin Heitmueller CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24ca3355a9SDevin Heitmueller SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25ca3355a9SDevin Heitmueller INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26ca3355a9SDevin Heitmueller CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27ca3355a9SDevin Heitmueller ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28ca3355a9SDevin Heitmueller POSSIBILITY OF SUCH DAMAGE. 29ca3355a9SDevin Heitmueller */ 30ca3355a9SDevin Heitmueller 3138b2df95SDevin Heitmueller /******************************************************************************* 3238b2df95SDevin Heitmueller * FILENAME: $Id: drx_dap_fasi.h,v 1.5 2009/07/07 14:21:40 justin Exp $ 3338b2df95SDevin Heitmueller * 3438b2df95SDevin Heitmueller * DESCRIPTION: 3538b2df95SDevin Heitmueller * Part of DRX driver. 3638b2df95SDevin Heitmueller * Data access protocol: Fast Access Sequential Interface (fasi) 3738b2df95SDevin Heitmueller * Fast access, because of short addressing format (16 instead of 32 bits addr) 3838b2df95SDevin Heitmueller * Sequential, because of I2C. 3938b2df95SDevin Heitmueller * 4038b2df95SDevin Heitmueller * USAGE: 4138b2df95SDevin Heitmueller * Include. 4238b2df95SDevin Heitmueller * 4338b2df95SDevin Heitmueller * NOTES: 4438b2df95SDevin Heitmueller * 4538b2df95SDevin Heitmueller * 4638b2df95SDevin Heitmueller *******************************************************************************/ 4738b2df95SDevin Heitmueller 4838b2df95SDevin Heitmueller /*-------- compilation control switches --------------------------------------*/ 4938b2df95SDevin Heitmueller 5038b2df95SDevin Heitmueller #ifndef __DRX_DAP_FASI_H__ 5138b2df95SDevin Heitmueller #define __DRX_DAP_FASI_H__ 5238b2df95SDevin Heitmueller 5338b2df95SDevin Heitmueller /*-------- Required includes -------------------------------------------------*/ 5438b2df95SDevin Heitmueller 5538b2df95SDevin Heitmueller #include "drx_driver.h" 5638b2df95SDevin Heitmueller 5738b2df95SDevin Heitmueller /*-------- Defines, configuring the API --------------------------------------*/ 5838b2df95SDevin Heitmueller 5938b2df95SDevin Heitmueller /******************************************** 6038b2df95SDevin Heitmueller * Allowed address formats 6138b2df95SDevin Heitmueller ********************************************/ 6238b2df95SDevin Heitmueller 6338b2df95SDevin Heitmueller /* 6438b2df95SDevin Heitmueller * Comments about short/long addressing format: 6538b2df95SDevin Heitmueller * 6638b2df95SDevin Heitmueller * The DAP FASI offers long address format (4 bytes) and short address format 6738b2df95SDevin Heitmueller * (2 bytes). The DAP can operate in 3 modes: 6838b2df95SDevin Heitmueller * (1) only short 6938b2df95SDevin Heitmueller * (2) only long 70*868c9a17SMauro Carvalho Chehab * (3) both long and short but short preferred and long only when necessary 7138b2df95SDevin Heitmueller * 7238b2df95SDevin Heitmueller * These modes must be selected compile time via compile switches. 738ac1ed79SJoe Perches * Compile switch settings for the different modes: 7438b2df95SDevin Heitmueller * (1) DRXDAPFASI_LONG_ADDR_ALLOWED=0, DRXDAPFASI_SHORT_ADDR_ALLOWED=1 7538b2df95SDevin Heitmueller * (2) DRXDAPFASI_LONG_ADDR_ALLOWED=1, DRXDAPFASI_SHORT_ADDR_ALLOWED=0 7638b2df95SDevin Heitmueller * (3) DRXDAPFASI_LONG_ADDR_ALLOWED=1, DRXDAPFASI_SHORT_ADDR_ALLOWED=1 7738b2df95SDevin Heitmueller * 7838b2df95SDevin Heitmueller * The default setting will be (3) both long and short. 7938b2df95SDevin Heitmueller * The default setting will need no compile switches. 8038b2df95SDevin Heitmueller * The default setting must be overridden if compile switches are already 8138b2df95SDevin Heitmueller * defined. 8238b2df95SDevin Heitmueller * 8338b2df95SDevin Heitmueller */ 8438b2df95SDevin Heitmueller 8538b2df95SDevin Heitmueller /* set default */ 8638b2df95SDevin Heitmueller #if !defined(DRXDAPFASI_LONG_ADDR_ALLOWED) 8738b2df95SDevin Heitmueller #define DRXDAPFASI_LONG_ADDR_ALLOWED 1 8838b2df95SDevin Heitmueller #endif 8938b2df95SDevin Heitmueller 9038b2df95SDevin Heitmueller /* set default */ 9138b2df95SDevin Heitmueller #if !defined(DRXDAPFASI_SHORT_ADDR_ALLOWED) 9238b2df95SDevin Heitmueller #define DRXDAPFASI_SHORT_ADDR_ALLOWED 1 9338b2df95SDevin Heitmueller #endif 9438b2df95SDevin Heitmueller 9538b2df95SDevin Heitmueller /* check */ 9638b2df95SDevin Heitmueller #if ((DRXDAPFASI_LONG_ADDR_ALLOWED == 0) && \ 9738b2df95SDevin Heitmueller (DRXDAPFASI_SHORT_ADDR_ALLOWED == 0)) 9838b2df95SDevin Heitmueller #error At least one of short- or long-addressing format must be allowed. 9938b2df95SDevin Heitmueller *; /* illegal statement to force compiler error */ 10038b2df95SDevin Heitmueller #endif 10138b2df95SDevin Heitmueller 10238b2df95SDevin Heitmueller /******************************************** 10338b2df95SDevin Heitmueller * Single/master multi master setting 10438b2df95SDevin Heitmueller ********************************************/ 10538b2df95SDevin Heitmueller /* 10638b2df95SDevin Heitmueller * Comments about SINGLE MASTER/MULTI MASTER modes: 10738b2df95SDevin Heitmueller * 10838b2df95SDevin Heitmueller * Consider the two sides:1) the master and 2)the slave. 10938b2df95SDevin Heitmueller * 11038b2df95SDevin Heitmueller * Master: 11138b2df95SDevin Heitmueller * Single/multimaster operation set via DRXDAP_SINGLE_MASTER compile switch 11238b2df95SDevin Heitmueller * + single master mode means no use of repeated starts 11338b2df95SDevin Heitmueller * + multi master mode means use of repeated starts 11438b2df95SDevin Heitmueller * Default is single master. 115*868c9a17SMauro Carvalho Chehab * Default can be overridden by setting the compile switch DRXDAP_SINGLE_MASTER. 11638b2df95SDevin Heitmueller * 11738b2df95SDevin Heitmueller * Slave: 11838b2df95SDevin Heitmueller * Single/multi master selected via the flags in the FASI protocol. 11938b2df95SDevin Heitmueller * + single master means remember memory address between i2c packets 12038b2df95SDevin Heitmueller * + multimaster means flush memory address between i2c packets 12138b2df95SDevin Heitmueller * Default is single master, DAP FASI changes multi-master setting silently 122*868c9a17SMauro Carvalho Chehab * into single master setting. This cannot be overridden. 12338b2df95SDevin Heitmueller * 12438b2df95SDevin Heitmueller */ 12538b2df95SDevin Heitmueller /* set default */ 12638b2df95SDevin Heitmueller #ifndef DRXDAP_SINGLE_MASTER 12738b2df95SDevin Heitmueller #define DRXDAP_SINGLE_MASTER 0 12838b2df95SDevin Heitmueller #endif 12938b2df95SDevin Heitmueller 13038b2df95SDevin Heitmueller /******************************************** 13138b2df95SDevin Heitmueller * Chunk/mode checking 13238b2df95SDevin Heitmueller ********************************************/ 13338b2df95SDevin Heitmueller /* 13438b2df95SDevin Heitmueller * Comments about DRXDAP_MAX_WCHUNKSIZE in single or multi master mode and 13538b2df95SDevin Heitmueller * in combination with short and long addressing format. All text below 13638b2df95SDevin Heitmueller * assumes long addressing format. The table also includes information 13738b2df95SDevin Heitmueller * for short ADDRessing format. 13838b2df95SDevin Heitmueller * 13938b2df95SDevin Heitmueller * In single master mode, data can be written by sending the register address 14038b2df95SDevin Heitmueller * first, then two or four bytes of data in the next packet. 14138b2df95SDevin Heitmueller * Because the device address plus a register address equals five bytes, 142*868c9a17SMauro Carvalho Chehab * the minimum chunk size must be five. 14338b2df95SDevin Heitmueller * If ten-bit I2C device addresses are used, the minimum chunk size must be six, 14438b2df95SDevin Heitmueller * because the I2C device address will then occupy two bytes when writing. 14538b2df95SDevin Heitmueller * 14638b2df95SDevin Heitmueller * Data in single master mode is transferred as follows: 14738b2df95SDevin Heitmueller * <S> <devW> a0 a1 a2 a3 <P> 14838b2df95SDevin Heitmueller * <S> <devW> d0 d1 [d2 d3] <P> 14938b2df95SDevin Heitmueller * .. 15038b2df95SDevin Heitmueller * or 15138b2df95SDevin Heitmueller * .. 15238b2df95SDevin Heitmueller * <S> <devW> a0 a1 a2 a3 <P> 15338b2df95SDevin Heitmueller * <S> <devR> --- <P> 15438b2df95SDevin Heitmueller * 15538b2df95SDevin Heitmueller * In multi-master mode, the data must immediately follow the address (an I2C 15638b2df95SDevin Heitmueller * stop resets the internal address), and hence the minimum chunk size is 15738b2df95SDevin Heitmueller * 1 <I2C address> + 4 (register address) + 2 (data to send) = 7 bytes (8 if 15838b2df95SDevin Heitmueller * 10-bit I2C device addresses are used). 15938b2df95SDevin Heitmueller * 16038b2df95SDevin Heitmueller * The 7-bit or 10-bit i2c address parameters is a runtime parameter. 16138b2df95SDevin Heitmueller * The other parameters can be limited via compile time switches. 16238b2df95SDevin Heitmueller * 16338b2df95SDevin Heitmueller *------------------------------------------------------------------------------- 16438b2df95SDevin Heitmueller * 16538b2df95SDevin Heitmueller * Minimum chunk size table (in bytes): 16638b2df95SDevin Heitmueller * 16738b2df95SDevin Heitmueller * +----------------+----------------+ 16838b2df95SDevin Heitmueller * | 7b i2c addr | 10b i2c addr | 16938b2df95SDevin Heitmueller * +----------------+----------------+ 17038b2df95SDevin Heitmueller * | single | multi | single | multi | 17138b2df95SDevin Heitmueller * ------+--------+-------+--------+-------+ 17238b2df95SDevin Heitmueller * short | 3 | 5 | 4 | 6 | 17338b2df95SDevin Heitmueller * long | 5 | 7 | 6 | 8 | 17438b2df95SDevin Heitmueller * ------+--------+-------+--------+-------+ 17538b2df95SDevin Heitmueller * 17638b2df95SDevin Heitmueller */ 17738b2df95SDevin Heitmueller 17838b2df95SDevin Heitmueller /* set default */ 17938b2df95SDevin Heitmueller #if !defined(DRXDAP_MAX_WCHUNKSIZE) 18038b2df95SDevin Heitmueller #define DRXDAP_MAX_WCHUNKSIZE 254 18138b2df95SDevin Heitmueller #endif 18238b2df95SDevin Heitmueller 18338b2df95SDevin Heitmueller /* check */ 18438b2df95SDevin Heitmueller #if ((DRXDAPFASI_LONG_ADDR_ALLOWED == 0) && (DRXDAPFASI_SHORT_ADDR_ALLOWED == 1)) 18538b2df95SDevin Heitmueller #if DRXDAP_SINGLE_MASTER 18638b2df95SDevin Heitmueller #define DRXDAP_MAX_WCHUNKSIZE_MIN 3 18738b2df95SDevin Heitmueller #else 18838b2df95SDevin Heitmueller #define DRXDAP_MAX_WCHUNKSIZE_MIN 5 18938b2df95SDevin Heitmueller #endif 19038b2df95SDevin Heitmueller #else 19138b2df95SDevin Heitmueller #if DRXDAP_SINGLE_MASTER 19238b2df95SDevin Heitmueller #define DRXDAP_MAX_WCHUNKSIZE_MIN 5 19338b2df95SDevin Heitmueller #else 19438b2df95SDevin Heitmueller #define DRXDAP_MAX_WCHUNKSIZE_MIN 7 19538b2df95SDevin Heitmueller #endif 19638b2df95SDevin Heitmueller #endif 19738b2df95SDevin Heitmueller 19838b2df95SDevin Heitmueller #if DRXDAP_MAX_WCHUNKSIZE < DRXDAP_MAX_WCHUNKSIZE_MIN 19938b2df95SDevin Heitmueller #if ((DRXDAPFASI_LONG_ADDR_ALLOWED == 0) && (DRXDAPFASI_SHORT_ADDR_ALLOWED == 1)) 20038b2df95SDevin Heitmueller #if DRXDAP_SINGLE_MASTER 20138b2df95SDevin Heitmueller #error DRXDAP_MAX_WCHUNKSIZE must be at least 3 in single master mode 20238b2df95SDevin Heitmueller *; /* illegal statement to force compiler error */ 20338b2df95SDevin Heitmueller #else 20438b2df95SDevin Heitmueller #error DRXDAP_MAX_WCHUNKSIZE must be at least 5 in multi master mode 20538b2df95SDevin Heitmueller *; /* illegal statement to force compiler error */ 20638b2df95SDevin Heitmueller #endif 20738b2df95SDevin Heitmueller #else 20838b2df95SDevin Heitmueller #if DRXDAP_SINGLE_MASTER 20938b2df95SDevin Heitmueller #error DRXDAP_MAX_WCHUNKSIZE must be at least 5 in single master mode 21038b2df95SDevin Heitmueller *; /* illegal statement to force compiler error */ 21138b2df95SDevin Heitmueller #else 21238b2df95SDevin Heitmueller #error DRXDAP_MAX_WCHUNKSIZE must be at least 7 in multi master mode 21338b2df95SDevin Heitmueller *; /* illegal statement to force compiler error */ 21438b2df95SDevin Heitmueller #endif 21538b2df95SDevin Heitmueller #endif 21638b2df95SDevin Heitmueller #endif 21738b2df95SDevin Heitmueller 21838b2df95SDevin Heitmueller /* set default */ 21938b2df95SDevin Heitmueller #if !defined(DRXDAP_MAX_RCHUNKSIZE) 22038b2df95SDevin Heitmueller #define DRXDAP_MAX_RCHUNKSIZE 254 22138b2df95SDevin Heitmueller #endif 22238b2df95SDevin Heitmueller 22338b2df95SDevin Heitmueller /* check */ 22438b2df95SDevin Heitmueller #if DRXDAP_MAX_RCHUNKSIZE < 2 22538b2df95SDevin Heitmueller #error DRXDAP_MAX_RCHUNKSIZE must be at least 2 22638b2df95SDevin Heitmueller *; /* illegal statement to force compiler error */ 22738b2df95SDevin Heitmueller #endif 22838b2df95SDevin Heitmueller 22938b2df95SDevin Heitmueller /* check */ 23038b2df95SDevin Heitmueller #if DRXDAP_MAX_RCHUNKSIZE & 1 23138b2df95SDevin Heitmueller #error DRXDAP_MAX_RCHUNKSIZE must be even 23238b2df95SDevin Heitmueller *; /* illegal statement to force compiler error */ 23338b2df95SDevin Heitmueller #endif 23438b2df95SDevin Heitmueller 23538b2df95SDevin Heitmueller /*-------- Public API functions ----------------------------------------------*/ 23638b2df95SDevin Heitmueller 23738b2df95SDevin Heitmueller #define DRXDAP_FASI_RMW 0x10000000 23838b2df95SDevin Heitmueller #define DRXDAP_FASI_BROADCAST 0x20000000 23938b2df95SDevin Heitmueller #define DRXDAP_FASI_CLEARCRC 0x80000000 24038b2df95SDevin Heitmueller #define DRXDAP_FASI_SINGLE_MASTER 0xC0000000 24138b2df95SDevin Heitmueller #define DRXDAP_FASI_MULTI_MASTER 0x40000000 24238b2df95SDevin Heitmueller #define DRXDAP_FASI_SMM_SWITCH 0x40000000 /* single/multi master switch */ 24338b2df95SDevin Heitmueller #define DRXDAP_FASI_MODEFLAGS 0xC0000000 24438b2df95SDevin Heitmueller #define DRXDAP_FASI_FLAGS 0xF0000000 24538b2df95SDevin Heitmueller 24638b2df95SDevin Heitmueller #define DRXDAP_FASI_ADDR2BLOCK(addr) (((addr)>>22)&0x3F) 24738b2df95SDevin Heitmueller #define DRXDAP_FASI_ADDR2BANK(addr) (((addr)>>16)&0x3F) 24838b2df95SDevin Heitmueller #define DRXDAP_FASI_ADDR2OFFSET(addr) ((addr)&0x7FFF) 24938b2df95SDevin Heitmueller 25038b2df95SDevin Heitmueller #define DRXDAP_FASI_SHORT_FORMAT(addr) (((addr) & 0xFC30FF80) == 0) 25138b2df95SDevin Heitmueller #define DRXDAP_FASI_LONG_FORMAT(addr) (((addr) & 0xFC30FF80) != 0) 25238b2df95SDevin Heitmueller #define DRXDAP_FASI_OFFSET_TOO_LARGE(addr) (((addr) & 0x00008000) != 0) 25338b2df95SDevin Heitmueller 25438b2df95SDevin Heitmueller #endif /* __DRX_DAP_FASI_H__ */ 255