Nut/OS  5.0.5
API Reference
twif.h
Go to the documentation of this file.
00001 #ifndef _DEV_TWIF_H_
00002 #define _DEV_TWIF_H_
00003 
00004 /*
00005  * Copyright (C) 2001-2005 by egnite Software GmbH. All rights reserved.
00006  *
00007  * Redistribution and use in source and binary forms, with or without
00008  * modification, are permitted provided that the following conditions
00009  * are met:
00010  *
00011  * 1. Redistributions of source code must retain the above copyright
00012  *    notice, this list of conditions and the following disclaimer.
00013  * 2. Redistributions in binary form must reproduce the above copyright
00014  *    notice, this list of conditions and the following disclaimer in the
00015  *    documentation and/or other materials provided with the distribution.
00016  * 3. Neither the name of the copyright holders nor the names of
00017  *    contributors may be used to endorse or promote products derived
00018  *    from this software without specific prior written permission.
00019  *
00020  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
00021  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
00022  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
00023  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
00024  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
00025  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
00026  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
00027  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
00028  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
00029  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
00030  * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
00031  * SUCH DAMAGE.
00032  *
00033  * For additional information see http://www.ethernut.de/
00034  */
00035 
00036 /*
00037  * $Log$
00038  * Revision 1.3  2008/08/11 06:59:59  haraldkipp
00039  * BSD types replaced by stdint types (feature request #1282721).
00040  *
00041  * Revision 1.2  2005/10/24 10:56:30  haraldkipp
00042  * Added const modifier to transmit data pointer in TwMasterTransact().
00043  *
00044  * Revision 1.1.1.1  2003/05/09 14:41:09  haraldkipp
00045  * Initial using 3.2.1
00046  *
00047  * Revision 1.2  2003/03/31 14:53:23  harald
00048  * Prepare release 3.1
00049  *
00050  */
00051 
00052 #include <sys/types.h>
00053 #include <cfg/arch.h>
00054 
00055 #include <cfg/twi.h>
00056 #include <dev/irqreg.h>
00057 #include <stdint.h>
00058 
00062 #define TWI_SETSPEED        0x0401  
00063 #define TWI_GETSPEED        0x0402  
00064 #define TWI_SETSLAVEADDRESS 0x0403  
00065 #define TWI_GETSLAVEADDRESS 0x0404  
00066 #define TWI_SETSTATUS       0x0409  
00067 #define TWI_GETSTATUS       0x040a  
00072 #define TWERR_OK          0  
00073 #define TWERR_TIMEOUT    -1  
00074 #define TWERR_BUS        -2  
00075 #define TWERR_IF_LOCKED  -3  
00076 #define TWERR_SLA_NACK   -4  
00077 #define TWERR_DATA_NACK  -5  
00078 #define TWERR_OVRE       -6  
00079 #define TWERR_ARBLOST    -7  
00080 #define TWERR_SPCTOUT    -8  
00082 #define TWSLA_MIN        17  
00086 #define TWSLA_MAX        79  
00090 #define TWSLA_BCAST       0  
00091 #define TWSLA_HOST       16  
00092 #define TWSLA_DEFAULT   193  
00094 typedef struct _NUTTWIBUS NUTTWIBUS;
00095 
00096 
00097 /* Include architecture specific TWI implementation */
00098 #if defined(__AVR__)
00099 
00100 #include "dev/twibus_avr.h"
00101 
00102 #elif defined(__arm__) && defined(__CORTEX__)
00103 
00104 #if defined(MCU_STM32)
00105 #include <arch/cm3/stm/stm32_twi.h>
00106 #endif
00107 
00108 #elif defined(__arm__) && !defined(__CORTEX__)
00109 
00110 #if defined(MCU_AT91R40008)
00111 #include "dev/twibus_bbif.h"
00112 #else
00113 #include "dev/twibus_at91.h"
00114 #endif
00115 
00116 #endif
00117 
00118 
00122 struct _NUTTWIBUS {
00125     uptr_t bus_base;
00126 
00129     IRQ_HANDLER *bus_sig_ev;
00130 
00134     IRQ_HANDLER *bus_sig_er;
00135 
00138     HANDLE bus_mutex;
00139 
00142     NUTTWIICB *bus_icb;
00143 
00146     uint_fast8_t bus_dma_tx;
00147 
00150     uint_fast8_t bus_dma_rx;
00151 
00156     int (*bus_initbus) (void);
00157 
00162     int (*bus_recover) (void);
00163 
00164 };
00165 
00166 
00167 extern int NutTwiMasterTranceive( NUTTWIBUS  *bus,
00168                                   uint8_t     sla,
00169                                   const void *txdata, uint16_t txlen,
00170                                   void       *rxdata, uint16_t rxsiz,
00171                                   uint32_t    tmo );
00172 
00173 extern int NutTwiMasterRegRead( NUTTWIBUS *bus,
00174                                 uint8_t    sla,
00175                                 uint32_t   iadr, uint8_t iadrlen,
00176                                 void      *rxdata, uint16_t rxsiz,
00177                                 uint32_t   tmo );
00178 
00179 extern int NutTwiMasterRegWrite( NUTTWIBUS  *bus,
00180                                  uint8_t     sla,
00181                                  uint32_t    iadr, uint8_t iadrlen,
00182                                  const void *txdata, uint16_t txsiz,
00183                                  uint32_t    tmo );
00184 
00185 extern int NutTwiMasterError(NUTTWIBUS *bus);
00186 
00187 extern int NutTwiSlaveListen(NUTTWIBUS *bus, uint8_t *sla, void *rxdata, uint16_t rxsiz, uint32_t tmo);
00188 
00189 extern int NutTwiSlaveRespond(NUTTWIBUS *bus, void *txdata, uint16_t txlen, uint32_t tmo);
00190 
00191 extern int NutTwiSlaveError(NUTTWIBUS *bus);
00192 
00193 extern uint16_t NutTwiIndexes( NUTTWIBUS *bus, uint8_t idx );
00194 
00195 extern int NutTwiIOCtl( NUTTWIBUS *bus, int req, void *conf );
00196 
00197 extern int NutRegisterTwiBus( NUTTWIBUS *bus, uint8_t sla );
00198 
00199 extern int NutDestroyTwiBus( NUTTWIBUS *bus);
00200 
00201 /*
00202  * Nut/OS Adaption to old TWI implementation
00203  */
00204 #define TwInit(slv) NutRegisterTwiBus(&DEF_TWIBUS, slv)
00205 #define TwIOCtl(req, conf) NutTwiIOCtl(&DEF_TWIBUS, req, conf)
00206 
00207 #define TwMasterTransact( sla, txd, txl, rxd, rxs, tmo) NutTwiMasterTranceive(&DEF_TWIBUS, sla, txd, txl, rxd, rxs, tmo)
00208 #define TwMasterRegRead( sla, iadr, ial, rxd, rxs, tmo) NutTwiMasterRegRead(&DEF_TWIBUS, sla, iadr, ial, rxd, rxs, tmo)
00209 #define TwMasterRegWrite( sla, iadr, ial, txd, txs, tmo) NutTwiMasterRegWrite(&DEF_TWIBUS, sla, iadr, ial, txd, txs, tmo)
00210 #define TwMasterError(void) NutTwiMasterError(&DEF_TWIBUS)
00211 #define TwMasterIndexes( idx) NutTwiIndexes(&DEF_TWIBUS, idx)
00212 
00213 #define TwSlaveListen(sla, rxdata, rxsiz, tmo) NutTwiSlaveListen(&DEF_TWIBUS, rxdata, rxsiz, tmo)
00214 #define TwSlaveRespond(txdata, txlen, tmo) NutTwiSlaveRespond(&DEF_TWIBUS, txlen, tmo)
00215 #define TwSlaveError(void) NutTwiSlaveError(&DEF_TWIBUS)
00216 
00217 #endif