]> rtime.felk.cvut.cz Git - arc.git/commitdiff
Merged in from default
authortojo <devnull@localhost>
Tue, 4 Jan 2011 12:41:06 +0000 (13:41 +0100)
committertojo <devnull@localhost>
Tue, 4 Jan 2011 12:41:06 +0000 (13:41 +0100)
13 files changed:
arch/ppc/mpc55xx/drivers/Can.c
arch/ppc/mpc55xx/drivers/Eep.c
arch/ppc/mpc55xx/drivers/Fls.c
arch/ppc/mpc55xx/drivers/Fls_H7F.c
arch/ppc/mpc55xx/drivers/Gpt.c
arch/ppc/mpc55xx/drivers/Mcu.c
arch/ppc/mpc55xx/drivers/Port.c
boards/mpc5516it/config/Eep_Cfg.h
boards/mpc5516it/config/Eep_Lcfg.c
include/Can.h
include/Eep.h
include/Fls.h
scripts/compile_examples.sh [changed mode: 0644->0755]

index 77730741693ea7e1bcb0a323ee9b6d0218bff8e8..cd5f5b4603ff27a8d0a07de1bc64b8d3222a0190 100644 (file)
@@ -638,6 +638,11 @@ static void Can_Isr(int unit) {
   }\r
 \r
   if (canHwConfig->Can_Arc_Fifo) {\r
+    /*\r
+     * NOTE!!!\r
+     * Do not enable RxFIFO. See [Freescale Device Errata MPC5510ACE, Rev. 10 APR 2009, errata ID: 14593].\r
+     */\r
+     \r
        /* Note\r
         * NOT tested at all\r
         */\r
@@ -1004,7 +1009,9 @@ Can_ReturnType Can_SetControllerMode( uint8 controller, Can_StateTransitionType
     canUnit->state = CANIF_CS_STARTED;\r
     imask_t state = McuE_EnterCriticalSection();\r
     if (canUnit->lock_cnt == 0)   // REQ CAN196\r
+    {\r
       Can_EnableControllerInterrupts(controller);\r
+    }\r
     McuE_ExitCriticalSection(state);\r
     break;\r
   case CAN_T_WAKEUP:  //CAN267\r
index 177bfd5b90a9df9dedfddad297951ce8528b8df1..c549979f0becc6e682b4df46c1fb6586097f5c73 100644 (file)
 #if ( EEP_DEV_ERROR_DETECT == STD_ON ) // Report DEV errors\r
 #define VALIDATE(_exp,_api,_err ) \\r
         if( !(_exp) ) { \\r
-          Det_ReportError(MODULE_ID_GPT,0,_api,_err); \\r
+          Det_ReportError(MODULE_ID_EEP,0,_api,_err); \\r
           return; \\r
         }\r
 \r
 #define VALIDATE_W_RV(_exp,_api,_err,_rv ) \\r
         if( !(_exp) ) { \\r
-          Det_ReportError(MODULE_ID_GPT,0,_api,_err); \\r
+          Det_ReportError(MODULE_ID_EEP,0,_api,_err); \\r
           return (_rv); \\r
         }\r
 \r
@@ -139,6 +139,7 @@ typedef struct {
        Eep_Arc_JobType mainState;\r
        Spi_SequenceType currSeq;\r
        uint32 chunkSize;\r
+       uint32            pageSize;
 } Eep_JobInfoType;\r
 \r
 #define JOB_SET_STATE(_x,_y)           job->state=(_x);job->mainState=(_y)\r
@@ -174,9 +175,9 @@ typedef struct {
 \r
 } Eep_GlobalType;\r
 \r
-#if 0\r
+#if 0  // Use SPI synchronous transmit
 #define SPI_TRANSMIT_FUNC(_x)  Spi_SyncTransmit(_x)\r
-#else\r
+#else  // Use SPI asynchronous transmit
 #define SPI_TRANSMIT_FUNC(_x,_y)       Eep_AsyncTransmit(_x,_y)\r
 \r
 Std_ReturnType Eep_AsyncTransmit(Spi_SequenceType Sequence,Eep_JobInfoType *job) {\r
@@ -255,6 +256,8 @@ void Eep_Init( const Eep_ConfigType* ConfigPtr ){
   Eep_Global.status     = MEMIF_IDLE;\r
   Eep_Global.jobResultType  = MEMIF_JOB_OK;\r
 \r
+  Eep_SetMode( CFG_P()->EepDefaultMode );
+
 }\r
 \r
 \r
@@ -330,6 +333,7 @@ Std_ReturnType Eep_Write( Eep_AddressType EepromAddress, const uint8* DataBuffer
                job->chunkSize = Eep_Global.config->EepNormalWriteBlockSize;\r
        }\r
 \r
+  job->pageSize = Eep_Global.config->EepPageSize;
   job->eepAddr = EepromAddress;\r
   job->targetAddr = (uint8 *)DataBufferPtr;\r
   job->left = Length;\r
@@ -363,6 +367,7 @@ Std_ReturnType Eep_Compare( Eep_AddressType EepromAddress, uint8 *TargetAddressP
      job->chunkSize = Eep_Global.config->EepNormalReadBlockSize;\r
   }\r
 \r
+  job->pageSize = Eep_Global.config->EepPageSize;    // Not relevant to compare/read operations, but set anyways.
   job->eepAddr = EepromAddress;\r
   job->targetAddr = TargetAddressPtr;\r
   job->left = Length;\r
@@ -373,8 +378,8 @@ Std_ReturnType Eep_Compare( Eep_AddressType EepromAddress, uint8 *TargetAddressP
 }\r
 \r
 \r
-void Eep_Cancel( void ){\r
-  EEP_JOB_END_NOTIFICATION();\r
+void Eep_Cancel( void ) {
+  EEP_JOB_ERROR_NOTIFICATION();
 \r
   if (MEMIF_JOB_PENDING==Eep_Global.jobResultType) {\r
        Eep_Global.jobResultType=MEMIF_JOB_CANCELLED;\r
@@ -401,6 +406,8 @@ MemIf_JobResultType Eep_GetJobResult( void ){
 static Spi_SeqResultType Eep_ProcessJob( Eep_JobInfoType *job ) {\r
   Spi_SeqResultType rv;\r
   _Bool done = 0;\r
+  uint32 chunkSize = 0;
+  uint32 sizeLeftInPage = 0;
 \r
   /* Check if previous sequence is OK */\r
   rv = Spi_GetSequenceResult(job->currSeq);\r
@@ -417,15 +424,19 @@ static Spi_SeqResultType Eep_ProcessJob( Eep_JobInfoType *job ) {
                        /* Check status from erase cmd, read status from flash */\r
                        Spi_SetupEB( CFG_P()->EepDataChannel, NULL, &Eep_Global.ebReadStatus, 1);\r
                        Eep_Global.ebCmd = E2_RDSR;\r
-                       if( SPI_TRANSMIT_FUNC(CFG_P()->EepCmd2Sequence,job ) != E_OK ) {\r
-                               assert(0);\r
+                       if( SPI_TRANSMIT_FUNC(CFG_P()->EepCmd2Sequence,job ) == E_OK )
+                       {
+                               SET_STATE(1,JOB_READ_STATUS_RESULT);
+                       }
+                       else
+                       {
+                               SET_STATE(1,JOB_READ_STATUS);
                        }\r
-                       SET_STATE(1,JOB_READ_STATUS_RESULT);\r
                        break;\r
 \r
                case JOB_READ_STATUS_RESULT:\r
                        DEBUG(DEBUG_LOW,"%s: READ_STATUS_RESULT\n",MODULE_NAME);\r
-                       if( Eep_Global.ebReadStatus&1 ) {\r
+                       if( Eep_Global.ebReadStatus & 1 ) {\r
                                SET_STATE(0,JOB_READ_STATUS);\r
                        } else {\r
                                SET_STATE(0,JOB_MAIN);\r
@@ -433,32 +444,53 @@ static Spi_SeqResultType Eep_ProcessJob( Eep_JobInfoType *job ) {
                        break;\r
 \r
                case JOB_MAIN:\r
-                       if( job->left != 0 ) {\r
-                               if( job->left <= job->chunkSize ) {\r
-                                       job->chunkSize = job->left;\r
+                       if( job->left > 0 ) {
+                               if( job->left <= job->chunkSize ) {
+                                       chunkSize = job->left;
+                               } else {
+                                       chunkSize = job->chunkSize;
                                }\r
 \r
                                Spi_ConvertToSpiAddr(Eep_Global.ebE2Addr,job->eepAddr);\r
 \r
-                               switch(job->mainState) {\r
+                       BOOL spiTransmitOK = FALSE;
 \r
+                       switch(job->mainState)
+                       {
                                case EEP_ERASE:\r
                                        /* NOT USED */\r
                                        break;\r
                                case EEP_READ:\r
                                case EEP_COMPARE:\r
-                                 DEBUG(DEBUG_LOW,"%s: READ s:%04x d:%04x l:%04x\n",MODULE_NAME,job->eepAddr, job->targetAddr, job->left);\r
+                                       DEBUG(DEBUG_LOW,"%s: READ s:%04x d:%04x l:%04x\n",MODULE_NAME,job->eepAddr, job->targetAddr, job->left);\r
                                        Eep_Global.ebCmd = E2_READ;\r
-                                       Spi_SetupEB( CFG_P()->EepDataChannel, NULL ,job->targetAddr,job->chunkSize);\r
-                                       SPI_TRANSMIT_FUNC(CFG_P()->EepReadSequence,job );\r
+                                       Spi_SetupEB( CFG_P()->EepDataChannel, NULL ,(Spi_DataType*)job->targetAddr,chunkSize);
+                                       if (SPI_TRANSMIT_FUNC(CFG_P()->EepReadSequence,job) == E_OK) {
+                                               spiTransmitOK = TRUE;
+                                       }
                                        break;\r
 \r
                                case EEP_WRITE:\r
                                        DEBUG(DEBUG_LOW,"%s: WRITE d:%04x s:%04x first data:%02x\n",MODULE_NAME,job->eepAddr,job->targetAddr,*job->targetAddr);\r
+
+                                       // Calculate how much space there is left in the current EEPROM page.
+                                       sizeLeftInPage = job->pageSize - (job->eepAddr % job->pageSize);
+
+                                       // Handle EEPROM page boundaries, i.e. make sure that we limit the chunk
+                                       // size so we don't write over the page boundary.
+                                       if (chunkSize > sizeLeftInPage) {\r
+                                               chunkSize = sizeLeftInPage;
+                                       } else {
+                                               // Do nothing since the size of the chunk to write is less than the
+                                               // available space left in the page.
+                                       }
+
                                        Eep_Global.ebCmd = E2_WRITE;\r
                                        Spi_ConvertToSpiAddr(Eep_Global.ebE2Addr,job->eepAddr);\r
-                                       Spi_SetupEB( CFG_P()->EepDataChannel, job->targetAddr, NULL, job->chunkSize);\r
-                                       SPI_TRANSMIT_FUNC(CFG_P()->EepWriteSequence,job );\r
+                                       Spi_SetupEB( CFG_P()->EepDataChannel, (const Spi_DataType*)job->targetAddr, NULL, chunkSize);
+                                       if (SPI_TRANSMIT_FUNC(CFG_P()->EepWriteSequence,job ) == E_OK) {
+                                               spiTransmitOK = TRUE;
+                                       }
                                        break;\r
 \r
                                default:\r
@@ -466,10 +498,15 @@ static Spi_SeqResultType Eep_ProcessJob( Eep_JobInfoType *job ) {
                                        break;\r
                                }\r
 \r
-                               job->eepAddr += job->chunkSize;\r
-                               job->targetAddr += job->chunkSize;\r
-                               job->left -= job->chunkSize;\r
-                               SET_STATE(1,JOB_READ_STATUS);\r
+                               if (spiTransmitOK) {
+                                       job->eepAddr += chunkSize;
+                                       job->targetAddr += chunkSize;
+                                       job->left -= chunkSize;
+
+                                       SET_STATE(1,JOB_READ_STATUS);\r
+                               } else {
+                                       SET_STATE(1,JOB_MAIN);
+                               }
 \r
                        } else {\r
                                /* We are done :) */\r
@@ -560,12 +597,13 @@ void Eep_MainFunction( void )
                                readJob.targetAddr = Eep_CompareBuffer;\r
                        } else {\r
                          // all other cases are bad\r
-                         firstTime = 1;\r
-        Eep_Global.jobResultType = MEMIF_JOB_FAILED;\r
-        Eep_Global.jobType = EEP_NONE;\r
-        Eep_Global.status = MEMIF_IDLE;\r
+                               firstTime = 1;\r
+                               Eep_Global.jobResultType = MEMIF_JOB_FAILED;\r
+                               Eep_Global.jobType = EEP_NONE;\r
+                               Eep_Global.status = MEMIF_IDLE;\r
 \r
-                               DET_REPORTERROR(MODULE_ID_EEP,0, 0x9, MEMIF_JOB_FAILED );\r
+                               DET_REPORTERROR(MODULE_ID_EEP,0, EEP_COMPARE_ID, EEP_E_COM_FAILURE ); // EEP056 (reporting to DET because DEM is missing)
+                               DET_REPORTERROR(MODULE_ID_EEP,0, EEP_COMPARE_ID, MEMIF_JOB_FAILED );
                                EEP_JOB_ERROR_NOTIFICATION();\r
                        }\r
                }\r
@@ -582,27 +620,33 @@ void Eep_MainFunction( void )
                Eep_Global.jobResultType = MEMIF_JOB_OK;\r
                Eep_Global.jobType = EEP_NONE;\r
                Eep_Global.status = MEMIF_IDLE;\r
-        EEP_JOB_END_NOTIFICATION();\r
-      } else if( jobResult == SPI_SEQ_PENDING )  {\r
-        /* Busy, Do nothing */\r
-      } else {\r
-        // Error\r
-       Eep_Global.jobResultType = MEMIF_JOB_FAILED;\r
-        Eep_Global.jobType = EEP_NONE;\r
-        Eep_Global.status = MEMIF_IDLE;\r
-\r
-       switch(Eep_Global.jobType) {\r
-       case EEP_ERASE:\r
-               DET_REPORTERROR(MODULE_ID_EEP,0, 0x9, MEMIF_JOB_FAILED );\r
+                       EEP_JOB_END_NOTIFICATION();\r
+               } else if( jobResult == SPI_SEQ_PENDING )  {\r
+               /* Busy, Do nothing */\r
+               } else {\r
+                       // Error\r
+\r
+                       Eep_EcoreJobType failedJobType = Eep_Global.jobType;
+
+                       Eep_Global.jobResultType = MEMIF_JOB_FAILED;\r
+                       Eep_Global.jobType = EEP_NONE;\r
+                       Eep_Global.status = MEMIF_IDLE;\r
+\r
+                       switch(failedJobType) {
+                               case EEP_ERASE:\r
+                                       DET_REPORTERROR(MODULE_ID_EEP,0, EEP_ERASE_ID, EEP_E_COM_FAILURE ); // EEP056 (reporting to DET because DEM is missing)
+                                       DET_REPORTERROR(MODULE_ID_EEP,0, EEP_ERASE_ID, MEMIF_JOB_FAILED );
                                        break;\r
-       case EEP_READ:\r
-               DET_REPORTERROR(MODULE_ID_EEP,0, 0x9, MEMIF_JOB_FAILED );\r
+                               case EEP_READ:\r
+                                       DET_REPORTERROR(MODULE_ID_EEP,0, EEP_READ_ID, EEP_E_COM_FAILURE ); // EEP056 (reporting to DET because DEM is missing)
+                                       DET_REPORTERROR(MODULE_ID_EEP,0, EEP_READ_ID, MEMIF_JOB_FAILED );
                                        break;\r
-       case EEP_WRITE:\r
-               DET_REPORTERROR(MODULE_ID_EEP,0, 0x9, MEMIF_JOB_FAILED );\r
+                               case EEP_WRITE:\r
+                                       DET_REPORTERROR(MODULE_ID_EEP,0, EEP_WRITE_ID, EEP_E_COM_FAILURE ); // EEP056 (reporting to DET because DEM is missing)
+                                       DET_REPORTERROR(MODULE_ID_EEP,0, EEP_WRITE_ID, MEMIF_JOB_FAILED );
                                        break;\r
-       default:\r
-               assert(0);\r
+                               default:\r
+                                       assert(0);\r
        }\r
 \r
         EEP_JOB_ERROR_NOTIFICATION();\r
index 7713bef34008dcf9aa68271b4921f24de93306eb..759becf834518262fbe8cf5b41577135d2724124 100644 (file)
@@ -86,6 +86,8 @@
 #define SHADOW_ROW_SIZE                0x00008000\r
 #define FLASH_PAGE_SIZE    H7FB_PAGE_SIZE\r
 \r
+#define FLASH_TOTAL_BLOCKS ( 20 )\r
+\r
 #if 0\r
 #define VFLAGS_ADDR_SECT               (1<<0)\r
 #define VFLAGS_ADDR_PAGE               (1<<1)\r
@@ -263,7 +265,7 @@ static inline int Fls_Validate( uint32 addr,uint32 length, uint32 api,uint32 rv
   }\r
 \r
 #define FLS_VALIDATE_PARAM_DATA_W_RV(_ptr,_api, _rv) \\r
-  if( (_ptr)==((void *)0)) { \\r
+  if(( (uint32)(_ptr)%FLS_READ_PAGE_SIZE != 0 ) || ( (_ptr)==((void *)0))) { \
     Det_ReportError(MODULE_ID_FLS,0,_api,FLS_E_PARAM_DATA); \\r
     return _rv; \\r
   }\r
@@ -480,7 +482,7 @@ static void address_to_erase_blocks( Fls_EraseBlockType *eraseBlocks, uint32 add
   endBlock = address_to_block( addr + size - 1,&rem );\r
 \r
   // Check so our implementation holds..\r
-  assert( endBlock<=32 );\r
+  assert( endBlock <= FLASH_TOTAL_BLOCKS );\r
 \r
 #define BLOCK_MASK 0x0003ffffUL\r
 \r
@@ -491,9 +493,9 @@ static void address_to_erase_blocks( Fls_EraseBlockType *eraseBlocks, uint32 add
 \r
 \r
   // shift things in to make freescale driver happy\r
-  eraseBlocks->lowEnabledBlocks = mask&0x3f; // ????\r
-  eraseBlocks->midEnabledBlocks = (mask>>10)&3; // ????\r
-  eraseBlocks->highEnabledBlocks = mask>>12;\r
+  eraseBlocks->lowEnabledBlocks = mask&0x3ff;   // Bits 0..9 indicats low blocks
+  eraseBlocks->midEnabledBlocks = (mask>>10)&3; // Bits 10..11 indicats mid blocks
+  eraseBlocks->highEnabledBlocks = mask>>12;    // Bits 12..19 indicats high blocks
 \r
 \r
   return ;\r
@@ -536,8 +538,8 @@ void Fls_Init( const Fls_ConfigType *ConfigPtr )
 Std_ReturnType Fls_Erase(      Fls_AddressType   TargetAddress,\r
                           Fls_LengthType    Length )\r
 {\r
-  uint32 block;\r
-  uint32 sBlock;\r
+  uint32 endBlock;\r
+  uint32 startBlock;\r
   uint32 rem;\r
   Fls_EraseBlockType eraseBlock;\r
   Fls_EraseInfoType eraseInfo;\r
@@ -553,14 +555,14 @@ Std_ReturnType Fls_Erase( Fls_AddressType   TargetAddress,
      return E_NOT_OK;\r
 \r
   // TargetAddress\r
-  sBlock = address_to_block(TargetAddress,&rem);\r
+  startBlock = address_to_block(TargetAddress,&rem);\r
 \r
-  if( (sBlock == (-1)) || (rem!=0) ) {\r
+  if( (startBlock == (-1)) || (rem!=0) ) {\r
     DET_REPORTERROR(MODULE_ID_FLS,0,0x0,FLS_E_PARAM_ADDRESS );\r
     return E_NOT_OK;\r
   }\r
 \r
-  block = address_to_block(TargetAddress+Length,&rem);\r
+  endBlock = address_to_block(TargetAddress+Length,&rem);\r
 \r
   // Check if we trying to erase a partition that we are executing in\r
   pc = Fls_GetPc();\r
@@ -569,8 +571,7 @@ Std_ReturnType Fls_Erase(   Fls_AddressType   TargetAddress,
        uint32 pcBlock = address_to_block(pc,&rem);\r
        uint8 *partMap = Fls_Global.config->FlsBlockToPartitionMap;\r
 \r
-       if( (partMap[pcBlock] >= partMap[sBlock]) && (partMap[pcBlock] <= partMap[block]) ) {\r
-//    if( address_to_block(pc,&rem) == Fls_Global.config->FlsBlockToPartitionMap[block] ) {\r
+       if( (partMap[pcBlock] >= partMap[startBlock]) && (partMap[pcBlock] <= partMap[endBlock]) ) {\r
         // Can't erase and in the same partition we are executing\r
         assert(0);\r
     }\r
@@ -828,5 +829,27 @@ void Fls_GetVersionInfo( Std_VersionInfoType *VersioninfoPtr )
   memcpy(VersioninfoPtr, &_Fls_VersionInfo, sizeof(Std_VersionInfoType));\r
 }\r
 \r
+void Fls_Check( uint32 flsBaseAddress, uint32 flsTotalSize )\r
+{\r
+  // ECC checking is always on by default.\r
+  // If a non correctable error is discovered\r
+  // we will get an IVOR2 exception.\r
+\r
+  // Enable Flash Non_Correctible Reporting,\r
+  // Not really necessary but makes more information\r
+  // available in the MCM registers if an error occurs.\r
+  MCM.ECR.B.EFNCR = 1;\r
+\r
+  // Read flash in 32bit chunks, it's most efficient.\r
+  uint32* memoryChunkPtr = (uint32*)flsBaseAddress;\r
+  uint32* flsTotalSizePtr = (uint32*)flsTotalSize;\r
+  uint32  memoryChunk = *memoryChunkPtr; // The first read\r
+\r
+  // Read the rest of the flash, chunk by chunk\r
+  while(memoryChunkPtr < flsTotalSizePtr)\r
+  {\r
+    memoryChunk=*(memoryChunkPtr++);\r
+  }\r
+}\r
 \r
 \r
index d4da25743222623c9681cee75951877b71d13fcb..4f8375ac5713aea9f6895e0f1ef6f199b7505512 100644 (file)
@@ -375,6 +375,7 @@ UINT32 Fls_H7F_Program ( PSSD_CONFIG pSSDConfig, Fls_ProgInfoType *pInfo )
       returnCode = Fls_H7F_ProgramStatus(pSSDConfig,pInfo);\r
       break;\r
     default:\r
+      returnCode = 0;\r
       assert(0);\r
       break;\r
     }\r
index e61a6a3cbc795798ac7a0cc4d1dc07ad3ad29438..4c093f6ce50a0ea1d93687d6f09ffabb76a25445 100644 (file)
@@ -101,59 +101,54 @@ Gpt_GlobalType Gpt_Global;
 \r
 //-------------------------------------------------------------------\r
 \r
-\r
-/**\r
- * ISR helper-function that handles the HW channels( 0 to 8 )\r
- *\r
- * @param channel - Channel that the raised the interrupt\r
+/*\r
+ * ISR for a given PIT channel (macro)\r
  */\r
-\r
-static void Gpt_IsrCh(Gpt_ChannelType channel)\r
-{\r
-  const Gpt_ConfigType *config;\r
-  int confCh;\r
-\r
-  confCh = Gpt_Global.channelMap[channel];\r
-  assert(confCh != GPT_CHANNEL_ILL);\r
-\r
-  config = &Gpt_Global.config[confCh];\r
-\r
-  if (config->GptChannelMode == GPT_MODE_ONESHOT)\r
-  {\r
-    // Disable the channel\r
-    PIT.EN.R &= ~(1<<channel);\r
-\r
-    Gpt_Unit[channel].state = GPT_STATE_STOPPED;\r
+#define GPT_ISR( _channel )                            \\r
+  static void Gpt_Isr_Channel##_channel( void )        \\r
+  {                                                    \\r
+    const Gpt_ConfigType *config;                      \\r
+    int confCh;                                        \\r
+                                                       \\r
+    /* Find the config entry for the PIT channel. */   \\r
+    confCh = Gpt_Global.channelMap[ _channel ];        \\r
+    ASSERT(confCh != GPT_CHANNEL_ILL);                 \\r
+    config = &Gpt_Global.config[ confCh ];             \\r
+                                                       \\r
+    if( config->GptChannelMode == GPT_MODE_ONESHOT )   \\r
+    {                                                  \\r
+      /* Disable the channel. */                       \\r
+      PIT.EN.R &= ~( 1 << _channel );                  \\r
+                                                       \\r
+      Gpt_Unit[_channel].state = GPT_STATE_STOPPED;    \\r
+    }                                                  \\r
+    config->GptNotification();                         \\r
+                                                       \\r
+    /* Clear interrupt. */                             \\r
+    PIT.FLG.R = ( 1 << _channel );                     \\r
   }\r
-  config->GptNotification();\r
 \r
-  // Clear interrupt\r
-  PIT.FLG.R = (1<<channel); // Added by Mattias 2009-01\r
-}\r
-\r
-//-------------------------------------------------------------------\r
-// Macro that counts leading zeroes.\r
-#define CNTLZW_INV(x) (31-cntlzw(x))\r
+#define STR__(x)       #x\r
+#define XSTR__(x) STR__(x)\r
 \r
-/**\r
- * ISR that handles all interrupts to the PIT channels\r
- * ( NOT the decrementer )\r
+/*\r
+ * Create instances of the ISR for each PIT channel.\r
  */\r
-\r
-static void Gpt_Isr(void)\r
-{\r
-  uint32 flgMask= PIT.FLG.R;\r
-  uint8 chNr = 0;\r
-\r
-  // Loop over all interrupts\r
-  for (; flgMask; flgMask&=~(1<<chNr))\r
-  {\r
-    // Find first channel that is requesting service.\r
-    chNr = CNTLZW_INV(flgMask);\r
-    Gpt_IsrCh(chNr);\r
-    // Clear interrupt\r
-    PIT.FLG.R = (1<<chNr);\r
-  }\r
+GPT_ISR( 0 );\r
+GPT_ISR( 1 );\r
+GPT_ISR( 2 );\r
+GPT_ISR( 3 );\r
+GPT_ISR( 4 );\r
+GPT_ISR( 5 );\r
+GPT_ISR( 6 );\r
+GPT_ISR( 7 );\r
+GPT_ISR( 8 );\r
+\r
+#define GPT_ISR_INSTALL( _channel )                                                                                                    \\r
+{                                                                                                                                                                      \\r
+       TaskType tid;                                                                                                                                   \\r
+       tid = Os_Arc_CreateIsr(Gpt_Isr_Channel##_channel, 2, XSTR__(Gpt_##_channel));   \\r
+       Irq_AttachIsr2(tid, NULL, PIT_PITFLG_RTIF + _channel);                                                  \\r
 }\r
 \r
 //-------------------------------------------------------------------\r
@@ -190,14 +185,24 @@ void Gpt_Init(const Gpt_ConfigType *config)
     {\r
       if (cfg->GptNotification != NULL)\r
       {\r
-\r
-#if defined(USE_KERNEL)\r
-                       TaskType tid;\r
-                       tid = Os_Arc_CreateIsr(Gpt_Isr, 2, "Gpt_Isr");\r
-                       Irq_AttachIsr2(tid, NULL, PIT_PITFLG_RTIF + ch);\r
-#else\r
-                       IntCtrl_InstallVector(Gpt_Isr, PIT_PITFLG_RTIF + ch, 1, CPU_Z1);\r
-#endif\r
+        switch( ch )\r
+        {\r
+          case 0: GPT_ISR_INSTALL( 0 ); break;\r
+          case 1: GPT_ISR_INSTALL( 1 ); break;\r
+          case 2: GPT_ISR_INSTALL( 2 ); break;\r
+          case 3: GPT_ISR_INSTALL( 3 ); break;\r
+          case 4: GPT_ISR_INSTALL( 4 ); break;\r
+          case 5: GPT_ISR_INSTALL( 5 ); break;\r
+          case 6: GPT_ISR_INSTALL( 6 ); break;\r
+          case 7: GPT_ISR_INSTALL( 7 ); break;\r
+          case 8: GPT_ISR_INSTALL( 8 ); break;\r
+          default:\r
+          {\r
+            // Unknown PIT channel.\r
+            assert( 0 );\r
+            break;\r
+          }\r
+        }\r
       }\r
     }\r
 #if defined(USE_KERNEL)\r
@@ -345,6 +350,11 @@ Gpt_ValueType Gpt_GetTimeRemaining(Gpt_ChannelType channel)
   {\r
     remaining = get_spr(SPR_DEC);\r
   }\r
+  else\r
+  {\r
+    /* We have written a fault in the fault log. Return 0. */\r
+    remaining = 0;\r
+  }\r
 \r
 return remaining;\r
 }\r
@@ -372,6 +382,11 @@ Gpt_ValueType Gpt_GetTimeElapsed(Gpt_ChannelType channel)
   {\r
     timer = get_spr(SPR_DECAR) - get_spr(SPR_DEC);\r
   }\r
+  else\r
+  {\r
+    /* We have written a fault in the fault log. Return 0. */\r
+    timer = 0;\r
+  }\r
 \r
   return (timer);\r
 }\r
index 9ec24a14d87083f08581e0a6f7f4c1eb0fbecbea..a38e3b80b04cd023dee6b5e075ae1b547a84b159 100644 (file)
@@ -108,6 +108,13 @@ static void Mcu_LossOfLock( void  ) {
        Dem_ReportErrorStatus(MCU_E_CLOCK_FAILURE, DEM_EVENT_STATUS_FAILED);\r
 #endif\r
 \r
+  /*\r
+   * NOTE!!!\r
+   * This interrupt may be triggered more than expected.\r
+   * If you are going to use this interrupt, see [Freescale Device Errata MPC5510ACE, Rev. 10 APR 2009, errata ID: 6764].\r
+   *\r
+   */\r
+\r
        Mcu_Global.stats.lossOfLockCnt++;\r
        // Clear interrupt\r
        FMPLL.SYNSR.B.LOLF = 1;\r
index 3ee20477a95e2a45dee294ce98f1ac337b5c7c59..21274c52e585fb782e36690ec5caff007d24e83d 100644 (file)
@@ -94,7 +94,7 @@ void Port_Init(const Port_ConfigType *configType)
   // Pointers to the register memory areas\r
   vuint16_t * padConfig = &(SIU.PCR[0].R);\r
   vuint8_t * outConfig = &(SIU.GPDO[0].R);\r
-//  vuint8_t * inConfig = &(SIU.GPDI[0].R);\r
+//  vuint8_t * inConfig = &(SIU.GPDI[0].R); // Read only\r
 \r
   // Copy config to register areas\r
   memcpy((void *)outConfig, configType->outConfig, configType->outCnt);\r
index 2545637d435c30e37237aa36c73a4cba16eb80b7..dfb9233940756387cad11ce421778838286a28b5 100644 (file)
@@ -140,6 +140,9 @@ typedef struct {
   // This parameter is the number of bytes written within one job processing cycle in fast mode\r
   Eep_LengthType EepFastWriteBlockSize;\r
 \r
+  // This parameter is the EEPROM page size, i.e. number of bytes.
+  Eep_LengthType EepPageSize;
+
   // This parameter is the EEPROM device base address.\r
   Eep_AddressType EepBaseAddress;\r
 } Eep_ConfigType;\r
index 713c7b0a52fe3af4bc95f0ab45a5669bc3063352..f790ba4a7d13260329aeb3b17763f25ee06c9cce 100644 (file)
@@ -76,7 +76,8 @@ const Eep_ConfigType EepConfigData[] = {
     .EepJobCallCycle = 0.2,\r
 \r
     // This parameter is the used size of EEPROM device in bytes.\r
-    .EepSize = 0x8000,\r
+//    .EepSize = 0x8000,\r
+    .EepSize = 0x2000,\r
 \r
     // This parameter is a reference to a callback function for positive job result\r
     .Eep_JobEndNotification = &_JobEndNotify,\r
@@ -84,19 +85,23 @@ const Eep_ConfigType EepConfigData[] = {
     // This parameter is the default EEPROM device mode after initialization.\r
     .EepDefaultMode = MEMIF_MODE_FAST,\r
 \r
+    // Number of bytes read within one job processing cycle in normal mode.
+    .EepNormalReadBlockSize = 4,
+
     // This parameter is the number of bytes read within one job processing cycle in fast mode\r
     .EepFastReadBlockSize = 64,\r
 \r
-    .EepNormalReadBlockSize = 4,\r
-\r
     // Number of bytes written within one job processing cycle in normal mode.\r
     .EepNormalWriteBlockSize = 1,\r
 \r
+    // This parameter is the number of bytes written within one job processing cycle in fast mode
+    .EepFastWriteBlockSize = 64,
+
     // This parameter is a reference to a callback function for negative job result\r
     .Eep_JobErrorNotification = &_JobErrorNotify,\r
 \r
-    // This parameter is the number of bytes written within one job processing cycle in fast mode\r
-    .EepFastWriteBlockSize = 64,\r
+    // This parameter is the EEPROM page size, i.e. number of bytes.
+    .EepPageSize = 64,
 \r
     // This parameter is the EEPROM device base address.\r
     .EepBaseAddress =  0\r
index 10e7171eecc4ee8dafd7945991fa55db0c7774d1..0cabc6a7d2a16a5f27fb4390ffed556e5857703b 100644 (file)
@@ -100,17 +100,17 @@ typedef enum {
 \r
 /* Error from  CAN controller */\r
 typedef union {\r
-       volatile uint32_t R;\r
+     vuint32_t R;\r
      struct {\r
-         volatile uint32_t:24;\r
-         volatile uint32_t BIT1ERR:1;\r
-         volatile uint32_t BIT0ERR:1;\r
-         volatile uint32_t ACKERR:1;\r
-         volatile uint32_t CRCERR:1;\r
-         volatile uint32_t FRMERR:1;\r
-         volatile uint32_t STFERR:1;\r
-         volatile uint32_t TXWRN:1;\r
-         volatile uint32_t RXWRN:1;\r
+         vuint32_t:24;\r
+         vuint32_t BIT1ERR:1;\r
+         vuint32_t BIT0ERR:1;\r
+         vuint32_t ACKERR:1;\r
+         vuint32_t CRCERR:1;\r
+         vuint32_t FRMERR:1;\r
+         vuint32_t STFERR:1;\r
+         vuint32_t TXWRN:1;\r
+         vuint32_t RXWRN:1;\r
      } B;\r
  } Can_Arc_ErrorType;\r
 \r
index 23f2c7fe9ae77cf00fe6c49a1d0a8ee38672a20c..1531878b4985574c15cf08d193cbe5b364c3bced 100644 (file)
@@ -49,6 +49,9 @@ typedef Eep_AddressType Eep_LengthType;
 #define EEP_E_UNINIT                               0x20\r
 #define EEP_E_BUSY                                         0x21\r
 \r
+/* Production errors */\r
+// #define EEP_E_COM_FAILURE       0x30 /* Shall be located in DemIntErrId.h when its available */\r
+\r
 /* Service id's for fls functions */\r
 #define EEP_INIT_ID                                        0x00\r
 #define EEP_SETMODE_ID          0x01\r
index d0a08c6329189cb4e6f4d18b7d7c2cb3cd526e59..740bd40a20dd2cbfb6b5fe3bf459419aff5e4acc 100644 (file)
@@ -143,5 +143,6 @@ void Fls_SetMode(           Fls_ModeType Mode );
 \r
 void Fls_GetVersionInfo( Std_VersionInfoType *VersioninfoPtr );\r
 \r
+void Fls_Check( uint32 flsBaseAddress, uint32 flsTotalSize );\r
 \r
 #endif /*FLS_H_*/\r
old mode 100644 (file)
new mode 100755 (executable)