[Tinyos-beta-commits] CVS: tinyos-1.x/beta/platform/imote2 FlashM.nc, 1.9, 1.10

Josh jsherbach at users.sourceforge.net
Fri Sep 2 14:39:27 PDT 2005


Update of /cvsroot/tinyos/tinyos-1.x/beta/platform/imote2
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv30009

Modified Files:
	FlashM.nc 
Log Message:
fin

Index: FlashM.nc
===================================================================
RCS file: /cvsroot/tinyos/tinyos-1.x/beta/platform/imote2/FlashM.nc,v
retrieving revision 1.9
retrieving revision 1.10
diff -C2 -d -r1.9 -r1.10
*** FlashM.nc	2 Sep 2005 18:00:31 -0000	1.9
--- FlashM.nc	2 Sep 2005 21:39:25 -0000	1.10
***************
*** 18,29 ****
    uint16_t writeHelper(uint32_t addr, uint8_t* data, uint32_t numBytes,
  		       uint8_t prebyte, uint8_t postbyte);
!   
    
    uint8_t FlashPartitionState[FLASH_PARTITION_COUNT];
    uint8_t init = 0, programBufferSupported = 2, currBlock = 0;
! 
!   extern void __Flash_Erase() __attribute__ ((C,spontaneous));
!   extern void __Flash_Program_Word() __attribute__ ((C,spontaneous));
!   extern void __Flash_Program_Buffer() __attribute__ ((C,spontaneous));
    extern uint32_t __Flash_Erase_true_end __attribute__ ((C));
    extern uint32_t __Flash_Program_Word_true_end __attribute__ ((C));
--- 18,28 ----
    uint16_t writeHelper(uint32_t addr, uint8_t* data, uint32_t numBytes,
  		       uint8_t prebyte, uint8_t postbyte);
!   void writeExitHelper(uint32_t addr, uint32_t numBytes);
    
    uint8_t FlashPartitionState[FLASH_PARTITION_COUNT];
    uint8_t init = 0, programBufferSupported = 2, currBlock = 0;
!   extern uint8_t __Flash_Erase(uint32_t addr) __attribute__ ((C,spontaneous,noinline));
!   extern uint8_t __Flash_Program_Word(uint32_t addr, uint16_t word) __attribute__ ((C,spontaneous,noinline));
!   extern uint8_t __Flash_Program_Buffer(uint32_t addr, uint16_t *data, uint8_t datalen) __attribute__ ((C,spontaneous,noinline));
    extern uint32_t __Flash_Erase_true_end __attribute__ ((C));
    extern uint32_t __Flash_Program_Word_true_end __attribute__ ((C));
***************
*** 74,83 ****
      
      if(addr % 2 == 1){
!       status = programWord(addr - 1, prebyte | (data[i] << 8));
        i++;
        if(status != 0x80)
  	return FAIL;
      }
! 
      if(addr % 2 == numBytes % 2){
        if(programBufferSupported == 1)
--- 73,82 ----
      
      if(addr % 2 == 1){
!       status = __Flash_Program_Word(addr - 1, prebyte | (data[i] << 8));
        i++;
        if(status != 0x80)
  	return FAIL;
      }
!     
      if(addr % 2 == numBytes % 2){
        if(programBufferSupported == 1)
***************
*** 86,90 ****
  		j < FLASH_PROGRAM_BUFFER_SIZE; j++, k+=2)
  	    buffer[j] = data[k] | (data[k + 1] << 8);
! 	  status = programBuffer(addr + i, buffer, j);
  	  if(status != 0x80)
  	    return FAIL;
--- 85,89 ----
  		j < FLASH_PROGRAM_BUFFER_SIZE; j++, k+=2)
  	    buffer[j] = data[k] | (data[k + 1] << 8);
! 	  status = __Flash_Program_Buffer(addr + i, buffer, j - 1);
  	  if(status != 0x80)
  	    return FAIL;
***************
*** 92,96 ****
        else
  	for(; i < numBytes; i+=2){
! 	  status = programWord(addr + i, (data[i + 1] << 8) | data[i]);
  	  if(status != 0x80)
  	    return FAIL;
--- 91,95 ----
        else
  	for(; i < numBytes; i+=2){
! 	  status = __Flash_Program_Word(addr + i, (data[i + 1] << 8) | data[i]);
  	  if(status != 0x80)
  	    return FAIL;
***************
*** 103,107 ****
  		j < FLASH_PROGRAM_BUFFER_SIZE; j++, k+=2)
  	    buffer[j] = data[k] | (data[k + 1] << 8);
! 	  status = programBuffer(addr + i, buffer, j);
  	  if(status != 0x80)
  	    return FAIL;
--- 102,106 ----
  		j < FLASH_PROGRAM_BUFFER_SIZE; j++, k+=2)
  	    buffer[j] = data[k] | (data[k + 1] << 8);
! 	  status = __Flash_Program_Buffer(addr + i, buffer, j - 1);
  	  if(status != 0x80)
  	    return FAIL;
***************
*** 109,117 ****
        else
  	for(; i < numBytes - 1; i+=2){
! 	  status = programWord(addr + i, (data[i + 1] << 8) | data[i]);
  	  if(status != 0x80)
  	    return FAIL;
  	}
!       status = programWord(addr + i, data[i] | (postbyte << 8));
        if(status != 0x80)
  	return FAIL;
--- 108,116 ----
        else
  	for(; i < numBytes - 1; i+=2){
! 	  status = __Flash_Program_Word(addr + i, (data[i + 1] << 8) | data[i]);
  	  if(status != 0x80)
  	    return FAIL;
  	}
!       status = __Flash_Program_Word(addr + i, data[i] | (postbyte << 8));
        if(status != 0x80)
  	return FAIL;
***************
*** 120,123 ****
--- 119,130 ----
    }
    
+   void writeExitHelper(uint32_t addr, uint32_t numBytes){
+     uint32_t i = 0;
+     for(i = addr / FLASH_PARTITION_SIZE;
+ 	i < (numBytes + addr) / FLASH_PARTITION_SIZE;
+ 	i++)
+       FlashPartitionState[i] = FLASH_STATE_READ_INACTIVE;
+   }
+   
    command result_t Flash.write(uint32_t addr, uint8_t* data, uint32_t numBytes){
      uint32_t i;
***************
*** 130,134 ****
      if(addr < FLASH_PROTECTED_REGION)
        return FAIL;
! 
      
      for(i = 0; i < FLASH_PARTITION_COUNT; i++)
--- 137,141 ----
      if(addr < FLASH_PROTECTED_REGION)
        return FAIL;
!     
      
      for(i = 0; i < FLASH_PARTITION_COUNT; i++)
***************
*** 160,168 ****
  	if(addr % 2 == 0){
  	  testBuf[0] = data[0] | ((*((uint8_t *)(addr + 1))) << 8);
! 	  status = programBuffer(addr, testBuf, 1);
  	}
  	else{
  	  testBuf[0] = *((uint8_t *)(addr - 1)) | (data[0] << 8);
! 	  status = programBuffer(addr - 1, testBuf, 1);
  	}      
  	if(status == FLASH_NOT_SUPPORTED)
--- 167,175 ----
  	if(addr % 2 == 0){
  	  testBuf[0] = data[0] | ((*((uint8_t *)(addr + 1))) << 8);
! 	  status = __Flash_Program_Buffer(addr, testBuf, 1 - 1);
  	}
  	else{
  	  testBuf[0] = *((uint8_t *)(addr - 1)) | (data[0] << 8);
! 	  status = __Flash_Program_Buffer(addr - 1, testBuf, 1 - 1);
  	}      
  	if(status == FLASH_NOT_SUPPORTED)
***************
*** 170,208 ****
  	else 
  	  programBufferSupported = 1;
- 	//	programBufferSupported = 0;
        }
!     
!       if(blocklen == 1){
! 	status = writeHelper(addr,data,numBytes,0xFF,0xFF);
! 	if(status != 0x80)
! 	  return FAIL;
        }
!       else{
! 	uint32_t bytesLeft = numBytes;
! 	status = writeHelper(addr,data, blockAddr + FLASH_BLOCK_SIZE - addr,0xFF,0xFF);
! 	if(status != 0x80)
  	  return FAIL;
- 	bytesLeft = numBytes - (FLASH_BLOCK_SIZE - (addr - blockAddr));
- 	for(i = 1; i < blocklen - 1; i++){
- 	  status = writeHelper(blockAddr + i * FLASH_BLOCK_SIZE,
- 			       (uint8_t *)(data + numBytes - bytesLeft),
- 			       FLASH_BLOCK_SIZE,0xFF,0xFF);
- 	  
- 	  bytesLeft -= FLASH_BLOCK_SIZE;
- 	  if(status != 0x80)
- 	    return FAIL;
  	}
! 	status = writeHelper(blockAddr + i * FLASH_BLOCK_SIZE,
! 			     data + (numBytes - bytesLeft), bytesLeft, 
! 			     0xFF,0xFF);
! 	if(status != 0x80)
! 	  return FAIL;
        }
      }
-     for(i = addr / FLASH_PARTITION_SIZE;
- 	i < (numBytes + addr) / FLASH_PARTITION_SIZE;
- 	i++)
-       FlashPartitionState[i] = FLASH_STATE_READ_INACTIVE;
      
      return SUCCESS;
    }
--- 177,214 ----
  	else 
  	  programBufferSupported = 1;
        }
!     }
!     if(blocklen == 1){
!       atomic status = writeHelper(addr,data,numBytes,0xFF,0xFF);
!       if(status == FAIL){
! 	writeExitHelper(addr, numBytes);
! 	return FAIL;
        }
!     }
!     else{
!       uint32_t bytesLeft = numBytes;
!       atomic status = writeHelper(addr,data, blockAddr + FLASH_BLOCK_SIZE - addr,0xFF,0xFF);
!       if(status == FAIL){
! 	writeExitHelper(addr, numBytes);
! 	return FAIL;
!       }
!       bytesLeft = numBytes - (FLASH_BLOCK_SIZE - (addr - blockAddr));
!       for(i = 1; i < blocklen - 1; i++){
! 	atomic status = writeHelper(blockAddr + i * FLASH_BLOCK_SIZE, (uint8_t *)(data + numBytes - bytesLeft),
! 				    FLASH_BLOCK_SIZE,0xFF,0xFF);
! 	bytesLeft -= FLASH_BLOCK_SIZE;
! 	if(status == FAIL){
! 	  writeExitHelper(addr, numBytes);
  	  return FAIL;
  	}
!       }
!       atomic status = writeHelper(blockAddr + i * FLASH_BLOCK_SIZE, data + (numBytes - bytesLeft), bytesLeft, 0xFF,0xFF);
!       if(status == FAIL){
! 	writeExitHelper(addr, numBytes);
! 	return FAIL;
        }
      }
      
+     writeExitHelper(addr, numBytes);
      return SUCCESS;
    }
***************
*** 218,222 ****
      
      addr = (addr / FLASH_BLOCK_SIZE) * FLASH_BLOCK_SIZE;
! 
      for(i = 0; i < FLASH_PARTITION_COUNT; i++)
        if(i != addr / FLASH_PARTITION_SIZE &&
--- 224,228 ----
      
      addr = (addr / FLASH_BLOCK_SIZE) * FLASH_BLOCK_SIZE;
!     
      for(i = 0; i < FLASH_PARTITION_COUNT; i++)
        if(i != addr / FLASH_PARTITION_SIZE &&
***************
*** 234,243 ****
        if(tempCheck != 0xFFFFFFFF)
  	break;
!       if(j == FLASH_BLOCK_SIZE - 1)
  	return SUCCESS;
      }
      atomic{
        unlock(addr);
!       status = eraseFlash(addr);
      }
      FlashPartitionState[addr / FLASH_PARTITION_SIZE] = FLASH_STATE_READ_INACTIVE;
--- 240,252 ----
        if(tempCheck != 0xFFFFFFFF)
  	break;
!       if(j == FLASH_BLOCK_SIZE - 1){
! 	FlashPartitionState[addr / FLASH_PARTITION_SIZE] = FLASH_STATE_READ_INACTIVE;
  	return SUCCESS;
+       }
      }
      atomic{
        unlock(addr);
!       //      status = eraseFlash(addr);
!       status = __Flash_Erase(addr);
      }
      FlashPartitionState[addr / FLASH_PARTITION_SIZE] = FLASH_STATE_READ_INACTIVE;
***************
*** 247,251 ****
      return SUCCESS;
    }
! 
    uint16_t unlock(uint32_t addr)  __attribute__((noinline)){
      //addr <<= 1;
--- 256,260 ----
      return SUCCESS;
    }
!   
    uint16_t unlock(uint32_t addr)  __attribute__((noinline)){
      //addr <<= 1;
***************
*** 297,320 ****
      return SUCCESS;
    }
! 
    uint16_t programBuffer(uint32_t addr, uint16_t data[], uint8_t datalen)   __attribute__((noinline)){
      uint16_t status;
      /*    uint32_t programBufferCommands[40];/* even though there are only 33 lines
! 					 * of assembly by my count it seems
! 					 * to work better if I allocate / allow
! 					 * for more lines...no clue but this
! 					 * is an issue*/
! 
      //    memcpy(programBufferCommands,__Flash_Program_Buffer,40 * 4);
      
      datalen -= 1;
      asm volatile("mov r1, %1;                 \
!                  mov r2, %2;		      \
                   mov r3, %3;		      \		 
! 		 bl __Flash_Program_Buffer;   \
  		 mov %0, r0;"		 
  		 /*mov r14, PC;		      \
! 		 mov PC, %4;		      \
! 		 mov %0, r0;"*/
  		 :"=r"(status)
  		 :"r"(addr), "r"(data),"r"(datalen)//, "r"(programBufferCommands)
--- 306,328 ----
      return SUCCESS;
    }
!   
    uint16_t programBuffer(uint32_t addr, uint16_t data[], uint8_t datalen)   __attribute__((noinline)){
      uint16_t status;
      /*    uint32_t programBufferCommands[40];/* even though there are only 33 lines
!      * of assembly by my count it seems
!      * to work better if I allocate / allow
!      * for more lines...no clue but this
!      * is an issue*/
      //    memcpy(programBufferCommands,__Flash_Program_Buffer,40 * 4);
      
      datalen -= 1;
      asm volatile("mov r1, %1;                 \
!                  mov r2, %2;			\
                   mov r3, %3;		      \		 
! 		 bl __Flash_Program_Buffer;	\
  		 mov %0, r0;"		 
  		 /*mov r14, PC;		      \
! 		   mov PC, %4;		      \
! 		   mov %0, r0;"*/
  		 :"=r"(status)
  		 :"r"(addr), "r"(data),"r"(datalen)//, "r"(programBufferCommands)
***************
*** 326,335 ****
      uint16_t status;
      /*    uint32_t *binary, *temp;
!     uint32_t binSize = (uint32_t)&__Flash_Program_Word_true_end;
!     binSize -= (uint32_t)__Flash_Program_Word;
!     binary = (uint32_t *)malloc(binSize + 4);
!     temp = (uint32_t *)((uint32_t)binary + 4 - ((uint32_t)binary & 0x3));
!     memcpy(temp,__Flash_Program_Word, binSize);*/
!       
      asm volatile(
  		 "mov r1, %1;                   \
--- 334,343 ----
      uint16_t status;
      /*    uint32_t *binary, *temp;
! 	  uint32_t binSize = (uint32_t)&__Flash_Program_Word_true_end;
! 	  binSize -= (uint32_t)__Flash_Program_Word;
! 	  binary = (uint32_t *)malloc(binSize + 4);
! 	  temp = (uint32_t *)((uint32_t)binary + 4 - ((uint32_t)binary & 0x3));
! 	  memcpy(temp,__Flash_Program_Word, binSize);*/
!     
      asm volatile(
  		 "mov r1, %1;                   \
***************
*** 357,361 ****
  	  temp = (uint32_t *)((uint32_t)binary + 4 - ((uint32_t)binary & 0x3));
  	  memcpy(temp,__Flash_Erase, binSize);*/
!       
      asm volatile(
  		 "mov r1, %1;                   \
--- 365,369 ----
  	  temp = (uint32_t *)((uint32_t)binary + 4 - ((uint32_t)binary & 0x3));
  	  memcpy(temp,__Flash_Erase, binSize);*/
!     
      asm volatile(
  		 "mov r1, %1;                   \
***************
*** 363,370 ****
                   mov %0, r0;"
  		 /*                
!                  mov r2, %2;                    \
! 		 mov r14, PC;			\
! 		 mov PC, r2;			\
! 		 mov %0, r0;"*/
  		 :"=r"(status)
  		 :"r"(addr)//, "r"(temp)
--- 371,378 ----
                   mov %0, r0;"
  		 /*                
! 				   mov r2, %2;	\
! 				   mov r14, PC;	\
! 				   mov PC, r2;	\
! 				   mov %0, r0;"*/
  		 :"=r"(status)
  		 :"r"(addr)//, "r"(temp)



More information about the Tinyos-beta-commits mailing list