/**
 * Formats a single scratch area.
 */
int
nffs_format_area(uint8_t area_idx, int is_scratch)
{
    struct nffs_disk_area disk_area;
    struct nffs_area *area;
    uint32_t write_len;
    int rc;

    area = nffs_areas + area_idx;

    rc = hal_flash_erase(area->na_flash_id, area->na_offset, area->na_length);
    if (rc != 0) {
        return rc;
    }
    area->na_cur = 0;

    nffs_area_to_disk(area, &disk_area);

    if (is_scratch) {
        nffs_areas[area_idx].na_id = NFFS_AREA_ID_NONE;
        write_len = sizeof disk_area - sizeof disk_area.nda_id;
    } else {
        write_len = sizeof disk_area;
    }

    rc = nffs_flash_write(area_idx, 0, &disk_area.nda_magic, write_len);
    if (rc != 0) {
        return rc;
    }

    return 0;
}
Exemplo n.º 2
0
static void
boot_test_util_init_flash(void)
{
    const struct nffs_area_desc *area_desc;
    int rc;

    rc = hal_flash_init();
    TEST_ASSERT(rc == 0);

    for (area_desc = boot_test_area_descs;
         area_desc->nad_length != 0;
         area_desc++) {

        rc = hal_flash_erase(area_desc->nad_flash_id, area_desc->nad_offset,
                             area_desc->nad_length);
        TEST_ASSERT(rc == 0);
    }

    rc = nffs_init();
    TEST_ASSERT(rc == 0);

    rc = nffs_format(boot_test_format_descs);
    TEST_ASSERT(rc == 0);

    rc = fs_mkdir("/boot");
    TEST_ASSERT(rc == 0);
}
Exemplo n.º 3
0
static void
boot_test_util_copy_area(int from_area_idx, int to_area_idx)
{
    const struct nffs_area_desc *from_area_desc;
    const struct nffs_area_desc *to_area_desc;
    void *buf;
    int rc;

    from_area_desc = boot_test_area_descs + from_area_idx;
    to_area_desc = boot_test_area_descs + to_area_idx;

    TEST_ASSERT(from_area_desc->nad_length == to_area_desc->nad_length);

    buf = malloc(from_area_desc->nad_length);
    TEST_ASSERT(buf != NULL);

    rc = hal_flash_read(from_area_desc->nad_flash_id,
                        from_area_desc->nad_offset, buf,
                        from_area_desc->nad_length);
    TEST_ASSERT(rc == 0);

    rc = hal_flash_erase(to_area_desc->nad_flash_id,
                         to_area_desc->nad_offset,
                         to_area_desc->nad_length);
    TEST_ASSERT(rc == 0);

    rc = hal_flash_write(to_area_desc->nad_flash_id,
                         to_area_desc->nad_offset, buf,
                         to_area_desc->nad_length);
    TEST_ASSERT(rc == 0);

    free(buf);
}
Exemplo n.º 4
0
static int stm32l475_ota_init(hal_ota_module_t *m, void *something)
{
    hal_logic_partition_t *partition_info;
    hal_partition_t pno = HAL_PARTITION_OTA_TEMP;

    stm32l475_ota_module.init = stm32l475_ota_init;
    stm32l475_ota_module.ota_write = stm32l475_ota_write;
    stm32l475_ota_module.ota_read = stm32l475_ota_read;
    stm32l475_ota_module.ota_set_boot = stm32l475_ota_set_boot;

    LOG("set ota init---------------\n");
    _off_set = *(uint32_t*)something;
    ota_info.ota_len=_off_set;

    if (!FLASH_bank1_enabled()) {
        pno = HAL_PARTITION_APPLICATION;
    }
    
    if(_off_set==0) {
        partition_info = hal_flash_get_info( pno );
        hal_flash_erase(pno, 0 ,partition_info->partition_length);
        CRC16_Init( &contex );
    } else {
        contex.crc=hal_ota_get_crc16();
        LOG("--------get crc16 context.crc=%d!--------\n",contex.crc);
    }

    return 0;
}
Exemplo n.º 5
0
static void
boot_test_util_swap_areas(int area_idx1, int area_idx2)
{
    const struct nffs_area_desc *area_desc1;
    const struct nffs_area_desc *area_desc2;
    void *buf1;
    void *buf2;
    int rc;

    area_desc1 = boot_test_area_descs + area_idx1;
    area_desc2 = boot_test_area_descs + area_idx2;

    TEST_ASSERT(area_desc1->nad_length == area_desc2->nad_length);

    buf1 = malloc(area_desc1->nad_length);
    TEST_ASSERT(buf1 != NULL);

    buf2 = malloc(area_desc2->nad_length);
    TEST_ASSERT(buf2 != NULL);

    rc = hal_flash_read(area_desc1->nad_flash_id, area_desc1->nad_offset,
                        buf1, area_desc1->nad_length);
    TEST_ASSERT(rc == 0);

    rc = hal_flash_read(area_desc2->nad_flash_id, area_desc2->nad_offset,
                        buf2, area_desc2->nad_length);
    TEST_ASSERT(rc == 0);

    rc = hal_flash_erase(area_desc1->nad_flash_id, area_desc1->nad_offset,
                         area_desc1->nad_length);
    TEST_ASSERT(rc == 0);

    rc = hal_flash_erase(area_desc2->nad_flash_id, area_desc2->nad_offset,
                         area_desc2->nad_length);
    TEST_ASSERT(rc == 0);

    rc = hal_flash_write(area_desc1->nad_flash_id, area_desc1->nad_offset,
                         buf2, area_desc1->nad_length);
    TEST_ASSERT(rc == 0);

    rc = hal_flash_write(area_desc2->nad_flash_id, area_desc2->nad_offset,
                         buf1, area_desc2->nad_length);
    TEST_ASSERT(rc == 0);

    free(buf1);
    free(buf2);
}
Exemplo n.º 6
0
static int
boot_erase_area(int area_idx)
{
    const struct nffs_area_desc *area_desc;
    int rc;

    area_desc = boot_req->br_area_descs + area_idx;
    rc = hal_flash_erase(area_desc->nad_flash_id, area_desc->nad_offset,
                         area_desc->nad_length);
    if (rc != 0) {
        return BOOT_EFLASH;
    }

    return 0;
}
Exemplo n.º 7
0
static hal_result_t s_hal_eeprom_writeflash(uint32_t addr, uint32_t size, void * data)
{
    uint32_t pageaddr   = hal_flash_get_pageaddr(addr);
    uint32_t pagesize   = hal_flash_get_pagesize(addr);
    uint32_t offset     = addr - pageaddr;
    uint32_t count      = 0;
    uint32_t numbytes   = 0;
    uint8_t* data2write = data;

    if(hal_false == hal_flash_address_isvalid(addr))
    {   // cannot write at the address the first bytes
        return(hal_res_NOK_generic);
    }

    if(hal_false == hal_flash_address_isvalid(addr+size-1))
    {   // cannot write at the address the last bytes
        return(hal_res_NOK_generic);
    }

    if(NULL == s_hal_eeprom_emulated_flash_cfg.flashpagebuffer)
    {   // dont have a pagebuffer
        return(hal_res_NOK_generic);
    }


    for(;;)
    {
        pageaddr   = hal_flash_get_pageaddr(addr);
        pagesize   = hal_flash_get_pagesize(addr);
        offset     = addr - pageaddr;
        numbytes   = (size<(pagesize-offset)) ? (size) : (pagesize-offset);
        data2write = (uint8_t*)data + count;;

        if(s_hal_eeprom_emulated_flash_cfg.flashpagesize < pagesize)
        {   // cannot write in a page with size bigger than the buffer capacity
            return(hal_res_NOK_generic);
        }
        
        // read a page and place content in buffer
        hal_flash_read(pageaddr, pagesize, s_hal_eeprom_emulated_flash_cfg.flashpagebuffer);
        // change the buffer
        memcpy(&((uint8_t*)s_hal_eeprom_emulated_flash_cfg.flashpagebuffer)[offset], data2write, numbytes);
        // erase the page
        hal_flash_erase(pageaddr, pagesize);
        // write the buffer
        hal_flash_write(pageaddr, pagesize, s_hal_eeprom_emulated_flash_cfg.flashpagebuffer);

        count += numbytes;
        size -= numbytes;
        addr = pageaddr+pagesize;
        

        if(0 == size)
        {
            return(hal_res_OK);
        }

    }

   
}
Exemplo n.º 8
0
static hal_result_t s_hal_eeprom_eraseflash(uint32_t addr, uint32_t size)
{
    uint32_t pageaddr   = hal_flash_get_pageaddr(addr);
    uint32_t pagesize   = hal_flash_get_pagesize(addr);
    uint32_t offset     = addr - pageaddr;
    uint32_t numbytes   = 0;

    if(hal_false == hal_flash_address_isvalid(addr))
    {   // cannot erase at the address of the first bytes
        return(hal_res_NOK_generic);
    }

    if(hal_false == hal_flash_address_isvalid(addr+size-1))
    {   // cannot erase at the address of the last bytes
        return(hal_res_NOK_generic);
    }

    if(NULL == s_hal_eeprom_emulated_flash_cfg.flashpagebuffer)
    {   // dont have a pagebuffer
        return(hal_res_NOK_generic);
    }


    for(;;)
    {
        pageaddr   = hal_flash_get_pageaddr(addr);
        pagesize   = hal_flash_get_pagesize(addr);
        offset     = addr - pageaddr;
        numbytes   = (size<(pagesize-offset)) ? (size) : (pagesize-offset);

        if(s_hal_eeprom_emulated_flash_cfg.flashpagesize < pagesize)
        {   // cannot erase a page with size bigger than the buffer capacity
            return(hal_res_NOK_generic);
        }

        if(numbytes == pagesize)
        {   // just erase
            hal_flash_erase(pageaddr, pagesize);
        }
        else
        {   // need to save some data in the page...
            // read a page and place content in buffer
            hal_flash_read(pageaddr, pagesize, s_hal_eeprom_emulated_flash_cfg.flashpagebuffer);
            // set to 0xff a part of the buffer
            memset(&((uint8_t*)s_hal_eeprom_emulated_flash_cfg.flashpagebuffer)[offset], 0xFF, numbytes);
            // erase the full page
            hal_flash_erase(pageaddr, pagesize);
            // write the buffer
            hal_flash_write(pageaddr, pagesize, s_hal_eeprom_emulated_flash_cfg.flashpagebuffer);
        }

        size -= numbytes;
        addr = pageaddr+pagesize;
        

        if(0 == size)
        {
            return(hal_res_OK);
        }

    }

   
}