Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

FOTA module #88

Open
arlucio opened this issue Sep 14, 2020 · 1 comment
Open

FOTA module #88

arlucio opened this issue Sep 14, 2020 · 1 comment

Comments

@arlucio
Copy link

arlucio commented Sep 14, 2020

I started making an OTA module that uses the FOTA API (https://ai-thinker-open.github.io/GPRS_C_SDK_DOC/en/c-sdk/function-api/fota.html) to update the firmware from a server. I would try running this from a micropython code or, if it doesn't work, use native code to check for updates and upgrade firmware before starting to run Micropython code.

I started to make the module but couldn't go further because I can't generate the .pack file to test at all, even using the FOTA example. Maybe I will come back to this later, but if anyone wants to give it a try. Would be something like this.

static void processFotaUpgradeData(const unsigned char *data, int len)
{
    if(len)
    {
        MEMBLOCK_Trace(1, (uint8_t*)data, (uint16_t)len, 16);
        if(!API_FotaInit(len))
            goto upgrade_failed;
        if(API_FotaReceiveData((unsigned char*)data, (int)len) == 0);
    }else{//error
        goto upgrade_failed;
    }
    return;

upgrade_failed:
    mp_printf(&mp_plat_print,"OTA upgrade failed");
    API_FotaClean();
}


STATIC mp_obj_t modota_update(size_t n_args, const mp_obj_t *args) {
    // ========================================
    // Get update from server and upgrade firmware.
    // Args:
    //     url (str): url from firmware server file on .pack format
    // ========================================
    if (n_args != 1) {
            mp_raise_ValueError("Unexpected number of argument: 1 is required");
    }
    
    const char* c_url = mp_obj_str_get_str(args[0]);
    if(API_FotaByServer((char*)c_url, processFotaUpgradeData) == 0)
        mp_printf(&mp_plat_print,"Starting OTA update");
    else
        mp_printf(&mp_plat_print,"OTA update failed");
    return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(modota_update_obj, modota_update);

STATIC const mp_map_elem_t mp_module_ota_globals_table[] = {
   { MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_OBJ_NEW_QSTR(MP_QSTR_ota) },

   { MP_OBJ_NEW_QSTR(MP_QSTR_update),  (mp_obj_t)&modota_update_obj },
};
STATIC MP_DEFINE_CONST_DICT(mp_module_ota_globals, mp_module_ota_globals_table);

const mp_obj_module_t ota_module = {
    .base = { &mp_type_module },
    .globals = (mp_obj_dict_t*)&mp_module_ota_globals,
};

There are already ways to just update .py/.mpy files like this one (https://medium.com/@ronald.dehuysser/micropython-ota-updates-and-github-a-match-made-in-heaven-45fde670d4eb). OTA updating entire firmware with all modules/main freezed seems better in terms of security and also update the freezed modules and bugs from the platform.

@pulkin
Copy link
Owner

pulkin commented Oct 16, 2020

upgrade firmware before starting to run Micropython code.

This is probably too intrusive.

What I learned from docs is that you need to build specific incremental images to make it work. Should be quite straightforward otherwise. Lod files are just addresses and text.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants