Choco OS  V.0.16.9.0
Join to the chocolate world
oc_machine.h
Go to the documentation of this file.
1 
30 #ifndef SYSTEM_PORTABLE_INC_OC_MACHINE_H_
31 #define SYSTEM_PORTABLE_INC_OC_MACHINE_H_
32 
33 #include <stdbool.h>
34 #include <oc_stdtypes.h>
35 #include <oc_rmaps.h>
36 #include <oc_channels.h>
37 #include <oc_pins.h>
38 #include <oc_ba.h>
39 #include <oc_registers.h>
40 #include <oc_assert.h>
41 #include <oc_mcs.h>
42 #include <oc_machine_defs.h>
43 
49 #define _________________________________________MACROS_SECTION_____________________________________________________________________________
50 
53 //==========================================================================================================================================
58 //==========================================================================================================================================
59 #define oC_Machine_DmaSignalType_(NAME) oC_1WORD_FROM_2(oC_Machine_DmaSignalType_ , NAME)
60 
61 //==========================================================================================================================================
66 //==========================================================================================================================================
67 #define oC_Machine_DmaChannelAssignment_( DMA_CHANNEL_NAME , CHANNEL_NAME , SIGNAL_TYPE , TYPE , ENC , ...) oC_1WORD_FROM_6(oC_Machine_DmaChannelAssignment_ , DMA_CHANNEL_NAME , CHANNEL_NAME , SIGNAL_TYPE , TYPE , ENC)
68 
69 //==========================================================================================================================================
74 //==========================================================================================================================================
75 #define oC_Machine_DmaChannelAssignmentIndex_( DMA_CHANNEL_NAME , CHANNEL_NAME , SIGNAL_TYPE , TYPE , ENC , ...) oC_1WORD_FROM_6(oC_Machine_DmaChannelAssignmentIndex_ , DMA_CHANNEL_NAME , CHANNEL_NAME , SIGNAL_TYPE , TYPE , ENC)
76 
77 //==========================================================================================================================================
90 //==========================================================================================================================================
91 #define oC_Machine_RegisterIndirectDynamic(BaseAddress , RegisterOffset) (*((oC_Register_t*)(((void*)BaseAddress)+((oC_UInt_t)RegisterOffset))))
92 //==========================================================================================================================================
105 //==========================================================================================================================================
106 #define oC_Machine_RegisterIndirectStaticOffset(BaseAddress , REGISTER_NAME) oC_RegisterByBaseAddress(BaseAddress,REGISTER_NAME)
107 //==========================================================================================================================================
117 //==========================================================================================================================================
118 #define oC_Machine_RegisterIndirectStatic(BASE_NAME,REGISTER_NAME) oC_Register(BASE_NAME,REGISTER_NAME)
119 
120 //==========================================================================================================================================
131 //==========================================================================================================================================
132 #define oC_Machine_Register(Channel,REGISTER_NAME) oC_Machine_RegisterIndirectStaticOffset(oC_Channel_GetBaseAddress(Channel),REGISTER_NAME)
133 
134 //==========================================================================================================================================
145 //==========================================================================================================================================
146 #define oC_Machine_GetRegisterAddress(Channel,REGISTER_NAME) ((void*)(oC_Channel_GetBaseAddress(Channel) + oC_RegisterOffset_(REGISTER_NAME)))
147 
148 //==========================================================================================================================================
161 //==========================================================================================================================================
162 #define oC_Machine_IsRegisterWritable(REGISTER_NAME) (oC_RegisterAccess_(REGISTER_NAME) & oC_Access_(W))
163 //==========================================================================================================================================
176 //==========================================================================================================================================
177 #define oC_Machine_IsRegisterReadable(REGISTER_NAME) (oC_RegisterAccess_(REGISTER_NAME) & oC_Access_(R))
178 //==========================================================================================================================================
192 //==========================================================================================================================================
193 #define oC_Machine_WriteRegisterDirectStaticOffset(Channel,REGISTER_NAME,Value) oC_Machine_WriteRegisterDirectDynamic(Channel,oC_RegisterOffset_(REGISTER_NAME),Value)
194 //==========================================================================================================================================
199 //==========================================================================================================================================
200 #define oC_Machine_WriteRegister(Channel,REGISTER_NAME,Value) oC_Machine_WriteRegisterDirectStaticOffset(Channel,REGISTER_NAME,Value)
201 //==========================================================================================================================================
213 //==========================================================================================================================================
214 #define oC_Machine_ReadRegisterDirectStaticOffset(Channel,REGISTER_NAME) oC_Machine_ReadRegisterDirectDynamic(Channel,oC_RegisterOffset_(REGISTER_NAME))
215 //==========================================================================================================================================
220 //==========================================================================================================================================
221 #define oC_Machine_ReadRegister(Channel,REGISTER_NAME) oC_Machine_ReadRegisterDirectStaticOffset(Channel,REGISTER_NAME)
222 //==========================================================================================================================================
227 //==========================================================================================================================================
228 #define oC_Machine_DmaSignalTypeMask ((1<<(oC_MACHINE_DMA_SIGNAL_TYPE_WIDTH))-1)
229 
230 //==========================================================================================================================================
235 //==========================================================================================================================================
236 #define oC_Machine_DmaEncodingValueMask ((1<<oC_MACHINE_DMA_ENCODING_VALUE_WIDTH)-1)
237 
238 //==========================================================================================================================================
243 //==========================================================================================================================================
244 #define oC_Machine_DmaChannelAssignment_DmaChannelMaskWidth (oC_CHANNEL_MASK_WIDTH)
245 //==========================================================================================================================================
250 //==========================================================================================================================================
251 #define oC_Machine_DmaChannelAssignment_ChannelMaskWidth (oC_CHANNEL_MASK_WIDTH)
252 //==========================================================================================================================================
257 //==========================================================================================================================================
258 #define oC_Machine_DmaChannelAssignment_DmaSignalTypeMaskWidth (oC_MACHINE_DMA_SIGNAL_TYPE_WIDTH)
259 //==========================================================================================================================================
264 //==========================================================================================================================================
265 #define oC_Machine_DmaChannelAssignment_DmaEncodingValueMaskWidth (oC_MACHINE_DMA_ENCODING_VALUE_WIDTH)
266 
267 //==========================================================================================================================================
272 //==========================================================================================================================================
273 #define oC_Machine_DmaChannelAssignment_MaskWidth (\
274  oC_Machine_DmaChannelAssignment_DmaChannelMaskWidth + \
275  oC_Machine_DmaChannelAssignment_ChannelMaskWidth + \
276  oC_Machine_DmaChannelAssignment_DmaSignalTypeMaskWidth + \
277  oC_Machine_DmaChannelAssignment_DmaEncodingValueMaskWidth)
278 
279 //==========================================================================================================================================
284 //==========================================================================================================================================
285 #define oC_Machine_DmaChannelAssignment_DmaChannelMaskStartBit (0)
286 //==========================================================================================================================================
291 //==========================================================================================================================================
292 #define oC_Machine_DmaChannelAssignment_ChannelMaskStartBit (oC_Machine_DmaChannelAssignment_DmaChannelMaskStartBit + oC_Machine_DmaChannelAssignment_DmaChannelMaskWidth)
293 //==========================================================================================================================================
298 //==========================================================================================================================================
299 #define oC_Machine_DmaChannelAssignment_DmaSignalTypeMaskStartBit (oC_Machine_DmaChannelAssignment_ChannelMaskStartBit + oC_Machine_DmaChannelAssignment_ChannelMaskWidth)
300 //==========================================================================================================================================
305 //==========================================================================================================================================
306 #define oC_Machine_DmaChannelAssignment_DmaEncodingValueMaskStartBit (oC_Machine_DmaChannelAssignment_DmaSignalTypeMaskStartBit + oC_Machine_DmaChannelAssignment_DmaSignalTypeMaskWidth)
307 
308 //==========================================================================================================================================
313 //==========================================================================================================================================
314 #define oC_Machine_DmaChannelAssignment_DmaChannelMask ((oC_ChannelMask) << oC_Machine_DmaChannelAssignment_DmaChannelMaskStartBit)
315 //==========================================================================================================================================
320 //==========================================================================================================================================
321 #define oC_Machine_DmaChannelAssignment_ChannelMask ((oC_ChannelMask) << oC_Machine_DmaChannelAssignment_ChannelMaskStartBit)
322 //==========================================================================================================================================
327 //==========================================================================================================================================
328 #define oC_Machine_DmaChannelAssignment_DmaSignalTypeMask ((oC_Machine_DmaSignalTypeMask) << oC_Machine_DmaChannelAssignment_DmaSignalTypeMaskStartBit)
329 //==========================================================================================================================================
334 //==========================================================================================================================================
335 #define oC_Machine_DmaChannelAssignment_DmaEncodingValueMask ((oC_Machine_DmaEncodingValueMask) << oC_Machine_DmaChannelAssignment_DmaEncodingValueMaskStartBit)
336 
337 //==========================================================================================================================================
342 //==========================================================================================================================================
343 #define oC_Machine_DmaChannelAssignmentMask ((1<<(oC_Machine_DmaChannelAssignment_MaskWidth))-1)
344 
345 //==========================================================================================================================================
350 //==========================================================================================================================================
351 #define oC_Machine_DmaChannelAssignment_GetDmaChannel(Assignment) (((Assignment) & oC_Machine_DmaChannelAssignment_DmaChannelMask) >> (oC_Machine_DmaChannelAssignment_DmaChannelMaskStartBit))
352 //==========================================================================================================================================
357 //==========================================================================================================================================
358 #define oC_Machine_DmaChannelAssignment_GetChannel(Assignment) (((Assignment) & oC_Machine_DmaChannelAssignment_ChannelMask) >> (oC_Machine_DmaChannelAssignment_ChannelMaskStartBit))
359 //==========================================================================================================================================
364 //==========================================================================================================================================
365 #define oC_Machine_DmaChannelAssignment_GetDmaSignalType(Assignment) (((Assignment) & oC_Machine_DmaChannelAssignment_DmaSignalTypeMask) >> (oC_Machine_DmaChannelAssignment_DmaSignalTypeMaskStartBit))
366 //==========================================================================================================================================
371 //==========================================================================================================================================
372 #define oC_Machine_DmaChannelAssignment_GetDmaEncodingValue(Assignment) (((Assignment) & oC_Machine_DmaChannelAssignment_DmaEncodingValueMask) >> (oC_Machine_DmaChannelAssignment_DmaEncodingValueMaskStartBit))
373 
374 #undef _________________________________________MACROS_SECTION_____________________________________________________________________________
375 
382 #define _________________________________________TYPES_SECTION______________________________________________________________________________
383 
386 #if oC_MACHINE_DMA_ENCODING_VALUE_WIDTH < 8
387 //==========================================================================================================================================
392 //==========================================================================================================================================
394 #elif oC_MACHINE_DMA_ENCODING_VALUE_WIDTH < 16
395 //==========================================================================================================================================
400 //==========================================================================================================================================
401 typedef uint16_t oC_Machine_DmaEncodingValue_t;
402 #elif oC_MACHINE_DMA_ENCODING_VALUE_WIDTH < 32
403 //==========================================================================================================================================
408 //==========================================================================================================================================
409 typedef uint32_t oC_Machine_DmaEncodingValue_t;
410 #elif oC_MACHINE_DMA_ENCODING_VALUE_WIDTH < 64
411 //==========================================================================================================================================
416 //==========================================================================================================================================
417 typedef uint64_t oC_Machine_DmaEncodingValue_t;
418 #else
419 # error oC_MACHINE_DMA_ENCODING_VALUE_WIDTH is too big!
420 #endif
421 
422 //==========================================================================================================================================
428 //==========================================================================================================================================
429 typedef enum
430 {
431 #define DEFINE_DMA_SIGNAL_TYPE(NAME) oC_Machine_DmaSignalType_(NAME) ,
432  oC_MACHINE_DMA_SIGNAL_TYPE_LIST(DEFINE_DMA_SIGNAL_TYPE)
433 #undef DEFINE_DMA_SIGNAL_TYPE
434  oC_Machine_DmaSignalType_NumberOfElements
436 
437 #if oC_Machine_DmaSignalType_NumberOfElements > oC_Machine_DmaSignalTypeMask
438 # error oC_MACHINE_DMA_SIGNAL_TYPE_WIDTH is too small!
439 #endif
440 
441 //==========================================================================================================================================
447 //==========================================================================================================================================
448 typedef enum
449 {
450 #define DEFINE_DMA_CHANNEL_ASSIGNMENT( DMA_CHANNEL_NAME , CHANNEL_NAME , SIGNAL_TYPE , TYPE , ENC ) \
451  oC_Machine_DmaChannelAssignment_( DMA_CHANNEL_NAME , CHANNEL_NAME , SIGNAL_TYPE , TYPE , ENC ) = \
452  ( (oC_Channel_(DMA_CHANNEL_NAME) << oC_Machine_DmaChannelAssignment_DmaChannelMaskStartBit ) & oC_Machine_DmaChannelAssignment_DmaChannelMask ) | \
453  ( (oC_Channel_(CHANNEL_NAME) << oC_Machine_DmaChannelAssignment_ChannelMaskStartBit ) & oC_Machine_DmaChannelAssignment_ChannelMask ) | \
454  ( (oC_Machine_DmaSignalType_(SIGNAL_TYPE) << oC_Machine_DmaChannelAssignment_DmaSignalTypeMaskStartBit ) & oC_Machine_DmaChannelAssignment_DmaSignalTypeMask ) | \
455  ( (ENC << oC_Machine_DmaChannelAssignment_DmaEncodingValueMaskStartBit ) & oC_Machine_DmaChannelAssignment_DmaEncodingValueMask ),
456 
457  oC_MACHINE_DMA_CHANNELS_ASSIGNMENTS_LIST(DEFINE_DMA_CHANNEL_ASSIGNMENT)
458 #undef DEFINE_DMA_CHANNEL_ASSIGNMENT
460 
461 #if oC_Machine_DmaChannelAssignment_MaskWidth > 64
462 #error oC_Machine_DmaChannelAssignment_t type is too big! (it needs more than 64 bits!)
463 #endif
464 
465 //==========================================================================================================================================
469 //==========================================================================================================================================
470 typedef enum
471 {
472 #define DEFINE_DMA_CHANNEL_ASSIGNMENT( DMA_CHANNEL_NAME , CHANNEL_NAME , SIGNAL_TYPE , TYPE , ENC ) \
473  oC_Machine_DmaChannelAssignmentIndex_( DMA_CHANNEL_NAME , CHANNEL_NAME , SIGNAL_TYPE , TYPE , ENC ) ,
474  oC_MACHINE_DMA_CHANNELS_ASSIGNMENTS_LIST(DEFINE_DMA_CHANNEL_ASSIGNMENT)
475  oC_Machine_DmaChannelAssignmentIndex_NumberOfElements
476 #undef DEFINE_DMA_CHANNEL_ASSIGNMENT
478 
479 #undef _________________________________________TYPES_SECTION______________________________________________________________________________
480 
487 #define _________________________________________VARIABLES_SECTION__________________________________________________________________________
488 
489 //==========================================================================================================================================
495 //==========================================================================================================================================
496 const oC_Machine_DmaChannelAssignment_t oC_DmaChannelAssignments[oC_Machine_DmaChannelAssignmentIndex_NumberOfElements];
497 
498 #undef _________________________________________VARIABLES_SECTION__________________________________________________________________________
499 
500 
506 #define _________________________________________INTERFACE_FUNCTIONS_SECTION________________________________________________________________
507 
508 
509 #undef _________________________________________INTERFACE_FUNCTIONS_SECTION________________________________________________________________
510 
516 #define _________________________________________STATIC_INLINE_SECTION______________________________________________________________________
517 
520 //==========================================================================================================================================
531 //==========================================================================================================================================
532 static inline bool oC_Machine_IsPowerRegisterSet( oC_Channel_t Channel )
533 {
534  return oC_Channel_PowerBaseAddressExist(Channel) &&
535  oC_Channel_PowerBitIndexExist(Channel) &&
536  oC_Channel_PowerOffsetExist(Channel);
537 }
538 
539 //==========================================================================================================================================
549 //==========================================================================================================================================
551 {
553 
554  if(Channel < oC_Channel_MaximumChannelNumber)
555  {
556  if(oC_Machine_IsPowerRegisterSet(Channel))
557  {
558  oC_PowerBaseAddress_t powerBaseAddress = oC_Channel_GetPowerBaseAddress(Channel);
559  oC_PowerBit_t powerBit = oC_Channel_GetPowerBitIndex(Channel);
560  oC_PowerOffset_t powerOffset = oC_Channel_GetPowerOffset(Channel);
561 
562  if(oC_Machine_RegisterIndirectDynamic(powerBaseAddress,powerOffset) & (1<<powerBit))
563  {
564  power = oC_Power_On;
565  }
566  else
567  {
568  power = oC_Power_Off;
569  }
570  }
571  else
572  {
573  power = oC_Power_NotHandled;
574  }
575  }
576 
577  return power;
578 }
579 
580 //==========================================================================================================================================
592 //==========================================================================================================================================
593 static inline bool oC_Machine_SetPowerStateForChannel( oC_Channel_t Channel , oC_Power_t Power )
594 {
595  bool success = false;
596 
597  if(Channel < oC_Channel_MaximumChannelNumber)
598  {
599  if(oC_Machine_IsPowerRegisterSet(Channel))
600  {
601  oC_PowerBaseAddress_t powerBaseAddress = oC_Channel_GetPowerBaseAddress(Channel);
602  oC_PowerBit_t powerBit = oC_Channel_GetPowerBitIndex(Channel);
603  oC_PowerOffset_t powerOffset = oC_Channel_GetPowerOffset(Channel);
604 
605  success = true;
606 
607  if(Power == oC_Power_On)
608  {
609  oC_Machine_RegisterIndirectDynamic(powerBaseAddress,powerOffset) |= (1<<powerBit);
610  }
611  else if(Power == oC_Power_Off)
612  {
613  oC_Machine_RegisterIndirectDynamic(powerBaseAddress,powerOffset) &= ~(1<<powerBit);
614  }
615  else
616  {
617  success = false;
618  }
619  }
620  else
621  {
622  success = Power == oC_Power_On;
623  }
624  }
625 
626  return success;
627 }
628 
629 //==========================================================================================================================================
639 //==========================================================================================================================================
640 static inline bool oC_Machine_IsChannelPoweredOn( oC_Channel_t Channel )
641 {
642  oC_Power_t powerState = oC_Machine_GetPowerStateForChannel(Channel);
643  return powerState == oC_Power_On || powerState == oC_Power_NotHandled;
644 }
645 
646 //==========================================================================================================================================
656 //==========================================================================================================================================
657 static inline const char * oC_Machine_GetChannelName( oC_Channel_t Channel )
658 {
659  return oC_Channel_GetName(Channel);
660 }
661 
662 //==========================================================================================================================================
674 //==========================================================================================================================================
675 static inline bool oC_Machine_WriteRegisterDirectDynamic( oC_Channel_t Channel , oC_RegisterOffset_t RegisterOffset , oC_Register_t Value )
676 {
677  bool success = false;
678 
679  if(Channel < oC_Channel_MaximumChannelNumber)
680  {
681  if(oC_Machine_IsChannelPoweredOn(Channel))
682  {
683  oC_Machine_RegisterIndirectDynamic(oC_Channel_GetBaseAddress(Channel),RegisterOffset) = Value;
684  success = true;
685  }
686  else
687  {
688  /* Channel is not powered on */
689  oC_IMPLEMENT_FAILURE();
690  }
691  }
692  else
693  {
694  /* Channel is not correct */
695  oC_IMPLEMENT_FAILURE();
696  }
697 
698  return success;
699 }
700 
701 //==========================================================================================================================================
712 //==========================================================================================================================================
714 {
715  oC_Register_t value = 0;
716 
717  if(Channel < oC_Channel_MaximumChannelNumber)
718  {
719  if(oC_Machine_IsChannelPoweredOn(Channel))
720  {
721  value = oC_Machine_RegisterIndirectDynamic(oC_Channel_GetBaseAddress(Channel),RegisterOffset);
722  }
723  else
724  {
725  /* Channel is not powered on */
726  oC_IMPLEMENT_FAILURE();
727  }
728  }
729  else
730  {
731  /* Channel is not correct */
732  oC_IMPLEMENT_FAILURE();
733  }
734 
735  return value;
736 }
737 
738 
739 
740 #undef _________________________________________STATIC_INLINE_SECTION______________________________________________________________________
741 
743 #endif /* SYSTEM_PORTABLE_INC_OC_MACHINE_H_ */
The file with interface for registers module.
Something is powered on.
Definition: oc_stdtypes.h:252
oC_Machine_DmaSignalType_t
type with DMA signal types
Definition: oc_machine.h:429
Something index is not correct.
Definition: oc_stdtypes.h:254
Something power is not handled.
Definition: oc_stdtypes.h:253
uint8_t oC_Machine_DmaEncodingValue_t
type for storing DMA encoding value
Definition: oc_machine.h:393
volatile oC_UInt_t oC_Register_t
type for storing registers
Definition: oc_registers.h:136
oC_RegisterOffset_t
Type for storing offset of registers.
Definition: oc_rmaps.h:138
oC_PowerBit_t
stores number of bit in the Power Register
Definition: oc_ba.h:235
#define oC_Channel_GetName(Channel)
returns name of channel
Definition: oc_channels.h:391
static bool oC_Machine_IsPowerRegisterSet(oC_Channel_t Channel)
checks if power for channel is turn on
Definition: oc_machine.h:532
oC_Machine_DmaChannelAssignment_t
type for storing assignment of DMA channels
Definition: oc_machine.h:448
#define oC_Machine_RegisterIndirectDynamic(BaseAddress, RegisterOffset)
allows for accessing registers in dynamic mode
Definition: oc_machine.h:91
Something is powered off.
Definition: oc_stdtypes.h:251
oC_PowerOffset_t
stores offset of the Power Register
Definition: oc_ba.h:219
#define oC_Channel_GetBaseAddress(Channel)
returns base address assigned to the channel
Definition: oc_channels.h:327
#define oC_Channel_GetPowerOffset(Channel)
returns offset of power register
Definition: oc_channels.h:355
oC_Channel_t
stores machine channel
Definition: oc_channels.h:573
#define oC_MACHINE_DMA_SIGNAL_TYPE_LIST(ADD_SIGNAL)
oC_Machine_DmaChannelAssignmentIndex_t
stores index in oC_DmaChannelAssignments array
Definition: oc_machine.h:470
The file with interface for register maps module.
FILE__DESCRIPTION
Contains machine core specific functions.
#define oC_Channel_GetPowerBitIndex(Channel)
returns index of bit for power register
Definition: oc_channels.h:365
static oC_Register_t oC_Machine_ReadRegisterDirectDynamic(oC_Channel_t Channel, oC_RegisterOffset_t RegisterOffset)
reads machine register
Definition: oc_machine.h:713
Contains interface of the pins module.
#define oC_Channel_GetPowerBaseAddress(Channel)
returns base address of power register
Definition: oc_channels.h:344
#define oC_MACHINE_DMA_CHANNELS_ASSIGNMENTS_LIST(ADD_CHANNEL_ASSIGNMENT)
static bool oC_Machine_IsChannelPoweredOn(oC_Channel_t Channel)
checks if channel is powered on
Definition: oc_machine.h:640
static oC_Power_t oC_Machine_GetPowerStateForChannel(oC_Channel_t Channel)
returns power state for channel
Definition: oc_machine.h:550
static const char * oC_Machine_GetChannelName(oC_Channel_t Channel)
returns printable name of channel
Definition: oc_machine.h:657
oC_PowerBaseAddress_t
stores base address of the Power Register
Definition: oc_ba.h:203
static bool oC_Machine_WriteRegisterDirectDynamic(oC_Channel_t Channel, oC_RegisterOffset_t RegisterOffset, oC_Register_t Value)
writes machine register
Definition: oc_machine.h:675
static bool oC_Machine_SetPowerStateForChannel(oC_Channel_t Channel, oC_Power_t Power)
configures power state for machine channel
Definition: oc_machine.h:593
The file with interface for Channel module.
FILE__DESCRIPTION
oC_Power_t
stores registers power state
Definition: oc_stdtypes.h:249
const oC_Machine_DmaChannelAssignment_t oC_DmaChannelAssignments[oC_Machine_DmaChannelAssignmentIndex_NumberOfElements]
array with DMA channel assignments
Definition: oc_machine.h:496
Interface for Machine Base Addresses (BA) module.