آپدیت افلاین MC60

سلام وقت بخیر

من میخوام برنامه mc60 رو از داخل حافظه فلش بخونم و برنامه رو اپدیت کنم

مثل همون FOTA ولی به جای دانلود کردن فایل، مستقیم از حافظه خونده بشه.

s32 UpdateFrom25Q32(uint32_t start_addr, uint32_t image_size, void (*progress_cb)(u32 percent))
{
    s32 ret;
    u32 bytes_written = 0;

    ST_FotaConfig fotaCfg;
    const u32 Write_SIZE = 512;
    u8 buffer[Write_SIZE];
    u8 read_buffer[Write_SIZE];


    Ql_memset((void *)(&fotaCfg), 0, sizeof(ST_FotaConfig));
    
    fotaCfg.Q_gpio_pin1 = Ql_WTD_GetWDIPinCfg()->pinWtd1;
    fotaCfg.Q_feed_interval1 = 10000;
    fotaCfg.Q_gpio_pin2 = Ql_WTD_GetWDIPinCfg()->pinWtd2;
    fotaCfg.Q_feed_interval2 = 10000;

    ret = Ql_FOTA_Init(&fotaCfg);
    if (ret != 0) {
        APP_DEBUG("FOTA Init failed: %d\r\n", ret);
        return -1;
    }

    //  نوشتن داده‌ها در ناحیه‌ی موقت FOTA
    while (bytes_written < image_size)
    {
        u32 chunk = image_size - bytes_written;
        if (chunk > Write_SIZE) chunk = Write_SIZE;

        Ql_memset(buffer, 0x00, sizeof(buffer));
        Ql_memset(read_buffer, 0x00, sizeof(read_buffer));


        flash_rd_data(start_addr + bytes_written, buffer, chunk);


        ret = Ql_FOTA_WriteData(chunk, (s8*)buffer);
        if (ret != 0) {
            APP_DEBUG("Ql_FOTA_WriteData failed: %d\r\n", ret);
            return -1;
        }


        Ql_FOTA_ReadData(bytes_written, chunk, read_buffer);

        if(Ql_memcmp(read_buffer, buffer, chunk) == 0)
        {
        	APP_DEBUG("Write OK\r\n", ret);
        }
        else
        {
        	APP_DEBUG("Write:\r\n", ret);
        	Ql_UART_Write(UART_PORT1, (u8*)(buffer), chunk);
        	
        	APP_DEBUG("\r\nRead:\r\n", ret);
        	Ql_UART_Write(UART_PORT1, (u8*)(read_buffer), chunk);
        	
        	return -1;
        }

        bytes_written += chunk;

        u32 percent = (bytes_written * 100) / image_size;
        APP_DEBUG("progress: %d\r\n", percent);

        if (progress_cb) {
            progress_cb(percent);
        }

        Ql_Sleep(1);
    }

    ret = Ql_FOTA_Finish();
    if (ret != 0) {
        APP_DEBUG("Ql_FOTA_Finish failed: %d\r\n", ret);

        return -1;
    }

    ret = Ql_FOTA_Update();
    if (ret != 0) {
        APP_DEBUG("Ql_FOTA_Update failed: %d\r\n", ret);

        return -1;
    }


    APP_DEBUG("Update completed, rebooting...\r\n");
    return 0;
}

برنامه به صورت پکت های 512 بایتی از حافظه خونده میشه و با تابع Ql_FOTA_WriteData به ماژول ارسال میشه

این تابع همیشه مقدار اوکی برمیگردونه و میگه کار به درستی انجام شده ولی با تابع Ql_FOTA_ReadData که متن ارسال شده رو میخونم، بعضی بایت ها تغییر میکنند و به درستی در ماژول ذخیره نمیشوند

در ابتدا دو پکت به درستی ثبت میشه (دیتایی که خوانده میشه با دیتای ارسال شده برابره) و کلمه Write OK در پورت سریال پرینت میشه.

اما از پکت سوم به بعد به مشکل میخوره. بعد از چند بار تست کردن دیگه همون پکت اول هم به درستی نمیشینه و بعضی از بایت ها تغییر میکنند

یه بار بدون خواندن داده ها، عملیات نوشتن ادامه دادم و ماژول کلا بهم ریخت و حتی پروگرم نمیشد.

دیتای برنامه هم به صورت درست از حافظه فلش خوانده میشه و فایل برنامه همون چیزیه که از طریق اینترنت دانلود میشه و به درستی اپدیت میشه (مشکل از برنامه یا خرابی داده های خوانده شده از حافظه فلش نیست)

برنامه خوانده شده از حافظه فلش با برنامه اصلی چک شده و به درستی خوانده میشه

اگر از سالم بودن داده روی فلش اطمینان داری. (دستی پروگرامش کن w25qxx)

اگر از داده ای که از فلش میخونی و در بافر نگه میداری هم اطمینان داری مثلا crc رو چک میکنی یا هر روش دیگه

و از صحت ارسال داده به ماژول هم اطمینان داری (حلقه برگشتی گذاشتی و چکش میکنی مثلا با crc یا هر روش دیگه ای)

احتمال داره نحوه ارسال به ماژول رو باید تغییر بدی مثلا اول بایت کم ارش یا اول بایت پر ارزش رو بفرستی و از این قبیل موارد

ممنون از شما

برنامه مربوط به آپدیت FOTA نگاه کردم دقیقا همینطوری داده هارو به ماژول ارسال میکنه، یعنی هر پکتی که دریافت میکنه، میده به این تابع Ql_FOTA_WriteData و برنامه هم به درستی اپدیت میشه!

حالا من دیتارو از حافظه فلش 25q میخونم و میدم به این تابع، ولی داده ای که میدم به ماژول با داده ای که از ماژول میخونم متفاوته در بعضی بایت ها. ولی اکثرا درست خونده میشه

داده ای که روی حافظه فلش ریختم، همون فایلی هست که از طریق اینترنت دانلود میشه و به درستی آپدیتش انجام میشه.

برنامه ذخیره شده در حافظه فلش رو هم خوندم مجدد از حافظه و با برنامه اصلی مقایسه کردم و هیچ بایتی مورد دار نیست

با توجه به مشکلات دیگه که از توابع opencpu دیدیم، ممکنه این تابع Ql_FOTA_ReadData مشکل داشته باشه و نتونه دیتارو به درستی بخونه؟

بدون خوندن دیتا از ماژول، یه ماژول دیگه رو بزنم شهید کنم یا نه :sob::face_with_raised_eyebrow:

کتابخونه هایی که از sdk داری استفاده میکنی رو بده به
DSN
و توضحی بده بهش مثل همینجا، صحت توابع رو بررسی میکنه.