00001 #ifndef _DEV_TWIF_H_
00002 #define _DEV_TWIF_H_
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
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
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
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