SAMV7 progmem: Debug fixes from intial testing

This commit is contained in:
Gregory Nutt
2015-11-13 09:18:26 -06:00
parent 4ecf9b5bec
commit a1e9a07c7a
+50 -30
View File
@@ -79,12 +79,6 @@
# error FLASH geometry for this SAMV7 chip not known # error FLASH geometry for this SAMV7 chip not known
#endif #endif
/* Start address */
#define SAMV7_PROGMEM_NBYTES (CONFIG_SAMV7_PROGMEM_NSECTORS << SAMV7_SECTOR_SHIFT)
#define SAMV7_PROGMEM_END (SAM_INTFLASH_BASE + SAMV7_FLASH_SIZE)
#define SAMV7_PROGMEM_START (SAMV7_PROGMEM_END - SAMV7_PROGMEM_NBYTES)
/* Sizes and masks */ /* Sizes and masks */
#define SAMV7_SECTOR_SIZE (1 << SAMV7_SECTOR_SHIFT) #define SAMV7_SECTOR_SIZE (1 << SAMV7_SECTOR_SHIFT)
@@ -131,11 +125,29 @@
#define SAMV7_LOCK_REGION_SIZE (1 << SAMV7_LOCK_REGION_SHIFT) #define SAMV7_LOCK_REGION_SIZE (1 << SAMV7_LOCK_REGION_SHIFT)
#define SAMV7_LOCK_REGION_MASK (SAMV7_LOCK_REGION_SIZE - 1) #define SAMV7_LOCK_REGION_MASK (SAMV7_LOCK_REGION_SIZE - 1)
/* Sizes of the programmable region */ /* Total FLASH sizes */
#define SAMV7_NSECTORS (CONFIG_SAMV7_PROGMEM_NSECTORS) #define SAMV7_TOTAL_NSECTORS (SAMV7_FLASH_SIZE >> SAMV7_SECTOR_SHIFT)
#define SAMV7_NPAGES SAMV7_SEC2PAGE(CONFIG_SAMV7_PROGMEM_NSECTORS) #define SAMV7_TOTAL_NPAGES SAMV7_SEC2PAGE(SAMV7_TOTAL_NSECTORS)
#define SAMV7_NCLUSTERS SAMV7_SEC2CLUST(CONFIG_SAMV7_PROGMEM_NSECTORS) #define SAMV7_TOTAL_NCLUSTERS SAMV7_SEC2CLUST(SAMV7_TOTAL_NSECTORS)
/* Start and size of the programmable region */
#define SAMV7_PROGMEM_NBYTES (CONFIG_SAMV7_PROGMEM_NSECTORS << SAMV7_SECTOR_SHIFT)
#define SAMV7_PROGMEM_END (SAM_INTFLASH_BASE + SAMV7_FLASH_SIZE)
#define SAMV7_PROGMEM_START (SAMV7_PROGMEM_END - SAMV7_PROGMEM_NBYTES)
#define SAMV7_PROGMEM_NPAGES SAMV7_SEC2PAGE(CONFIG_SAMV7_PROGMEM_NSECTORS)
#define SAMV7_PROGMEM_ENDPAGE (SAMV7_TOTAL_NPAGES)
#define SAMV7_PROGMEM_STARTPAGE (SAMV7_PROGMEM_ENDPAGE - SAMV7_PROGMEM_NPAGES)
#define SAMV7_PROGMEM_NCLUSTERS SAMV7_SEC2CLUST(CONFIG_SAMV7_PROGMEM_NSECTORS)
#define SAMV7_PROGMEM_ENDCLUST (SAMV7_TOTAL_NCLUSTERS)
#define SAMV7_PROGMEM_STARTCLUST (SAMV7_PROGMEM_ENDCLUST - SAMV7_PROGMEM_NCLUSTERS)
#define SAMV7_PROGMEM_NSECTORS (CONFIG_SAMV7_PROGMEM_NSECTORS)
#define SAMV7_PROGMEM_ENDSEC (SAMV7_TOTAL_NSECTORS)
#define SAMV7_PROGMEM_STARTSEC (SAMV7_PROGMEM_ENDSEC - CONFIG_SAMV7_PROGMEM_NSECTORS)
/* Misc stuff */ /* Misc stuff */
@@ -159,7 +171,7 @@ static sem_t g_page_sem;
****************************************************************************/ ****************************************************************************/
/**************************************************************************** /****************************************************************************
* Name: page_lock * Name: page_buffer_lock
* *
* Description: * Description:
* Get exclusive access to the global page buffer * Get exclusive access to the global page buffer
@@ -172,7 +184,7 @@ static sem_t g_page_sem;
* *
****************************************************************************/ ****************************************************************************/
static void page_lock(void) static void page_buffer_lock(void)
{ {
while (sem_wait(&g_page_sem) < 0) while (sem_wait(&g_page_sem) < 0)
{ {
@@ -188,7 +200,7 @@ static void page_lock(void)
} }
} }
#define page_unlock() sem_post(&g_page_sem) #define page_buffer_unlock() sem_post(&g_page_sem)
/**************************************************************************** /****************************************************************************
* Name: efc_command * Name: efc_command
@@ -364,7 +376,7 @@ void sam_progmem_initialize(void)
size_t up_progmem_npages(void) size_t up_progmem_npages(void)
{ {
return SAMV7_NCLUSTERS; return SAMV7_PROGMEM_NCLUSTERS;
} }
/**************************************************************************** /****************************************************************************
@@ -442,7 +454,7 @@ ssize_t up_progmem_getpage(size_t address)
size_t up_progmem_getaddress(size_t cluster) size_t up_progmem_getaddress(size_t cluster)
{ {
if (cluster >= SAMV7_NCLUSTERS) if (cluster >= SAMV7_PROGMEM_NCLUSTERS)
{ {
return SAMV7_PROGMEM_NBYTES; return SAMV7_PROGMEM_NBYTES;
} }
@@ -479,14 +491,14 @@ ssize_t up_progmem_erasepage(size_t cluster)
uint32_t arg; uint32_t arg;
int ret; int ret;
if (cluster >= SAMV7_NCLUSTERS) if (cluster >= SAMV7_PROGMEM_NCLUSTERS)
{ {
return -EFAULT; return -EFAULT;
} }
/* Get the page number of the start of the cluster */ /* Get the page number of the start of the cluster */
page = SAMV7_CLUST2PAGE((uint32_t)cluster); page = SAMV7_CLUST2PAGE((uint32_t)cluster) + SAMV7_PROGMEM_STARTPAGE;
/* Erase all pages in the cluster */ /* Erase all pages in the cluster */
@@ -503,15 +515,15 @@ ssize_t up_progmem_erasepage(size_t cluster)
*/ */
#if SAMV7_PAGE_PER_CLUSTER == 32 #if SAMV7_PAGE_PER_CLUSTER == 32
arg = (page << 2) | 3; /* Not valid for small 8 KB sectors */ arg = page | 3; /* Not valid for small 8 KB sectors */
#elif SAMV7_PAGE_PER_CLUSTER == 16 #elif SAMV7_PAGE_PER_CLUSTER == 16
arg = (page << 2) | 2; arg = page | 2;
#elif SAMV7_PAGE_PER_CLUSTER == 8 #elif SAMV7_PAGE_PER_CLUSTER == 8
# error Cluster size of 8 not suportted # error Cluster size of 8 not suportted
arg = (page << 2) | 1; /* 0nly valid for small 8 KB sectors */ arg = page | 1; /* 0nly valid for small 8 KB sectors */
#elif SAMV7_PAGE_PER_CLUSTER == 4 #elif SAMV7_PAGE_PER_CLUSTER == 4
# error Cluster size of 4 not suportted # error Cluster size of 4 not suportted
arg = (page << 2) | 0; /* 0nly valid for small 8 KB sectors */ arg = page | 0; /* 0nly valid for small 8 KB sectors */
#else #else
# error Unsupported/undefined pages-per-cluster size # error Unsupported/undefined pages-per-cluster size
#endif #endif
@@ -563,7 +575,7 @@ ssize_t up_progmem_ispageerased(size_t cluster)
size_t nwritten; size_t nwritten;
int nleft; int nleft;
if (cluster >= SAMV7_NCLUSTERS) if (cluster >= SAMV7_PROGMEM_NCLUSTERS)
{ {
return -EFAULT; return -EFAULT;
} }
@@ -625,7 +637,7 @@ ssize_t up_progmem_write(size_t address, const void *buffer, size_t buflen)
size_t i; size_t i;
int ret; int ret;
/* Convert the address into a FLASH offset, if necessary */ /* Convert the address into a FLASH byte offset, if necessary */
offset = address; offset = address;
if (address >= SAMV7_PROGMEM_START) if (address >= SAMV7_PROGMEM_START)
@@ -648,12 +660,12 @@ ssize_t up_progmem_write(size_t address, const void *buffer, size_t buflen)
* offset into the page. * offset into the page.
*/ */
page = offset >> SAMV7_PAGE_SHIFT; page = SAMV7_BYTE2PAGE((uint32_t)offset) + SAMV7_PROGMEM_STARTPAGE;
offset &= SAMV7_PAGE_MASK; offset &= SAMV7_PAGE_MASK;
/* Get exclusive access to the global page buffer */ /* Get exclusive access to the global page buffer */
page_lock(); page_buffer_lock();
/* Make sure that the FLASH is unlocked */ /* Make sure that the FLASH is unlocked */
@@ -682,11 +694,19 @@ ssize_t up_progmem_write(size_t address, const void *buffer, size_t buflen)
{ {
/* Yes, copy data into global page buffer */ /* Yes, copy data into global page buffer */
memcpy(g_page_buffer, dest, offset); if (offset > 0)
{
memcpy(g_page_buffer, dest, offset);
}
memcpy((uint8_t *)g_page_buffer + offset, buffer, xfrsize); memcpy((uint8_t *)g_page_buffer + offset, buffer, xfrsize);
memcpy((uint8_t *)g_page_buffer + offset + xfrsize,
(const uint8_t *)dest + offset + xfrsize, if (offset + xfrsize < SAMV7_PAGE_SIZE)
SAMV7_PAGE_SIZE - offset - xfrsize); {
memcpy((uint8_t *)g_page_buffer + offset + xfrsize,
(const uint8_t *)dest + offset + xfrsize,
SAMV7_PAGE_SIZE - offset - xfrsize);
}
src = g_page_buffer; src = g_page_buffer;
} }
@@ -720,6 +740,6 @@ ssize_t up_progmem_write(size_t address, const void *buffer, size_t buflen)
page++; page++;
} }
page_unlock(); page_buffer_unlock();
return written; return written;
} }