예제 #1
0
static int Q6Polling (U32 adr) {
   U32 fsreg;
   U32 dqold;
  
   fsreg = M16(adr);
   do {
      dqold = fsreg & DQ6;
      fsreg = M16(adr);
      if ((fsreg & DQ6) == dqold) {
         /* OK, Done. */
         return (0);
      }
      dqold = fsreg & DQ6;
   } while ((fsreg & DQ5) < DQ5);
   fsreg = M16(adr);
   dqold = fsreg & DQ6;
   fsreg = M16(adr);
   if ((fsreg & DQ6) == dqold) {
      /* OK, Done */
      return (0);
   }
   /* Error, Reset Flash Device */
   M16(adr) = RESET;
   return (1);
} /* end of Q6Polling */
예제 #2
0
int fs_ProgramPage (U32 adr, U32 sz, U8 *buf)  {

   for (  ; sz; sz -= 2, adr += 2, buf += 2)  {
      M16(base_adr | 0xAAA) = 0xAA;
      M16(base_adr | 0x554) = 0x55;
      M16(base_adr | 0xAAA) = PROGRAM;
      /* 'buf' might be unaligned. */
      M16(adr) = *(__packed U16 *)buf;

      /* Wait until Programming completed */
      if (Q6Polling (adr)) {
         return (1);
      }
   }
   return (0);
} /* end of fs_ProgramPage */
예제 #3
0
int ProgramPage (unsigned long adr, unsigned long sz, unsigned char *buf) {

  sz = (sz + 1) & ~1;                                   // Adjust size for Half Words
  
  FLASH->SR |= FLASH_PGERR;                             // Reset Error Flags

  while (sz) {
    FLASH->CR |=  FLASH_OPTPG;                          // Option Byte Programming Enabled

    M16(adr) = *((u16 *)buf);                           // Program Half Word
    while (FLASH->SR & FLASH_BSY) {
      IWDG->KR = 0xAAAA;                                // Reload IWDG
    }

    FLASH->CR &= ~FLASH_OPTPG;                          // Option Byte Programming Disabled

    if (FLASH->SR & FLASH_ERR) {                        // Check for Errors
      FLASH->SR |= FLASH_ERR;
      return (1);                                       // Failed
    }

    adr += 2;                                           // Go to next Half Word
    buf += 2;
    sz  -= 2;
  }

  return (0);                                           // Done
}
예제 #4
0
int EraseChip (void) {

  FLASH->SR  |= FLASH_ERR;                              // Reset Error Flags

  FLASH->CR |=  FLASH_OPTER;                            // Option Byte Erase Enabled 
  FLASH->CR |=  FLASH_STRT;                             // Start Erase

  while (FLASH->SR & FLASH_BSY) {
    IWDG->KR = 0xAAAA;                                  // Reload IWDG
  }

  FLASH->CR &= ~FLASH_OPTER;                            // Option Byte Erase Disabled 

  // Unprotect Flash
  FLASH->CR |=  FLASH_OPTPG;                            // Option Byte Programming Enabled

  M16(0x1FFFF800) = RDPRT_KEY;                          // Program Half Word: RDPRT Key
  while (FLASH->SR & FLASH_BSY) {
    IWDG->KR = 0xAAAA;                                  // Reload IWDG
  }

  FLASH->CR &= ~FLASH_OPTPG;                            // Option Byte Programming Disabled
  
  if (FLASH->SR & FLASH_ERR) {                          // Check for Errors
    FLASH->SR |= FLASH_ERR;
    return (1);                                         // Failed
  }

  return (0);                                           // Done
}
예제 #5
0
파일: Code.cpp 프로젝트: trieck/pixievm
void code2(int mode, LPSYMBOL s1, LPSYMBOL s2)
{
	switch (mode) {
	case AM_R8:
		R8(s1->instr, s2->val8);
		break;
	case AM_R16:
		R16(s1->instr, s2->val8);
		break;
	case AM_M8:
		M8(s1->instr, s2->val8);
		break;
	case AM_M16:
		M16(s1->instr, s2->val8);
		break;
	case AM_A8:
		A8(s1->instr, s2->val16);
		break;
	case AM_A16:
		A16(s1->instr, s2->val16);
		break;
	case AM_I16:
		I16(s1->instr, s2->val16);
		break;
	case AM_I8:
		I8(s1->instr, s2->val8);
		break;
	default:
		break;
	}
}
예제 #6
0
static	void cvtSM1616K(const unsigned char* src, int ns, unsigned char* dst)
{
    TRACE("(%p, %d, %p)\n", src, ns, dst);

    while (ns--) {
	W16(dst, M16(R16(src),R16(src+2)));	dst += 2;
	src += 4;
    }
}
예제 #7
0
static	void cvtSM168K(const unsigned char* src, int ns, unsigned char* dst)
{
    TRACE("(%p, %d, %p)\n", src, ns, dst);

    while (ns--) {
	*dst++ = C168(M16(R16(src), R16(src + 2)));
	src += 4;
    }
}
예제 #8
0
static	void cvtSM816K(const unsigned char* src, int ns, unsigned char* dst)
{
    short	v;
    TRACE("(%p, %d, %p)\n", src, ns, dst);

    while (ns--) {
	v = M16(C816(src[0]), C816(src[1]));
	src += 2;
	W16(dst, v);		dst += 2;
    }
}
예제 #9
0
static	void cvtSM1616C(DWORD srcRate, const unsigned char* src, LPDWORD nsrc,
			DWORD dstRate, unsigned char* dst, LPDWORD ndst)
{
    DWORD error = dstRate / 2;
    TRACE("(%d, %p, %p, %d, %p, %p)\n", srcRate, src, nsrc, dstRate, dst, ndst);

    while ((*ndst)--) {
        W16(dst, M16(R16(src), R16(src + 2))); dst += 2;
        error = error + srcRate;
        while (error > dstRate) {
            src += 4;
            (*nsrc)--;
            if (*nsrc == 0)
                return;
            error = error - dstRate;
        }
    }
}
예제 #10
0
int fs_EraseSector (U32 adr)  {
   U32 fsreg;

   M16(base_adr | 0xAAA) = 0xAA;
   M16(base_adr | 0x554) = 0x55;
   M16(base_adr | 0xAAA) = ERASE;
   M16(base_adr | 0xAAA) = 0xAA;
   M16(base_adr | 0x554) = 0x55;
   M16(adr) = ERA_SECT;

   /* Wait for Sector Erase Timeout. */
   do {
      fsreg = M16(adr);
   } while ((fsreg & DQ3) < DQ3);

   /* Wait until Erase Completed */
   return (Q6Polling (adr));
} /* end of fs_EraseSector */