STM32 FLASH changes from Freddie Chopin

git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@5473 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
patacongo
2013-01-03 13:39:16 +00:00
parent 9388f4510a
commit b25e932ef5
+23 -14
View File
@@ -35,7 +35,7 @@
/* Provides standard flash access functions, to be used by the flash mtd driver. /* Provides standard flash access functions, to be used by the flash mtd driver.
* The interface is defined in the include/nuttx/progmem.h * The interface is defined in the include/nuttx/progmem.h
* *
* Requirements during write/erase operations on FLASH: * Requirements during write/erase operations on FLASH:
* - HSI must be ON. * - HSI must be ON.
* - Low Power Modes are not permitted during write/erase * - Low Power Modes are not permitted during write/erase
@@ -80,7 +80,7 @@ void stm32_flash_unlock(void)
if (getreg32(STM32_FLASH_CR) & FLASH_CR_LOCK) if (getreg32(STM32_FLASH_CR) & FLASH_CR_LOCK)
{ {
/* Unlock sequence */ /* Unlock sequence */
putreg32(FLASH_KEY1, STM32_FLASH_KEYR); putreg32(FLASH_KEY1, STM32_FLASH_KEYR);
putreg32(FLASH_KEY2, STM32_FLASH_KEYR); putreg32(FLASH_KEY2, STM32_FLASH_KEYR);
} }
@@ -112,6 +112,11 @@ uint16_t up_progmem_pagesize(uint16_t page)
int up_progmem_getpage(uint32_t addr) int up_progmem_getpage(uint32_t addr)
{ {
if (addr >= STM32_FLASH_BASE)
{
addr -= STM32_FLASH_BASE;
}
if (addr >= STM32_FLASH_SIZE) if (addr >= STM32_FLASH_SIZE)
{ {
return -EFAULT; return -EFAULT;
@@ -131,14 +136,14 @@ int up_progmem_erasepage(uint16_t page)
} }
/* Get flash ready and begin erasing single page */ /* Get flash ready and begin erasing single page */
if (!(getreg32(STM32_RCC_CR) & RCC_CR_HSION)) if (!(getreg32(STM32_RCC_CR) & RCC_CR_HSION))
{ {
return -EPERM; return -EPERM;
} }
stm32_flash_unlock(); stm32_flash_unlock();
modifyreg32(STM32_FLASH_CR, 0, FLASH_CR_PER); modifyreg32(STM32_FLASH_CR, 0, FLASH_CR_PER);
putreg32(page * STM32_FLASH_PAGESIZE, STM32_FLASH_AR); putreg32(page * STM32_FLASH_PAGESIZE, STM32_FLASH_AR);
modifyreg32(STM32_FLASH_CR, 0, FLASH_CR_STRT); modifyreg32(STM32_FLASH_CR, 0, FLASH_CR_STRT);
@@ -146,10 +151,10 @@ int up_progmem_erasepage(uint16_t page)
while(getreg32(STM32_FLASH_SR) & FLASH_SR_BSY) up_waste(); while(getreg32(STM32_FLASH_SR) & FLASH_SR_BSY) up_waste();
modifyreg32(STM32_FLASH_CR, FLASH_CR_PER, 0); modifyreg32(STM32_FLASH_CR, FLASH_CR_PER, 0);
/* Verify */ /* Verify */
for (addr = page * STM32_FLASH_PAGESIZE + STM32_FLASH_BASE, count = STM32_FLASH_PAGESIZE; for (addr = page * STM32_FLASH_PAGESIZE + STM32_FLASH_BASE, count = STM32_FLASH_PAGESIZE;
count; count-=4, addr += 4) count; count-=4, addr += 4)
{ {
if (getreg32(addr) != 0xffffffff) if (getreg32(addr) != 0xffffffff)
@@ -173,8 +178,8 @@ int up_progmem_ispageerased(uint16_t page)
} }
/* Verify */ /* Verify */
for (addr = page * STM32_FLASH_PAGESIZE + STM32_FLASH_BASE, count = STM32_FLASH_PAGESIZE; for (addr = page * STM32_FLASH_PAGESIZE + STM32_FLASH_BASE, count = STM32_FLASH_PAGESIZE;
count; count--, addr++) count; count--, addr++)
{ {
if (getreg8(addr) != 0xff) if (getreg8(addr) != 0xff)
@@ -200,6 +205,11 @@ int up_progmem_write(uint32_t addr, const void *buf, size_t count)
/* Check for valid address range */ /* Check for valid address range */
if (addr >= STM32_FLASH_BASE)
{
addr -= STM32_FLASH_BASE;
}
if ((addr+count) >= STM32_FLASH_SIZE) if ((addr+count) >= STM32_FLASH_SIZE)
{ {
return -EFAULT; return -EFAULT;
@@ -213,10 +223,10 @@ int up_progmem_write(uint32_t addr, const void *buf, size_t count)
} }
stm32_flash_unlock(); stm32_flash_unlock();
modifyreg32(STM32_FLASH_CR, 0, FLASH_CR_PG); modifyreg32(STM32_FLASH_CR, 0, FLASH_CR_PG);
for (addr += STM32_FLASH_BASE; count; count--, hword++, addr+=2) for (addr += STM32_FLASH_BASE; count; count-=2, hword++, addr+=2)
{ {
/* Write half-word and wait to complete */ /* Write half-word and wait to complete */
@@ -237,7 +247,6 @@ int up_progmem_write(uint32_t addr, const void *buf, size_t count)
modifyreg32(STM32_FLASH_CR, FLASH_CR_PG, 0); modifyreg32(STM32_FLASH_CR, FLASH_CR_PG, 0);
return -EIO; return -EIO;
} }
} }
modifyreg32(STM32_FLASH_CR, FLASH_CR_PG, 0); modifyreg32(STM32_FLASH_CR, FLASH_CR_PG, 0);