blob: ca2ef7aa1bbde6bb3eed71a18eef0b2927d8d446 [file] [log] [blame]
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "mbtk_type.h"
#include "mbtk_device.h"
/*
* revision_out start from 0x1000.
*/
#define REVISION_OUT_ADDR 0x1000
#define DEV_INFO_FILE_NAME "dev_info.bin"
static void help()
{
printf("ota_update -f [ota_bin] -v [new_revision_dir]\n");
}
/*
*
* ota_update -f [ota_bin] -v [new_revision_dir]
*
*/
int main(int argc, char *argv[])
{
int ch;
char ota_bin[128] = {0};
char dev_info_file[128] = {0};
while((ch = getopt(argc, argv, "f:v:"))!= -1)
{
switch(ch)
{
case 'f':
if(strlen(optarg) > 0)
memcpy(ota_bin, optarg, strlen(optarg));
break;
case 'v':
if(strlen(optarg) > 0)
memcpy(dev_info_file, optarg, strlen(optarg));
break;
default:
help();
return -1;
}
}
if(strlen(ota_bin) == 0 || strlen(dev_info_file) == 0)
{
help();
return -1;
}
printf("Ota Bin:%s, Revision Dir:%s\n", ota_bin, dev_info_file);
sprintf(dev_info_file + strlen(dev_info_file), "/%s", DEV_INFO_FILE_NAME);
if(access(ota_bin, F_OK))
{
printf("%s not exist.", ota_bin);
return -1;
}
if(access(dev_info_file, F_OK))
{
printf("%s not exist.", dev_info_file);
return -1;
}
int fd = open(dev_info_file, O_RDONLY);
if(fd < 0)
{
printf("Open(%s) fail:%d\n", dev_info_file, errno);
return -1;
}
mbtk_device_info_header_t info_header;
memset(&info_header, 0, sizeof(mbtk_device_info_header_t));
if(read(fd, &info_header, sizeof(mbtk_device_info_header_t)) != sizeof(mbtk_device_info_header_t)) {
printf("Read mbtk_device_info_header_t fail:%d\n", errno);
goto fail;
}
if(lseek(fd, info_header.item_header[MBTK_DEVICE_INFO_ITEM_BASIC].addr, SEEK_SET) < 0)
{
printf("seek failed\n");
goto fail;
}
mbtk_device_info_basic_t info_basic;
memset(&info_basic, 0, sizeof(mbtk_device_info_basic_t));
if(read(fd, &info_basic, sizeof(mbtk_device_info_basic_t)) != sizeof(mbtk_device_info_basic_t)) {
printf("Read mbtk_device_info_basic_t fail:%d\n", errno);
goto fail;
}
printf("New Revision:%s\n", info_basic.revision_out);
close(fd);
fd = open(ota_bin, O_WRONLY, 0644);
if(fd < 0)
{
printf("Open(%s) fail:%d\n", ota_bin, errno);
return -1;
}
if(lseek(fd, REVISION_OUT_ADDR, SEEK_SET) < 0)
{
printf("seek failed\n");
goto fail;
}
if(write(fd, info_basic.revision_out, strlen(info_basic.revision_out)) != strlen(info_basic.revision_out)) {
printf("Write revision failed\n");
goto fail;
}
printf("%s revision update to:%s\n", ota_bin, info_basic.revision_out);
close(fd);
return 0;
fail:
close(fd);
return -1;
}