亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? c2312.c

?? flash programer driver
?? C
?? 第 1 頁 / 共 5 頁
字號:
            completed
   Step 7:  Return to Read mode (if an error occurred)

*******************************************************************************/
ReturnType FlashMultipleBlockErase(uBlockType ublNumBlocks,uBlockType *ublpBlock,ReturnType *rpResults) {

   ReturnType rRetVal = Flash_Success, /* Holds return value: optimistic initially! */
              rProtStatus; /* Holds the protection status of each block */
   uBlockType ublCurBlock; /* Range Variable to track current block */
   uCPUBusType ucFirstRead, ucSecondRead; /* used to check toggle bit DQ2 */

   /* Step 1: Check for invalid block. */
   if( ublNumBlocks > NUM_BLOCKS ){ /* Check specified blocks <= NUM_BLOCKS */
      eiErrorInfo.sprRetVal = FlashSpec_TooManyBlocks; 
      return Flash_SpecificError;
   } /* EndIf */

   /* Step 2: Check if some blocks are protected */ 
   for (ublCurBlock=0; ublCurBlock < ublNumBlocks;ublCurBlock++) {
      if (FlashCheckBlockProtection(ublCurBlock)==Flash_BlockProtected) {
         rProtStatus = Flash_BlockProtected;  
	 rRetVal = Flash_BlockEraseFailed;
      } else 
         rProtStatus =Flash_Success;
         if (rpResults != NULL)
            rpResults[ublCurBlock] = rProtStatus;
   } /* Next ublCurBlock */

   /* Step 3: Write Block Erase command */
   FlashWrite( ConvAddr(0x00555), (uCPUBusType)CMD(0x00AA) );
   FlashWrite( ConvAddr(0x002AA), (uCPUBusType)CMD(0x0055) );
   FlashWrite( ConvAddr(0x00555), (uCPUBusType)CMD(0x0080) );
   FlashWrite( ConvAddr(0x00555), (uCPUBusType)CMD(0x00AA) );
   FlashWrite( ConvAddr(0x002AA), (uCPUBusType)CMD(0x0055) );

   /* DSI!: Disable Interrupt, Time critical section. Additional blocks must be added 
            every 50us */

   for( ublCurBlock = 0; ublCurBlock < ublNumBlocks; ublCurBlock++ ) {
      FlashWrite( BlockOffset[ublpBlock[ublCurBlock]], (uCPUBusType)CMD(0x0030) );
      /* Check for Erase Timeout Period (is bit DQ3 set?)*/ 
      if( (FlashRead( BlockOffset[ublpBlock[0]] ) & CMD(0x0008)) != 0 )
         break; /* Cannot set any more blocks due to timeout */
   } /* Next ublCurBlock */

   /* ENI!: Enable Interrupt */

   /* Step 4: Check for time-out blocks */
   /* if timeout occurred then check if current block is erasing or not */
   /* Use DQ2 of status register, toggle implies block is erasing */
   if ( ublCurBlock < ublNumBlocks ) {
      ucFirstRead = FlashRead( BlockOffset[ublpBlock[ublCurBlock]] ) & CMD(0x0004);
      ucSecondRead = FlashRead( BlockOffset[ublpBlock[ublCurBlock]] ) & CMD(0x0004);
      if( ucFirstRead != ucSecondRead )
         ublCurBlock++; /* Point to the next block */

      if( ublCurBlock < ublNumBlocks ){
         /* Indicate that some blocks have been timed out of the erase list */
         rRetVal = Flash_SpecificError;
         eiErrorInfo.sprRetVal = FlashSpec_MpuTooSlow; 
      } /* EndIf */

      /* Now specify all other blocks as not being erased */
      while( ublCurBlock < ublNumBlocks ) {
         rpResults[ublCurBlock++] = Flash_BlockEraseFailed;
      } /* EndWhile */     
   } /* EndIf ( ublCurBlock < ublNumBlocks ) */


   /* Step 5: Wait for the Erase Timer Bit (DQ3) to be set */
   FlashTimeOut(0); /* Initialize TimeOut Counter */
   while( !(FlashRead( BlockOffset[ublpBlock[0]] ) & CMD(0x0008) ) ){ 
      if (FlashTimeOut(5) == Flash_OperationTimeOut) {
         FlashWrite( ANY_ADDR, (uCPUBusType)CMD(0x00F0) ); /* Use single instruction 
                                                              cycle method */
         return Flash_OperationTimeOut; 
      } /* EndIf */
   } /* EndWhile */

   /* Step 6: Follow Data Toggle Flow Chart until Program/Erase Controlle completes */
   if( FlashDataToggle(BlockOffset[ublpBlock[0]]) !=  Flash_Success ) {
      if (rpResults != NULL) {
         for (ublCurBlock=0;ublCurBlock < ublNumBlocks;ublCurBlock++)
            if (rpResults[ublCurBlock]==Flash_Success)
               rpResults[ublCurBlock] = FlashCheckBlockEraseError(ublCurBlock);  
      } /* EndIf */

      /* Step 7: Return to Read mode (if an error occurred) */
      FlashWrite( ANY_ADDR, (uCPUBusType)CMD(0x00F0) ); /* Use single instruction cycle method */
      rRetVal=Flash_BlockEraseFailed;
   } /* EndIf */
   return rRetVal;

} /* EndFunction FlashMultipleBlockErase */





/*******************************************************************************
Function:    void FlashPause( udword udMicroSeconds )
Arguments:   udMicroSeconds is the length of the pause in microseconds
Returns:     None
Description: This routine returns after udMicroSeconds have elapsed. It is used
   in several parts of the code to generate a pause required for correct
   operation of the flash part.

Pseudo Code:
   Step 1: Initilize clkReset variable.
   Step 2: Count to the required size.
*******************************************************************************/

#ifdef TIME_H_EXISTS
/*-----------------------------------------------------------------------------
 Note:The Routine uses the function clock() inside of the ANSI C library "time.h". 
-----------------------------------------------------------------------------*/

static void FlashPause(udword udMicroSeconds){
   clock_t clkReset,clkCounts;

   /* Step 1: Initialize clkReset variable */
   clkReset=clock();

   /* Step 2: Count to the required size */
   do
      clkCounts = clock()-clkReset;
   while (clkCounts < ((CLOCKS_PER_SEC/1e6L)*udMicroSeconds));

} /* EndFunction FlashPause */
#else

/*-----------------------------------------------------------------------------
Note: The routine here works by counting. The user may already have a more suitable
      routine for timing which can be used.
-----------------------------------------------------------------------------*/

static void FlashPause(udword udMicroSeconds) {
   static udword udCounter;

   /* Step 1: Compute the count size */
   udCounter = udMicroSeconds * COUNT_FOR_MICROSECOND;

   /* Step 2: Count to the required size */
   while( udCounter > 0 ) /* Test to see if finished */
      udCounter--; /* and count down */
} /* EndFunction FlashPause */

#endif





/*******************************************************************************
Function:     ReturnType FlashProgram( udword udMode, udword udAddrOff,
                                       udword udNrOfElementsInArray, void *pArray )
Arguments:    udMode changes between programming modes
   udAddrOff is the address offset into the flash to be programmed
   udNrOfElementsInArray holds the number of elements (uCPUBusType) in the array.
   pArray is a void pointer to the array with the contents to be programmed.

Return Value: The function returns the following conditions:
   Flash_Success
   Flash_AddressInvalid
   Flash_ProgramFailed

Description: This function is used to program an array into the flash. It does
   not erase the flash first and will not produce proper results, if the block(s)
   are not erased first.
   Any errors are returned without any further attempts to program other addresses
   of the device. The function returns Flash_Success when all addresses have
   successfully been programmed.

   Note: Two program modes are available:
   - udMode = 0, Normal Program Mode
   The number of elements (udNumberOfElementsInArray) contained in pArray
   are programmed directly to the flash starting with udAddrOff.    
   - udMode = 1, Single Value Program Mode
? Only the first value of the pArray will be programmed to the flash
   starting from udAddrOff.
   .
Pseudo Code:
   Step  1:  Check whether the data to be programmed are are within the
             Flash memory 
   Step  2:  Determine first and last block to program
   Step  3:  Check protection status for the blocks to be programmed
   Step  4:  Issue the Unlock Bypass command
   Step  5:  Unlock Bypass Program command
   Step  6:  Wait until Program/Erase Controller has completed
   Step  7:  Return to Read Mode
   Step  8:  Decision between direct and single value programming
   Step  9:  Unlock Bypass Reset
*******************************************************************************/
ReturnType FlashProgram(udword udMode, udword udAddrOff, udword udNrOfElementsInArray, void *pArray ) {
   ReturnType rRetVal = Flash_Success; /* Return Value: Initially optimistic */ 
   ReturnType rProtStatus; /* Protection Status of a block */
   uCPUBusType *ucpArrayPointer; /* Use an uCPUBusType to access the array */ 
   udword udLastOff; /* Holds the last offset to be programmed */ 
   uBlockType ublFirstBlock; /* The block where start to program */
   uBlockType ublLastBlock; /* The last block to be programmed */
   uBlockType ublCurBlock; /* Current block */

   if (udMode > 1)
      return Flash_FunctionNotSupported;

   /* Step 1: Check if the data to be programmed are within the Flash memory space */
   udLastOff = udAddrOff + udNrOfElementsInArray - 1; 
   if( udLastOff >= FLASH_SIZE ) 
      return Flash_AddressInvalid; 
   
   /* Step 2: Determine first and last block to program */
   for (ublFirstBlock=0; ublFirstBlock < NUM_BLOCKS-1;ublFirstBlock++)
      if (udAddrOff < BlockOffset[ublFirstBlock+1]) 
         break;
   
   for (ublLastBlock=ublFirstBlock; ublLastBlock < NUM_BLOCKS-1;ublLastBlock++)
      if (udLastOff < BlockOffset[ublLastBlock+1]) 
         break;
   
   /* Step 3: Check protection status for the blocks to be programmed */
   for (ublCurBlock = ublFirstBlock; ublCurBlock <= ublLastBlock; ublCurBlock++){
      if ( (rProtStatus = FlashCheckBlockProtection(ublCurBlock)) != Flash_BlockUnprotected ){
         rRetVal = Flash_BlockProtected;
         if (ublCurBlock == ublFirstBlock){
            eiErrorInfo.udGeneralInfo[0] = udAddrOff;
            return rRetVal; 
         } else {
            eiErrorInfo.udGeneralInfo[0] = BlockOffset[ublCurBlock];
            udLastOff = BlockOffset[ublCurBlock]-1;
         } /* EndIf ublCurBlock */
      } /* EndIf rProtStatus */
   } /* Next ublCurBlock */
   
   /* Step 4: Issue the Unlock Bypass command */
   FlashWrite( ConvAddr(0x00555), (uCPUBusType)CMD(0x00AA) ); /* 1st cycle */
   FlashWrite( ConvAddr(0x002AA), (uCPUBusType)CMD(0x0055) ); /* 2nd cycle */
   FlashWrite( ConvAddr(0x00555), (uCPUBusType)CMD(0x0020) ); /* 3nd cycle */
   
   ucpArrayPointer = (uCPUBusType *)pArray; 
   
   /* Step 5: Unlock Bypass Program command */ 
   while( udAddrOff <= udLastOff ){
      FlashWrite( ANY_ADDR, CMD(0x00A0) ); /* 1st cycle */
      FlashWrite( udAddrOff, *ucpArrayPointer ); /* 2nd Cycle */  
   
      /* Step 6: Wait until Program/Erase Controller has completed */
      if( FlashDataToggle(udAddrOff) != Flash_Success){
         /* Step 7: Return to Read Mode */
         FlashWrite( ANY_ADDR, (uCPUBusType)CMD(0x00F0) ); /* Use single instruction cycle method */
         rRetVal=Flash_ProgramFailed;
         eiErrorInfo.udGeneralInfo[0] = udAddrOff;
         break; /* exit while cycle */
      } /* EndIf */

      /* Step 8: Decision between direct and single value programming */
      if (udMode == 0) /* Decision between direct and single value programming */
         ucpArrayPointer++;
   
      udAddrOff++;
   } /* EndWhile */
   
   /* Step 9: Unlock Bypass Reset */
   FlashWrite( ANY_ADDR, (uCPUBusType)CMD(0x0090) ); /* 1st cycle */
   FlashWrite( ANY_ADDR, (uCPUBusType)CMD(0x0000) ); /* 2st cycle */
   
   return rRetVal;

} /* EndFunction FlashProgram */ 




/******************************************************************************* 
Function:     ReturnType FlashQuadProgram( udword udAddrOff, uCPUBusType ucValue1, 
                   uCPUBusType ucValue2,uCPUBusType ucValue3, uCPUBusType ucValue4 ) 
Arguments:    udAddrOff is the address to program.
              ucValue1, ucValue2, ucValue3 and ucValue4 are the values to program 
              on the chip
Return Value: The function returns the following conditions:   
               Flash_Success       
               Flash_ProgramFailed 
   
Note:         
1)    This procedure is available both in 8-bit/16-bit mode. 
2)    This procedure automatically put the 2 least significati bits of udAddrOff 
      to zero, to align the address with a quad-bytes/words boundary.

Description: This function programs four consecutive byte/words, starting from the 
             quadbytes/quadwords boundary.

Pseudo Code: 
   Step 1: Align address to quadbytes/quadwords boundary
   Step 2: Program
   Step 3: Wait until the Program/Erase Controller has completed
   Step 4: Return to read Array mode
********************************************************************************/ 
ReturnType FlashQuadProgram( udword udAddrOff, uCPUBusType ucValue1, uCPUBusType ucValue2, 
                             uCPUBusType ucValue3, uCPUBusType ucValue4  ) {
   ReturnType rRetVal = Flash_Success; /* Return value */

   /* Step 1: Align address to QUAD-BYTE/Word boundary */
   udAddrOff = udAddrOff  & (0xFFFFFFFC);

   /* Step 2: Program  */
   /* Note: the command is expressed with ConvAddr, because it is possible both 8bit and 16bit mode*/
   FlashWrite( ConvAddr(0x0555), CMD(0x0056) ); /* Quadruple Byte Command */
   FlashWrite( udAddrOff,   ucValue1 );
   FlashWrite( udAddrOff+1, ucValue2 );
   FlashWrite( udAddrOff+2, ucValue3 );
   FlashWrite( udAddrOff+3, ucValue4 );
   
   /* Step 3: Wait until Program/Erase Controller has completed */
   if (FlashDataToggle(udAddrOff) != Flash_Success)
      rRetVal = Flash_ProgramFailed; 

   /* Step 4: Return to read Array mode */ 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美videossexotv100| 91亚洲精品久久久蜜桃网站| 亚洲图片激情小说| 欧美日韩亚洲另类| www.日本不卡| 国产一区二区在线视频| 亚洲欧美一区二区三区极速播放| 91色在线porny| 国内精品伊人久久久久av一坑| 亚洲欧美电影一区二区| 久久婷婷一区二区三区| 欧美高清视频不卡网| 色偷偷一区二区三区| 成人av免费在线播放| 国产精品资源网| 国产一区在线观看麻豆| 久久成人免费网| 精品一区二区三区在线观看国产| 亚洲图片欧美一区| 亚洲人成精品久久久久| 中文字幕亚洲在| 国产欧美久久久精品影院| 精品少妇一区二区三区在线播放| 欧美人狂配大交3d怪物一区| 国产精品一区一区| 中文文精品字幕一区二区| 色综合久久久网| 波多野结衣在线aⅴ中文字幕不卡| 国产麻豆9l精品三级站| 国产一区二区三区免费在线观看| 国产一区二区不卡老阿姨| 另类小说色综合网站| 国产一区二区三区日韩| 国产成人综合亚洲网站| 成人午夜免费av| 色综合久久综合网97色综合| 欧美日韩一级片网站| 6080午夜不卡| 欧美电影精品一区二区| 亚洲国产成人私人影院tom| 亚洲欧美日韩中文播放| 男女性色大片免费观看一区二区| 国产呦精品一区二区三区网站| 国产ts人妖一区二区| 欧美性大战xxxxx久久久| 欧美老人xxxx18| 国产欧美一区二区精品久导航| 亚洲丝袜制服诱惑| 精品在线免费视频| 成人av电影免费观看| 日韩免费一区二区| 国产精品你懂的在线| 男男视频亚洲欧美| 91麻豆免费观看| 久久久久99精品国产片| 亚洲在线视频免费观看| 国产电影一区二区三区| 91精品国产综合久久香蕉麻豆 | 国产一本一道久久香蕉| 国v精品久久久网| 日韩欧美成人激情| 日本在线播放一区二区三区| 91片在线免费观看| 国产精品乱码妇女bbbb| 国产在线国偷精品产拍免费yy| 欧美日韩国产大片| 亚洲精品成人悠悠色影视| 国产成人精品1024| 91精品国产一区二区三区香蕉| 亚洲色图19p| 99精品一区二区| 亚洲欧洲av在线| 91极品美女在线| 一区二区三区视频在线看| 在线视频亚洲一区| 午夜伦欧美伦电影理论片| 欧美日韩第一区日日骚| 日韩成人伦理电影在线观看| 91麻豆精品国产91久久久久久久久| 亚洲伊人伊色伊影伊综合网| 91一区二区在线观看| 一级日本不卡的影视| 在线免费观看视频一区| 五月天视频一区| 欧美mv日韩mv亚洲| 性做久久久久久免费观看欧美| 精品一区二区三区蜜桃| 日韩欧美一级二级三级久久久| 美日韩黄色大片| 国产日韩欧美激情| 99精品视频在线观看| 亚洲国产一区在线观看| 欧美一级久久久久久久大片| 国产一区欧美二区| 国产精品久99| 欧美日韩一区在线观看| 久久99久久99| 亚洲日本一区二区三区| 666欧美在线视频| www.日韩大片| 免费日本视频一区| 亚洲色图.com| 欧美激情在线观看视频免费| 不卡高清视频专区| 亚洲一区二区三区四区不卡| 2019国产精品| 欧美日韩国产在线观看| 成人av在线资源网站| 免费精品视频最新在线| 亚洲桃色在线一区| 欧美国产丝袜视频| 日韩精品一区二区三区在线| 成人在线综合网| 久久国产精品99精品国产| 亚洲一区在线观看视频| 久久香蕉国产线看观看99| 欧美久久免费观看| 欧美性生活一区| 欧美在线观看视频在线| 色婷婷av一区二区三区软件| 91在线视频观看| 97久久超碰精品国产| 波多野结衣的一区二区三区| 国产91清纯白嫩初高中在线观看| 精品一区二区三区在线视频| 麻豆久久一区二区| 久久精品国产亚洲aⅴ| 亚洲国产美女搞黄色| 综合精品久久久| 亚洲美女区一区| 亚洲成人在线免费| 免费高清在线一区| 久久精品国产99| 奇米色一区二区| 激情成人综合网| 精品影院一区二区久久久| 国产一区二区三区高清播放| 色综合久久综合| 日本高清免费不卡视频| 欧洲av一区二区嗯嗯嗯啊| 91精品国产乱码| 久久综合九色综合欧美亚洲| 国产精品三级在线观看| 亚洲成av人片在线| 麻豆国产精品视频| 成人动漫中文字幕| 欧美一区二区视频在线观看2022| 日韩欧美在线观看一区二区三区| 久久九九国产精品| 亚洲免费观看高清完整版在线观看熊 | 欧美精品久久久久久久久老牛影院| 日韩你懂的在线播放| 亚洲精品欧美综合四区| 久久精品噜噜噜成人av农村| 亚洲欧洲综合另类| 亚洲男人都懂的| 麻豆精品视频在线观看免费| 成熟亚洲日本毛茸茸凸凹| 欧美妇女性影城| 亚洲天堂精品在线观看| 国产在线精品一区在线观看麻豆| 91网站最新网址| 国产婷婷色一区二区三区四区 | 日日夜夜精品视频天天综合网| 国产精华液一区二区三区| 在线观看成人小视频| 久久精品人人做人人爽人人| 免费看日韩a级影片| 91激情在线视频| 一区二区三区成人| 91免费观看国产| 亚洲精品亚洲人成人网在线播放| 国产麻豆9l精品三级站| 欧美精品一区二区三区蜜桃 | 91理论电影在线观看| 国产亚洲欧美色| 国产成人免费在线观看不卡| 精品国产自在久精品国产| 精品一区二区三区免费毛片爱 | 韩国精品主播一区二区在线观看| 欧美日韩国产一级二级| 亚洲一区二区欧美激情| 色噜噜偷拍精品综合在线| 亚洲精品视频在线观看网站| 色综合色狠狠综合色| 性久久久久久久久久久久| 欧美日韩卡一卡二| 日韩福利视频导航| 日韩精品自拍偷拍| 成人激情免费视频| 伊人开心综合网| 欧美日韩精品综合在线| 日本不卡在线视频| 国产精品色在线观看| 91国偷自产一区二区开放时间| 午夜精品久久久久久久久久| 欧美成人艳星乳罩| 国产成人av电影在线| 亚洲国产精品嫩草影院| 精品国产一区二区三区不卡|