سلام وقت بخیر
من میخوام برنامه 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 در پورت سریال پرینت میشه.
اما از پکت سوم به بعد به مشکل میخوره. بعد از چند بار تست کردن دیگه همون پکت اول هم به درستی نمیشینه و بعضی از بایت ها تغییر میکنند
یه بار بدون خواندن داده ها، عملیات نوشتن ادامه دادم و ماژول کلا بهم ریخت و حتی پروگرم نمیشد.
دیتای برنامه هم به صورت درست از حافظه فلش خوانده میشه و فایل برنامه همون چیزیه که از طریق اینترنت دانلود میشه و به درستی اپدیت میشه (مشکل از برنامه یا خرابی داده های خوانده شده از حافظه فلش نیست)
برنامه خوانده شده از حافظه فلش با برنامه اصلی چک شده و به درستی خوانده میشه