C
Qt Quick Ultralite Automotive Cluster Demo
//============================================================================ // PROJECT = RSCFD Type RSCFD_UCIAPRCN //============================================================================ // C O P Y R I G H T //============================================================================ // Copyright (c) 2002 by Renesas Electronics (EUROPE) GmbH. All rights reserved. // Kanzlerstrasse 2 // D-40472 Duesseldorf //============================================================================ //Purpose: RSCFD Low Level Driver // //Warranty Disclaimer // //Because the Product(s) is licensed free of charge, there is no warranty //of any kind whatsoever and expressly disclaimed and excluded by Renesas, //either expressed or implied, including but not limited to those for //non-infringement of intellectual property, merchantability and/or //fitness for the particular purpose. //Renesas shall not have any obligation to maintain, service or provide bug //fixes for the supplied Product(s) and/or the Application. // //Each User is solely responsible for determining the appropriateness of //using the Product(s) and assumes all risks associated with its exercise //of rights under this Agreement, including, but not limited to the risks //and costs of program errors, compliance with applicable laws, damage to //or loss of data, programs or equipment, and unavailability or //interruption of operations. // //Limitation of Liability // //In no event shall Renesas be liable to the User for any incidental, //consequential, indirect, or punitive damage (including but not limited //to lost profits) regardless of whether such liability is based on breach //of contract, tort, strict liability, breach of warranties, failure of //essential purpose or otherwise and even if advised of the possibility of //such damages. Renesas shall not be liable for any services or products //provided by third party vendors, developers or consultants identified or //referred to the User by Renesas in connection with the Product(s) and/or the //Application. // //============================================================================ // Environment: Devices: All featuring RSCFD_UCIAPRCN // Assembler: GHS MULTI // C-Compiler: GHS MULTI // Linker: GHS MULTI // Debugger: GHS MULTI //============================================================================ #define DRIVER_LOCAL #include <ree_types.h> #include <stddef.h> #ifdef VLIB #include <config_rscfd.h> #include <standardports_p.h> #include <ql85e70x_p.h> #else #include <map_rscfd.h> #include <map_ports.h> #include <ports/standardports/standardports_p.h> #endif #if( EE_RSCFD_MACROS > 2 ) #error "NUMBER OF UNITS NOT SUPPORTED" #endif #ifdef EE_RSCFD_INT_BUNDLINGHOOK extern void EE_RSCFD_INT_BUNDLINGHOOK( u08, u08 *, u08 *, u08 *, u08 *, u08 *, u08 *, u08 *, u08 *, u08 * ); #endif /* * CreateInterrupt() Jump Vector Table */ void EE_RSCFD_IRQDefault( ); #if( EE_RSCFD_MACROS == 1 ) static void ( *EE_RSCFD_CIVector [ ( EE_RSCFD_MACROS * ( EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_CHANNEL * EE_RSCFD_MAXCHANNELS ) ) ] )( ) = { EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault }; #endif #if( EE_RSCFD_MACROS == 2 ) static void ( *EE_RSCFD_CIVector [ ( EE_RSCFD_MACROS * ( EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_CHANNEL * EE_RSCFD_MAXCHANNELS ) ) ] )( ) = { EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault, EE_RSCFD_IRQDefault }; #endif /* * Global Variables */ /* Number of interrupt vector */ u08 EE_RSCFD_InterruptFlag_Unit_u08 = 0; u08 EE_RSCFD_InterruptFlag_Global_u08 = EE_RSCFD_INT_NOINT; u08 EE_RSCFD_InterruptFlag_Channel0_u08 = EE_RSCFD_INT_NOINT; u08 EE_RSCFD_InterruptFlag_Channel1_u08 = EE_RSCFD_INT_NOINT; u08 EE_RSCFD_InterruptFlag_Channel2_u08 = EE_RSCFD_INT_NOINT; u08 EE_RSCFD_InterruptFlag_Channel3_u08 = EE_RSCFD_INT_NOINT; u08 EE_RSCFD_InterruptFlag_Channel4_u08 = EE_RSCFD_INT_NOINT; u08 EE_RSCFD_InterruptFlag_Channel5_u08 = EE_RSCFD_INT_NOINT; u08 EE_RSCFD_InterruptFlag_Channel6_u08 = EE_RSCFD_INT_NOINT; u08 EE_RSCFD_InterruptFlag_Channel7_u08 = EE_RSCFD_INT_NOINT; u08 EE_RSCFD_LastErrorCode_Global_u08 = EE_RSCFD_GINT_NONE; u08 EE_RSCFD_InterruptFlag_Channel_u08[ EE_RSCFD_MAXCHANNELS ] = { EE_RSCFD_INT_NOINT, EE_RSCFD_INT_NOINT, EE_RSCFD_INT_NOINT }; u16 EE_RSCFD_LastErrorCode_Channel_u16[ EE_RSCFD_MAXCHANNELS ] = { EE_RSCFD_ERROR_CLEARALL, EE_RSCFD_ERROR_CLEARALL, EE_RSCFD_ERROR_CLEARALL }; u08 EE_RSCFD_LastTxObjectChannel0_u08 = EE_RSCFD_INT_NOINT; u08 EE_RSCFD_LastTxObjectChannel1_u08 = EE_RSCFD_INT_NOINT; u08 EE_RSCFD_LastTxObjectChannel2_u08 = EE_RSCFD_INT_NOINT; u08 EE_RSCFD_LastTxObjectChannel3_u08 = EE_RSCFD_INT_NOINT; u08 EE_RSCFD_LastTxObjectChannel4_u08 = EE_RSCFD_INT_NOINT; u08 EE_RSCFD_LastTxObjectChannel5_u08 = EE_RSCFD_INT_NOINT; u08 EE_RSCFD_LastTxObjectChannel6_u08 = EE_RSCFD_INT_NOINT; u08 EE_RSCFD_LastTxObjectChannel7_u08 = EE_RSCFD_INT_NOINT; /* * Internal Support Functions */ void EE_RSCFD_IRQDefault( ) { } u08 EE_RSCFD_GetTxBuffer( u32 FlagRegister_u32 ) { u08 CurrentScan_u08; for( CurrentScan_u08 = 0; CurrentScan_u08 < EE_RSCFD_MAXTXBUFFERS; CurrentScan_u08++ ) { if( ( ( FlagRegister_u32 >> CurrentScan_u08 ) & 0x01 ) == 0x01 ) { return( CurrentScan_u08 ); } } return( EE_RSCFD_INT_NOINT ); } u08 EE_RSCFD_GetComFIFOIntStatus( u08 UnitNumber_u08, u08 ChannelNumber_u08, u08 InterruptType_u08 ) { u32 FlagSet_u32; u08 FlagFirst_u08; switch( InterruptType_u08 ) { case EE_RSCFD_INT_RXCF: FlagSet_u32 = ( u32 )( ee_rscfd_common_p[ UnitNumber_u08 ]->cfrists ); for( FlagFirst_u08 = 0; FlagFirst_u08 < EE_RSCFD_MAXRXFIFOS; FlagFirst_u08++ ) { if( FlagSet_u32 & ( 1 << FlagFirst_u08 ) ) return( FlagFirst_u08 ); } break; case EE_RSCFD_INT_TXCF: FlagSet_u32 = ( u32 )( ee_rscfd_common_p[ UnitNumber_u08 ]->cftists ); for( FlagFirst_u08 = ( EE_RSCFD_MAXCOMFIFOS * ChannelNumber_u08 ); FlagFirst_u08 < ( EE_RSCFD_MAXCOMFIFOS * ( ChannelNumber_u08 + 1 ) ); FlagFirst_u08++ ) { if( FlagSet_u32 & ( 1 << FlagFirst_u08 ) ) return( FlagFirst_u08 ); } break; } return( EE_RSCFD_GLOBAL ); } void EE_RSCFD_SetIDData( struct ee_rscfd_t_msg *Buffer, struct ee_rscfd_message *Message ) { u08 DataCount_u08; u08 DataCountMax_u08; if( Message->flag.dlc <= EE_RSCFD_DLC_CMAX ) { DataCountMax_u08 = Message->flag.dlc; } else { switch( Message->flag.dlc ) { case EE_RSCFD_DLC_FD_12: DataCountMax_u08 = 12; break; case EE_RSCFD_DLC_FD_16: DataCountMax_u08 = 16; break; case EE_RSCFD_DLC_FD_20: DataCountMax_u08 = 20; break; default: DataCountMax_u08 = 20; break; } } Buffer->id.id = Message->hdr.id; Buffer->id.thlen = Message->hdr.thlen; Buffer->id.rtr = Message->hdr.rtr; Buffer->id.ide = Message->hdr.ide; for( DataCount_u08 = 0; DataCount_u08 < DataCountMax_u08; DataCount_u08++ ) { if( ( DataCount_u08 % 4 ) == 0 ) { Buffer->data[ DataCount_u08 / 4 ] = 0L; } Buffer->data[ DataCount_u08 / 4 ] += ( u32 )( Message->data[ DataCount_u08 ] << ( 8 * ( DataCount_u08 % 4 ) ) ); } Buffer->ptr.tid = Message->flag.ptr; Buffer->ptr.dlc = Message->flag.dlc; Buffer->fdsts.esi = Message->fdsts.esi; Buffer->fdsts.brs = Message->fdsts.brs; Buffer->fdsts.fdf = Message->fdsts.fdf; } void EE_RSCFD_SetIDDataMerged( struct ee_rscfd_t_mmsg *Buffer, struct ee_rscfd_message *Message ) { u08 DataCount_u08; u08 DataCountMax_u08; if( Message->flag.dlc <= EE_RSCFD_DLC_CMAX ) { DataCountMax_u08 = Message->flag.dlc; } else { switch( Message->flag.dlc ) { case EE_RSCFD_DLC_FD_12: DataCountMax_u08 = 12; break; case EE_RSCFD_DLC_FD_16: DataCountMax_u08 = 16; break; case EE_RSCFD_DLC_FD_20: DataCountMax_u08 = 20; break; case EE_RSCFD_DLC_FD_24: DataCountMax_u08 = 24; break; case EE_RSCFD_DLC_FD_32: DataCountMax_u08 = 32; break; case EE_RSCFD_DLC_FD_48: DataCountMax_u08 = 48; break; case EE_RSCFD_DLC_FD_64: DataCountMax_u08 = 64; break; default: DataCountMax_u08 = 64; break; } } Buffer->id.id = Message->hdr.id; Buffer->id.thlen = Message->hdr.thlen; Buffer->id.rtr = Message->hdr.rtr; Buffer->id.ide = Message->hdr.ide; for( DataCount_u08 = 0; DataCount_u08 < DataCountMax_u08; DataCount_u08++ ) { if( ( DataCount_u08 % 4 ) == 0 ) { Buffer->data[ DataCount_u08 / 4 ] = 0L; } Buffer->data[ DataCount_u08 / 4 ] += ( u32 )( Message->data[ DataCount_u08 ] << ( 8 * ( DataCount_u08 % 4 ) ) ); } Buffer->ptr.tid = Message->flag.ptr; Buffer->ptr.dlc = Message->flag.dlc; Buffer->fdsts.esi = Message->fdsts.esi; Buffer->fdsts.brs = Message->fdsts.brs; Buffer->fdsts.fdf = Message->fdsts.fdf; } void EE_RSCFD_SetIDDataCFIFO( struct ee_rscfd_r_cmsg *Buffer, struct ee_rscfd_message *Message ) { u08 DataCount_u08; u08 DataCountMax_u08; if( Message->flag.dlc <= EE_RSCFD_DLC_CMAX ) { DataCountMax_u08 = Message->flag.dlc; } else { switch( Message->flag.dlc ) { case EE_RSCFD_DLC_FD_12: DataCountMax_u08 = 12; break; case EE_RSCFD_DLC_FD_16: DataCountMax_u08 = 16; break; case EE_RSCFD_DLC_FD_20: DataCountMax_u08 = 20; break; case EE_RSCFD_DLC_FD_24: DataCountMax_u08 = 24; break; case EE_RSCFD_DLC_FD_32: DataCountMax_u08 = 32; break; case EE_RSCFD_DLC_FD_48: DataCountMax_u08 = 48; break; case EE_RSCFD_DLC_FD_64: DataCountMax_u08 = 64; break; default: DataCountMax_u08 = 64; break; } } Buffer->id.id = Message->hdr.id; Buffer->id.thlen = Message->hdr.thlen; Buffer->id.rtr = Message->hdr.rtr; Buffer->id.ide = Message->hdr.ide; for( DataCount_u08 = 0; DataCount_u08 < DataCountMax_u08; DataCount_u08++ ) { if( ( DataCount_u08 % 4 ) == 0 ) { Buffer->data[ DataCount_u08 / 4 ] = 0L; } Buffer->data[ DataCount_u08 / 4 ] += ( u32 )( Message->data[ DataCount_u08 ] << ( 8 * ( DataCount_u08 % 4 ) ) ); } Buffer->ptr.dlc = Message->flag.dlc; Buffer->fdsts.esi = Message->fdsts.esi; Buffer->fdsts.brs = Message->fdsts.brs; Buffer->fdsts.fdf = Message->fdsts.fdf; } void EE_RSCFD_GetMessage( struct ee_rscfd_r_rmsg *Buffer, struct ee_rscfd_message *Message ) { u08 DataCount_u08; u08 DataCountMax_u08; Message->flag.ts = Buffer->ptr.ts; Message->flag.ptr = Buffer->ptr.ptr; Message->flag.dlc = Buffer->ptr.dlc; Message->hdr.id = Buffer->id.id; Message->hdr.rtr = Buffer->id.rtr; Message->hdr.ide = Buffer->id.ide; Message->fdsts.esi = Buffer->fdsts.esi; Message->fdsts.brs = Buffer->fdsts.brs; Message->fdsts.fdf = Buffer->fdsts.fdf; if( Message->flag.dlc <= EE_RSCFD_DLC_CMAX ) { DataCountMax_u08 = Message->flag.dlc; } else { switch( Message->flag.dlc ) { case EE_RSCFD_DLC_FD_12: DataCountMax_u08 = 12; break; case EE_RSCFD_DLC_FD_16: DataCountMax_u08 = 16; break; case EE_RSCFD_DLC_FD_20: DataCountMax_u08 = 20; break; default: DataCountMax_u08 = 20; break; } } for( DataCount_u08 = 0; DataCount_u08 < DataCountMax_u08; DataCount_u08++ ) { Message->data[ DataCount_u08 ] = ( u08 )( Buffer->data[ DataCount_u08 / 4 ] >> ( ( DataCount_u08 % 4 ) * 8 ) ); } } void EE_RSCFD_GetMessageRF( struct ee_rscfd_r_rfmsg *Buffer, struct ee_rscfd_message *Message ) { u08 DataCount_u08; u08 DataCountMax_u08; Message->flag.ts = Buffer->ptr.ts; Message->flag.ptr = Buffer->ptr.ptr; Message->flag.dlc = Buffer->ptr.dlc; Message->hdr.id = Buffer->id.id; Message->hdr.rtr = Buffer->id.rtr; Message->hdr.ide = Buffer->id.ide; Message->fdsts.esi = Buffer->fdsts.esi; Message->fdsts.brs = Buffer->fdsts.brs; Message->fdsts.fdf = Buffer->fdsts.fdf; if( Message->flag.dlc <= EE_RSCFD_DLC_CMAX ) { DataCountMax_u08 = Message->flag.dlc; } else { switch( Message->flag.dlc ) { case EE_RSCFD_DLC_FD_12: DataCountMax_u08 = 12; break; case EE_RSCFD_DLC_FD_16: DataCountMax_u08 = 16; break; case EE_RSCFD_DLC_FD_20: DataCountMax_u08 = 20; break; case EE_RSCFD_DLC_FD_24: DataCountMax_u08 = 24; break; case EE_RSCFD_DLC_FD_32: DataCountMax_u08 = 32; break; case EE_RSCFD_DLC_FD_48: DataCountMax_u08 = 48; break; case EE_RSCFD_DLC_FD_64: DataCountMax_u08 = 64; break; default: DataCountMax_u08 = 64; break; } } for( DataCount_u08 = 0; DataCount_u08 < DataCountMax_u08; DataCount_u08++ ) { Message->data[ DataCount_u08 ] = ( u08 )( Buffer->data[ DataCount_u08 / 4 ] >> ( ( DataCount_u08 % 4 ) * 8 ) ); } } void EE_RSCFD_GetMessageCF( struct ee_rscfd_r_cmsg *Buffer, struct ee_rscfd_message *Message ) { u08 DataCount_u08; u08 DataCountMax_u08; Message->flag.ts = Buffer->ptr.ts; Message->flag.ptr = Buffer->ptr.ptr; Message->flag.dlc = Buffer->ptr.dlc; Message->hdr.id = Buffer->id.id; Message->hdr.rtr = Buffer->id.rtr; Message->hdr.ide = Buffer->id.ide; Message->fdsts.esi = Buffer->fdsts.esi; Message->fdsts.brs = Buffer->fdsts.brs; Message->fdsts.fdf = Buffer->fdsts.fdf; if( Message->flag.dlc <= EE_RSCFD_DLC_CMAX ) { DataCountMax_u08 = Message->flag.dlc; } else { switch( Message->flag.dlc ) { case EE_RSCFD_DLC_FD_12: DataCountMax_u08 = 12; break; case EE_RSCFD_DLC_FD_16: DataCountMax_u08 = 16; break; case EE_RSCFD_DLC_FD_20: DataCountMax_u08 = 20; break; case EE_RSCFD_DLC_FD_24: DataCountMax_u08 = 24; break; case EE_RSCFD_DLC_FD_32: DataCountMax_u08 = 32; break; case EE_RSCFD_DLC_FD_48: DataCountMax_u08 = 48; break; case EE_RSCFD_DLC_FD_64: DataCountMax_u08 = 64; break; default: DataCountMax_u08 = 64; break; } } for( DataCount_u08 = 0; DataCount_u08 < DataCountMax_u08; DataCount_u08++ ) { Message->data[ DataCount_u08 ] = ( u08 )( Buffer->data[ DataCount_u08 / 4 ] >> ( ( DataCount_u08 % 4 ) * 8 ) ); } } /* * The interrupt Functions */ //============================================================================= // FunctionName: RSCFD_Interrupt // IN : - // OUT : - // Description : Central Interrupt Entry, clears pending bits and stores status // //============================================================================= void EE_RSCFD_Interrupt( ) { u08 FIFONumber_u08; u08 UnitNumber_u08; UnitNumber_u08 = EE_RSCFD_InterruptFlag_Unit_u08; /* use this interrupt routine only if in FD mode */ if( ee_rscfd_common_p[ UnitNumber_u08 ]->grmcfg.rcmc != EE_RSCFD_SET ) return; #ifdef EE_RSCFD_INT_BUNDLINGHOOK EE_RSCFD_INT_BUNDLINGHOOK( UnitNumber_u08, &EE_RSCFD_InterruptFlag_Global_u08, &EE_RSCFD_InterruptFlag_Channel0_u08, &EE_RSCFD_InterruptFlag_Channel1_u08, &EE_RSCFD_InterruptFlag_Channel2_u08, &EE_RSCFD_InterruptFlag_Channel3_u08, &EE_RSCFD_InterruptFlag_Channel4_u08, &EE_RSCFD_InterruptFlag_Channel5_u08, &EE_RSCFD_InterruptFlag_Channel6_u08, &EE_RSCFD_InterruptFlag_Channel7_u08 ); #endif /* Handling of Unit 0 */ if( EE_RSCFD_InterruptFlag_Global_u08 != EE_RSCFD_INT_NOINT ) { switch( EE_RSCFD_InterruptFlag_Global_u08 ) { case EE_RSCFD_INT_GERR: EE_RSCFD_LastErrorCode_Global_u08 = ee_rscfd_common_p[ UnitNumber_u08 ]->gerfl.err; ee_rscfd_common_p[ UnitNumber_u08 ]->gerfl.err = EE_RSCFD_GINT_NONE; for( FIFONumber_u08 = 0; FIFONumber_u08 < EE_RSCFD_MAXRXFIFOS; FIFONumber_u08++ ) { if( ee_rscfd_common_p[ UnitNumber_u08 ]->rfsts[ FIFONumber_u08 ].rfmlt ) { EE_RSCFD_LastErrorCode_Global_u08 = EE_RSCFD_GINT_MSGLOST; ee_rscfd_common_p[ UnitNumber_u08 ]->rfsts[ FIFONumber_u08 ].rfmlt = 0; } } for( FIFONumber_u08 = 0; FIFONumber_u08 < ( EE_RSCFD_MAXCOMFIFOS * EE_RSCFD_MAXCHANNELS ); FIFONumber_u08++ ) { if( ee_rscfd_common_p[ UnitNumber_u08 ]->cfsts[ FIFONumber_u08 ].cfmlt ) { EE_RSCFD_LastErrorCode_Global_u08 = EE_RSCFD_GINT_MSGLOST; ee_rscfd_common_p[ UnitNumber_u08 ]->cfsts[ FIFONumber_u08 ].cfmlt = 0; } } EE_RSCFD_CIVector[ EE_RSCFD_INT_GERR ]( ); break; case EE_RSCFD_INT_RXF0: case EE_RSCFD_INT_RXF1: case EE_RSCFD_INT_RXF2: case EE_RSCFD_INT_RXF3: case EE_RSCFD_INT_RXF4: case EE_RSCFD_INT_RXF5: case EE_RSCFD_INT_RXF6: case EE_RSCFD_INT_RXF7: FIFONumber_u08 = EE_RSCFD_InterruptFlag_Global_u08 - EE_RSCFD_INT_RXF0; ee_rscfd_common_p[ UnitNumber_u08 ]->rfsts[ FIFONumber_u08 ].rfif = 0; EE_RSCFD_CIVector[ EE_RSCFD_INT_RXF0 + FIFONumber_u08 ]( ); break; default: break; } EE_RSCFD_InterruptFlag_Global_u08 = EE_RSCFD_INT_NOINT; } else if( EE_RSCFD_InterruptFlag_Channel0_u08 != EE_RSCFD_INT_NOINT ) { EE_RSCFD_InterruptFlag_Channel_u08[ EE_RSCFD_CHANNEL0 ] = EE_RSCFD_InterruptFlag_Channel0_u08; switch( EE_RSCFD_InterruptFlag_Channel0_u08 ) { case EE_RSCFD_INT_TX: EE_RSCFD_LastTxObjectChannel0_u08 = EE_RSCFD_GetTxBuffer( ee_rscfd_common_p[ UnitNumber_u08 ]->tmtcsts[ 0 ]); if( EE_RSCFD_LastTxObjectChannel0_u08 != EE_RSCFD_INT_NOINT ) { ee_rscfd_common_p[ UnitNumber_u08 ]->tmsts[ EE_RSCFD_LastTxObjectChannel0_u08 ] &= ( u08 )( ~( EE_RSCFD_TMSTS_RFMSK ) ); EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_TX + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL0 ) ]( ); } break; case EE_RSCFD_INT_TXA: EE_RSCFD_LastTxObjectChannel0_u08 = EE_RSCFD_GetTxBuffer( ee_rscfd_common_p[ UnitNumber_u08 ]->tmtasts[ 0 ]); if( EE_RSCFD_LastTxObjectChannel0_u08 != EE_RSCFD_INT_NOINT ) { ee_rscfd_common_p[ UnitNumber_u08 ]->tmsts[ EE_RSCFD_LastTxObjectChannel0_u08 ] &= ( u08 )( ~( EE_RSCFD_TMSTS_RFMSK ) ); EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_TXA + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL0 ) ]( ); } break; case EE_RSCFD_INT_TXQ: EE_RSCFD_LastTxObjectChannel0_u08 = ( u08 ) ( ee_rscfd_common_p[ UnitNumber_u08 ]->txqsts[ EE_RSCFD_CHANNEL0 ].mc ); ee_rscfd_common_p[ UnitNumber_u08 ]->txqsts[ EE_RSCFD_CHANNEL0 ].irq = 0; EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_TXQ + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL0 ) ]( ); break; case EE_RSCFD_INT_CERR: EE_RSCFD_LastErrorCode_Channel_u16[ EE_RSCFD_CHANNEL0 ] = ( u16 )( ee_rscfd_common_p[ UnitNumber_u08 ]->ch[ EE_RSCFD_CHANNEL0 ].erfl.err ); EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_CERR + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL0 ) ]( ); ee_rscfd_common_p[ UnitNumber_u08 ]->ch[ EE_RSCFD_CHANNEL0 ].erfl.err = EE_RSCFD_ERROR_CLEARALL; break; case EE_RSCFD_INT_TXHL: ee_rscfd_common_p[ UnitNumber_u08 ]->thlsts[ EE_RSCFD_CHANNEL0 ].irq = 0; if( ee_rscfd_common_p[ UnitNumber_u08 ]->thlsts[ EE_RSCFD_CHANNEL0 ].elt ) { ee_rscfd_common_p[ UnitNumber_u08 ]->thlsts[ EE_RSCFD_CHANNEL0 ].elt = 0; EE_RSCFD_LastErrorCode_Global_u08 = EE_RSCFD_GERROR_THLLOST; EE_RSCFD_CIVector[ EE_RSCFD_INT_GERR ]( ); } EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_TXHL + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL0 ) ]( ); break; case EE_RSCFD_INT_RXCF: FIFONumber_u08 = EE_RSCFD_GetComFIFOIntStatus( 0, EE_RSCFD_CHANNEL0, EE_RSCFD_INT_RXCF ); if( FIFONumber_u08 == EE_RSCFD_GLOBAL ) break; ee_rscfd_common_p[ UnitNumber_u08 ]->cfsts[ FIFONumber_u08 ].cfrxif = 0; EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_RXCF + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL0 ) ]( ); break; case EE_RSCFD_INT_TXCF: FIFONumber_u08 = EE_RSCFD_GetComFIFOIntStatus( 0, EE_RSCFD_CHANNEL0, EE_RSCFD_INT_TXCF ); if( FIFONumber_u08 == EE_RSCFD_GLOBAL ) break; ee_rscfd_common_p[ UnitNumber_u08 ]->cfsts[ FIFONumber_u08 ].cftxif = 0; EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_TXCF + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL0 ) ]( ); break; } EE_RSCFD_InterruptFlag_Channel0_u08 = EE_RSCFD_INT_NOINT; } else if( EE_RSCFD_InterruptFlag_Channel1_u08 != EE_RSCFD_INT_NOINT ) { EE_RSCFD_InterruptFlag_Channel_u08[ EE_RSCFD_CHANNEL1 ] = EE_RSCFD_InterruptFlag_Channel1_u08; switch( EE_RSCFD_InterruptFlag_Channel1_u08 ) { case EE_RSCFD_INT_TX: EE_RSCFD_LastTxObjectChannel1_u08 = EE_RSCFD_GetTxBuffer( ee_rscfd_common_p[ UnitNumber_u08 ]->tmtcsts[ 0 ]>> EE_RSCFD_MAXTXBUFFERS ); if( EE_RSCFD_LastTxObjectChannel1_u08 != EE_RSCFD_INT_NOINT ) { ee_rscfd_common_p[ UnitNumber_u08 ]->tmsts[ EE_RSCFD_LastTxObjectChannel1_u08 + EE_RSCFD_MAXTXBUFFERS ] &= ( u08 )( ~( EE_RSCFD_TMSTS_RFMSK ) ); EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_TX + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL1 ) ]( ); } break; case EE_RSCFD_INT_TXA: EE_RSCFD_LastTxObjectChannel1_u08 = EE_RSCFD_GetTxBuffer( ee_rscfd_common_p[ UnitNumber_u08 ]->tmtasts[ 0 ]>> EE_RSCFD_MAXTXBUFFERS ); if( EE_RSCFD_LastTxObjectChannel1_u08 != EE_RSCFD_INT_NOINT ) { ee_rscfd_common_p[ UnitNumber_u08 ]->tmsts[ EE_RSCFD_LastTxObjectChannel1_u08 + EE_RSCFD_MAXTXBUFFERS ] &= ( u08 )( ~( EE_RSCFD_TMSTS_RFMSK ) ); EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_TXA + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL1 ) ]( ); } break; case EE_RSCFD_INT_TXQ: EE_RSCFD_LastTxObjectChannel1_u08 = ( u08 ) ( ee_rscfd_common_p[ UnitNumber_u08 ]->txqsts[ EE_RSCFD_CHANNEL1 ].mc ); ee_rscfd_common_p[ UnitNumber_u08 ]->txqsts[ EE_RSCFD_CHANNEL1 ].irq = 0; EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_TXQ + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL1 ) ]( ); break; case EE_RSCFD_INT_CERR: EE_RSCFD_LastErrorCode_Channel_u16[ EE_RSCFD_CHANNEL1 ] = ( u16 )( ee_rscfd_common_p[ UnitNumber_u08 ]->ch[ EE_RSCFD_CHANNEL1 ].erfl.err ); EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_CERR + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL1 ) ]( ); ee_rscfd_common_p[ UnitNumber_u08 ]->ch[ EE_RSCFD_CHANNEL1 ].erfl.err = EE_RSCFD_ERROR_CLEARALL; break; case EE_RSCFD_INT_TXHL: ee_rscfd_common_p[ UnitNumber_u08 ]->thlsts[ EE_RSCFD_CHANNEL1 ].irq = 0; if( ee_rscfd_common_p[ UnitNumber_u08 ]->thlsts[ EE_RSCFD_CHANNEL1 ].elt ) { ee_rscfd_common_p[ UnitNumber_u08 ]->thlsts[ EE_RSCFD_CHANNEL1 ].elt = 0; EE_RSCFD_LastErrorCode_Global_u08 = EE_RSCFD_GERROR_THLLOST; EE_RSCFD_CIVector[ EE_RSCFD_INT_GERR ]( ); } EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_TXHL + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL1 ) ]( ); break; case EE_RSCFD_INT_RXCF: FIFONumber_u08 = EE_RSCFD_GetComFIFOIntStatus( 0, EE_RSCFD_CHANNEL1, EE_RSCFD_INT_RXCF ); if( FIFONumber_u08 == EE_RSCFD_GLOBAL ) break; ee_rscfd_common_p[ UnitNumber_u08 ]->cfsts[ FIFONumber_u08 ].cfrxif = 0; EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_RXCF + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL1 ) ]( ); break; case EE_RSCFD_INT_TXCF: FIFONumber_u08 = EE_RSCFD_GetComFIFOIntStatus( 0, EE_RSCFD_CHANNEL1, EE_RSCFD_INT_TXCF ); if( FIFONumber_u08 == EE_RSCFD_GLOBAL ) break; ee_rscfd_common_p[ UnitNumber_u08 ]->cfsts[ FIFONumber_u08 ].cftxif = 0; EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_TXCF + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL1 ) ]( ); break; } EE_RSCFD_InterruptFlag_Channel1_u08 = EE_RSCFD_INT_NOINT; } else if( EE_RSCFD_InterruptFlag_Channel2_u08 != EE_RSCFD_INT_NOINT ) { EE_RSCFD_InterruptFlag_Channel_u08[ EE_RSCFD_CHANNEL2 ] = EE_RSCFD_InterruptFlag_Channel2_u08; switch( EE_RSCFD_InterruptFlag_Channel2_u08 ) { case EE_RSCFD_INT_TX: EE_RSCFD_LastTxObjectChannel2_u08 = EE_RSCFD_GetTxBuffer( ee_rscfd_common_p[ UnitNumber_u08 ]->tmtcsts[ 1 ]); if( EE_RSCFD_LastTxObjectChannel2_u08 != EE_RSCFD_INT_NOINT ) { ee_rscfd_common_p[ UnitNumber_u08 ]->tmsts[ EE_RSCFD_LastTxObjectChannel2_u08 + 2 * EE_RSCFD_MAXTXBUFFERS ] &= ( u08 )( ~( EE_RSCFD_TMSTS_RFMSK ) ); EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_TX + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL2 ) ]( ); } break; case EE_RSCFD_INT_TXA: EE_RSCFD_LastTxObjectChannel2_u08 = EE_RSCFD_GetTxBuffer( ee_rscfd_common_p[ UnitNumber_u08 ]->tmtasts[ 1 ]); if( EE_RSCFD_LastTxObjectChannel2_u08 != EE_RSCFD_INT_NOINT ) { ee_rscfd_common_p[ UnitNumber_u08 ]->tmsts[ EE_RSCFD_LastTxObjectChannel2_u08 + 2 * EE_RSCFD_MAXTXBUFFERS ] &= ( u08 )( ~( EE_RSCFD_TMSTS_RFMSK ) ); EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_TXA + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL1 ) ]( ); } break; case EE_RSCFD_INT_TXQ: EE_RSCFD_LastTxObjectChannel2_u08 = ( u08 ) ( ee_rscfd_common_p[ UnitNumber_u08 ]->txqsts[ EE_RSCFD_CHANNEL2 ].mc ); ee_rscfd_common_p[ UnitNumber_u08 ]->txqsts[ EE_RSCFD_CHANNEL2 ].irq = 0; EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_TXQ + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL2 ) ]( ); break; case EE_RSCFD_INT_CERR: EE_RSCFD_LastErrorCode_Channel_u16[ EE_RSCFD_CHANNEL2 ] = ( u16 )( ee_rscfd_common_p[ UnitNumber_u08 ]->ch[ EE_RSCFD_CHANNEL2 ].erfl.err ); EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_CERR + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL2 ) ]( ); ee_rscfd_common_p[ UnitNumber_u08 ]->ch[ EE_RSCFD_CHANNEL2 ].erfl.err = EE_RSCFD_ERROR_CLEARALL; break; case EE_RSCFD_INT_TXHL: ee_rscfd_common_p[ UnitNumber_u08 ]->thlsts[ EE_RSCFD_CHANNEL2 ].irq = 0; if( ee_rscfd_common_p[ UnitNumber_u08 ]->thlsts[ EE_RSCFD_CHANNEL2 ].elt ) { ee_rscfd_common_p[ UnitNumber_u08 ]->thlsts[ EE_RSCFD_CHANNEL2 ].elt = 0; EE_RSCFD_LastErrorCode_Global_u08 = EE_RSCFD_GERROR_THLLOST; EE_RSCFD_CIVector[ EE_RSCFD_INT_GERR ]( ); } EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_TXHL + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL2 ) ]( ); break; case EE_RSCFD_INT_RXCF: FIFONumber_u08 = EE_RSCFD_GetComFIFOIntStatus( 0, EE_RSCFD_CHANNEL1, EE_RSCFD_INT_RXCF ); if( FIFONumber_u08 == EE_RSCFD_GLOBAL ) break; ee_rscfd_common_p[ UnitNumber_u08 ]->cfsts[ FIFONumber_u08 ].cfrxif = 0; EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_RXCF + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL1 ) ]( ); break; case EE_RSCFD_INT_TXCF: FIFONumber_u08 = EE_RSCFD_GetComFIFOIntStatus( 0, EE_RSCFD_CHANNEL1, EE_RSCFD_INT_TXCF ); if( FIFONumber_u08 == EE_RSCFD_GLOBAL ) break; ee_rscfd_common_p[ UnitNumber_u08 ]->cfsts[ FIFONumber_u08 ].cftxif = 0; EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_TXCF + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL1 ) ]( ); break; } EE_RSCFD_InterruptFlag_Channel2_u08 = EE_RSCFD_INT_NOINT; } else if( EE_RSCFD_InterruptFlag_Channel3_u08 != EE_RSCFD_INT_NOINT ) { EE_RSCFD_InterruptFlag_Channel_u08[ EE_RSCFD_CHANNEL3 ] = EE_RSCFD_InterruptFlag_Channel3_u08; switch( EE_RSCFD_InterruptFlag_Channel3_u08 ) { case EE_RSCFD_INT_TX: EE_RSCFD_LastTxObjectChannel3_u08 = EE_RSCFD_GetTxBuffer( ee_rscfd_common_p[ UnitNumber_u08 ]->tmtcsts[ 1 ] >> EE_RSCFD_MAXTXBUFFERS ); if( EE_RSCFD_LastTxObjectChannel3_u08 != EE_RSCFD_INT_NOINT ) { ee_rscfd_common_p[ UnitNumber_u08 ]->tmsts[ EE_RSCFD_LastTxObjectChannel3_u08 + 3 * EE_RSCFD_MAXTXBUFFERS ] &= ( u08 )( ~( EE_RSCFD_TMSTS_RFMSK ) ); EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_TX + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL3 ) ]( ); } break; case EE_RSCFD_INT_TXA: EE_RSCFD_LastTxObjectChannel3_u08 = EE_RSCFD_GetTxBuffer( ee_rscfd_common_p[ UnitNumber_u08 ]->tmtasts[ 1 ] >> EE_RSCFD_MAXTXBUFFERS ); if( EE_RSCFD_LastTxObjectChannel0_u08 != EE_RSCFD_INT_NOINT ) { ee_rscfd_common_p[ UnitNumber_u08 ]->tmsts[ EE_RSCFD_LastTxObjectChannel3_u08 + 3 * EE_RSCFD_MAXTXBUFFERS ] &= ( u08 )( ~( EE_RSCFD_TMSTS_RFMSK ) ); EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_TXA + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL3 ) ]( ); } break; case EE_RSCFD_INT_TXQ: EE_RSCFD_LastTxObjectChannel3_u08 = ( u08 ) ( ee_rscfd_common_p[ UnitNumber_u08 ]->txqsts[ EE_RSCFD_CHANNEL3 ].mc ); ee_rscfd_common_p[ UnitNumber_u08 ]->txqsts[ EE_RSCFD_CHANNEL3 ].irq = 0; EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_TXQ + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL3 ) ]( ); break; case EE_RSCFD_INT_CERR: EE_RSCFD_LastErrorCode_Channel_u16[ EE_RSCFD_CHANNEL3 ] = ( u16 )( ee_rscfd_common_p[ UnitNumber_u08 ]->ch[ EE_RSCFD_CHANNEL3 ].erfl.err ); EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_CERR + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL3 ) ]( ); ee_rscfd_common_p[ UnitNumber_u08 ]->ch[ EE_RSCFD_CHANNEL3 ].erfl.err = EE_RSCFD_ERROR_CLEARALL; break; case EE_RSCFD_INT_TXHL: ee_rscfd_common_p[ UnitNumber_u08 ]->thlsts[ EE_RSCFD_CHANNEL3 ].irq = 0; if( ee_rscfd_common_p[ UnitNumber_u08 ]->thlsts[ EE_RSCFD_CHANNEL3 ].elt ) { ee_rscfd_common_p[ UnitNumber_u08 ]->thlsts[ EE_RSCFD_CHANNEL3 ].elt = 0; EE_RSCFD_LastErrorCode_Global_u08 = EE_RSCFD_GERROR_THLLOST; EE_RSCFD_CIVector[ EE_RSCFD_INT_GERR ]( ); } EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_TXHL + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL3 ) ]( ); break; case EE_RSCFD_INT_RXCF: FIFONumber_u08 = EE_RSCFD_GetComFIFOIntStatus( 0, EE_RSCFD_CHANNEL3, EE_RSCFD_INT_RXCF ); if( FIFONumber_u08 == EE_RSCFD_GLOBAL ) break; ee_rscfd_common_p[ UnitNumber_u08 ]->cfsts[ FIFONumber_u08 ].cfrxif = 0; EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_RXCF + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL3 ) ]( ); break; case EE_RSCFD_INT_TXCF: FIFONumber_u08 = EE_RSCFD_GetComFIFOIntStatus( 0, EE_RSCFD_CHANNEL3, EE_RSCFD_INT_TXCF ); if( FIFONumber_u08 == EE_RSCFD_GLOBAL ) break; ee_rscfd_common_p[ UnitNumber_u08 ]->cfsts[ FIFONumber_u08 ].cftxif = 0; EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_TXCF + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL3 ) ]( ); break; } EE_RSCFD_InterruptFlag_Channel3_u08 = EE_RSCFD_INT_NOINT; } else if( EE_RSCFD_InterruptFlag_Channel4_u08 != EE_RSCFD_INT_NOINT ) { EE_RSCFD_InterruptFlag_Channel_u08[ EE_RSCFD_CHANNEL4 ] = EE_RSCFD_InterruptFlag_Channel4_u08; switch( EE_RSCFD_InterruptFlag_Channel4_u08 ) { case EE_RSCFD_INT_TX: EE_RSCFD_LastTxObjectChannel4_u08 = EE_RSCFD_GetTxBuffer( ee_rscfd_common_p[ UnitNumber_u08 ]->tmtcsts[ 2 ]); if( EE_RSCFD_LastTxObjectChannel4_u08 != EE_RSCFD_INT_NOINT ) { ee_rscfd_common_p[ UnitNumber_u08 ]->tmsts[ EE_RSCFD_LastTxObjectChannel4_u08 + 4 * EE_RSCFD_MAXTXBUFFERS ] &= ( u08 )( ~( EE_RSCFD_TMSTS_RFMSK ) ); EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_TX + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL4 ) ]( ); } break; case EE_RSCFD_INT_TXA: EE_RSCFD_LastTxObjectChannel4_u08 = EE_RSCFD_GetTxBuffer( ee_rscfd_common_p[ UnitNumber_u08 ]->tmtasts[ 2 ]); if( EE_RSCFD_LastTxObjectChannel4_u08 != EE_RSCFD_INT_NOINT ) { ee_rscfd_common_p[ UnitNumber_u08 ]->tmsts[ EE_RSCFD_LastTxObjectChannel4_u08 + 4 * EE_RSCFD_MAXTXBUFFERS ] &= ( u08 )( ~( EE_RSCFD_TMSTS_RFMSK ) ); EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_TXA + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL4 ) ]( ); } break; case EE_RSCFD_INT_TXQ: EE_RSCFD_LastTxObjectChannel4_u08 = ( u08 ) ( ee_rscfd_common_p[ UnitNumber_u08 ]->txqsts[ EE_RSCFD_CHANNEL4 ].mc ); ee_rscfd_common_p[ UnitNumber_u08 ]->txqsts[ EE_RSCFD_CHANNEL0 ].irq = 0; EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_TXQ + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL4 ) ]( ); break; case EE_RSCFD_INT_CERR: EE_RSCFD_LastErrorCode_Channel_u16[ EE_RSCFD_CHANNEL4 ] = ( u16 )( ee_rscfd_common_p[ UnitNumber_u08 ]->ch[ EE_RSCFD_CHANNEL4 ].erfl.err ); EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_CERR + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL4 ) ]( ); ee_rscfd_common_p[ UnitNumber_u08 ]->ch[ EE_RSCFD_CHANNEL4 ].erfl.err = EE_RSCFD_ERROR_CLEARALL; break; case EE_RSCFD_INT_TXHL: ee_rscfd_common_p[ UnitNumber_u08 ]->thlsts[ EE_RSCFD_CHANNEL4 ].irq = 0; if( ee_rscfd_common_p[ UnitNumber_u08 ]->thlsts[ EE_RSCFD_CHANNEL4 ].elt ) { ee_rscfd_common_p[ UnitNumber_u08 ]->thlsts[ EE_RSCFD_CHANNEL4 ].elt = 0; EE_RSCFD_LastErrorCode_Global_u08 = EE_RSCFD_GERROR_THLLOST; EE_RSCFD_CIVector[ EE_RSCFD_INT_GERR ]( ); } EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_TXHL + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL4 ) ]( ); break; case EE_RSCFD_INT_RXCF: FIFONumber_u08 = EE_RSCFD_GetComFIFOIntStatus( 0, EE_RSCFD_CHANNEL4, EE_RSCFD_INT_RXCF ); if( FIFONumber_u08 == EE_RSCFD_GLOBAL ) break; ee_rscfd_common_p[ UnitNumber_u08 ]->cfsts[ FIFONumber_u08 ].cfrxif = 0; EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_RXCF + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL4 ) ]( ); break; case EE_RSCFD_INT_TXCF: FIFONumber_u08 = EE_RSCFD_GetComFIFOIntStatus( 0, EE_RSCFD_CHANNEL4, EE_RSCFD_INT_TXCF ); if( FIFONumber_u08 == EE_RSCFD_GLOBAL ) break; ee_rscfd_common_p[ UnitNumber_u08 ]->cfsts[ FIFONumber_u08 ].cftxif = 0; EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_TXCF + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL4 ) ]( ); break; } EE_RSCFD_InterruptFlag_Channel4_u08 = EE_RSCFD_INT_NOINT; } else if( EE_RSCFD_InterruptFlag_Channel5_u08 != EE_RSCFD_INT_NOINT ) { EE_RSCFD_InterruptFlag_Channel_u08[ EE_RSCFD_CHANNEL5 ] = EE_RSCFD_InterruptFlag_Channel5_u08; switch( EE_RSCFD_InterruptFlag_Channel5_u08 ) { case EE_RSCFD_INT_TX: EE_RSCFD_LastTxObjectChannel5_u08 = EE_RSCFD_GetTxBuffer( ee_rscfd_common_p[ UnitNumber_u08 ]->tmtcsts[ 2 ]>> EE_RSCFD_MAXTXBUFFERS ); if( EE_RSCFD_LastTxObjectChannel5_u08 != EE_RSCFD_INT_NOINT ) { ee_rscfd_common_p[ UnitNumber_u08 ]->tmsts[ EE_RSCFD_LastTxObjectChannel5_u08 + 5 * EE_RSCFD_MAXTXBUFFERS ] &= ( u08 )( ~( EE_RSCFD_TMSTS_RFMSK ) ); EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_TX + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL5 ) ]( ); } break; case EE_RSCFD_INT_TXA: EE_RSCFD_LastTxObjectChannel5_u08 = EE_RSCFD_GetTxBuffer( ee_rscfd_common_p[ UnitNumber_u08 ]->tmtasts[ 2 ]>> EE_RSCFD_MAXTXBUFFERS ); if( EE_RSCFD_LastTxObjectChannel1_u08 != EE_RSCFD_INT_NOINT ) { ee_rscfd_common_p[ UnitNumber_u08 ]->tmsts[ EE_RSCFD_LastTxObjectChannel5_u08 + 5 * EE_RSCFD_MAXTXBUFFERS ] &= ( u08 )( ~( EE_RSCFD_TMSTS_RFMSK ) ); EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_TXA + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL5 ) ]( ); } break; case EE_RSCFD_INT_TXQ: EE_RSCFD_LastTxObjectChannel5_u08 = ( u08 ) ( ee_rscfd_common_p[ UnitNumber_u08 ]->txqsts[ EE_RSCFD_CHANNEL5 ].mc ); ee_rscfd_common_p[ UnitNumber_u08 ]->txqsts[ EE_RSCFD_CHANNEL1 ].irq = 0; EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_TXQ + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL5 ) ]( ); break; case EE_RSCFD_INT_CERR: EE_RSCFD_LastErrorCode_Channel_u16[ EE_RSCFD_CHANNEL5 ] = ( u16 )( ee_rscfd_common_p[ UnitNumber_u08 ]->ch[ EE_RSCFD_CHANNEL5 ].erfl.err ); EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_CERR + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL5 ) ]( ); ee_rscfd_common_p[ UnitNumber_u08 ]->ch[ EE_RSCFD_CHANNEL5 ].erfl.err = EE_RSCFD_ERROR_CLEARALL; break; case EE_RSCFD_INT_TXHL: ee_rscfd_common_p[ UnitNumber_u08 ]->thlsts[ EE_RSCFD_CHANNEL5 ].irq = 0; if( ee_rscfd_common_p[ UnitNumber_u08 ]->thlsts[ EE_RSCFD_CHANNEL5 ].elt ) { ee_rscfd_common_p[ UnitNumber_u08 ]->thlsts[ EE_RSCFD_CHANNEL5 ].elt = 0; EE_RSCFD_LastErrorCode_Global_u08 = EE_RSCFD_GERROR_THLLOST; EE_RSCFD_CIVector[ EE_RSCFD_INT_GERR ]( ); } EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_TXHL + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL5 ) ]( ); break; case EE_RSCFD_INT_RXCF: FIFONumber_u08 = EE_RSCFD_GetComFIFOIntStatus( 0, EE_RSCFD_CHANNEL5, EE_RSCFD_INT_RXCF ); if( FIFONumber_u08 == EE_RSCFD_GLOBAL ) break; ee_rscfd_common_p[ UnitNumber_u08 ]->cfsts[ FIFONumber_u08 ].cfrxif = 0; EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_RXCF + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL5 ) ]( ); break; case EE_RSCFD_INT_TXCF: FIFONumber_u08 = EE_RSCFD_GetComFIFOIntStatus( 0, EE_RSCFD_CHANNEL5, EE_RSCFD_INT_TXCF ); if( FIFONumber_u08 == EE_RSCFD_GLOBAL ) break; ee_rscfd_common_p[ UnitNumber_u08 ]->cfsts[ FIFONumber_u08 ].cftxif = 0; EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_TXCF + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL5 ) ]( ); break; } EE_RSCFD_InterruptFlag_Channel5_u08 = EE_RSCFD_INT_NOINT; } else if( EE_RSCFD_InterruptFlag_Channel6_u08 != EE_RSCFD_INT_NOINT ) { EE_RSCFD_InterruptFlag_Channel_u08[ EE_RSCFD_CHANNEL6 ] = EE_RSCFD_InterruptFlag_Channel6_u08; switch( EE_RSCFD_InterruptFlag_Channel6_u08 ) { case EE_RSCFD_INT_TX: EE_RSCFD_LastTxObjectChannel6_u08 = EE_RSCFD_GetTxBuffer( ee_rscfd_common_p[ UnitNumber_u08 ]->tmtcsts[ 3 ]); if( EE_RSCFD_LastTxObjectChannel6_u08 != EE_RSCFD_INT_NOINT ) { ee_rscfd_common_p[ UnitNumber_u08 ]->tmsts[ EE_RSCFD_LastTxObjectChannel6_u08 + 6 * EE_RSCFD_MAXTXBUFFERS ] &= ( u08 )( ~( EE_RSCFD_TMSTS_RFMSK ) ); EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_TX + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL6 ) ]( ); } break; case EE_RSCFD_INT_TXA: EE_RSCFD_LastTxObjectChannel6_u08 = EE_RSCFD_GetTxBuffer( ee_rscfd_common_p[ UnitNumber_u08 ]->tmtasts[ 3 ]); if( EE_RSCFD_LastTxObjectChannel6_u08 != EE_RSCFD_INT_NOINT ) { ee_rscfd_common_p[ UnitNumber_u08 ]->tmsts[ EE_RSCFD_LastTxObjectChannel6_u08 + 6 * EE_RSCFD_MAXTXBUFFERS ] &= ( u08 )( ~( EE_RSCFD_TMSTS_RFMSK ) ); EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_TXA + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL6 ) ]( ); } break; case EE_RSCFD_INT_TXQ: EE_RSCFD_LastTxObjectChannel6_u08 = ( u08 ) ( ee_rscfd_common_p[ UnitNumber_u08 ]->txqsts[ EE_RSCFD_CHANNEL6 ].mc ); ee_rscfd_common_p[ UnitNumber_u08 ]->txqsts[ EE_RSCFD_CHANNEL6 ].irq = 0; EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_TXQ + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL6 ) ]( ); break; case EE_RSCFD_INT_CERR: EE_RSCFD_LastErrorCode_Channel_u16[ EE_RSCFD_CHANNEL6 ] = ( u16 )( ee_rscfd_common_p[ UnitNumber_u08 ]->ch[ EE_RSCFD_CHANNEL6 ].erfl.err ); EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_CERR + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL6 ) ]( ); ee_rscfd_common_p[ UnitNumber_u08 ]->ch[ EE_RSCFD_CHANNEL6 ].erfl.err = EE_RSCFD_ERROR_CLEARALL; break; case EE_RSCFD_INT_TXHL: ee_rscfd_common_p[ UnitNumber_u08 ]->thlsts[ EE_RSCFD_CHANNEL6 ].irq = 0; if( ee_rscfd_common_p[ UnitNumber_u08 ]->thlsts[ EE_RSCFD_CHANNEL2 ].elt ) { ee_rscfd_common_p[ UnitNumber_u08 ]->thlsts[ EE_RSCFD_CHANNEL6 ].elt = 0; EE_RSCFD_LastErrorCode_Global_u08 = EE_RSCFD_GERROR_THLLOST; EE_RSCFD_CIVector[ EE_RSCFD_INT_GERR ]( ); } EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_TXHL + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL6 ) ]( ); break; case EE_RSCFD_INT_RXCF: FIFONumber_u08 = EE_RSCFD_GetComFIFOIntStatus( 0, EE_RSCFD_CHANNEL6, EE_RSCFD_INT_RXCF ); if( FIFONumber_u08 == EE_RSCFD_GLOBAL ) break; ee_rscfd_common_p[ UnitNumber_u08 ]->cfsts[ FIFONumber_u08 ].cfrxif = 0; EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_RXCF + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL6 ) ]( ); break; case EE_RSCFD_INT_TXCF: FIFONumber_u08 = EE_RSCFD_GetComFIFOIntStatus( 0, EE_RSCFD_CHANNEL6, EE_RSCFD_INT_TXCF ); if( FIFONumber_u08 == EE_RSCFD_GLOBAL ) break; ee_rscfd_common_p[ UnitNumber_u08 ]->cfsts[ FIFONumber_u08 ].cftxif = 0; EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_TXCF + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL6 ) ]( ); break; } EE_RSCFD_InterruptFlag_Channel6_u08 = EE_RSCFD_INT_NOINT; } else if( EE_RSCFD_InterruptFlag_Channel7_u08 != EE_RSCFD_INT_NOINT ) { EE_RSCFD_InterruptFlag_Channel_u08[ EE_RSCFD_CHANNEL7 ] = EE_RSCFD_InterruptFlag_Channel7_u08; switch( EE_RSCFD_InterruptFlag_Channel7_u08 ) { case EE_RSCFD_INT_TX: EE_RSCFD_LastTxObjectChannel7_u08 = EE_RSCFD_GetTxBuffer( ee_rscfd_common_p[ UnitNumber_u08 ]->tmtcsts[ 3 ] >> EE_RSCFD_MAXTXBUFFERS ); if( EE_RSCFD_LastTxObjectChannel7_u08 != EE_RSCFD_INT_NOINT ) { ee_rscfd_common_p[ UnitNumber_u08 ]->tmsts[ EE_RSCFD_LastTxObjectChannel7_u08 + 7 * EE_RSCFD_MAXTXBUFFERS ] &= ( u08 )( ~( EE_RSCFD_TMSTS_RFMSK ) ); EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_TX + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL3 ) ]( ); } break; case EE_RSCFD_INT_TXA: EE_RSCFD_LastTxObjectChannel7_u08 = EE_RSCFD_GetTxBuffer( ee_rscfd_common_p[ UnitNumber_u08 ]->tmtasts[ 3 ] >> EE_RSCFD_MAXTXBUFFERS ); if( EE_RSCFD_LastTxObjectChannel7_u08 != EE_RSCFD_INT_NOINT ) { ee_rscfd_common_p[ UnitNumber_u08 ]->tmsts[ EE_RSCFD_LastTxObjectChannel7_u08 + 7 * EE_RSCFD_MAXTXBUFFERS ] &= ( u08 )( ~( EE_RSCFD_TMSTS_RFMSK ) ); EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_TXA + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL7 ) ]( ); } break; case EE_RSCFD_INT_TXQ: EE_RSCFD_LastTxObjectChannel7_u08 = ( u08 ) ( ee_rscfd_common_p[ UnitNumber_u08 ]->txqsts[ EE_RSCFD_CHANNEL3 ].mc ); ee_rscfd_common_p[ UnitNumber_u08 ]->txqsts[ EE_RSCFD_CHANNEL7 ].irq = 0; EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_TXQ + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL7 ) ]( ); break; case EE_RSCFD_INT_CERR: EE_RSCFD_LastErrorCode_Channel_u16[ EE_RSCFD_CHANNEL7 ] = ( u16 )( ee_rscfd_common_p[ UnitNumber_u08 ]->ch[ EE_RSCFD_CHANNEL7 ].erfl.err ); EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_CERR + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL7 ) ]( ); ee_rscfd_common_p[ UnitNumber_u08 ]->ch[ EE_RSCFD_CHANNEL7 ].erfl.err = EE_RSCFD_ERROR_CLEARALL; break; case EE_RSCFD_INT_TXHL: ee_rscfd_common_p[ UnitNumber_u08 ]->thlsts[ EE_RSCFD_CHANNEL7 ].irq = 0; if( ee_rscfd_common_p[ UnitNumber_u08 ]->thlsts[ EE_RSCFD_CHANNEL7 ].elt ) { ee_rscfd_common_p[ UnitNumber_u08 ]->thlsts[ EE_RSCFD_CHANNEL7 ].elt = 0; EE_RSCFD_LastErrorCode_Global_u08 = EE_RSCFD_GERROR_THLLOST; EE_RSCFD_CIVector[ EE_RSCFD_INT_GERR ]( ); } EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_TXHL + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL7 ) ]( ); break; case EE_RSCFD_INT_RXCF: FIFONumber_u08 = EE_RSCFD_GetComFIFOIntStatus( 0, EE_RSCFD_CHANNEL7, EE_RSCFD_INT_RXCF ); if( FIFONumber_u08 == EE_RSCFD_GLOBAL ) break; ee_rscfd_common_p[ UnitNumber_u08 ]->cfsts[ FIFONumber_u08 ].cfrxif = 0; EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_RXCF + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL7 ) ]( ); break; case EE_RSCFD_INT_TXCF: FIFONumber_u08 = EE_RSCFD_GetComFIFOIntStatus( 0, EE_RSCFD_CHANNEL7, EE_RSCFD_INT_TXCF ); if( FIFONumber_u08 == EE_RSCFD_GLOBAL ) break; ee_rscfd_common_p[ UnitNumber_u08 ]->cfsts[ FIFONumber_u08 ].cftxif = 0; EE_RSCFD_CIVector[ EE_RSCFD_INT_GLOBAL + EE_RSCFD_INT_TXCF + ( EE_RSCFD_INT_CHANNEL * EE_RSCFD_CHANNEL7 ) ]( ); break; } EE_RSCFD_InterruptFlag_Channel7_u08 = EE_RSCFD_INT_NOINT; } __asm( "syncp" ); } /* * The peripheral Support Functions */ //============================================================================= // FunctionName: RSCFD_PortEnable // IN : UnitNumber: Selected Macro // ChannelNumber: Selected Channel // OUT : Error Flag // Description : // Enable AFCAN I/O ports //============================================================================= bit EE_RSCFD_PortEnable( u08 UnitNumber_u08, u08 ChannelNumber_u08 ) { u08 ChannelCount_u08; if( UnitNumber_u08 >= EE_RSCFD_MACROS ) return( EE_RSCFD_ERROR ); if( ChannelNumber_u08 >= ee_rscfd_channels[ UnitNumber_u08 ] ) return( EE_RSCFD_ERROR ); switch( UnitNumber_u08 ) { case EE_RSCFD_0: switch( ChannelNumber_u08 ) { #ifdef EE_RSCFD_PORT_M0RX0 case EE_RSCFD_CHANNEL0: PORT_Enable( EE_RSCFD_PORT_M0RX0, EE_RSCFD_PORT_BIT_M0RX0, PORT_DIR_INPUT, PORT_MODE_PERIPHERAL, EE_RSCFD_PORT_FUNC_M0RX0 ); PORT_Enable( EE_RSCFD_PORT_M0TX0, EE_RSCFD_PORT_BIT_M0TX0, PORT_DIR_OUTPUT, PORT_MODE_PERIPHERAL, EE_RSCFD_PORT_FUNC_M0TX0 ); break; #endif #ifdef EE_RSCFD_PORT_M0RX1 case EE_RSCFD_CHANNEL1: PORT_Enable( EE_RSCFD_PORT_M0RX1, EE_RSCFD_PORT_BIT_M0RX1, PORT_DIR_INPUT, PORT_MODE_PERIPHERAL, EE_RSCFD_PORT_FUNC_M0RX1 ); PORT_Enable( EE_RSCFD_PORT_M0TX1, EE_RSCFD_PORT_BIT_M0TX1, PORT_DIR_OUTPUT, PORT_MODE_PERIPHERAL, EE_RSCFD_PORT_FUNC_M0TX1 ); break; #endif #ifdef EE_RSCFD_PORT_M0RX2 case EE_RSCFD_CHANNEL2: PORT_Enable( EE_RSCFD_PORT_M0RX2, EE_RSCFD_PORT_BIT_M0RX2, PORT_DIR_INPUT, PORT_MODE_PERIPHERAL, EE_RSCFD_PORT_FUNC_M0RX2 ); PORT_Enable( EE_RSCFD_PORT_M0TX2, EE_RSCFD_PORT_BIT_M0TX2, PORT_DIR_OUTPUT, PORT_MODE_PERIPHERAL, EE_RSCFD_PORT_FUNC_M0TX2 ); break; #endif #ifdef EE_RSCFD_PORT_M0RX3 case EE_RSCFD_CHANNEL3: PORT_Enable( EE_RSCFD_PORT_M0RX3, EE_RSCFD_PORT_BIT_M0RX3, PORT_DIR_INPUT, PORT_MODE_PERIPHERAL, EE_RSCFD_PORT_FUNC_M0RX3 ); PORT_Enable( EE_RSCFD_PORT_M0TX3, EE_RSCFD_PORT_BIT_M0TX3, PORT_DIR_OUTPUT, PORT_MODE_PERIPHERAL, EE_RSCFD_PORT_FUNC_M0TX3 ); break; #endif #ifdef EE_RSCFD_PORT_M0RX4 case EE_RSCFD_CHANNEL4: PORT_Enable( EE_RSCFD_PORT_M0RX4, EE_RSCFD_PORT_BIT_M0RX4, PORT_DIR_INPUT, PORT_MODE_PERIPHERAL, EE_RSCFD_PORT_FUNC_M0RX4 ); PORT_Enable( EE_RSCFD_PORT_M0TX4, EE_RSCFD_PORT_BIT_M0TX4, PORT_DIR_OUTPUT, PORT_MODE_PERIPHERAL, EE_RSCFD_PORT_FUNC_M0TX4 ); break; #endif #ifdef EE_RSCFD_PORT_M0RX5 case EE_RSCFD_CHANNEL5: PORT_Enable( EE_RSCFD_PORT_M0RX5, EE_RSCFD_PORT_BIT_M0RX5, PORT_DIR_INPUT, PORT_MODE_PERIPHERAL, EE_RSCFD_PORT_FUNC_M0RX5 ); PORT_Enable( EE_RSCFD_PORT_M0TX5, EE_RSCFD_PORT_BIT_M0TX5, PORT_DIR_OUTPUT, PORT_MODE_PERIPHERAL, EE_RSCFD_PORT_FUNC_M0TX5 ); break; #endif case EE_RSCFD_GLOBAL: for( ChannelCount_u08 = 0; ChannelCount_u08 < ee_rscfd_channels[ UnitNumber_u08 ]; ChannelCount_u08++ ) { EE_RSCFD_PortEnable( UnitNumber_u08, ChannelCount_u08 ); } break; default: return( EE_RSCFD_ERROR ); } // switch ChannelNumber_u08 break; case EE_RSCFD_1: switch( ChannelNumber_u08 ) { #ifdef EE_RSCFD_PORT_M1RX0 case EE_RSCFD_CHANNEL0: PORT_Enable( EE_RSCFD_PORT_M1RX0, EE_RSCFD_PORT_BIT_M1RX0, PORT_DIR_INPUT, PORT_MODE_PERIPHERAL, EE_RSCFD_PORT_FUNC_M1RX0 ); PORT_Enable( EE_RSCFD_PORT_M1TX0, EE_RSCFD_PORT_BIT_M1TX0, PORT_DIR_OUTPUT, PORT_MODE_PERIPHERAL, EE_RSCFD_PORT_FUNC_M1TX0 ); break; #endif #ifdef EE_RSCFD_PORT_M1RX1 case EE_RSCFD_CHANNEL1: PORT_Enable( EE_RSCFD_PORT_M1RX1, EE_RSCFD_PORT_BIT_M1RX1, PORT_DIR_INPUT, PORT_MODE_PERIPHERAL, EE_RSCFD_PORT_FUNC_M1RX1 ); PORT_Enable( EE_RSCFD_PORT_M1TX1, EE_RSCFD_PORT_BIT_M1TX1, PORT_DIR_OUTPUT, PORT_MODE_PERIPHERAL, EE_RSCFD_PORT_FUNC_M1TX1 ); break; #endif case EE_RSCFD_GLOBAL: for( ChannelCount_u08 = 0; ChannelCount_u08 < ee_rscfd_channels[ UnitNumber_u08 ]; ChannelCount_u08++ ) { EE_RSCFD_PortEnable( UnitNumber_u08, ChannelCount_u08 ); } break; default: return( EE_RSCFD_ERROR ); } // switch ChannelNumber_u08 break; default: return( EE_RSCFD_ERROR ); } // switch( UnitNumber ) return( EE_RSCFD_OK ); } //============================================================================= // FunctionName: EE_RSCFD_PortDisable // IN : UnitNumber: Selected Macro // ChannelNumber: Selected Channel // OUT : Error Flag // Description : // Release AFCAN I/O ports to normal port function //============================================================================= bit EE_RSCFD_PortDisable( u08 UnitNumber_u08, u08 ChannelNumber_u08 ) { u08 ChannelCount_u08; if( UnitNumber_u08 >= EE_RSCFD_MACROS ) return( EE_RSCFD_ERROR ); if( ChannelNumber_u08 >= ee_rscfd_channels[ UnitNumber_u08 ] ) return( EE_RSCFD_ERROR ); switch( UnitNumber_u08 ) { case EE_RSCFD_0: switch( ChannelNumber_u08 ) { #ifdef EE_RSCFD_PORT_M0RX0 case EE_RSCFD_CHANNEL0: PORT_Disable( EE_RSCFD_PORT_M0RX0, EE_RSCFD_PORT_BIT_M0RX0 ); PORT_Disable( EE_RSCFD_PORT_M0TX0, EE_RSCFD_PORT_BIT_M0TX0 ); break; #endif #ifdef EE_RSCFD_PORT_M0RX1 case EE_RSCFD_CHANNEL1: PORT_Disable( EE_RSCFD_PORT_M0RX1, EE_RSCFD_PORT_BIT_M0RX1 ); PORT_Disable( EE_RSCFD_PORT_M0TX1, EE_RSCFD_PORT_BIT_M0TX1 ); break; #endif #ifdef EE_RSCFD_PORT_M0RX2 case EE_RSCFD_CHANNEL2: PORT_Disable( EE_RSCFD_PORT_M0RX2, EE_RSCFD_PORT_BIT_M0RX2 ); PORT_Disable( EE_RSCFD_PORT_M0TX2, EE_RSCFD_PORT_BIT_M0TX2 ); break; #endif #ifdef EE_RSCFD_PORT_M0RX3 case EE_RSCFD_CHANNEL3: PORT_Disable( EE_RSCFD_PORT_M0RX3, EE_RSCFD_PORT_BIT_M0RX3 ); PORT_Disable( EE_RSCFD_PORT_M0TX3, EE_RSCFD_PORT_BIT_M0TX3 ); break; #endif #ifdef EE_RSCFD_PORT_M0RX4 case EE_RSCFD_CHANNEL4: PORT_Disable( EE_RSCFD_PORT_M0RX4, EE_RSCFD_PORT_BIT_M0RX4 ); PORT_Disable( EE_RSCFD_PORT_M0TX4, EE_RSCFD_PORT_BIT_M0TX4 ); break; #endif case EE_RSCFD_GLOBAL: for( ChannelCount_u08 = 0; ChannelCount_u08 < ee_rscfd_channels[ UnitNumber_u08 ]; ChannelCount_u08++ ) { EE_RSCFD_PortDisable( UnitNumber_u08, ChannelCount_u08 ); } break; default: return( EE_RSCFD_ERROR ); } // switch ChannelNumber_u08 break; case EE_RSCFD_1: switch( ChannelNumber_u08 ) { #ifdef EE_RSCFD_PORT_M1RX0 case EE_RSCFD_CHANNEL0: PORT_Disable( EE_RSCFD_PORT_M1RX0, EE_RSCFD_PORT_BIT_M1RX0 ); PORT_Disable( EE_RSCFD_PORT_M1TX0, EE_RSCFD_PORT_BIT_M1TX0 ); break; #endif #ifdef EE_RSCFD_PORT_M1RX1 case EE_RSCFD_CHANNEL1: PORT_Disable( EE_RSCFD_PORT_M1RX1, EE_RSCFD_PORT_BIT_M1RX1 ); PORT_Disable( EE_RSCFD_PORT_M1TX1, EE_RSCFD_PORT_BIT_M1TX1 ); break; #endif case EE_RSCFD_GLOBAL: for( ChannelCount_u08 = 0; ChannelCount_u08 < ee_rscfd_channels[ UnitNumber_u08 ]; ChannelCount_u08++ ) { EE_RSCFD_PortDisable( UnitNumber_u08, ChannelCount_u08 ); } break; default: return( EE_RSCFD_ERROR ); } // switch ChannelNumber_u08 break; default: return( EE_RSCFD_ERROR ); } // switch( UnitNumber ) return( EE_RSCFD_OK ); } //============================================================================= // FunctionName: EE_RSCFD_CreateInterrupt // IN : Unit Number, Channel Number, Int Number, Int Level, // Int Function Vector // OUT : Success Status // Description : Enables and Sets Interrupt Vector to given Function // //============================================================================= bit EE_RSCFD_CreateInterrupt( u08 UnitNumber_u08, u08 ChannelNumber_u08, u08 IntNumber_u08, u16 SetIntLevel_u16, void ( *FunctionVector )( ) ) { u16 IntLevel_u16 = SetIntLevel_u16; if( UnitNumber_u08 >= EE_RSCFD_MACROS ) return( EE_RSCFD_ERROR ); if( FunctionVector == NULL ) { IntLevel_u16 = EE_RSCFD_INTCLEAR; FunctionVector = EE_RSCFD_IRQDefault; } if( ChannelNumber_u08 == EE_RSCFD_GLOBAL ) { EE_RSCFD_CIVector[ UnitNumber_u08 * ( EE_RSCFD_CHANNELS * EE_RSCFD_INT_CHANNEL + EE_RSCFD_INT_GLOBAL ) + IntNumber_u08 ] = FunctionVector; switch( UnitNumber_u08 ) { case EE_RSCFD_0: switch( IntNumber_u08 ) { #if( defined( EE_RSCFD_INT_M0GERR ) ) case EE_RSCFD_INT_GERR: EE_RSCFD_INT_M0GERR = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M0RXF0 ) ) case EE_RSCFD_INT_RXF0: EE_RSCFD_INT_M0RXF0 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M0RXF1 ) ) case EE_RSCFD_INT_RXF1: EE_RSCFD_INT_M0RXF1 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M0RXF2 ) ) case EE_RSCFD_INT_RXF2: EE_RSCFD_INT_M0RXF2 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M0RXF3 ) ) case EE_RSCFD_INT_RXF3: EE_RSCFD_INT_M0RXF3 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M0RXF4 ) ) case EE_RSCFD_INT_RXF4: EE_RSCFD_INT_M0RXF4 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M0RXF5 ) ) case EE_RSCFD_INT_RXF5: EE_RSCFD_INT_M0RXF5 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M0RXF6 ) ) case EE_RSCFD_INT_RXF6: EE_RSCFD_INT_M0RXF6 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M0RXF7 ) ) case EE_RSCFD_INT_RXF7: EE_RSCFD_INT_M0RXF7 = IntLevel_u16; break; #endif } break; case EE_RSCFD_1: switch( IntNumber_u08 ) { #if( defined( EE_RSCFD_INT_M1GERR ) ) case EE_RSCFD_INT_GERR: EE_RSCFD_INT_M1GERR = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M1RXF0 ) ) case EE_RSCFD_INT_RXF0: EE_RSCFD_INT_M1RXF0 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M1RXF1 ) ) case EE_RSCFD_INT_RXF1: EE_RSCFD_INT_M1RXF1 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M1RXF2 ) ) case EE_RSCFD_INT_RXF2: EE_RSCFD_INT_M1RXF2 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M1RXF3 ) ) case EE_RSCFD_INT_RXF3: EE_RSCFD_INT_M1RXF3 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M1RXF4 ) ) case EE_RSCFD_INT_RXF4: EE_RSCFD_INT_M1RXF4 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M1RXF5 ) ) case EE_RSCFD_INT_RXF5: EE_RSCFD_INT_M1RXF5 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M1RXF6 ) ) case EE_RSCFD_INT_RXF6: EE_RSCFD_INT_M1RXF6 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M1RXF7 ) ) case EE_RSCFD_INT_RXF7: EE_RSCFD_INT_M1RXF7 = IntLevel_u16; break; #endif } default: return( EE_RSCFD_ERROR ); } } else { if( ChannelNumber_u08 >= EE_RSCFD_CHANNELS ) return( EE_RSCFD_ERROR ); EE_RSCFD_CIVector[ UnitNumber_u08 * ( EE_RSCFD_CHANNELS * EE_RSCFD_INT_CHANNEL + EE_RSCFD_INT_GLOBAL ) + ChannelNumber_u08 * EE_RSCFD_INT_CHANNEL + EE_RSCFD_INT_GLOBAL + IntNumber_u08 ] = FunctionVector; switch( UnitNumber_u08 ) { case EE_RSCFD_0: switch( ChannelNumber_u08 ) { case EE_RSCFD_CHANNEL0: switch( IntNumber_u08 ) { #if( defined( EE_RSCFD_INT_M0TX0 ) ) case EE_RSCFD_INT_TX: EE_RSCFD_INT_M0TX0 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M0TXA0 ) ) case EE_RSCFD_INT_TXA: EE_RSCFD_INT_M0TXA0 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M0TXQ0 ) ) case EE_RSCFD_INT_TXQ: EE_RSCFD_INT_M0TXQ0 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M0ERR0 ) ) case EE_RSCFD_INT_CERR: EE_RSCFD_INT_M0ERR0 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M0THL0 ) ) case EE_RSCFD_INT_TXHL: EE_RSCFD_INT_M0THL0 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M0RXCF0 ) ) case EE_RSCFD_INT_RXCF: EE_RSCFD_INT_M0RXCF0 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M0TXCF0 ) ) case EE_RSCFD_INT_TXCF: EE_RSCFD_INT_M0TXCF0 = IntLevel_u16; break; #endif } break; case EE_RSCFD_CHANNEL1: switch( IntNumber_u08 ) { #if( defined( EE_RSCFD_INT_M0TX1 ) ) case EE_RSCFD_INT_TX: EE_RSCFD_INT_M0TX1 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M0TXA1 ) ) case EE_RSCFD_INT_TXA: EE_RSCFD_INT_M0TXA1 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M0TXQ1 ) ) case EE_RSCFD_INT_TXQ: EE_RSCFD_INT_M0TXQ1 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M0ERR1 ) ) case EE_RSCFD_INT_CERR: EE_RSCFD_INT_M0ERR1 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M0THL1 ) ) case EE_RSCFD_INT_TXHL: EE_RSCFD_INT_M0THL1 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M0RXCF1 ) ) case EE_RSCFD_INT_RXCF: EE_RSCFD_INT_M0RXCF1 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M0TXCF1 ) ) case EE_RSCFD_INT_TXCF: EE_RSCFD_INT_M0TXCF1 = IntLevel_u16; break; #endif } break; case EE_RSCFD_CHANNEL2: switch( IntNumber_u08 ) { #if( defined( EE_RSCFD_INT_M0TX2 ) ) case EE_RSCFD_INT_TX: EE_RSCFD_INT_M0TX2 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M0TXA2 ) ) case EE_RSCFD_INT_TXA: EE_RSCFD_INT_M0TXA2 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M0TXQ2 ) ) case EE_RSCFD_INT_TXQ: EE_RSCFD_INT_M0TXQ2 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M0ERR2 ) ) case EE_RSCFD_INT_CERR: EE_RSCFD_INT_M0ERR2 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M0THL2 ) ) case EE_RSCFD_INT_TXHL: EE_RSCFD_INT_M0THL2 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M0RXCF2 ) ) case EE_RSCFD_INT_RXCF: EE_RSCFD_INT_M0RXCF2 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M0TXCF2 ) ) case EE_RSCFD_INT_TXCF: EE_RSCFD_INT_M0TXCF2 = IntLevel_u16; break; #endif } break; case EE_RSCFD_CHANNEL3: switch( IntNumber_u08 ) { #if( defined( EE_RSCFD_INT_M0TX3 ) ) case EE_RSCFD_INT_TX: EE_RSCFD_INT_M0TX3 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M0TXA3 ) ) case EE_RSCFD_INT_TXA: EE_RSCFD_INT_M0TXA3 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M0TXQ3 ) ) case EE_RSCFD_INT_TXQ: EE_RSCFD_INT_M0TXQ3 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M0ERR3 ) ) case EE_RSCFD_INT_CERR: EE_RSCFD_INT_M0ERR3 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M0THL3 ) ) case EE_RSCFD_INT_TXHL: EE_RSCFD_INT_M0THL3 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M0RXCF3 ) ) case EE_RSCFD_INT_RXCF: EE_RSCFD_INT_M0RXCF3 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M0TXCF3 ) ) case EE_RSCFD_INT_TXCF: EE_RSCFD_INT_M0TXCF3 = IntLevel_u16; break; #endif } break; case EE_RSCFD_CHANNEL4: switch( IntNumber_u08 ) { #if( defined( EE_RSCFD_INT_M0TX4 ) ) case EE_RSCFD_INT_TX: EE_RSCFD_INT_M0TX4 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M0TXA4 ) ) case EE_RSCFD_INT_TXA: EE_RSCFD_INT_M0TXA4 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M0TXQ4 ) ) case EE_RSCFD_INT_TXQ: EE_RSCFD_INT_M0TXQ4 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M0ERR4 ) ) case EE_RSCFD_INT_CERR: EE_RSCFD_INT_M0ERR4 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M0THL4 ) ) case EE_RSCFD_INT_TXHL: EE_RSCFD_INT_M0THL4 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M0RXCF4 ) ) case EE_RSCFD_INT_RXCF: EE_RSCFD_INT_M0RXCF4 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M0TXCF4 ) ) case EE_RSCFD_INT_TXCF: EE_RSCFD_INT_M0TXCF4 = IntLevel_u16; break; #endif } break; case EE_RSCFD_CHANNEL5: switch( IntNumber_u08 ) { #if( defined( EE_RSCFD_INT_M0TX5 ) ) case EE_RSCFD_INT_TX: EE_RSCFD_INT_M0TX5 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M0TXA5 ) ) case EE_RSCFD_INT_TXA: EE_RSCFD_INT_M0TXA5 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M0TXQ5 ) ) case EE_RSCFD_INT_TXQ: EE_RSCFD_INT_M0TXQ5 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M0ERR5 ) ) case EE_RSCFD_INT_CERR: EE_RSCFD_INT_M0ERR5 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M0THL5 ) ) case EE_RSCFD_INT_TXHL: EE_RSCFD_INT_M0THL5 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M0RXCF5 ) ) case EE_RSCFD_INT_RXCF: EE_RSCFD_INT_M0RXCF5 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M0TXCF5 ) ) case EE_RSCFD_INT_TXCF: EE_RSCFD_INT_M0TXCF5 = IntLevel_u16; break; #endif } break; default: return( EE_RSCFD_ERROR ); } break; case EE_RSCFD_1: switch( ChannelNumber_u08 ) { case EE_RSCFD_CHANNEL0: switch( IntNumber_u08 ) { #if( defined( EE_RSCFD_INT_M1TX0 ) ) case EE_RSCFD_INT_TX: EE_RSCFD_INT_M1TX0 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M1TXA0 ) ) case EE_RSCFD_INT_TXA: EE_RSCFD_INT_M1TXA0 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M1TXQ0 ) ) case EE_RSCFD_INT_TXQ: EE_RSCFD_INT_M1TXQ0 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M1ERR0 ) ) case EE_RSCFD_INT_CERR: EE_RSCFD_INT_M1ERR0 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M1THL0 ) ) case EE_RSCFD_INT_TXHL: EE_RSCFD_INT_M1THL0 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M1RXCF0 ) ) case EE_RSCFD_INT_RXCF: EE_RSCFD_INT_M1RXCF0 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M1TXCF0 ) ) case EE_RSCFD_INT_TXCF: EE_RSCFD_INT_M1TXCF0 = IntLevel_u16; break; #endif } break; case EE_RSCFD_CHANNEL1: switch( IntNumber_u08 ) { #if( defined( EE_RSCFD_INT_M1TX1 ) ) case EE_RSCFD_INT_TX: EE_RSCFD_INT_M1TX1 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M1TXA1 ) ) case EE_RSCFD_INT_TXA: EE_RSCFD_INT_M1TXA1 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M1TXQ1 ) ) case EE_RSCFD_INT_TXQ: EE_RSCFD_INT_M1TXQ1 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M1ERR1 ) ) case EE_RSCFD_INT_CERR: EE_RSCFD_INT_M1ERR1 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M1THL1 ) ) case EE_RSCFD_INT_TXHL: EE_RSCFD_INT_M1THL1 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M1RXCF1 ) ) case EE_RSCFD_INT_RXCF: EE_RSCFD_INT_M1RXCF1 = IntLevel_u16; break; #endif #if( defined( EE_RSCFD_INT_M1TXCF1 ) ) case EE_RSCFD_INT_TXCF: EE_RSCFD_INT_M1TXCF1 = IntLevel_u16; break; #endif } break; default: return( EE_RSCFD_ERROR ); } break; } } return( EE_RSCFD_OK ); } //============================================================================= // FunctionName: EE_RSCFD_SetInterrupt // IN : UnitNumber, Channel Number, Int Mask // OUT : Success Status // Description : Enables or disables dedicated Interrupts // //============================================================================= bit EE_RSCFD_SetInterrupt( u08 UnitNumber_u08, u08 ChannelNumber_u08, u08 InterruptSelection_u08, u16 InterruptSubSelection_u08 ) { u08 RegIndex_u08; u08 RegPos_u08; u32 RegBits_u32; if( UnitNumber_u08 >= EE_RSCFD_MACROS ) return( EE_RSCFD_ERROR ); if( ChannelNumber_u08 == EE_RSCFD_GLOBAL ) { switch( InterruptSelection_u08 ) { case EE_RSCFD_INT_GERR: ee_rscfd_common_p[ UnitNumber_u08 ]->gctr.ie = ( u32 )InterruptSubSelection_u08; break; default: /* RX FIFO Interrupt selected */ if( InterruptSelection_u08 > EE_RSCFD_MAXRXFIFOS ) return( EE_RSCFD_ERROR ); ee_rscfd_common_p[ UnitNumber_u08 ]->rfcc [ InterruptSelection_u08 - EE_RSCFD_INT_RXF0 ].rfie = InterruptSubSelection_u08; break; } } else { if( ChannelNumber_u08 >= EE_RSCFD_CHANNELS ) return( EE_RSCFD_ERROR ); RegIndex_u08 = ChannelNumber_u08 * EE_RSCFD_MAXTXBUFFERS / EE_RSCFD_COMREGSBITS; RegPos_u08 = ChannelNumber_u08 * EE_RSCFD_MAXTXBUFFERS - RegIndex_u08 * EE_RSCFD_COMREGSBITS; switch( InterruptSelection_u08 ) { case EE_RSCFD_INT_TX: case EE_RSCFD_INT_TXA: if( InterruptSubSelection_u08 == EE_RSCFD_INT_NOINT ) /* clears all */ { RegBits_u32 = ( u32 )( EE_RSCFD_MAXTXBUFFERS - 1 ) << RegPos_u08; ee_rscfd_common_p[ UnitNumber_u08 ]->tmiec[ RegIndex_u08 ] &= ~RegBits_u32; } else /* Sub selection defines the Tx Buffer IRQ to be enabled */ { if( InterruptSubSelection_u08 >= EE_RSCFD_MAXTXBUFFERS ) return( EE_RSCFD_ERROR ); RegBits_u32 = ( u32 )( 1 << ( InterruptSubSelection_u08 + RegPos_u08 ) ); ee_rscfd_common_p[ UnitNumber_u08 ]->tmiec[ RegIndex_u08 ] |= RegBits_u32; } break; case EE_RSCFD_INT_TXQ: ee_rscfd_common_p[ UnitNumber_u08 ]->txqcc[ ChannelNumber_u08 ].ie = InterruptSubSelection_u08; break; case EE_RSCFD_INT_CERR: ee_rscfd_common_p[ UnitNumber_u08 ]->ch[ ChannelNumber_u08 ].ctr.ie = InterruptSubSelection_u08; break; case EE_RSCFD_INT_TXHL: ee_rscfd_common_p[ UnitNumber_u08 ]->thlcc[ ChannelNumber_u08 ].ie = InterruptSubSelection_u08; break; case EE_RSCFD_INT_RXCF: if( InterruptSubSelection_u08 == EE_RSCFD_INT_NOINT ) /* clears all */ { for( RegIndex_u08 = ( ChannelNumber_u08 * EE_RSCFD_CHANNELS ); RegIndex_u08 < ( ( ChannelNumber_u08 + 1 ) * EE_RSCFD_CHANNELS ); RegIndex_u08++ ) { ee_rscfd_common_p[ UnitNumber_u08 ]->cfcc[ RegIndex_u08 ].cfrxie = EE_RSCFD_INT_DISABLE; } } else /* Sub Index selects the COM FIFO number per channel */ { RegIndex_u08 = ( ChannelNumber_u08 * EE_RSCFD_CHANNELS ) + InterruptSubSelection_u08; ee_rscfd_common_p[ UnitNumber_u08 ]->cfcc[ RegIndex_u08 ].cfrxie = EE_RSCFD_INT_ENABLE; } break; case EE_RSCFD_INT_TXCF: if( InterruptSubSelection_u08 == EE_RSCFD_INT_NOINT ) /* clears all */ { for( RegIndex_u08 = ( ChannelNumber_u08 * EE_RSCFD_CHANNELS ); RegIndex_u08 < ( ( ChannelNumber_u08 + 1 ) * EE_RSCFD_CHANNELS ); RegIndex_u08++ ) { ee_rscfd_common_p[ UnitNumber_u08 ]->cfcc[ RegIndex_u08 ].cftxie = EE_RSCFD_INT_DISABLE; } } else /* Sub Index selects the COM FIFO number per channel */ { RegIndex_u08 = ( ChannelNumber_u08 * EE_RSCFD_CHANNELS ) + InterruptSubSelection_u08; ee_rscfd_common_p[ UnitNumber_u08 ]->cfcc[ RegIndex_u08 ].cftxie = EE_RSCFD_INT_ENABLE; } break; } } return( EE_RSCFD_OK ); } //============================================================================= // FunctionName: EE_RSCFD_GetError // IN : UnitNumber, Channel Number // OUT : Success Status, Error States // Description : Returns global or channel local error states // //============================================================================= bit EE_RSCFD_GetError( u08 UnitNumber_u08, u08 ChannelNumber_u08, pu16 InterruptErrorFlag_pu16, pu16 LastErrorFlag_pu16 ) { if( UnitNumber_u08 >= EE_RSCFD_MACROS ) return( EE_RSCFD_ERROR ); if( ChannelNumber_u08 == EE_RSCFD_GLOBAL ) { *InterruptErrorFlag_pu16 = ( u16 )EE_RSCFD_LastErrorCode_Global_u08; *LastErrorFlag_pu16 = ( u16 )( ee_rscfd_common_p[ UnitNumber_u08 ]->gerfl.err ); } else { if( ChannelNumber_u08 >= ee_rscfd_channels[ UnitNumber_u08 ] ) return( EE_RSCFD_ERROR ); *InterruptErrorFlag_pu16 = EE_RSCFD_LastErrorCode_Channel_u16[ ChannelNumber_u08 ]; *LastErrorFlag_pu16 = ( u16 )( ee_rscfd_common_p[ UnitNumber_u08 ]->ch [ ChannelNumber_u08 ].erfl.err ); } return( EE_RSCFD_OK ); } //============================================================================= // FunctionName: EE_RSCFD_GetStatus // IN : UnitNumber, Channel Number // OUT : Success Status, Channel Status Values // Description : Returns channel local status information flags // //============================================================================= bit EE_RSCFD_GetStatus( u08 UnitNumber_u08, u08 ChannelNumber_u08, u08 StatusNumber_u08, pu08 StatusValue_u08 ) { static u08 LocalStatusValue_THL; if( UnitNumber_u08 >= EE_RSCFD_MACROS ) return( EE_RSCFD_ERROR ); if( ( ChannelNumber_u08 >= ee_rscfd_channels[ UnitNumber_u08 ] ) && ( ChannelNumber_u08 != EE_RSCFD_GLOBAL ) )return( EE_RSCFD_ERROR ); switch( StatusNumber_u08 ) { case EE_RSCFD_STATUS_OPMODE: /* Operation mode of channel */ ( ( ChannelNumber_u08 == EE_RSCFD_GLOBAL ) ? ( *StatusValue_u08 = ( u08 ) ee_rscfd_common_p[ UnitNumber_u08 ]->gsts.mds ) : ( *StatusValue_u08 = ( u08 ) ee_rscfd_common_p[ UnitNumber_u08 ]->ch [ ChannelNumber_u08 ].sts.mds ) ); break; case EE_RSCFD_STATUS_PSMODE: /* Operation mode of channel */ ( ( ChannelNumber_u08 == EE_RSCFD_GLOBAL ) ? ( *StatusValue_u08 = ( u08 ) ee_rscfd_common_p[ UnitNumber_u08 ]->gsts.slps ) : ( *StatusValue_u08 = ( u08 ) ee_rscfd_common_p[ UnitNumber_u08 ]->ch [ ChannelNumber_u08 ].sts.slps ) ); break; case EE_RSCFD_STATUS_RECEIVE: /* indicates channel is receiving */ if( ChannelNumber_u08 >= ee_rscfd_channels[ UnitNumber_u08 ] ) return( EE_RSCFD_ERROR ); *StatusValue_u08 = ( u08 ) ee_rscfd_common_p[ UnitNumber_u08 ]->ch [ ChannelNumber_u08 ].sts.recs; break; case EE_RSCFD_STATUS_TRANSMIT: /* indicates channel is sending */ if( ChannelNumber_u08 >= ee_rscfd_channels[ UnitNumber_u08 ] ) return( EE_RSCFD_ERROR ); *StatusValue_u08 = ( u08 ) ee_rscfd_common_p[ UnitNumber_u08 ]->ch [ ChannelNumber_u08 ].sts.trxs; break; case EE_RSCFD_STATUS_BUSOFF: /* indicates channel is bus off */ if( ChannelNumber_u08 >= ee_rscfd_channels[ UnitNumber_u08 ] ) return( EE_RSCFD_ERROR ); *StatusValue_u08 = ( u08 ) ee_rscfd_common_p[ UnitNumber_u08 ]->ch [ ChannelNumber_u08 ].sts.boffs; break; case EE_RSCFD_STATUS_ERRCNTLEV: /* error level */ if( ChannelNumber_u08 >= ee_rscfd_channels[ UnitNumber_u08 ] ) return( EE_RSCFD_ERROR ); *StatusValue_u08 = ( u08 )( ee_rscfd_common_p[ UnitNumber_u08 ]->ch [ ChannelNumber_u08 ].erfl.err & ( EE_RSCFD_ERROR_WARNING | EE_RSCFD_ERROR_PASSIVE | EE_RSCFD_ERROR_BUSOFF ) ); break; case EE_RSCFD_STATUS_TOVF: /* send history overrun flag */ if( ChannelNumber_u08 >= ee_rscfd_channels[ UnitNumber_u08 ] ) return( EE_RSCFD_ERROR ); *StatusValue_u08 = ( u08 ) ee_rscfd_common_p[ UnitNumber_u08 ]->thlsts [ ChannelNumber_u08 ].elt; if( *StatusValue_u08 ) { ee_rscfd_common_p[ UnitNumber_u08 ]->thlsts[ ChannelNumber_u08 ].elt = 0; } break; case EE_RSCFD_STATUS_THPM: /* send history empty flag */ if( ChannelNumber_u08 >= ee_rscfd_channels[ UnitNumber_u08 ] ) return( EE_RSCFD_ERROR ); *StatusValue_u08 = ( u08 ) ee_rscfd_common_p[ UnitNumber_u08 ]->thlsts [ ChannelNumber_u08 ].emp; break; case EE_RSCFD_STATUS_TGPT: /* send history pointer */ if( ChannelNumber_u08 >= ee_rscfd_channels[ UnitNumber_u08 ] ) return( EE_RSCFD_ERROR ); if( !ee_rscfd_common_p[ UnitNumber_u08 ]->thlsts[ ChannelNumber_u08 ].emp ) { LocalStatusValue_THL = ( u08 )ee_rscfd_thl_p[ UnitNumber_u08 ] [ ChannelNumber_u08 ]->tid; if( LocalStatusValue_THL == EE_RSCFD_TID_NOTUSED ) { LocalStatusValue_THL = ( u08 )( ee_rscfd_thl_p[ UnitNumber_u08 ] [ ChannelNumber_u08 ]->bt + ( ee_rscfd_thl_p[ UnitNumber_u08 ] [ ChannelNumber_u08 ]->bn << EE_RSCFD_THL_BN_P ) ); } *StatusValue_u08 = LocalStatusValue_THL; } else { *StatusValue_u08 = EE_RSCFD_TID_NOTUSED; } break; case EE_RSCFD_STATUS_NEWTXHISTORY: /* get next THL entry */ if( ChannelNumber_u08 >= ee_rscfd_channels[ UnitNumber_u08 ] ) return( EE_RSCFD_ERROR ); ee_rscfd_common_p[ UnitNumber_u08 ]->thlpctr[ ChannelNumber_u08 ] = EE_RSCFD_THL_NEXTELEMENT; break; case EE_RSCFD_STATUS_VALID: /* channel has received sucessfully */ if( ChannelNumber_u08 >= ee_rscfd_channels[ UnitNumber_u08 ] ) return( EE_RSCFD_ERROR ); *StatusValue_u08 = ( u08 ) ee_rscfd_common_p[ UnitNumber_u08 ]->ch [ ChannelNumber_u08 ].sts.coms; break; case EE_RSCFD_STATUS_TRERRCOUNT: /* transmit error counter value */ if( ChannelNumber_u08 >= ee_rscfd_channels[ UnitNumber_u08 ] ) return( EE_RSCFD_ERROR ); *StatusValue_u08 = ( u08 ) ee_rscfd_common_p[ UnitNumber_u08 ]->ch [ ChannelNumber_u08 ].sts.tec; break; case EE_RSCFD_STATUS_RXERRCOUNT: /* receive error counter value */ if( ChannelNumber_u08 >= ee_rscfd_channels[ UnitNumber_u08 ] ) return( EE_RSCFD_ERROR ); *StatusValue_u08 = ( u08 ) ee_rscfd_common_p[ UnitNumber_u08 ]->ch [ ChannelNumber_u08 ].sts.rec; break; case EE_RSCFD_STATUS_ERRPLEV: /* error counter passive */ if( ChannelNumber_u08 >= ee_rscfd_channels[ UnitNumber_u08 ] ) return( EE_RSCFD_ERROR ); *StatusValue_u08 = ( u08 ) ee_rscfd_common_p[ UnitNumber_u08 ]->ch [ ChannelNumber_u08 ].sts.eps; break; case EE_RSCFD_STATUS_INT_RXFIFO: *StatusValue_u08 = ( u08 )ee_rscfd_common_p[ UnitNumber_u08 ]->rfists; break; case EE_RSCFD_STATUS_MLT_RXFIFO: *StatusValue_u08 = ( u08 )ee_rscfd_common_p[ UnitNumber_u08 ]->fmsts.rf; break; case EE_RSCFD_STATUS_MLT_COMFIFO: *StatusValue_u08 = ( u08 )ee_rscfd_common_p[ UnitNumber_u08 ]->fmsts.cf; break; case EE_RSCFD_STATUS_INTERRUPT: if( ChannelNumber_u08 == EE_RSCFD_GLOBAL ) { *StatusValue_u08 = EE_RSCFD_InterruptFlag_Global_u08; EE_RSCFD_InterruptFlag_Global_u08 = EE_RSCFD_INT_NOINT; } else { if( ChannelNumber_u08 >= ee_rscfd_channels[ UnitNumber_u08 ] ) return( EE_RSCFD_ERROR ); *StatusValue_u08 = EE_RSCFD_InterruptFlag_Channel_u08[ ChannelNumber_u08 ]; EE_RSCFD_InterruptFlag_Channel_u08[ ChannelNumber_u08 ] = EE_RSCFD_INT_NOINT; } break; default: return( EE_RSCFD_ERROR ); } // end switch( StatusNumber_u08 ) __asm( "syncp" ); return( EE_RSCFD_OK ); } //============================================================================= // FunctionName: EE_RSCFD_Start // IN : UnitNumber, Channel Number, Operation Mode // OUT : Success Status // Description : Activates CAN Unit from any stop/sleep mode // //============================================================================= bit EE_RSCFD_Start( u08 UnitNumber_u08, u08 ChannelNumber_u08, u08 OperationMode_u08, u08 ClearErrorCounter_u08, u16 TimeStampSetting_u16 ) { u32 AccessTimeout_u32 = EE_RSCFD_SHUTDOWNTIMEOUT; u08 ChannelIndex_u08; if( UnitNumber_u08 >= EE_RSCFD_MACROS ) return( EE_RSCFD_ERROR ); while( ee_rscfd_common_p[ UnitNumber_u08 ]->gsts.rsts ); if( ee_rscfd_common_p[ UnitNumber_u08 ]->gsts.slps ) /* activate the unit */ { ee_rscfd_common_p[ UnitNumber_u08 ]->gctr.gslpr = EE_RSCFD_SLEEP_DISABLE; } /* go globally to OPERATION */ if( ee_rscfd_common_p[ UnitNumber_u08 ]->gsts.mds != EE_RSCFD_RSTATUS_OPERATION ) { ee_rscfd_common_p[ UnitNumber_u08 ]->gctr.gmdc = EE_RSCFD_OPMODE_OPER; __asm( "syncp" ); while( ( ee_rscfd_common_p[ UnitNumber_u08 ]->gsts.mds != EE_RSCFD_RSTATUS_OPERATION ) && ( --AccessTimeout_u32 > 0 ) ); if( AccessTimeout_u32 == 0L ) return( EE_RSCFD_ERROR ); } if( TimeStampSetting_u16 ) { ee_rscfd_common_p[ UnitNumber_u08 ]->gctr.tsrst = EE_RSCFD_SET; } if( ChannelNumber_u08 == EE_RSCFD_GLOBAL ) { for( ChannelIndex_u08 = 0; ChannelIndex_u08 < ee_rscfd_channels[ UnitNumber_u08 ]; ChannelIndex_u08++ ) { EE_RSCFD_Start( UnitNumber_u08, ChannelIndex_u08, OperationMode_u08, ClearErrorCounter_u08, TimeStampSetting_u16 ); } } else { if( ChannelNumber_u08 >= ee_rscfd_channels[ UnitNumber_u08 ] ) return( EE_RSCFD_ERROR ); /* channels: cancel any sleep states */ ee_rscfd_common_p[ UnitNumber_u08 ]->ch [ ChannelNumber_u08 ].ctr.cslpr = EE_RSCFD_CLEAR; AccessTimeout_u32 = EE_RSCFD_SHUTDOWNTIMEOUT; __asm( "syncp" ); while( ( ee_rscfd_common_p[ UnitNumber_u08 ]->ch [ ChannelNumber_u08 ].sts.slps != EE_RSCFD_CLEAR ) && ( --AccessTimeout_u32 > 0 ) ); if( AccessTimeout_u32 == 0L ) return( EE_RSCFD_ERROR ); if( ClearErrorCounter_u08 ) { EE_RSCFD_Start( UnitNumber_u08, ChannelIndex_u08, EE_RSCFD_OPMODE_RESET, 0, 0 ); } switch( OperationMode_u08 ) { case EE_RSCFD_OPMODE_RESET: ee_rscfd_common_p[ UnitNumber_u08 ]->ch [ ChannelNumber_u08 ].ctr.chmdc = EE_RSCFD_OPMODE_RESET; break; case EE_RSCFD_OPMODE_HALT: ee_rscfd_common_p[ UnitNumber_u08 ]->ch [ ChannelNumber_u08 ].ctr.chmdc = EE_RSCFD_OPMODE_HALT; ee_rscfd_common_p[ UnitNumber_u08 ]->ch [ ChannelNumber_u08 ].ctr.ctme = EE_RSCFD_CLEAR; break; case EE_RSCFD_OPMODE_OPER: ee_rscfd_common_p[ UnitNumber_u08 ]->ch [ ChannelNumber_u08 ].ctr.chmdc = EE_RSCFD_OPMODE_OPER; break; case EE_RSCFD_OPMODE_RECONLY: ee_rscfd_common_p[ UnitNumber_u08 ]->ch [ ChannelNumber_u08 ].ctr.ctms = EE_RSCFD_TEST_RXONLY; ee_rscfd_common_p[ UnitNumber_u08 ]->ch [ ChannelNumber_u08 ].ctr.ctme = EE_RSCFD_SET; ee_rscfd_common_p[ UnitNumber_u08 ]->ch [ ChannelNumber_u08 ].ctr.chmdc = EE_RSCFD_OPMODE_OPER; OperationMode_u08 = EE_RSCFD_OPMODE_OPER; break; case EE_RSCFD_OPMODE_STEST: ee_rscfd_common_p[ UnitNumber_u08 ]->ch [ ChannelNumber_u08 ].ctr.ctms = EE_RSCFD_TEST_INTLOOP; ee_rscfd_common_p[ UnitNumber_u08 ]->ch [ ChannelNumber_u08 ].ctr.ctme = EE_RSCFD_SET; ee_rscfd_common_p[ UnitNumber_u08 ]->ch [ ChannelNumber_u08 ].ctr.chmdc = EE_RSCFD_OPMODE_OPER; OperationMode_u08 = EE_RSCFD_OPMODE_OPER; break; default: return( EE_RSCFD_ERROR ); } // switch( OperationMode_u08 ) __asm( "syncp" ); AccessTimeout_u32 = EE_RSCFD_SHUTDOWNTIMEOUT; while( ( ee_rscfd_common_p[ UnitNumber_u08 ]->ch [ ChannelNumber_u08 ].sts.mds != ( u32 )OperationMode_u08 ) && ( --AccessTimeout_u32 > 0 ) ); if( AccessTimeout_u32 == 0L ) return( EE_RSCFD_ERROR ); if( OperationMode_u08 == EE_RSCFD_OPMODE_OPER ) /* verify communication ready state */ { AccessTimeout_u32 = EE_RSCFD_SHUTDOWNTIMEOUT; while( ( ee_rscfd_common_p[ UnitNumber_u08 ]->ch [ ChannelNumber_u08 ].sts.coms != EE_RSCFD_SET ) && ( --AccessTimeout_u32 > 0 ) ); if( AccessTimeout_u32 == 0L ) return( EE_RSCFD_ERROR ); } } return( EE_RSCFD_OK ); } //============================================================================= // FunctionName: EE_RSCFD_Stop // IN : UnitNumber, Channel Number, Stop Mode // OUT : Success Status // Description : Sets CAN Channel into any init/stop/sleep mode // //============================================================================= bit EE_RSCFD_Stop( u08 UnitNumber_u08, u08 ChannelNumber_u08, u08 StopMode_u08 ) { u32 AccessTimeout_u32 = EE_RSCFD_SHUTDOWNTIMEOUT; if( UnitNumber_u08 >= EE_RSCFD_MACROS ) return( EE_RSCFD_ERROR ); if( ( ChannelNumber_u08 >= ee_rscfd_channels[ UnitNumber_u08 ] ) && ( ChannelNumber_u08 != EE_RSCFD_GLOBAL ) ) return( EE_RSCFD_ERROR ); if( ChannelNumber_u08 == EE_RSCFD_GLOBAL ) { switch( StopMode_u08 ) { case EE_RSCFD_OPMODE_SLEEP: if( ee_rscfd_common_p[ UnitNumber_u08 ]->gsts.mds != EE_RSCFD_OPMODE_RESET ) return( EE_RSCFD_ERROR ); ee_rscfd_common_p[ UnitNumber_u08 ]->gctr.gslpr = EE_RSCFD_SET; __asm( "syncp" ); while( ( ee_rscfd_common_p[ UnitNumber_u08 ]->gsts.slps != EE_RSCFD_SET ) && ( --AccessTimeout_u32 > 0 ) ); break; default: ee_rscfd_common_p[ UnitNumber_u08 ]->gctr.gmdc = ( u32 )StopMode_u08; __asm( "syncp" ); while( ( ee_rscfd_common_p[ UnitNumber_u08 ]->gsts.mds != ( u32 )StopMode_u08 ) && ( --AccessTimeout_u32 > 0 ) ); break; } } else { switch( StopMode_u08 ) { case EE_RSCFD_OPMODE_SLEEP: if( ee_rscfd_common_p[ UnitNumber_u08 ]->ch [ ChannelNumber_u08 ].sts.mds != EE_RSCFD_OPMODE_RESET ) return( EE_RSCFD_ERROR ); ee_rscfd_common_p[ UnitNumber_u08 ]->ch [ ChannelNumber_u08 ].ctr.cslpr = EE_RSCFD_SET; __asm( "syncp" ); while( ( ee_rscfd_common_p[ UnitNumber_u08 ]->ch [ ChannelNumber_u08 ].sts.slps != EE_RSCFD_SET ) && ( --AccessTimeout_u32 > 0 ) ); break; default: ee_rscfd_common_p[ UnitNumber_u08 ]->ch [ ChannelNumber_u08 ].ctr.chmdc = ( u32 )StopMode_u08; ee_rscfd_common_p[ UnitNumber_u08 ]->ch [ ChannelNumber_u08 ].ctr.ctme = EE_RSCFD_CLEAR; __asm( "syncp" ); while( ( ee_rscfd_common_p[ UnitNumber_u08 ]->ch [ ChannelNumber_u08 ].sts.mds != ( u32 )StopMode_u08 ) && ( --AccessTimeout_u32 > 0 ) ); break; } } if( AccessTimeout_u32 == 0L ) return( EE_RSCFD_ERROR ); else return( EE_RSCFD_OK ); } //============================================================================= // FunctionName: EE_RSCFD_SetGlobalConfiguration // IN : UnitNumber, Global configuration set // Description : Performs Global Configurations // //============================================================================= bit EE_RSCFD_SetGlobalConfiguration( u08 UnitNumber_u08, const struct ee_rscfd_cfg_global *Config ) { if( UnitNumber_u08 >= EE_RSCFD_MACROS ) return( EE_RSCFD_ERROR ); /* Must be in global reset to set the global configuration! */ while( ee_rscfd_common_p[ UnitNumber_u08 ]->gsts.rsts ); if( ee_rscfd_common_p[ UnitNumber_u08 ]->gsts.mds != EE_RSCFD_OPMODE_RESET ) return( EE_RSCFD_ERROR ); ee_rscfd_common_p[ UnitNumber_u08 ]->gctr.gslpr = Config->gctr.gslpr; ee_rscfd_common_p[ UnitNumber_u08 ]->grmcfg.rcmc = EE_RSCFD_SET; /* use FD register map */ ee_rscfd_common_p[ UnitNumber_u08 ]->gcfg.tpri = Config->gcfg.tpri; ee_rscfd_common_p[ UnitNumber_u08 ]->gcfg.dce = Config->gcfg.dce; ee_rscfd_common_p[ UnitNumber_u08 ]->gcfg.dre = Config->gcfg.dre; ee_rscfd_common_p[ UnitNumber_u08 ]->gcfg.mme = Config->gcfg.mme; ee_rscfd_common_p[ UnitNumber_u08 ]->gcfg.dcs = Config->gcfg.dcs; ee_rscfd_common_p[ UnitNumber_u08 ]->gcfg.cmpoc = Config->gcfg.cmpoc; ee_rscfd_common_p[ UnitNumber_u08 ]->gcfg.eefe = Config->gcfg.eefe; ee_rscfd_common_p[ UnitNumber_u08 ]->gcfg.tmtsce = Config->gcfg.tmtsce; ee_rscfd_common_p[ UnitNumber_u08 ]->gcfg.tsp = Config->gcfg.tsp; ee_rscfd_common_p[ UnitNumber_u08 ]->gcfg.tsss = Config->gcfg.tsss; ee_rscfd_common_p[ UnitNumber_u08 ]->gcfg.tsbtcs = Config->gcfg.tsbtcs; ee_rscfd_common_p[ UnitNumber_u08 ]->gcfg.itrcp = Config->gcfg.itrcp; ee_rscfd_common_p[ UnitNumber_u08 ]->gctr.gmdc = Config->gctr.gmdc; ee_rscfd_common_p[ UnitNumber_u08 ]->gctr.ie = Config->gctr.ie; ee_rscfd_common_p[ UnitNumber_u08 ]->gctr.tsrst = Config->gctr.tsrst; ee_rscfd_common_p[ UnitNumber_u08 ]->gctr.tswr = Config->gctr.tswr; ee_rscfd_common_p[ UnitNumber_u08 ]->gfdcfg.rped = Config->gfdcfg.rped; ee_rscfd_common_p[ UnitNumber_u08 ]->gfdcfg.tsccfg = Config->gfdcfg.tsccfg; ee_rscfd_common_p[ UnitNumber_u08 ]->gcrccfg.nie = Config->gcrccfg.nie; ee_rscfd_common_p[ UnitNumber_u08 ]->rmnb.nrxmb = Config->rmnb.nrxmb; ee_rscfd_common_p[ UnitNumber_u08 ]->rmnb.rmpls = Config->rmnb.rmpls; ee_rscfd_common_p[ UnitNumber_u08 ]->gaflc0.rnc0 = Config->rnc[ 0 ]; ee_rscfd_common_p[ UnitNumber_u08 ]->gaflc0.rnc1 = Config->rnc[ 1 ]; ee_rscfd_common_p[ UnitNumber_u08 ]->gaflc0.rnc2 = Config->rnc[ 2 ]; ee_rscfd_common_p[ UnitNumber_u08 ]->gaflc0.rnc3 = Config->rnc[ 3 ]; ee_rscfd_common_p[ UnitNumber_u08 ]->gaflc1.rnc4 = Config->rnc[ 4 ]; ee_rscfd_common_p[ UnitNumber_u08 ]->gaflc1.rnc5 = Config->rnc[ 5 ]; ee_rscfd_common_p[ UnitNumber_u08 ]->gaflc1.rnc6 = Config->rnc[ 6 ]; ee_rscfd_common_p[ UnitNumber_u08 ]->gaflc1.rnc7 = Config->rnc[ 7 ]; return( EE_RSCFD_OK ); } //============================================================================= // FunctionName: EE_RSCFD_EnableCOMFIFO // IN : Unit, Channel, FIFO Number, Enable Flag // OUT : Success Status // Description : Enable and Disable COMMON FIFO // //============================================================================= bit EE_RSCFD_EnableCOMFIFO( u08 UnitNumber_u08, u08 ChannelNumber_u08, u08 FIFONumber_u08, u08 EnableFlag_u08 ) { if( UnitNumber_u08 >= EE_RSCFD_MACROS ) return( EE_RSCFD_ERROR ); if( ChannelNumber_u08 >= ee_rscfd_channels[ UnitNumber_u08 ] ) return( EE_RSCFD_ERROR ); if( ee_rscfd_common_p[ UnitNumber_u08 ]->ch[ ChannelNumber_u08 ].sts.mds == EE_RSCFD_OPMODE_RESET ) return( EE_RSCFD_ERROR ); ee_rscfd_common_p[ UnitNumber_u08 ]-> cfcc[ FIFONumber_u08 + ChannelNumber_u08 * EE_RSCFD_MAXCOMFIFOS ].cfe = ( u32 )EnableFlag_u08; __asm( "syncp" ); return( EE_RSCFD_OK ); } //============================================================================= // FunctionName: EE_RSCFD_EnableRXFIFO // IN : Unit, FIFO Number, Enable Flag // OUT : Success Status // Description : Enable and Disable RX FIFO // //============================================================================= bit EE_RSCFD_EnableRXFIFO( u08 UnitNumber_u08, u08 FIFONumber_u08, u08 EnableFlag_u08 ) { if( UnitNumber_u08 >= EE_RSCFD_MACROS ) return( EE_RSCFD_ERROR ); if( ee_rscfd_common_p[ UnitNumber_u08 ]->gsts.mds == EE_RSCFD_OPMODE_RESET ) return( EE_RSCFD_ERROR ); ee_rscfd_common_p[ UnitNumber_u08 ]-> rfcc[ FIFONumber_u08 ].rfe = ( u32 )EnableFlag_u08; ee_rscfd_common_p[ UnitNumber_u08 ]-> rfsts[ FIFONumber_u08 ].rfmlt = 0; __asm( "syncp" ); return( EE_RSCFD_OK ); } //============================================================================= // FunctionName: EE_RSCFD_SetBittiming // IN : InputFrequency, Bitrate, TQ per Bit, Sampling Point, SJW // OUT : Main Prescaler Setting, Bit Rate Prescaler Setting, Bit Timing // Description : Calculates Settings from Clock Supply and Parameters // //============================================================================= bit EE_RSCFD_SetBittiming( u08 UnitNumber_u08, u32 InputFrequency_u32, u32 Bitrate_u32, bit Timingspec_bit, pu16 BRPSetting_pu16, pu08 TSEG1Setting_pu08, pu08 TSEG2Setting_pu08, pu08 SJWSetting_pu08, flt SamplingPointPos_flt ) // optional Parameter, can be 0.0 { u16 TQPerBitUsed_u16; u16 TQPerBitMinDeviation_u16; u16 BRPSettingUsed_u16; u08 TSEG1SettingUsed_u16; u08 TSEG2SettingUsed_u16; flt SamplingPointPosUsed_flt = SamplingPointPos_flt; u32 BitrateAchieved_u32; s32 MinBitrateDeviation_s32; s32 BitrateDeviation_s32; /* Automatic settings generation */ TQPerBitUsed_u16 = ( u16 )( InputFrequency_u32 / ( Bitrate_u32 * EE_RSCFD_TRLAYERFACTOR ) ); if( Timingspec_bit == EE_RSCFD_BT_SPEC ) { if( TQPerBitUsed_u16 > EE_RSCFD_BT_MAXTQ ) TQPerBitUsed_u16 = EE_RSCFD_BT_MAXTQ; if( TQPerBitUsed_u16 < EE_RSCFD_BT_MINTQ ) return( EE_RSCFD_ERROR ); /* Minimum Bitrate check */ if( ( InputFrequency_u32 / ( ( u32 )TQPerBitUsed_u16 * EE_RSCFD_TRLAYERFACTOR * Bitrate_u32 ) ) > EE_RSCFD_BT_MAXBRP ) return( EE_RSCFD_ERROR ); } else { if( TQPerBitUsed_u16 > EE_RSCFD_BTD_MAXTQ ) TQPerBitUsed_u16 = EE_RSCFD_BTD_MAXTQ; if( TQPerBitUsed_u16 < EE_RSCFD_BTD_MINTQ ) return( EE_RSCFD_ERROR ); /* Minimum Bitrate check */ if( ( InputFrequency_u32 / ( ( u32 )TQPerBitUsed_u16 * EE_RSCFD_TRLAYERFACTOR * Bitrate_u32 ) ) > EE_RSCFD_BTD_MAXBRP ) return( EE_RSCFD_ERROR ); } if( SamplingPointPos_flt == 0.0 ) SamplingPointPosUsed_flt = EE_RSCFD_BT_SPTOPTIMUM; /* Other plausibility checks */ if( ( InputFrequency_u32 / Bitrate_u32 ) < EE_RSCFD_CLKMINFACTOR ) return( EE_RSCFD_ERROR ); /* Maximum Bitrate check */ if( ( InputFrequency_u32 / ( ( u32 )TQPerBitUsed_u16 * EE_RSCFD_TRLAYERFACTOR ) ) < Bitrate_u32 ) return( EE_RSCFD_ERROR ); /* Maximum Prescaler check */ BRPSettingUsed_u16 = ( u16 )( InputFrequency_u32 / ( Bitrate_u32 * ( u32 )TQPerBitUsed_u16 * EE_RSCFD_TRLAYERFACTOR ) ); /* Frequency rounding optimization */ BitrateAchieved_u32 = ( u32 )InputFrequency_u32 / ( ( u32 ) ( ( u32 )BRPSettingUsed_u16 * ( u32 )TQPerBitUsed_u16 * ( u32 )EE_RSCFD_TRLAYERFACTOR ) ); MinBitrateDeviation_s32 = ( s32 )( BitrateAchieved_u32 - Bitrate_u32 ); if( MinBitrateDeviation_s32 < 0L ) MinBitrateDeviation_s32 = -MinBitrateDeviation_s32; BitrateDeviation_s32 = MinBitrateDeviation_s32; while( BitrateAchieved_u32 != Bitrate_u32 ) { TQPerBitUsed_u16--; if( Timingspec_bit == EE_RSCFD_BT_SPEC ) { if( TQPerBitUsed_u16 < EE_RSCFD_BT_MINTQ ) break; } else { if( TQPerBitUsed_u16 < EE_RSCFD_BTD_MINTQ ) break; } BRPSettingUsed_u16 = ( u16 )( InputFrequency_u32 / ( Bitrate_u32 * ( u32 )TQPerBitUsed_u16 * EE_RSCFD_TRLAYERFACTOR ) ); if( Timingspec_bit == EE_RSCFD_BT_SPEC ) { if( BRPSettingUsed_u16 > EE_RSCFD_BT_MAXBRP ) return( EE_RSCFD_ERROR ); } else { if( BRPSettingUsed_u16 > EE_RSCFD_BTD_MAXBRP ) return( EE_RSCFD_ERROR ); } BitrateAchieved_u32 = ( u32 )InputFrequency_u32 / ( ( u32 ) ( ( u32 )BRPSettingUsed_u16 * ( u32 )TQPerBitUsed_u16 * ( u32 )EE_RSCFD_TRLAYERFACTOR ) ); BitrateDeviation_s32 = ( s32 )( BitrateAchieved_u32 - Bitrate_u32 ); if( BitrateDeviation_s32 < 0L ) BitrateDeviation_s32 = -BitrateDeviation_s32; if( BitrateDeviation_s32 < MinBitrateDeviation_s32 ) { MinBitrateDeviation_s32 = BitrateDeviation_s32; TQPerBitMinDeviation_u16 = TQPerBitUsed_u16; } } if( BitrateAchieved_u32 != Bitrate_u32 ) /* Optimum Bitrate was not found */ { TQPerBitUsed_u16 = TQPerBitMinDeviation_u16; /* use the best value instead */ BRPSettingUsed_u16 = ( u16 )( InputFrequency_u32 / ( Bitrate_u32 * ( u32 )TQPerBitUsed_u16 * EE_RSCFD_TRLAYERFACTOR ) ); } /* Sampling Point setting and segment splitting */ /* Synchronisation Jump Width setting */ if( Timingspec_bit == EE_RSCFD_BT_SPEC ) { TSEG1SettingUsed_u16 = ( u16 )( ( flt )( TQPerBitUsed_u16 - EE_RSCFD_BT_SYNCSEGLEN ) * SamplingPointPosUsed_flt ); if( TSEG1SettingUsed_u16 < EE_RSCFD_BT_MINTSEG1 ) TSEG1SettingUsed_u16 = EE_RSCFD_BT_MINTSEG1; if( TSEG1SettingUsed_u16 > EE_RSCFD_BT_MAXTSEG1 ) TSEG1SettingUsed_u16 = EE_RSCFD_BT_MAXTSEG1; TSEG2SettingUsed_u16 = TQPerBitUsed_u16 - TSEG1SettingUsed_u16 - EE_RSCFD_BT_SYNCSEGLEN; if( TSEG2SettingUsed_u16 > EE_RSCFD_BT_MAXTSEG2 ) TSEG2SettingUsed_u16 = EE_RSCFD_BT_MAXTSEG2; if( TSEG2SettingUsed_u16 < EE_RSCFD_BT_MINTSEG2 ) TSEG2SettingUsed_u16 = EE_RSCFD_BT_MINTSEG2; TSEG1SettingUsed_u16 = TQPerBitUsed_u16 - TSEG2SettingUsed_u16 - EE_RSCFD_BT_SYNCSEGLEN; if( ( TSEG1SettingUsed_u16 < EE_RSCFD_BT_MINTSEG1 ) || ( TSEG1SettingUsed_u16 > EE_RSCFD_BT_MAXTSEG1 ) ) return( EE_RSCFD_ERROR ); *SJWSetting_pu08 = ( u08 )TSEG2SettingUsed_u16 - 1; if( *SJWSetting_pu08 >= EE_RSCFD_BT_MAXSJW ) *SJWSetting_pu08 = EE_RSCFD_BT_MAXSJW - 1; } else { TSEG1SettingUsed_u16 = ( u16 )( ( flt )( TQPerBitUsed_u16 - EE_RSCFD_BTD_SYNCSEGLEN ) * SamplingPointPosUsed_flt ); if( TSEG1SettingUsed_u16 < EE_RSCFD_BTD_MINTSEG1 ) TSEG1SettingUsed_u16 = EE_RSCFD_BTD_MINTSEG1; if( TSEG1SettingUsed_u16 > EE_RSCFD_BTD_MAXTSEG1 ) TSEG1SettingUsed_u16 = EE_RSCFD_BTD_MAXTSEG1; TSEG2SettingUsed_u16 = TQPerBitUsed_u16 - TSEG1SettingUsed_u16 - EE_RSCFD_BTD_SYNCSEGLEN; if( TSEG2SettingUsed_u16 > EE_RSCFD_BTD_MAXTSEG2 ) TSEG2SettingUsed_u16 = EE_RSCFD_BTD_MAXTSEG2; if( TSEG2SettingUsed_u16 < EE_RSCFD_BTD_MINTSEG2 ) TSEG2SettingUsed_u16 = EE_RSCFD_BTD_MINTSEG2; TSEG1SettingUsed_u16 = TQPerBitUsed_u16 - TSEG2SettingUsed_u16 - EE_RSCFD_BTD_SYNCSEGLEN; if( ( TSEG1SettingUsed_u16 < EE_RSCFD_BTD_MINTSEG1 ) || ( TSEG1SettingUsed_u16 > EE_RSCFD_BTD_MAXTSEG1 ) ) return( EE_RSCFD_ERROR ); *SJWSetting_pu08 = ( u08 )TSEG2SettingUsed_u16 - 1; if( *SJWSetting_pu08 >= EE_RSCFD_BTD_MAXSJW ) *SJWSetting_pu08 = EE_RSCFD_BTD_MAXSJW - 1; } /* Definition of Register Values */ *BRPSetting_pu16 = ( u16 )( BRPSettingUsed_u16 - 1 ); *TSEG1Setting_pu08 = ( u08 )( TSEG1SettingUsed_u16 - 1 ); *TSEG2Setting_pu08 = ( u08 )( TSEG2SettingUsed_u16 - 1 ); return( EE_RSCFD_OK ); } //============================================================================= // FunctionName: EE_RSCFD_SetChannelConfiguration // IN : UnitNumber, Channel Number, Config Set // OUT : Success Status // Description : Performs Channel Configurations // //============================================================================= bit EE_RSCFD_SetChannelConfiguration( u08 UnitNumber_u08, u08 ChannelNumber_u08, const struct ee_rscfd_cfg_channel *Config ) { u32 ClockFrequency_u32; u16 BRPSetting_u16; u08 TSEG1Setting_u08; u08 TSEG2Setting_u08; u08 SJWSetting_u08; u08 TXCounter_u08; bit Status_bit; if( UnitNumber_u08 >= EE_RSCFD_MACROS ) return( EE_RSCFD_ERROR ); if( ChannelNumber_u08 >= ee_rscfd_channels[ UnitNumber_u08 ] ) return( EE_RSCFD_ERROR ); if( ee_rscfd_common_p[ UnitNumber_u08 ]->ch[ ChannelNumber_u08 ].sts.mds != EE_RSCFD_OPMODE_RESET ) return( EE_RSCFD_ERROR ); /* first, clear any sleep mode */ ee_rscfd_common_p[ UnitNumber_u08 ]->ch[ ChannelNumber_u08 ].ctr.cslpr = Config->ctr.cslpr; if( ee_rscfd_common_p[ UnitNumber_u08 ]->gcfg.dcs == EE_RSCFD_CLOCK_SYS ) { ClockFrequency_u32 = ( u32 )( OSCILLATOR_FREQUENCY * EE_RSCFD_FREQFACTOR ); if( Config->arb_bitrate > EE_RSCFD_MAXBAUDRATE ) return( EE_RSCFD_ERROR ); if( Config->data_bitrate > EE_RSCFD_MAXBAUDRATE ) return( EE_RSCFD_ERROR ); } else { ClockFrequency_u32 = ( u32 )( OSCILLATOR_FREQUENCY * EE_RSCFD_FREQFACTORPLLBP ); if( Config->arb_bitrate > EE_RSCFD_MAXBAUDRATEPLLBP ) return( EE_RSCFD_ERROR ); if( Config->data_bitrate > EE_RSCFD_MAXBAUDRATEPLLBP ) return( EE_RSCFD_ERROR ); } if( Config->arb_bitrate != 0L ) { Status_bit = EE_RSCFD_SetBittiming( UnitNumber_u08, ClockFrequency_u32, Config->arb_bitrate, EE_RSCFD_BT_SPEC, &BRPSetting_u16, &TSEG1Setting_u08, &TSEG2Setting_u08, &SJWSetting_u08, Config->arb_samplingpointpos ); if( Status_bit != EE_RSCFD_OK ) return( EE_RSCFD_ERROR ); ee_rscfd_common_p[ UnitNumber_u08 ]->ch[ ChannelNumber_u08 ].ncfg.nbrp = ( u32 )BRPSetting_u16; ee_rscfd_common_p[ UnitNumber_u08 ]->ch[ ChannelNumber_u08 ].ncfg.ntseg1 = ( u32 )TSEG1Setting_u08; ee_rscfd_common_p[ UnitNumber_u08 ]->ch[ ChannelNumber_u08 ].ncfg.ntseg2 = ( u32 )TSEG2Setting_u08; ee_rscfd_common_p[ UnitNumber_u08 ]->ch[ ChannelNumber_u08 ].ncfg.nsjw = ( u32 )SJWSetting_u08; } else { ee_rscfd_common_p[ UnitNumber_u08 ]->ch[ ChannelNumber_u08 ].ncfg.nbrp = Config->ncfg.nbrp; ee_rscfd_common_p[ UnitNumber_u08 ]->ch[ ChannelNumber_u08 ].ncfg.ntseg1 = Config->ncfg.ntseg1; ee_rscfd_common_p[ UnitNumber_u08 ]->ch[ ChannelNumber_u08 ].ncfg.ntseg2 = Config->ncfg.ntseg2; ee_rscfd_common_p[ UnitNumber_u08 ]->ch[ ChannelNumber_u08 ].ncfg.nsjw = Config->ncfg.nsjw; } if( Config->data_bitrate != 0L ) { Status_bit = EE_RSCFD_SetBittiming( UnitNumber_u08, ClockFrequency_u32, Config->data_bitrate, EE_RSCFD_BTD_SPEC, &BRPSetting_u16, &TSEG1Setting_u08, &TSEG2Setting_u08, &SJWSetting_u08, Config->data_samplingpointpos ); if( Status_bit != EE_RSCFD_OK ) return( EE_RSCFD_ERROR ); ee_rscfd_common_p[ UnitNumber_u08 ]->fdch[ ChannelNumber_u08 ].dcfg.dbrp = ( u32 )BRPSetting_u16; ee_rscfd_common_p[ UnitNumber_u08 ]->fdch[ ChannelNumber_u08 ].dcfg.dtseg1 = ( u32 )TSEG1Setting_u08; ee_rscfd_common_p[ UnitNumber_u08 ]->fdch[ ChannelNumber_u08 ].dcfg.dtseg2 = ( u32 )TSEG2Setting_u08; ee_rscfd_common_p[ UnitNumber_u08 ]->fdch[ ChannelNumber_u08 ].dcfg.dsjw = ( u32 )SJWSetting_u08; } else { ee_rscfd_common_p[ UnitNumber_u08 ]->fdch[ ChannelNumber_u08 ].dcfg.dbrp = Config->dcfg.dbrp; ee_rscfd_common_p[ UnitNumber_u08 ]->fdch[ ChannelNumber_u08 ].dcfg.dtseg1 = Config->dcfg.dtseg1; ee_rscfd_common_p[ UnitNumber_u08 ]->fdch[ ChannelNumber_u08 ].dcfg.dtseg2 = Config->dcfg.dtseg2; ee_rscfd_common_p[ UnitNumber_u08 ]->fdch[ ChannelNumber_u08 ].dcfg.dsjw = Config->dcfg.dsjw; } ee_rscfd_common_p[ UnitNumber_u08 ]->ch[ ChannelNumber_u08 ].ctr.chmdc = Config->ctr.chmdc; ee_rscfd_common_p[ UnitNumber_u08 ]->ch[ ChannelNumber_u08 ].ctr.rtbo = Config->ctr.rtbo; ee_rscfd_common_p[ UnitNumber_u08 ]->ch[ ChannelNumber_u08 ].ctr.ie = Config->ctr.ie; ee_rscfd_common_p[ UnitNumber_u08 ]->ch[ ChannelNumber_u08 ].ctr.bom = Config->ctr.bom; ee_rscfd_common_p[ UnitNumber_u08 ]->ch[ ChannelNumber_u08 ].ctr.errd = Config->ctr.errd; ee_rscfd_common_p[ UnitNumber_u08 ]->ch[ ChannelNumber_u08 ].ctr.ctme = Config->ctr.ctme; ee_rscfd_common_p[ UnitNumber_u08 ]->ch[ ChannelNumber_u08 ].ctr.ctms = Config->ctr.ctms; ee_rscfd_common_p[ UnitNumber_u08 ]->ch[ ChannelNumber_u08 ].ctr.trwe = Config->ctr.trwe; ee_rscfd_common_p[ UnitNumber_u08 ]->ch[ ChannelNumber_u08 ].ctr.trh = Config->ctr.trh; ee_rscfd_common_p[ UnitNumber_u08 ]->ch[ ChannelNumber_u08 ].ctr.trr = Config->ctr.trr; ee_rscfd_common_p[ UnitNumber_u08 ]->ch[ ChannelNumber_u08 ].ctr.rom = Config->ctr.rom; ee_rscfd_common_p[ UnitNumber_u08 ]->fdch[ ChannelNumber_u08 ].fdctr.eocclr = Config->fdctr.eocclr; ee_rscfd_common_p[ UnitNumber_u08 ]->fdch[ ChannelNumber_u08 ].fdctr.socclr = Config->fdctr.socclr; ee_rscfd_common_p[ UnitNumber_u08 ]->fdch[ ChannelNumber_u08 ].fdcfg.eoccfg = Config->fdcfg.eoccfg; ee_rscfd_common_p[ UnitNumber_u08 ]->fdch[ ChannelNumber_u08 ].fdcfg.tdcoc = Config->fdcfg.tdcoc; ee_rscfd_common_p[ UnitNumber_u08 ]->fdch[ ChannelNumber_u08 ].fdcfg.tdce = Config->fdcfg.tdce; ee_rscfd_common_p[ UnitNumber_u08 ]->fdch[ ChannelNumber_u08 ].fdcfg.esic = Config->fdcfg.esic; ee_rscfd_common_p[ UnitNumber_u08 ]->fdch[ ChannelNumber_u08 ].fdcfg.tdco = Config->fdcfg.tdco; ee_rscfd_common_p[ UnitNumber_u08 ]->fdch[ ChannelNumber_u08 ].fdcfg.gwen = Config->fdcfg.gwen; ee_rscfd_common_p[ UnitNumber_u08 ]->fdch[ ChannelNumber_u08 ].fdcfg.gwfdf = Config->fdcfg.gwfdf; ee_rscfd_common_p[ UnitNumber_u08 ]->fdch[ ChannelNumber_u08 ].fdcfg.gwbrs = Config->fdcfg.gwbrs; ee_rscfd_common_p[ UnitNumber_u08 ]->fdch[ ChannelNumber_u08 ].fdcfg.tmme = Config->fdcfg.tmme; for( TXCounter_u08 = 0; TXCounter_u08 < EE_RSCFD_MAXTXBUFFERS; TXCounter_u08++ ) { if( ( Config->tmiec >> TXCounter_u08 ) & 0x01 ) { ee_rscfd_common_p[ UnitNumber_u08 ]-> tmiec[ EE_RSCFD_COMTXREG( ChannelNumber_u08 ) ] |= ( 1 << ( TXCounter_u08 + ( ChannelNumber_u08 * EE_RSCFD_MAXTXBUFFERS ) - EE_RSCFD_COMREGSBITS * EE_RSCFD_COMTXREG( ChannelNumber_u08 ) ) ); } else { ee_rscfd_common_p[ UnitNumber_u08 ]-> tmiec[ EE_RSCFD_COMTXREG( ChannelNumber_u08 ) ] &= ~( 1 << ( TXCounter_u08 + ( ChannelNumber_u08 * EE_RSCFD_MAXTXBUFFERS ) - EE_RSCFD_COMREGSBITS * EE_RSCFD_COMTXREG( ChannelNumber_u08 ) ) ); } } /* Set Channel to HALT mode, in order to configure queues and lists */ ee_rscfd_common_p[ UnitNumber_u08 ]->ch[ ChannelNumber_u08 ].ctr.chmdc = EE_RSCFD_OPMODE_HALT; __asm( "syncp" ); while( ee_rscfd_common_p[ UnitNumber_u08 ]->ch[ ChannelNumber_u08 ].sts.mds != EE_RSCFD_OPMODE_HALT ); for( TXCounter_u08 = 0; TXCounter_u08 < EE_RSCFD_MAXTXQUEUES; TXCounter_u08++ ) { ee_rscfd_common_p[ UnitNumber_u08 ]-> txqcc[ TXCounter_u08 + ChannelNumber_u08 * EE_RSCFD_MAXTXQUEUES ].qe = Config->txqcc[ TXCounter_u08 ].qe; ee_rscfd_common_p[ UnitNumber_u08 ]-> txqcc[ TXCounter_u08 + ChannelNumber_u08 * EE_RSCFD_MAXTXQUEUES ].dc = Config->txqcc[ TXCounter_u08 ].dc; ee_rscfd_common_p[ UnitNumber_u08 ]-> txqcc[ TXCounter_u08 + ChannelNumber_u08 * EE_RSCFD_MAXTXQUEUES ].ie = Config->txqcc[ TXCounter_u08 ].ie; ee_rscfd_common_p[ UnitNumber_u08 ]-> txqcc[ TXCounter_u08 + ChannelNumber_u08 * EE_RSCFD_MAXTXQUEUES ].im = Config->txqcc[ TXCounter_u08 ].im; } ee_rscfd_common_p[ UnitNumber_u08 ]->thlcc[ ChannelNumber_u08 ].thle = Config->thlcc.thle; ee_rscfd_common_p[ UnitNumber_u08 ]->thlcc[ ChannelNumber_u08 ].ie = Config->thlcc.ie; ee_rscfd_common_p[ UnitNumber_u08 ]->thlcc[ ChannelNumber_u08 ].im = Config->thlcc.im; ee_rscfd_common_p[ UnitNumber_u08 ]->thlcc[ ChannelNumber_u08 ].dte = Config->thlcc.dte; return( EE_RSCFD_OK ); } //============================================================================= // FunctionName: EE_RSCFD_SetGlobalFIFOConfiguration // IN : UnitNumber, Global configuration set // Description : Performs Global Configurations // //============================================================================= bit EE_RSCFD_SetGlobalFIFOConfiguration( u08 Unit_u08, const struct ee_rscfd_cfg_global *Config ) { u08 CurrentFIFO_u08; if( Unit_u08 >= EE_RSCFD_MACROS ) return( EE_RSCFD_ERROR ); /* Must be in global reset to set the global configuration! */ if( ee_rscfd_common_p[ Unit_u08 ]->gsts.mds != EE_RSCFD_OPMODE_RESET ) return( EE_RSCFD_ERROR ); if( ee_rscfd_common_p[ Unit_u08 ]->gsts.slps != 0 ) return( EE_RSCFD_ERROR ); for( CurrentFIFO_u08 = 0; CurrentFIFO_u08 < EE_RSCFD_MAXRXFIFOS; CurrentFIFO_u08++ ) { ee_rscfd_common_p[ Unit_u08 ]->rfcc[ CurrentFIFO_u08 ].rfie = Config->rfcc[ CurrentFIFO_u08 ].rfie; ee_rscfd_common_p[ Unit_u08 ]->rfcc[ CurrentFIFO_u08 ].rfpls = Config->rfcc[ CurrentFIFO_u08 ].rfpls; ee_rscfd_common_p[ Unit_u08 ]->rfcc[ CurrentFIFO_u08 ].rfdc = Config->rfcc[ CurrentFIFO_u08 ].rfdc; ee_rscfd_common_p[ Unit_u08 ]->rfcc[ CurrentFIFO_u08 ].rfim = Config->rfcc[ CurrentFIFO_u08 ].rfim; ee_rscfd_common_p[ Unit_u08 ]->rfcc[ CurrentFIFO_u08 ].rfigcv = Config->rfcc[ CurrentFIFO_u08 ].rfigcv; } return( EE_RSCFD_OK ); } //============================================================================= // FunctionName: EE_RSCFD_SetCOMFIFOConfiguration // IN : UnitNumber, Channel Number, Config Set // OUT : Success Status // Description : Performs Channel COM FIFO Configurations // //============================================================================= bit EE_RSCFD_SetCOMFIFOConfiguration( u08 UnitNumber_u08, u08 ChannelNumber_u08, const struct ee_rscfd_cfg_channel *Config ) { u08 TXCounter_u08; if( UnitNumber_u08 >= EE_RSCFD_MACROS ) return( EE_RSCFD_ERROR ); /* Must be in global reset to set the global configuration! */ if( ee_rscfd_common_p[ UnitNumber_u08 ]->gsts.mds != EE_RSCFD_OPMODE_RESET ) return( EE_RSCFD_ERROR ); for( TXCounter_u08 = 0; TXCounter_u08 < EE_RSCFD_MAXCOMFIFOS; TXCounter_u08++ ) { ee_rscfd_common_p[ UnitNumber_u08 ]-> cfcc[ TXCounter_u08 + ChannelNumber_u08 * EE_RSCFD_MAXCOMFIFOS ].cfrxie = Config->cfcc[ TXCounter_u08 ].cfrxie; ee_rscfd_common_p[ UnitNumber_u08 ]-> cfcc[ TXCounter_u08 + ChannelNumber_u08 * EE_RSCFD_MAXCOMFIFOS ].cftxie = Config->cfcc[ TXCounter_u08 ].cftxie; ee_rscfd_common_p[ UnitNumber_u08 ]-> cfcc[ TXCounter_u08 + ChannelNumber_u08 * EE_RSCFD_MAXCOMFIFOS ].cfpls = Config->cfcc[ TXCounter_u08 ].cfpls; ee_rscfd_common_p[ UnitNumber_u08 ]-> cfcc[ TXCounter_u08 + ChannelNumber_u08 * EE_RSCFD_MAXCOMFIFOS ].cfdc = Config->cfcc[ TXCounter_u08 ].cfdc; ee_rscfd_common_p[ UnitNumber_u08 ]-> cfcc[ TXCounter_u08 + ChannelNumber_u08 * EE_RSCFD_MAXCOMFIFOS ].cfim = Config->cfcc[ TXCounter_u08 ].cfim; ee_rscfd_common_p[ UnitNumber_u08 ]-> cfcc[ TXCounter_u08 + ChannelNumber_u08 * EE_RSCFD_MAXCOMFIFOS ].cfigcv = Config->cfcc[ TXCounter_u08 ].cfigcv; ee_rscfd_common_p[ UnitNumber_u08 ]-> cfcc[ TXCounter_u08 + ChannelNumber_u08 * EE_RSCFD_MAXCOMFIFOS ].cfm = Config->cfcc[ TXCounter_u08 ].cfm; ee_rscfd_common_p[ UnitNumber_u08 ]-> cfcc[ TXCounter_u08 + ChannelNumber_u08 * EE_RSCFD_MAXCOMFIFOS ].cfitss = Config->cfcc[ TXCounter_u08 ].cfitss; ee_rscfd_common_p[ UnitNumber_u08 ]-> cfcc[ TXCounter_u08 + ChannelNumber_u08 * EE_RSCFD_MAXCOMFIFOS ].cfitr = Config->cfcc[ TXCounter_u08 ].cfitr; ee_rscfd_common_p[ UnitNumber_u08 ]-> cfcc[ TXCounter_u08 + ChannelNumber_u08 * EE_RSCFD_MAXCOMFIFOS ].cftml = Config->cfcc[ TXCounter_u08 ].cftml; ee_rscfd_common_p[ UnitNumber_u08 ]-> cfcc[ TXCounter_u08 + ChannelNumber_u08 * EE_RSCFD_MAXCOMFIFOS ].cfitt = Config->cfcc[ TXCounter_u08 ].cfitt; } return( EE_RSCFD_OK ); } //============================================================================= // FunctionName: EE_RSCFD_TxAbort // IN : UnitNumber, Channel Number, Message // OUT : Success Status // Description : Performs Message Sending //============================================================================= bit EE_RSCFD_TxAbort( u08 UnitNumber_u08, u08 ChannelNumber_u08, struct ee_rscfd_message *Message ) { u08 SendBox_u08; u08 FirstBox_u08; u08 LastBox_u08; if( UnitNumber_u08 >= EE_RSCFD_MACROS ) return( EE_RSCFD_ERROR ); if( ChannelNumber_u08 >= ee_rscfd_channels[ UnitNumber_u08 ] ) return( EE_RSCFD_ERROR ); if( ee_rscfd_common_p[ UnitNumber_u08 ]->ch[ ChannelNumber_u08 ].sts.mds != EE_RSCFD_OPMODE_OPER ) return( EE_RSCFD_ERROR ); switch( Message->path ) { case EE_RSCFD_PATH_MSGBOX: /* direct abortion of message box */ if( Message->pathdetail == EE_RSCFD_PATHDETAIL_ANY ) /* abort all */ { FirstBox_u08 = 0; LastBox_u08 = EE_RSCFD_MAXTXBUFFERS - 1; } else { FirstBox_u08 = Message->pathdetail; LastBox_u08 = FirstBox_u08; } break; case EE_RSCFD_PATH_COMFIFO: /* only one FIFO abort at a time */ if( Message->pathdetail == EE_RSCFD_PATHDETAIL_ANY ) { return( EE_RSCFD_ERROR ); } else { SendBox_u08 = Message->pathdetail; if( SendBox_u08 >= EE_RSCFD_MAXCOMFIFOS ) { return( EE_RSCFD_ERROR ); } else { SendBox_u08 = ( EE_RSCFD_MAXCOMFIFOS * ChannelNumber_u08 ) + Message->pathdetail; if( ee_rscfd_common_p[ UnitNumber_u08 ]->cfcc[ SendBox_u08 ].cfe ) { FirstBox_u08 = ee_rscfd_common_p[ UnitNumber_u08 ]-> cfcc[ SendBox_u08 ].cftml; LastBox_u08 = FirstBox_u08; } else return( EE_RSCFD_ERROR ); } } break; case EE_RSCFD_PATH_TXQUEUE: /* only one TX Queue abort at a time */ if( Message->pathdetail == EE_RSCFD_PATHDETAIL_ANY ) { return( EE_RSCFD_ERROR ); } else { SendBox_u08 = Message->pathdetail; if( SendBox_u08 >= EE_RSCFD_MAXTXQUEUES ) { return( EE_RSCFD_ERROR ); } else { if( ee_rscfd_common_p[ UnitNumber_u08 ]->txqcc [ EE_RSCFD_MAXTXQUEUES * ChannelNumber_u08 + SendBox_u08 ].qe ) { FirstBox_u08 = ee_rscfd_txqentries[ UnitNumber_u08 ] [ ChannelNumber_u08 ] [ SendBox_u08 ]; LastBox_u08 = FirstBox_u08; } else return( EE_RSCFD_ERROR ); } } break; default: return( EE_RSCFD_ERROR ); } for( SendBox_u08 = FirstBox_u08; SendBox_u08 <= LastBox_u08; SendBox_u08++ ) { ee_rscfd_common_p[ UnitNumber_u08 ]->tmc [( EE_RSCFD_MAXTXBUFFERS * ChannelNumber_u08 + SendBox_u08 ) ] |= ( u08 ) ( EE_RSCFD_TMC_SET_AR ); } return( EE_RSCFD_OK ); } //============================================================================= // FunctionName: EE_RSCFD_SendMessage // IN : UnitNumber, Channel Number, Message // OUT : Success Status // Description : Performs Message Sending //============================================================================= bit EE_RSCFD_SendMessage( u08 UnitNumber_u08, u08 ChannelNumber_u08, pu08 Status_pu08, struct ee_rscfd_message *Message ) { u08 SendBox_u08; u08 FirstBox_u08; u08 LastBox_u08; u08 SendBoxOccupied_u08 = EE_RSCFD_CLEAR; u08 FIFONumber_u08; u08 TxMergeMode_u08; *Status_pu08 = EE_RSCFD_FAULT_PARAMETER; TxMergeMode_u08 = ( u08 ) ee_rscfd_common_p[ UnitNumber_u08 ]->fdch[ ChannelNumber_u08 ].fdcfg.tmme; if( UnitNumber_u08 >= EE_RSCFD_MACROS ) return( EE_RSCFD_ERROR ); if( ChannelNumber_u08 >= ee_rscfd_channels[ UnitNumber_u08 ] ) return( EE_RSCFD_ERROR ); if( ee_rscfd_common_p[ UnitNumber_u08 ]->ch[ ChannelNumber_u08 ].sts.mds != EE_RSCFD_OPMODE_OPER ) return( EE_RSCFD_ERROR ); *Status_pu08 = EE_RSCFD_FAULT_NONE; switch( Message->path ) { case EE_RSCFD_PATH_MSGBOX: /* search a free SendBox, if required */ { if( Message->pathdetail != EE_RSCFD_PATHDETAIL_ANY ) { FirstBox_u08 = Message->pathdetail; LastBox_u08 = FirstBox_u08; if( FirstBox_u08 >= ( ( TxMergeMode_u08 == 1 ) ? EE_RSCFD_MAXTXBUFFERS : EE_RSCFD_MAXTXMBUFFERS ) ) { *Status_pu08 = EE_RSCFD_FAULT_PARAMETER; return( EE_RSCFD_ERROR ); } } else { if( !TxMergeMode_u08 ) { FirstBox_u08 = 0; LastBox_u08 = ( EE_RSCFD_MAXTXBUFFERS - 1 ); } else { if( Message->flag.dlc > EE_RSCFD_DLC_FD_20 ) { FirstBox_u08 = 0; LastBox_u08 = ( EE_RSCFD_MAXTXMBUFFERS - 1 ) * EE_RSCFD_TXMERGESIZE; } else { FirstBox_u08 = EE_RSCFD_MINTXMBUFFERS; LastBox_u08 = ( EE_RSCFD_MAXTXBUFFERS - 1 ); } } } for( SendBox_u08 = FirstBox_u08; SendBox_u08 <= LastBox_u08; ) { if( ( ( ( ee_rscfd_common_p[ UnitNumber_u08 ]->tmsts [ ( EE_RSCFD_MAXTXBUFFERS * ChannelNumber_u08 + SendBox_u08 ) ] ) ) & EE_RSCFD_TMSTS_STSMSK ) == EE_RSCFD_TMSTS_CLEAR ) /* check pending TRQ */ { for( FIFONumber_u08 = 0; FIFONumber_u08 < EE_RSCFD_MAXCOMFIFOS; FIFONumber_u08++ ) /* check any COM FIFO assignment */ { if( ( ( u08 )( ee_rscfd_common_p[ UnitNumber_u08 ]->cfcc [ EE_RSCFD_MAXCOMFIFOS * ChannelNumber_u08 ].cftml ) == SendBox_u08 ) && ( ee_rscfd_common_p[ UnitNumber_u08 ]->cfcc [ EE_RSCFD_MAXCOMFIFOS * ChannelNumber_u08 ].cfe ) ) { SendBoxOccupied_u08 = EE_RSCFD_SET; break; } } if( ( ( u08 )( ee_rscfd_common_p[ UnitNumber_u08 ]->txqcc [ EE_RSCFD_MAXTXQUEUES * ChannelNumber_u08 ].dc >= SendBox_u08 ) ) && ( ee_rscfd_common_p[ UnitNumber_u08 ]->txqcc [ EE_RSCFD_MAXTXQUEUES * ChannelNumber_u08 ].dc != EE_RSCFD_TXQ_OFF ) && ( ee_rscfd_common_p[ UnitNumber_u08 ]->txqcc [ EE_RSCFD_MAXTXQUEUES * ChannelNumber_u08 ].qe != EE_RSCFD_TXQ_OFF ) ) { /* check any TX Queue assignment */ SendBoxOccupied_u08 = EE_RSCFD_SET; } } else { SendBoxOccupied_u08 = EE_RSCFD_SET; } if( SendBoxOccupied_u08 == EE_RSCFD_CLEAR ) { /* Initiate Sending with this box and exit the box searching */ if( TxMergeMode_u08 && ( Message->flag.dlc > EE_RSCFD_DLC_FD_20 ) ) { EE_RSCFD_SetIDDataMerged( &ee_rscfd_txmmsg_p[ UnitNumber_u08 ] [ ChannelNumber_u08 ]-> buf[ SendBox_u08 ], Message ); } else { EE_RSCFD_SetIDData( &ee_rscfd_txmsg_p[ UnitNumber_u08 ] [ ChannelNumber_u08 ]-> buf[ SendBox_u08 ], Message ); } ee_rscfd_common_p[ UnitNumber_u08 ]->tmsts [ ( EE_RSCFD_MAXTXBUFFERS * ChannelNumber_u08 + SendBox_u08 ) ] &= ( u08 ) ( ~( EE_RSCFD_TMSTS_RFMSK ) ); ee_rscfd_common_p[ UnitNumber_u08 ]->tmc [ ( EE_RSCFD_MAXTXBUFFERS * ChannelNumber_u08 + SendBox_u08 ) ] |= ( u08 ) ( EE_RSCFD_TMC_SET_TR ); break; } else { SendBoxOccupied_u08 = EE_RSCFD_CLEAR; /* test next SendBox */ } if( TxMergeMode_u08 && ( Message->flag.dlc > EE_RSCFD_DLC_FD_20 ) ) { SendBox_u08 += EE_RSCFD_TXMERGESIZE; } else { SendBox_u08++; } } if( SendBox_u08 >= EE_RSCFD_MAXTXBUFFERS ) { *Status_pu08 = EE_RSCFD_FAULT_BUSY; return( EE_RSCFD_OK ); } break; } case EE_RSCFD_PATH_COMFIFO: /* use dedicated FIFO */ { if( Message->pathdetail != EE_RSCFD_PATHDETAIL_ANY ) { SendBox_u08 = Message->pathdetail; if( SendBox_u08 >= EE_RSCFD_MAXCOMFIFOS ) { *Status_pu08 = EE_RSCFD_FAULT_PARAMETER; return( EE_RSCFD_ERROR ); } else { SendBox_u08 = ( EE_RSCFD_MAXCOMFIFOS * ChannelNumber_u08 ) + Message->pathdetail; if( ee_rscfd_common_p[ UnitNumber_u08 ]->cfsts[ SendBox_u08 ].cffll ) { *Status_pu08 = EE_RSCFD_FAULT_BUSY; return( EE_RSCFD_OK ); } } } else /* search enabled, non-full FIFO */ { SendBox_u08 = EE_RSCFD_FIFO_NEXTELEMENT; for( FIFONumber_u08 = ( EE_RSCFD_MAXCOMFIFOS * ChannelNumber_u08 ); FIFONumber_u08 < ( EE_RSCFD_MAXCOMFIFOS * ( ChannelNumber_u08 + 1 ) ); FIFONumber_u08++ ) { if( ee_rscfd_common_p[ UnitNumber_u08 ]->cfcc[ FIFONumber_u08 ].cfe ) { if( !ee_rscfd_common_p[ UnitNumber_u08 ]->cfsts[ FIFONumber_u08 ].cffll ) { SendBox_u08 = FIFONumber_u08; if( ee_rscfd_common_p[ UnitNumber_u08 ]->cfsts[ FIFONumber_u08 ].cfemp ) { break; /* an empty FIFO can be used immediately */ } } } } } if( SendBox_u08 != EE_RSCFD_FIFO_NEXTELEMENT ) /* feed message into FIFO */ { SendBox_u08 %= EE_RSCFD_MAXCOMFIFOS; EE_RSCFD_SetIDDataCFIFO( &ee_rscfd_comfifo_p[ UnitNumber_u08 ] [ ChannelNumber_u08 ]-> buf[ SendBox_u08 ], Message ); ee_rscfd_common_p[ UnitNumber_u08 ]->cfpctr [ EE_RSCFD_MAXCOMFIFOS * ChannelNumber_u08 + SendBox_u08 ].fpc = EE_RSCFD_FIFO_NEXTELEMENT; } else /* free and enabled FIFO was not found */ { *Status_pu08 = EE_RSCFD_FAULT_BUSY; return( EE_RSCFD_OK ); } break; } case EE_RSCFD_PATH_TXQUEUE: /* use dedicated TX Queue */ { if( Message->pathdetail != EE_RSCFD_PATHDETAIL_ANY ) { SendBox_u08 = Message->pathdetail; if( ( SendBox_u08 >= EE_RSCFD_MAXTXQUEUES ) || ( Message->flag.dlc > EE_RSCFD_DLC_FD_20 ) ) { *Status_pu08 = EE_RSCFD_FAULT_PARAMETER; return( EE_RSCFD_ERROR ); } } else { SendBoxOccupied_u08 = EE_RSCFD_SET; for( SendBox_u08 = 0; /* search enabled, non-full queue */ SendBox_u08 < EE_RSCFD_MAXTXQUEUES; SendBox_u08++ ) { if( ee_rscfd_common_p[ UnitNumber_u08 ]->txqcc [ EE_RSCFD_MAXTXQUEUES * ChannelNumber_u08 + SendBox_u08 ].qe ) { if( !ee_rscfd_common_p[ UnitNumber_u08 ]->txqsts [ EE_RSCFD_MAXTXQUEUES * ChannelNumber_u08 + SendBox_u08 ].fll ) { SendBoxOccupied_u08 = EE_RSCFD_CLEAR; if( ee_rscfd_common_p[ UnitNumber_u08 ]->txqsts [ EE_RSCFD_MAXTXQUEUES * ChannelNumber_u08 + SendBox_u08 ].emp ) { break; /* empty queue can be used immediately */ } } } } } if( SendBoxOccupied_u08 == EE_RSCFD_CLEAR ) /* feed message into queue */ { SendBox_u08 = ee_rscfd_txqentries[ UnitNumber_u08 ] [ ChannelNumber_u08 ] [ SendBox_u08 ]; EE_RSCFD_SetIDData( &ee_rscfd_txmsg_p[ UnitNumber_u08 ] [ ChannelNumber_u08 ]-> buf[ SendBox_u08 ], Message ); ee_rscfd_common_p[ UnitNumber_u08 ]->txqpctr [ EE_RSCFD_MAXTXQUEUES * ChannelNumber_u08 + SendBox_u08 ] = EE_RSCFD_TXQ_NEXTELEMENT; } else /* free and enabled queue was not found */ { *Status_pu08 = EE_RSCFD_FAULT_BUSY; return( EE_RSCFD_OK ); } break; } default: *Status_pu08 = EE_RSCFD_FAULT_PARAMETER; return( EE_RSCFD_ERROR ); } __asm( "syncm" ); return( EE_RSCFD_OK ); } //============================================================================= // FunctionName: EE_RSCFD_ReceiveMessage // IN : UnitNumber, (preferred) Reception path within message // OUT : Success Status // Message with content and information // Description : Performs Message Reception // //============================================================================= bit EE_RSCFD_ReceiveMessage( u08 UnitNumber_u08, pu08 Status_pu08, struct ee_rscfd_message *Message ) { u08 ReceiveBox_u08; u08 SearchBegin_u08; u08 SearchEnd_u08; *Status_pu08 = EE_RSCFD_FAULT_PARAMETER; if( UnitNumber_u08 >= EE_RSCFD_MACROS ) return( EE_RSCFD_ERROR ); if( ee_rscfd_common_p[ UnitNumber_u08 ]->gsts.mds != EE_RSCFD_OPMODE_OPER ) return( EE_RSCFD_ERROR ); *Status_pu08 = EE_RSCFD_FAULT_NODATA; if( ( Message->path == EE_RSCFD_PATH_MSGBOX ) || ( Message->path == EE_RSCFD_PATH_ANY ) ) /* check within message boxes */ { if( Message->pathdetail == EE_RSCFD_GLOBAL ) /* read first filled box */ { SearchBegin_u08 = 0; SearchEnd_u08 = EE_RSCFD_MAXRXBUFFERS - 1; } else /* read dedicated box (typical polling) */ { SearchBegin_u08 = Message->pathdetail; SearchEnd_u08 = Message->pathdetail; if( SearchBegin_u08 >= EE_RSCFD_MAXRXBUFFERS ) { *Status_pu08 = EE_RSCFD_FAULT_PARAMETER; return( EE_RSCFD_ERROR ); } } for( ReceiveBox_u08 = SearchBegin_u08; ReceiveBox_u08 <= SearchEnd_u08; ReceiveBox_u08++ ) { while( ee_rscfd_common_p[ UnitNumber_u08 ]->rmnd [ EE_RSCFD_COMRXREG( ReceiveBox_u08 ) ] >> EE_RSCFD_COMRXBIT( ReceiveBox_u08 ) & EE_RSCFD_SET ) { *Status_pu08 = EE_RSCFD_FAULT_NONE; /* Clear new data flag */ ee_rscfd_common_p[ UnitNumber_u08 ]->rmnd [ EE_RSCFD_COMRXREG( ReceiveBox_u08 ) ] = ( u32 ) ( ~( 1 << EE_RSCFD_COMRXBIT( ReceiveBox_u08 ) ) ); EE_RSCFD_GetMessage( &ee_rscfd_rxmsg_p[ UnitNumber_u08 ]-> buf[ ReceiveBox_u08 ], Message ); } if( *Status_pu08 != EE_RSCFD_FAULT_NODATA ) break; } } if( ( Message->path == EE_RSCFD_PATH_RXFIFO ) || ( ( Message->path == EE_RSCFD_PATH_ANY ) && ( *Status_pu08 == EE_RSCFD_FAULT_NODATA ) ) ) /* check within RX FIFO */ { if( Message->pathdetail == EE_RSCFD_GLOBAL ) /* read first filled FIFO */ { SearchBegin_u08 = 0; SearchEnd_u08 = EE_RSCFD_MAXRXFIFOS - 1; } else /* read dedicated FIFO */ { SearchBegin_u08 = Message->pathdetail; SearchEnd_u08 = Message->pathdetail; if( SearchBegin_u08 >= EE_RSCFD_MAXRXFIFOS ) { *Status_pu08 = EE_RSCFD_FAULT_PARAMETER; return( EE_RSCFD_ERROR ); } } for( ReceiveBox_u08 = SearchBegin_u08; ReceiveBox_u08 <= SearchEnd_u08; ReceiveBox_u08++ ) { if( !ee_rscfd_common_p[ UnitNumber_u08 ]->rfsts[ ReceiveBox_u08 ].rfemp ) { *Status_pu08 = EE_RSCFD_FAULT_NONE; EE_RSCFD_GetMessageRF( &ee_rscfd_rxfifo_p[ UnitNumber_u08 ]-> buf[ ReceiveBox_u08 ], Message ); ee_rscfd_common_p[ UnitNumber_u08 ]->rfpctr[ ReceiveBox_u08 ].fpc = EE_RSCFD_FIFO_NEXTELEMENT; break; } } } if( ( Message->path == EE_RSCFD_PATH_COMFIFO ) || ( ( Message->path == EE_RSCFD_PATH_ANY ) && ( *Status_pu08 == EE_RSCFD_FAULT_NODATA ) ) ) /* check within COMFIFO */ { if( Message->pathdetail == EE_RSCFD_GLOBAL ) /* read first filled FIFO */ { SearchBegin_u08 = 0; SearchEnd_u08 = EE_RSCFD_MAXCOMFIFOS * ee_rscfd_channels[ UnitNumber_u08 ] - 1; } else /* read dedicated FIFO */ { SearchBegin_u08 = Message->pathdetail; SearchEnd_u08 = Message->pathdetail; if( SearchBegin_u08 >= ( EE_RSCFD_MAXCOMFIFOS * ee_rscfd_channels[ UnitNumber_u08 ] ) ) { *Status_pu08 = EE_RSCFD_FAULT_PARAMETER; return( EE_RSCFD_ERROR ); } } for( ReceiveBox_u08 = SearchBegin_u08; ReceiveBox_u08 <= SearchEnd_u08; ReceiveBox_u08++ ) { if( !ee_rscfd_common_p[ UnitNumber_u08 ]->cfsts[ ReceiveBox_u08 ].cfemp ) { *Status_pu08 = EE_RSCFD_FAULT_NONE; EE_RSCFD_GetMessageCF( &ee_rscfd_comfifo_p[ UnitNumber_u08 ] [ ReceiveBox_u08 / EE_RSCFD_MAXCOMFIFOS ]-> buf[ ReceiveBox_u08 ], Message ); ee_rscfd_common_p[ UnitNumber_u08 ]->cfpctr[ ReceiveBox_u08 ].fpc = EE_RSCFD_FIFO_NEXTELEMENT; break; } } } __asm( "syncm" ); return( EE_RSCFD_OK ); } //============================================================================= // FunctionName: EE_RSCFD_SetAFLEntry // IN : UnitNumber, Channel Number, AFL Entry object // OUT : Success Status // Description : Enters a new entry into the AFL // Limitations for routing are not verified! //============================================================================= bit EE_RSCFD_SetAFLEntry( u08 UnitNumber_u08, u08 ChannelNumber_u08, u16 RuleNumber_u16, struct ee_rscfd_a_afl *AFLEntry ) { u08 AFLPage_u08; u16 AFLElement_u16 = RuleNumber_u16; u08 AFLIndex_u08; u08 AFLChannelEntry[ EE_RSCFD_MAXCHANNELS ]; if( UnitNumber_u08 >= EE_RSCFD_MACROS ) return( EE_RSCFD_ERROR ); if( ChannelNumber_u08 >= ee_rscfd_channels[ UnitNumber_u08 ] ) return( EE_RSCFD_ERROR ); if( ee_rscfd_common_p[ UnitNumber_u08 ]->ch[ ChannelNumber_u08 ].sts.mds == EE_RSCFD_OPMODE_OPER ) return( EE_RSCFD_ERROR ); if( ee_rscfd_common_p[ UnitNumber_u08 ]->gctr.gslpr == EE_RSCFD_SET ) return( EE_RSCFD_ERROR ); for( AFLIndex_u08 = 0; AFLIndex_u08 <= ChannelNumber_u08; AFLIndex_u08++ ) { switch( AFLIndex_u08 ) { case EE_RSCFD_CHANNEL0: AFLChannelEntry[ AFLIndex_u08 ] = ( u08 )ee_rscfd_common_p[ UnitNumber_u08 ]->gaflc0.rnc0; break; case EE_RSCFD_CHANNEL1: AFLChannelEntry[ AFLIndex_u08 ] = ( u08 )ee_rscfd_common_p[ UnitNumber_u08 ]->gaflc0.rnc1; AFLElement_u16 += ( u16 )AFLChannelEntry[ EE_RSCFD_CHANNEL0 ]; break; case EE_RSCFD_CHANNEL2: AFLChannelEntry[ AFLIndex_u08 ] = ( u08 ) ee_rscfd_common_p[ UnitNumber_u08 ]->gaflc0.rnc2; AFLElement_u16 += (u16) AFLChannelEntry[ EE_RSCFD_CHANNEL1 ]; break; case EE_RSCFD_CHANNEL3: AFLChannelEntry[ AFLIndex_u08 ] = ( u08 ) ee_rscfd_common_p[ UnitNumber_u08 ]->gaflc0.rnc3; AFLElement_u16 += (u16) AFLChannelEntry[ EE_RSCFD_CHANNEL2 ]; break; case EE_RSCFD_CHANNEL4: AFLChannelEntry[ AFLIndex_u08 ] = ( u08 ) ee_rscfd_common_p[ UnitNumber_u08 ]->gaflc1.rnc4; AFLElement_u16 += (u16) AFLChannelEntry[ EE_RSCFD_CHANNEL3 ]; break; case EE_RSCFD_CHANNEL5: AFLChannelEntry[ AFLIndex_u08 ] = ( u08 ) ee_rscfd_common_p[ UnitNumber_u08 ]->gaflc1.rnc5; AFLElement_u16 += (u16) AFLChannelEntry[ EE_RSCFD_CHANNEL4 ]; break; case EE_RSCFD_CHANNEL6: AFLChannelEntry[ AFLIndex_u08 ] = ( u08 ) ee_rscfd_common_p[ UnitNumber_u08 ]->gaflc1.rnc6; AFLElement_u16 += (u16) AFLChannelEntry[ EE_RSCFD_CHANNEL5 ]; break; case EE_RSCFD_CHANNEL7: AFLChannelEntry[ AFLIndex_u08 ] = ( u08 ) ee_rscfd_common_p[ UnitNumber_u08 ]->gaflc1.rnc7; AFLElement_u16 += (u16) AFLChannelEntry[ EE_RSCFD_CHANNEL6 ]; break; default: return( EE_RSCFD_ERROR ); } } if( AFLElement_u16 >= EE_RSCFD_MAXAFLENTRIES ) return( EE_RSCFD_ERROR ); if( RuleNumber_u16 >= AFLChannelEntry[ ChannelNumber_u08 ] ) return( EE_RSCFD_ERROR ); if( AFLChannelEntry[ ChannelNumber_u08 ] > EE_RSCFD_MAXAFLCHANSET ) return( EE_RSCFD_ERROR ); AFLPage_u08 = ( u08 )( AFLElement_u16 / EE_RSCFD_AFLPAGESIZE ); AFLElement_u16 = AFLElement_u16 % EE_RSCFD_AFLPAGESIZE; ee_rscfd_common_p[ UnitNumber_u08 ]->gafle.afldae = EE_RSCFD_SET; ee_rscfd_common_p[ UnitNumber_u08 ]->gafle.aflpn = ( u32 )AFLPage_u08; __asm( "syncp" ); ee_rscfd_aflpage_p[ UnitNumber_u08 ]->af[ AFLElement_u16 ].id.id = AFLEntry->id.id; ee_rscfd_aflpage_p[ UnitNumber_u08 ]->af[ AFLElement_u16 ].id.lb = AFLEntry->id.lb; ee_rscfd_aflpage_p[ UnitNumber_u08 ]->af[ AFLElement_u16 ].id.rtr = AFLEntry->id.rtr; ee_rscfd_aflpage_p[ UnitNumber_u08 ]->af[ AFLElement_u16 ].id.ide = AFLEntry->id.ide; ee_rscfd_aflpage_p[ UnitNumber_u08 ]->af[ AFLElement_u16 ].mask.id = AFLEntry->mask.id; ee_rscfd_aflpage_p[ UnitNumber_u08 ]->af[ AFLElement_u16 ].mask.rtr = AFLEntry->mask.rtr; ee_rscfd_aflpage_p[ UnitNumber_u08 ]->af[ AFLElement_u16 ].mask.ide = AFLEntry->mask.ide; ee_rscfd_aflpage_p[ UnitNumber_u08 ]->af[ AFLElement_u16 ].ptr0.rmdp = AFLEntry->ptr0.rmdp; ee_rscfd_aflpage_p[ UnitNumber_u08 ]->af[ AFLElement_u16 ].ptr0.rmv = AFLEntry->ptr0.rmv; ee_rscfd_aflpage_p[ UnitNumber_u08 ]->af[ AFLElement_u16 ].ptr0.ptr = AFLEntry->ptr0.ptr; ee_rscfd_aflpage_p[ UnitNumber_u08 ]->af[ AFLElement_u16 ].ptr0.dlc = AFLEntry->ptr0.dlc; ee_rscfd_aflpage_p[ UnitNumber_u08 ]->af[ AFLElement_u16 ].ptr1.rxfifomask = AFLEntry->ptr1.rxfifomask; ee_rscfd_aflpage_p[ UnitNumber_u08 ]->af[ AFLElement_u16 ].ptr1.comfifomask = AFLEntry->ptr1.comfifomask; ee_rscfd_common_p[ UnitNumber_u08 ]->gafle.afldae = EE_RSCFD_CLEAR; __asm( "syncp" ); return( EE_RSCFD_OK ); } //============================================================================= // FunctionName: EE_RSCFD_GetTimeStampCounter // IN : Unit Number // OUT : Success Status // Description : Returns current value of Time Stamp Counter // //============================================================================= bit EE_RSCFD_GetTimeStampCounter( u08 UnitNumber_u08, pu32 TimeStampValue_pu32 ) { if( UnitNumber_u08 >= EE_RSCFD_MACROS ) return( EE_RSCFD_ERROR ); *TimeStampValue_pu32 = ee_rscfd_common_p[ UnitNumber_u08 ]->gtsc; return( EE_RSCFD_OK ); } //============================================================================= // FunctionName: EE_RSCFD_RAMTest // IN : Unit Number // OUT : Success Status // Description : Executes RAM Test // //============================================================================= bit EE_RSCFD_RAMTest( u08 UnitNumber_u08 ) { u08 RAMPage_u08; u16 RAMElement_u16; u32 RAMData_u32 = 0x00000001; if( UnitNumber_u08 >= EE_RSCFD_MACROS ) return( EE_RSCFD_ERROR ); if( ee_rscfd_common_p[ UnitNumber_u08 ]->gsts.mds != EE_RSCFD_OPMODE_HALT ) return( EE_RSCFD_ERROR ); if( ee_rscfd_common_p[ UnitNumber_u08 ]->gctr.gslpr == EE_RSCFD_SET ) return( EE_RSCFD_ERROR ); /* Unlock the test mode */ ee_rscfd_common_p[ UnitNumber_u08 ]->glockk = EE_RSCFD_RAMTEST_KEY1; ee_rscfd_common_p[ UnitNumber_u08 ]->glockk = EE_RSCFD_RAMTEST_KEY2; ee_rscfd_common_p[ UnitNumber_u08 ]->gtctr = EE_RSCFD_RAMTEST_MODE; // Reading back zero value from cleared RAM for( RAMPage_u08 = 0; RAMPage_u08 < EE_RSCFD_RAMTEST_PAGES; RAMPage_u08++ ) { ee_rscfd_common_p[ UnitNumber_u08 ]->gtcfg.rtmps = RAMPage_u08; for( RAMElement_u16 = 0; RAMElement_u16 < EE_RSCFD_RAMTEST_ENTRIES; RAMElement_u16++ ) { #ifdef EE_RSCFD_RAMTEST_LASTPGENTRIES if( ( RAMPage_u08 == ( EE_RSCFD_RAMTEST_PAGES-1 ) ) & ( RAMElement_u16 > EE_RSCFD_RAMTEST_LASTPGENTRIES ) ) break; #endif ee_rscfd_ram_p[ UnitNumber_u08 ]->cell[ RAMElement_u16 ] = 0x00000000; if( ee_rscfd_ram_p[ UnitNumber_u08 ]->cell[ RAMElement_u16 ] != 0x00000000 ) { return( EE_RSCFD_ERROR ); } } } // Write walking-1 to all RAM pages for( RAMPage_u08 = 0; RAMPage_u08 < EE_RSCFD_RAMTEST_PAGES; RAMPage_u08++ ) { ee_rscfd_common_p[ UnitNumber_u08 ]->gtcfg.rtmps = RAMPage_u08; for( RAMElement_u16 = 0; RAMElement_u16 < EE_RSCFD_RAMTEST_ENTRIES; RAMElement_u16++ ) { #ifdef EE_RSCFD_RAMTEST_LASTPGENTRIES if( ( RAMPage_u08 == ( EE_RSCFD_RAMTEST_PAGES-1 ) ) & ( RAMElement_u16 > EE_RSCFD_RAMTEST_LASTPGENTRIES ) ) break; #endif ee_rscfd_ram_p[ UnitNumber_u08 ]->cell[ RAMElement_u16 ] = RAMData_u32; if( RAMData_u32 >= 0x80000000) { RAMData_u32 = 0x00000001; } else { RAMData_u32 = RAMData_u32 * 2; } } } // Checking Walking-1 through all pages for( RAMPage_u08 = 0; RAMPage_u08 < EE_RSCFD_RAMTEST_PAGES; RAMPage_u08++ ) { ee_rscfd_common_p[ UnitNumber_u08 ]->gtcfg.rtmps = RAMPage_u08; for( RAMElement_u16 = 0; RAMElement_u16 < EE_RSCFD_RAMTEST_ENTRIES; RAMElement_u16++ ) { #ifdef EE_RSCFD_RAMTEST_LASTPGENTRIES if( ( RAMPage_u08 == ( EE_RSCFD_RAMTEST_PAGES-1 ) ) & ( RAMElement_u16 > EE_RSCFD_RAMTEST_LASTPGENTRIES ) ) break; #endif if ( RAMPage_u08 == 0 && RAMElement_u16 == 0 ) { RAMData_u32 = 0x00000001; } else if( RAMData_u32 >= 0x80000000) { RAMData_u32 = 0x00000001; } else { RAMData_u32 = RAMData_u32 * 2; } if( ee_rscfd_ram_p[ UnitNumber_u08 ]->cell[ RAMElement_u16 ] != RAMData_u32 ) { return( EE_RSCFD_ERROR ); } } } return( EE_RSCFD_OK ); } //============================================================================= // FunctionName: EE_RSCFD_IntCANBusActivate // IN : Unit Number // OUT : Success Status // Description : Activates internal CAN bus communication for testing // //============================================================================= bit EE_RSCFD_IntCANBusActivate( u08 UnitNumber_u08 ) { if( UnitNumber_u08 >= EE_RSCFD_MACROS ) return( EE_RSCFD_ERROR ); if( ee_rscfd_common_p[ UnitNumber_u08 ]->gsts.mds != EE_RSCFD_OPMODE_HALT ) return( EE_RSCFD_ERROR ); ee_rscfd_common_p[ UnitNumber_u08 ]->gtcfg.icbce = EE_RSCFD_COMTEST_ALLON; ee_rscfd_common_p[ UnitNumber_u08 ]->gtctr = EE_RSCFD_COMTEST_MODE; while( ee_rscfd_common_p[ UnitNumber_u08 ]->gtctr != EE_RSCFD_COMTEST_MODE ); return( EE_RSCFD_OK ); } //============================================================================= // FunctionName: EE_RSCFD_GetFIFOStatus // IN : Unit Number, Channel Number, FIFO Number, Status Type // OUT : Success Status, Status Value // Description : Reads FIFO Status registers // //============================================================================= bit EE_RSCFD_GetFIFOStatus( u08 UnitNumber_u08, u08 ChannelNumber_u08, u08 FIFONumber_u08, u08 StatusType_u08, pu08 StatusValue_pu08 ) { if( UnitNumber_u08 >= EE_RSCFD_MACROS ) return( EE_RSCFD_ERROR ); if( ChannelNumber_u08 >= ee_rscfd_channels[ UnitNumber_u08 ] && ChannelNumber_u08 != EE_RSCFD_GLOBAL) return( EE_RSCFD_ERROR ); if( ChannelNumber_u08 == EE_RSCFD_GLOBAL ) { switch( StatusType_u08 ) { case EE_RSCFD_FIFO_STATUS_FULL: *StatusValue_pu08 = ( u08 )( ( ee_rscfd_common_p[ UnitNumber_u08 ]-> ffsts.rf >> FIFONumber_u08 ) & 0x01L ); break; case EE_RSCFD_FIFO_STATUS_EMPTY: *StatusValue_pu08 = ( u08 )( ( ee_rscfd_common_p[ UnitNumber_u08 ]-> fests.rf >> FIFONumber_u08 ) & 0x01L ); break; case EE_RSCFD_FIFO_STATUS_LOST: *StatusValue_pu08 = ( u08 )( ( ee_rscfd_common_p[ UnitNumber_u08 ]-> fmsts.rf >> FIFONumber_u08 ) & 0x01L ); break; } } else { FIFONumber_u08 = EE_RSCFD_MAXCOMFIFOS * ChannelNumber_u08 + FIFONumber_u08; switch( StatusType_u08 ) { case EE_RSCFD_FIFO_STATUS_FULL: *StatusValue_pu08 = ( u08 )( ( ee_rscfd_common_p[ UnitNumber_u08 ]-> ffsts.cf >> FIFONumber_u08 ) & 0x01L ); break; case EE_RSCFD_FIFO_STATUS_EMPTY: *StatusValue_pu08 = ( u08 )( ( ee_rscfd_common_p[ UnitNumber_u08 ]-> fests.cf >> FIFONumber_u08 ) & 0x01L ); break; case EE_RSCFD_FIFO_STATUS_LOST: *StatusValue_pu08 = ( u08 )( ( ee_rscfd_common_p[ UnitNumber_u08 ]-> fmsts.cf >> FIFONumber_u08 ) & 0x01L ); break; } } return( EE_RSCFD_OK ); }