⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 ST flash driver
💻 C
📖 第 1 页 / 共 3 页
字号:
        printf("Open file for write error.\n");
        return -1;
    }

    result = fwrite((unsigned char *) addr, 1, len, dfile);
    if (result != len)
    {
        printf("write to file error.\n");
        return -1;
    }

    fclose(dfile);

    if (len < 256)
    {
        for (i = 0; i < len; i++)
        {
            if (i % 16 == 0)
            {
                printf("\n");
                printf("%x: ", addr + i);
            }

            memcpy((void *) &x, (const void *) (addr + i), 1);

            printf("%02x ", x);
        }
    }

    printf("\n");

    return 0;
}

int Image2Hex(void)
{
    int     i, j, m, x, addr, num, len, result;
    char    str[10], buf[300], *buf1;
    unsigned char * buf0;
    FILE   *dfile;

    buf0 = (unsigned char *) malloc(800000);
    if (buf0 == NULL)
    {
        printf("Not enough memory.\n");
        return -1;
    }

    memset(buf0, 0, 800000);

    buf1 = (char *) malloc(2000000);
    if (buf1 == NULL)
    {
        printf("Not enough memory.\n");
        return -1;
    }

    memset(buf1, 0, 2000000);

    dfile = fopen("image.hex", "w");

    if (dfile == NULL)
    {
        printf("Open file for write error.\n");
        free(buf0);
        free(buf1);
        return -1;
    }

    memcpy((void *) &num, (const void *) FLASH_PROGRAM_ZIP_DATA_ADDR, 4);

    if (num <= 0 || num > 100)
    {
        printf("Num error.\n");
        free(buf0);
        free(buf1);
        fclose(dfile);
        return -1;
    }

    addr = 4;
    for (i = 0; i < num; i++)
    {
        memset(buf, 0, 256);
        memcpy(buf, (const void *) (FLASH_PROGRAM_ZIP_DATA_ADDR + addr), 256);

        addr += 256;
        memcpy((void *) &x, (const void *) (FLASH_PROGRAM_ZIP_DATA_ADDR + addr), 4);

        printf("%d : %s %d", i + 1, buf, x);

        if (x % 4 != 0)
        {
            x = x + 4 - x % 4;
        }

        addr += 4 + x;

        printf(", addr is %d\n", addr);
    }

    printf("\n\n");

    m = 0;
    len = addr;

    memcpy((void *) buf0, (const void *) FLASH_PROGRAM_ZIP_DATA_ADDR, len);

    for (i = 0; i < len + 32 - len % 32; i += 32)
    {
        buf[0] = 0;
        sprintf(buf, "%x", FLASH_PROGRAM_ZIP_DATA_ADDR + i);

        addr = i;
        for (j = 0; j < 32; j++)
        {
            sprintf(str, "%02x", *((unsigned char *) (buf0 + addr)));
            strcat(buf, " ");
            strcat(buf, str);

            addr++;
            if (addr > len - 1)
            {
                break;
            }
        }

        strcat(buf, "\n");

        memcpy((void *) &buf1[m], (const void *) buf, strlen(buf));
        m += strlen(buf);
    }

    printf("m = %d\n", m);

    result = fwrite((unsigned char *) buf1, 1, m, dfile);
    if (result != m)
    {
        printf("write to file error.\n");
        free(buf0);
        free(buf1);
        fclose(dfile);
        return -1;
    }

    free(buf0);
    free(buf1);
    fclose(dfile);

    return 0;
}

void GetMainProgVersion(void)
{
    int version;

    memcpy((void *) &version, (const void *) (FLASH_PROGRAM_CHECK_ADDR + 20), 4);

    if (version <0 || version> 100000)
    {
        printf("\n非法的版本号: %x\n", version);
    }
    else
    {
        printf("\n主程序当前版本为 :%x\n", version);
    }
}

void GetEprom(void)
{
    int         len = 8 * 1024 - 4;
    char        fname[100];
    static char strFlag[8 * 1024 + 1000];
    FILE       *dfile;

    fname[0] = 0;
    printf("请输入保存E2P的文件名 : ");
    scanf("%s", fname);

    if (strlen(fname) < 1)
    {
        return ;
    }

    memset(strFlag, 0, len + 1);

    dfile = fopen(fname, "w");
    if (dfile == NULL)
    {
        printf("Open %s for write error!\n", fname);
        return ;
    }

    sysE2PROM->Read(sysE2PROM, 0, (u8 *) strFlag, (u32 *) &len);

    fwrite((unsigned char *) strFlag, 1, len, dfile);

    fclose(dfile);

    return ;
}

void writeEprom(void)
{
    int         len = 8 * 1024 - 4;
    char        fname[100];
    static char strFlag[8 * 1024 + 1000];
    FILE       *dfile;

    fname[0] = 0;
    printf("请输入要写入E2P的文件 : ");
    scanf("%s", fname);

    if (strlen(fname) < 1)
    {
        return ;
    }

    memset(strFlag, 0, len + 1);

    dfile = fopen(fname, "r");
    if (dfile == NULL)
    {
        printf("Open %s for read error!\n", fname);
        return ;
    }

    fread((unsigned char *) strFlag, 1, len, dfile);

    sysE2PROM->Write(sysE2PROM, 0, (u8 *) strFlag, (u32 *) &len);

    fclose(dfile);

    return ;
}

int SetProgramVer(void)
{
    int version;

    printf("Please input new version : ");
    scanf("%x", &version);

    sysFlash->Write(sysFlash, FLASH_PROGRAM_CHECK_ADDR + 20 - FLASH_START_ADDR, 4, (void *) &version);

    return 0;
}

int SetSTBSequenceID(void)
{
    int sid;

    printf("Please input new sequence id : ");
    scanf("%d", &sid);

    sysFlash->Write(sysFlash, FLASH_FONT_ADDR + FLASH_FONT_SIZE - sizeof(STBVER) + 64 - FLASH_START_ADDR, 4, (void *) &sid);

    return 0;
}


static int ReadDataInFlash2File()
{
    int     result, len, address;
    char    filename[100];
    FILE   *dfile;

    printf("\nPlease input address(in hex) : ");
    scanf("%x", &address);
    printf("\n");

    printf("\nPlease input length : ");
    scanf("%d", &len);
    printf("\n");

    printf("\nPlease input filename to save data : ");
    scanf("%s", filename);
    printf("\n");

    dfile = fopen(filename, "wb");
    if (dfile == NULL)
    {
        printf("Open %s to write error.\n", filename);
        return -1;
    }

    result = fwrite((unsigned char *) address, 1, len, dfile);

    if (result != len)
    {
        fclose(dfile);
        printf("write to file error.\n");
        return -1;
    }

    fclose(dfile);

    return 0;
}


static int WriteDataInFile2FLash()
{
    int     result, address, blocksize = 65536;
    char    filename[100];
    FILE   *dfile;
    unsigned char * buf;

    printf("\nPlease input source filename : ");
    scanf("%s", filename);
    printf("\n");

    printf("\nPlease input start address(in hex) : ");
    scanf("%x", &address);
    printf("\n");

    buf = (unsigned char *) malloc(blocksize);
    if (buf == NULL)
    {
        printf("malloc buf for %d error.\n", blocksize);
    }

    dfile = fopen(filename, "rb");
    if (dfile == NULL)
    {
        free(buf);
        printf("Open %s to read error.\n", filename);
        return -1;
    }

    for (; ;)
    {
        result = fread(buf, 1, blocksize, dfile);

        if (result > 0)
        {
            sysFlash->Write(sysFlash, address - FLASH_START_ADDR, result, buf);
            address += result;
        }
        else
        {
            break;
        }
    }

    free(buf);
    fclose(dfile);

    return 0;
}
void EraseSoftVersion()
{
    DTVIA_FLASH_CONTENT Flash_Content;
    memset((void *) &Flash_Content, 0xFF, sizeof(DTVIA_FLASH_CONTENT));
    Flash_Content.stb_sequence_number = 0x123;
    sysFlash->Write(sysFlash, FLASH_PROGRAM_CHECK_ADDR - FLASH_START_ADDR, sizeof(DTVIA_FLASH_CONTENT), (unsigned char *) &Flash_Content);
}

int Look_for_pos_of_bmp(void)
{
    char    BMP_NAME[256];
    char    zipname1[256];

    int     i, x, num, addr;
    printf("Please Input the BMP Name:\n");
    scanf("%s", BMP_NAME);
    memcpy((void *) &num, (const void *) FLASH_PROGRAM_ZIP_DATA_ADDR, 4);
    addr = 4;
    for (i = 0; i < num; i++)
    {
        memset(zipname1, 0, 256);
        sysFlash->Read(sysFlash, FLASH_PROGRAM_ZIP_DATA_ADDR + addr - FLASH_START_ADDR, 256, (unsigned char *) zipname1);
        if (!strcmp(BMP_NAME, zipname1))
        {
            return (i + 1);
        }

        addr += 256;
        memcpy((void *) &x, (const void *) (FLASH_PROGRAM_ZIP_DATA_ADDR + addr), 4);

        if (x % 4 != 0)
        {
            x = x + 4 - x % 4;
        }

        addr += 4 + (int) x;
    }
    return 0;
}

void task1(void)
{
    BOOL    bExit   = FALSE;
    int     command;

    printf("\nProgamme Flash:\n");


    while (!bExit)
    {
        printf("\n 0) Exit\n");
        printf(" 1) Burn basic Program\n");
        printf(" 2) Burn Font\n");
        printf(" 3) Burn Main Program (.bin)\n");
        printf(" 4) Burn Main Program (.prg)\n");
        printf(" 5) 写入图片(压缩数据)\n");
        printf(" 6) 写入图片(不压缩数据)\n");
        printf(" 7) 读取图片数据\n");
        printf(" 8) 删除图片\n");
        printf(" 9) 列出FLASH中存储的图片\n");
        printf("10) 取得FLASH映像\n");
        printf("11) 将数组形式的图片数据存为二进制形式\n");
        printf("12) 将映像文件写入FLASH\n");
        printf("13) 显示FLASH中的数据(二进制形式)\n");
        printf("14) 擦除芯片\n");
        printf("15) 将图片数据转化为hex文件\n");
        printf("16) 设置主程序版本号\n");
        printf("17) 显示主程序版本号\n");
        printf("18) 设置标识区信息\n");
        printf("19) 显示标识区信息\n");
        printf("20) 将版本信息转化为hex文件(保存于当前目录下的flag.hex文件中)\n");
        printf("21) 得到e2p数据并写入文件中\n");
        printf("22) 将文件里的数据写入E2P\n");
        printf("23) 设置机顶盒序列号\n");
        printf("24) 读取flash中的数据并存入文件中(例如可将图片数据读出并保存)\n");
        printf("25) 将二进制数据写入flash中(例如可一次将所有图片数据写入flash中)\n");
        printf("26) 清除版本信息\n");
        printf("27) 查找图片在Flash中的位置\n");
		printf("30) 烧写2M映像文件(TEST)\n");
        printf("Command:");

        scanf("%d", &command);

        switch (command)
        {
          case 0:
            bExit = TRUE;
            break;
          case 1:
            burningbasic();
            break;
          case 2:
            burningFont();
            break;
          case 3:
            burningMainProgram();
            break;
          case 4:
            burningMainProgramPrg();
            break;
          case 5:
            burningZipdata(8);
            break;
          case 6:
            burningZipdata(0);
            break;
          case 7:
            GetZipData();
            break;
          case 8:
            DeleteZipInFlash();
            break;
          case 9:
            ListZipInFlash();
            break;
          case 10:
            GetFlashMirrorImage();
            break;
          case 11:
            WriteArrayToFile();
            break;
          case 12:
            WriteFlashMirrorImage();
            break;
          case 13:
            GetDataFromFlash();
            break;
          case 14:
            flash_erase();
            break;
          case 15:
            Image2Hex();
            break;

          case 16:
            SetProgramVer();
            break;

          case 17:
            GetMainProgVersion();
            break;

          case 21:
            GetEprom();
            break;

          case 22:
            writeEprom();
            break;

          case 23:
            SetSTBSequenceID();
            break;

          case 24:
            ReadDataInFlash2File();
            break;

          case 25:
            WriteDataInFile2FLash();
            break;
          case 26:
            EraseSoftVersion();
            break;
          case 27:
            {
                int temp;
                if (temp = Look_for_pos_of_bmp())
                {
                    printf("Find the BMP pos=%d\n", temp);
                }
                else
                {
                    printf("Cant Find the BMP\n");
                }
            }
            break;

		  case 30:
			  WriteFlashMirrorImage2M();
			  break;

          default:
            break;
        }
    }

    if (sk_taskState(root_task) == TASK_STATE_SUSPENDED)
    {
        sk_taskResume(root_task);
    }
}

int main(void)
{
    u32 tick;

    printf("Root task enter ... \n");

    printf("image staradd:%x\n", FLASH_PROGRAM_ZIP_DATA_ADDR);
    /*
    * Initialize board
    */

    sk_bspInit();
    sk_bspStart();

    /*
    * Start OS
    */
    //sk_osInit();
    //sk_osStart();

    sysE2PROM->Init(sysE2PROM, FALSE);
    tick = sk_osGetTick();
    printf("System tick ... %d\n", tick);

    /*
    * Create tasks
    */
    if (sk_taskOpen(&tid1, "task1", 1, 4096, 0, (sk_Task) task1, NULL) != STATUS_OK)
    {
        printf("Task open for %s failed\n", "task1");
    }
    printf("Task '%s' created\n", "task1");

    tick = sk_osGetTick();
    printf("System tick ... %d\n", tick);

    root_task = sk_taskId();
    sk_taskSetPriority((sk_TaskID) NULL, 0);
    if (sk_taskSuspend((sk_TaskID) NULL) < 0)
    {
        printf("Could not suspend\n");
    }

    tick = sk_osGetTick();
    printf("System tick ... %d\n", tick);

    sk_taskDelaymSec(1000);

    printf("Root task exit!\n");
    tick = sk_osGetTick();
    printf("System tick ... %d\n", tick);

    sk_osStop();
    sk_osShutdown();

    sk_bspStop();
    sk_bspShutdown();

    return (0);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -