[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