|
@@ -0,0 +1,666 @@
|
|
|
+#include <stdio.h>
|
|
|
+#include <stdint.h>
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdlib.h>
|
|
|
+#include <stdarg.h>
|
|
|
+#include <limits.h>
|
|
|
+#include <string.h>
|
|
|
+#include <ctype.h>
|
|
|
+#include <unistd.h>
|
|
|
+#include <stddef.h>
|
|
|
+#include <time.h>
|
|
|
+#include <errno.h>
|
|
|
+#include <getopt.h>
|
|
|
+#include <gfaserial.h>
|
|
|
+#include <gfabootlmast.h>
|
|
|
+#include "main.h"
|
|
|
+#include "cmdopt.h"
|
|
|
+#include "error.h"
|
|
|
+#include "output.h"
|
|
|
+
|
|
|
+/////////////////////////////////////////////////////////////////////////////
|
|
|
+
|
|
|
+#define _IS_POWER_OF_2(x) (!!(x) && !((x) & ((x) - 1)))
|
|
|
+#define _IS_VALID_STATION_NUMBER(s) (((s) > 0) && ((s) <= 99))
|
|
|
+#define _IS_VALID_BLOCK_SIZE(s) (((s) >= CMD_OPT_MIN_SEND_BLOCK_SIZE) && ((s) <= CMD_OPT_MAX_SEND_BLOCK_SIZE) && !((s) & 0x03))
|
|
|
+
|
|
|
+/////////////////////////////////////////////////////////////////////////////
|
|
|
+
|
|
|
+#define _OV_HAS_UPLOAD_IMG ((uint32_t)0x00000001)
|
|
|
+#define _OV_HAS_SHOW_FILE_IMG_INFO ((uint32_t)0x00000002)
|
|
|
+#define _OV_HAS_SHOW_DEV_IMG_INFO ((uint32_t)0x00000004)
|
|
|
+#define _OV_HAS_VALIDATE_IMG ((uint32_t)0x00000008)
|
|
|
+#define _OV_HAS_SHOW_MAT_SER ((uint32_t)0x00000010)
|
|
|
+#define _OV_HAS_SET_MAT_SER ((uint32_t)0x00000020)
|
|
|
+#define _OV_HAS_BOOT_PING ((uint32_t)0x00000040)
|
|
|
+
|
|
|
+#define _OV_HAS_IMG_FILE ((uint32_t)0x00001000)
|
|
|
+#define _OV_HAS_ITF_NAME ((uint32_t)0x00002000)
|
|
|
+#define _OV_HAS_BLOCK_SIZE ((uint32_t)0x00004000)
|
|
|
+#define _OV_HAS_APP_ADDR ((uint32_t)0x00008000)
|
|
|
+#define _OV_HAS_BAUD_RATE ((uint32_t)0x00010000)
|
|
|
+#define _OV_HAS_STATION_NUMBER ((uint32_t)0x00020000)
|
|
|
+#define _OV_HAS_NODE_ADDR ((uint32_t)0x00040000)
|
|
|
+#define _OV_HAS_SLAVE_ADDR ((uint32_t)0x00080000)
|
|
|
+#define _OV_HAS_SET_MATERIAL ((uint32_t)0x00100000)
|
|
|
+#define _OV_HAS_SET_SERIAL ((uint32_t)0x00200000)
|
|
|
+#define _OV_HAS_PING_INTERVAL ((uint32_t)0x00400000)
|
|
|
+
|
|
|
+/////////////////////////////////////////////////////////////////////////////
|
|
|
+
|
|
|
+#define _OV_CMD_MASK ((uint32_t)0x00000FFF)
|
|
|
+#define _OV_OPT_MASK (~_OV_CMD_MASK)
|
|
|
+
|
|
|
+/////////////////////////////////////////////////////////////////////////////
|
|
|
+
|
|
|
+#define _REQ_CONNECTION_OPTS (_OV_HAS_ITF_NAME | _OV_HAS_SLAVE_ADDR)
|
|
|
+
|
|
|
+#define _REQ_OPTS_UPLOAD_IMG (_OV_HAS_IMG_FILE | _OV_HAS_APP_ADDR | _REQ_CONNECTION_OPTS)
|
|
|
+#define _REQ_OPTS_SHOW_IMG_INFO_OFFLINE _OV_HAS_IMG_FILE
|
|
|
+#define _REQ_OPTS_SHOW_IMG_INFO_ONLINE _REQ_CONNECTION_OPTS
|
|
|
+#define _REQ_OPTS_VALIDATE_IMG (_OV_HAS_IMG_FILE | _OV_HAS_APP_ADDR | _REQ_CONNECTION_OPTS)
|
|
|
+#define _REQ_OPTS_SHOW_MAT_SER _REQ_CONNECTION_OPTS
|
|
|
+#define _REQ_OPTS_SET_MAT_SER _REQ_CONNECTION_OPTS
|
|
|
+#define _REQ_OPTS_BOOT_PING _REQ_CONNECTION_OPTS
|
|
|
+
|
|
|
+/////////////////////////////////////////////////////////////////////////////
|
|
|
+
|
|
|
+#define _OPT_CONNECTION_OPTS (_OV_HAS_BAUD_RATE | _OV_HAS_STATION_NUMBER | _OV_HAS_NODE_ADDR)
|
|
|
+
|
|
|
+#define _OPT_OPTS_UPLOAD_IMG (_OV_HAS_IMG_FILE | _OV_HAS_APP_ADDR | _OPT_CONNECTION_OPTS)
|
|
|
+#define _OPT_OPTS_SHOW_IMG_INFO_OFFLINE _OV_HAS_SLAVE_ADDR
|
|
|
+#define _OPT_OPTS_SHOW_IMG_INFO_ONLINE _OPT_CONNECTION_OPTS
|
|
|
+#define _OPT_OPTS_VALIDATE_IMG _OPT_CONNECTION_OPTS
|
|
|
+#define _OPT_OPTS_SHOW_MAT_SER _OPT_CONNECTION_OPTS
|
|
|
+#define _OPT_OPTS_SET_MAT_SER _OPT_CONNECTION_OPTS
|
|
|
+#define _OPT_OPTS_BOOT_PING (_OPT_CONNECTION_OPTS | _OV_HAS_PING_INTERVAL)
|
|
|
+
|
|
|
+/////////////////////////////////////////////////////////////////////////////
|
|
|
+
|
|
|
+#define _GET_OPTS(m) ((m) & _OV_OPT_MASK)
|
|
|
+#define _GET_CMD(m) ((m) & _OV_CMD_MASK)
|
|
|
+#define _HAS_CMD(m) (!!_GET_CMD(m))
|
|
|
+#define _HAS_VALID_CMD(m) (_HAS_CMD(m) && _IS_POWER_OF_2(_GET_CMD(m)))
|
|
|
+#define _IS_OFFLINE_CMD(m) (_GET_CMD(m) == _OV_HAS_SHOW_FILE_IMG_INFO)
|
|
|
+#define _HAS_REQUIRED_OPTIONS(m, r) ((_GET_OPTS(m) & (r)) == (r))
|
|
|
+#define _GET_MISSING_OPTS(m, r) ((_GET_OPTS(m) ^ (r)) & (r))
|
|
|
+#define _GET_UNUSED_OPTS(m, r, o) ((_GET_OPTS(m) ^ (r)) & ~(o))
|
|
|
+
|
|
|
+/////////////////////////////////////////////////////////////////////////////
|
|
|
+
|
|
|
+#define _OPT_STRING_UPLOAD_IMG "upload-img"
|
|
|
+#define _OPT_STRING_VALIDATE_IMG "validate-img"
|
|
|
+#define _OPT_STRING_SHOW_FILE_IMG_INFO "show-file-img-info"
|
|
|
+#define _OPT_STRING_SHOW_DEV_IMG_INFO "show-dev-img-info"
|
|
|
+#define _OPT_STRING_SHOW_MAT_SER "show-mat-ser"
|
|
|
+#define _OPT_STRING_SET_MATERIAL "set-material"
|
|
|
+#define _OPT_STRING_SET_SERIAL "set-serial"
|
|
|
+#define _OPT_STRING_BOOT_PING "boot-ping"
|
|
|
+#define _OPT_STRING_ITF_NAME "itf-name"
|
|
|
+#define _OPT_STRING_BAUD_RATE "baud-rate"
|
|
|
+#define _OPT_STRING_STATION_NUMBER "stat-num"
|
|
|
+#define _OPT_STRING_NODE_ADDR "node-addr"
|
|
|
+#define _OPT_STRING_SLAVE_ADDR "stat-num or node-addr"
|
|
|
+#define _OPT_STRING_APP_BASE_ADDR "app-addr"
|
|
|
+#define _OPT_STRING_BLOCK_SIZE "block-size"
|
|
|
+#define _OPT_STRING_PING_INTERVAL "ping-int"
|
|
|
+#define _OPT_STRING_VERBOSITY "verbosity"
|
|
|
+#define _OPT_STRING_HELP "help"
|
|
|
+#define _OPT_STRING_IMG_FILE "<IMG FILE>"
|
|
|
+
|
|
|
+#define _MAX_CMD_LENGTH 18
|
|
|
+#define _MAX_OPT_LENGTH 10
|
|
|
+
|
|
|
+/////////////////////////////////////////////////////////////////////////////
|
|
|
+
|
|
|
+int g_nVerbosity = CMD_OPT_DEFAULT_VERBOSITY;
|
|
|
+
|
|
|
+/////////////////////////////////////////////////////////////////////////////
|
|
|
+
|
|
|
+static const uint8_t g_nodeTable[] =
|
|
|
+{
|
|
|
+ // 1 - 99
|
|
|
+ 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A,
|
|
|
+ 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A,
|
|
|
+ 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A,
|
|
|
+ 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A,
|
|
|
+ 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A,
|
|
|
+ 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A,
|
|
|
+ 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A,
|
|
|
+ 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A,
|
|
|
+ 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A,
|
|
|
+ 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9
|
|
|
+};
|
|
|
+
|
|
|
+/////////////////////////////////////////////////////////////////////////////
|
|
|
+
|
|
|
+static const char* _GetOptName(uint32_t nOpt)
|
|
|
+{
|
|
|
+ switch(nOpt)
|
|
|
+ {
|
|
|
+ case _OV_HAS_UPLOAD_IMG:
|
|
|
+ return _OPT_STRING_UPLOAD_IMG;
|
|
|
+ case _OV_HAS_VALIDATE_IMG:
|
|
|
+ return _OPT_STRING_VALIDATE_IMG;
|
|
|
+ case _OV_HAS_SHOW_FILE_IMG_INFO:
|
|
|
+ return _OPT_STRING_SHOW_FILE_IMG_INFO;
|
|
|
+ case _OV_HAS_SHOW_DEV_IMG_INFO:
|
|
|
+ return _OPT_STRING_SHOW_DEV_IMG_INFO;
|
|
|
+ case _OV_HAS_SHOW_MAT_SER:
|
|
|
+ return _OPT_STRING_SHOW_MAT_SER;
|
|
|
+ case _OV_HAS_BOOT_PING:
|
|
|
+ return _OPT_STRING_BOOT_PING;
|
|
|
+ case _OV_HAS_PING_INTERVAL:
|
|
|
+ return _OPT_STRING_PING_INTERVAL;
|
|
|
+ case _OV_HAS_ITF_NAME:
|
|
|
+ return _OPT_STRING_ITF_NAME;
|
|
|
+ case _OV_HAS_BLOCK_SIZE:
|
|
|
+ return _OPT_STRING_BLOCK_SIZE;
|
|
|
+ case _OV_HAS_APP_ADDR:
|
|
|
+ return _OPT_STRING_APP_BASE_ADDR;
|
|
|
+ case _OV_HAS_BAUD_RATE:
|
|
|
+ return _OPT_STRING_BAUD_RATE;
|
|
|
+ case _OV_HAS_STATION_NUMBER:
|
|
|
+ return _OPT_STRING_STATION_NUMBER;
|
|
|
+ case _OV_HAS_NODE_ADDR:
|
|
|
+ return _OPT_STRING_NODE_ADDR;
|
|
|
+ case _OV_HAS_SLAVE_ADDR:
|
|
|
+ return _OPT_STRING_SLAVE_ADDR;
|
|
|
+ case _OV_HAS_SET_MATERIAL:
|
|
|
+ return _OPT_STRING_SET_MATERIAL;
|
|
|
+ case _OV_HAS_SET_SERIAL:
|
|
|
+ return _OPT_STRING_SET_SERIAL;
|
|
|
+ case _OV_HAS_IMG_FILE:
|
|
|
+ return _OPT_STRING_IMG_FILE;
|
|
|
+ default:
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/////////////////////////////////////////////////////////////////////////////
|
|
|
+
|
|
|
+const char* GfaTfuCmdOpt2String(uint32_t nOpts)
|
|
|
+{
|
|
|
+ static char szOptStr[600];
|
|
|
+
|
|
|
+ if(nOpts)
|
|
|
+ {
|
|
|
+ int nCount = 0;
|
|
|
+ uint32_t nMask = 1;
|
|
|
+ memset(szOptStr, '\0', sizeof(szOptStr));
|
|
|
+
|
|
|
+ while(nMask)
|
|
|
+ {
|
|
|
+ if(nOpts & nMask)
|
|
|
+ {
|
|
|
+ const char *pszOptName = _GetOptName(nMask);
|
|
|
+ if(pszOptName)
|
|
|
+ {
|
|
|
+ if(nCount++)
|
|
|
+ strcat(szOptStr, ", ");
|
|
|
+ strcat(szOptStr, pszOptName);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ nMask <<= 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ return szOptStr;
|
|
|
+ }
|
|
|
+
|
|
|
+ return "";
|
|
|
+}
|
|
|
+
|
|
|
+/////////////////////////////////////////////////////////////////////////////
|
|
|
+
|
|
|
+static const struct option g_lo[] =
|
|
|
+{
|
|
|
+ {
|
|
|
+ _OPT_STRING_UPLOAD_IMG,
|
|
|
+ no_argument,
|
|
|
+ NULL,
|
|
|
+ ov_upload_img
|
|
|
+ },
|
|
|
+ {
|
|
|
+ _OPT_STRING_VALIDATE_IMG,
|
|
|
+ no_argument,
|
|
|
+ NULL,
|
|
|
+ ov_validate_img
|
|
|
+ },
|
|
|
+ {
|
|
|
+ _OPT_STRING_SHOW_FILE_IMG_INFO,
|
|
|
+ no_argument,
|
|
|
+ NULL,
|
|
|
+ ov_show_file_img_info
|
|
|
+ },
|
|
|
+ {
|
|
|
+ _OPT_STRING_SHOW_DEV_IMG_INFO,
|
|
|
+ no_argument,
|
|
|
+ NULL,
|
|
|
+ ov_show_dev_img_info
|
|
|
+ },
|
|
|
+ {
|
|
|
+ _OPT_STRING_SHOW_MAT_SER,
|
|
|
+ no_argument,
|
|
|
+ NULL,
|
|
|
+ ov_show_mat_ser
|
|
|
+ },
|
|
|
+ {
|
|
|
+ _OPT_STRING_SET_MATERIAL,
|
|
|
+ optional_argument,
|
|
|
+ NULL,
|
|
|
+ ov_set_material
|
|
|
+ },
|
|
|
+ {
|
|
|
+ _OPT_STRING_SET_SERIAL,
|
|
|
+ optional_argument,
|
|
|
+ NULL,
|
|
|
+ ov_set_serial
|
|
|
+ },
|
|
|
+ {
|
|
|
+ _OPT_STRING_BOOT_PING,
|
|
|
+ no_argument,
|
|
|
+ NULL,
|
|
|
+ ov_boot_ping
|
|
|
+ },
|
|
|
+ {
|
|
|
+ _OPT_STRING_PING_INTERVAL,
|
|
|
+ required_argument,
|
|
|
+ NULL,
|
|
|
+ ov_ping_interval
|
|
|
+ },
|
|
|
+ {
|
|
|
+ _OPT_STRING_ITF_NAME,
|
|
|
+ required_argument,
|
|
|
+ NULL,
|
|
|
+ ov_itf_name
|
|
|
+ },
|
|
|
+ {
|
|
|
+ _OPT_STRING_BAUD_RATE,
|
|
|
+ required_argument,
|
|
|
+ NULL,
|
|
|
+ ov_baud_rate
|
|
|
+ },
|
|
|
+ {
|
|
|
+ _OPT_STRING_STATION_NUMBER,
|
|
|
+ required_argument,
|
|
|
+ NULL,
|
|
|
+ ov_station_number
|
|
|
+ },
|
|
|
+ {
|
|
|
+ _OPT_STRING_NODE_ADDR,
|
|
|
+ required_argument,
|
|
|
+ NULL,
|
|
|
+ ov_node_addr
|
|
|
+ },
|
|
|
+ {
|
|
|
+ _OPT_STRING_APP_BASE_ADDR,
|
|
|
+ required_argument,
|
|
|
+ NULL,
|
|
|
+ ov_app_addr
|
|
|
+ },
|
|
|
+ {
|
|
|
+ _OPT_STRING_BLOCK_SIZE,
|
|
|
+ required_argument,
|
|
|
+ NULL,
|
|
|
+ ov_block_size
|
|
|
+ },
|
|
|
+ {
|
|
|
+ _OPT_STRING_VERBOSITY,
|
|
|
+ required_argument,
|
|
|
+ NULL,
|
|
|
+ ov_verbosity
|
|
|
+ },
|
|
|
+ {
|
|
|
+ _OPT_STRING_HELP,
|
|
|
+ no_argument,
|
|
|
+ NULL,
|
|
|
+ ov_help
|
|
|
+ },
|
|
|
+ {
|
|
|
+ NULL,
|
|
|
+ 0,
|
|
|
+ NULL,
|
|
|
+ 0
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+/////////////////////////////////////////////////////////////////////////////
|
|
|
+
|
|
|
+static int64_t _ArgStr2Num(const char *pszNum, int64_t nDefault)
|
|
|
+{
|
|
|
+ if(pszNum && *pszNum)
|
|
|
+ {
|
|
|
+ char *pszEnd = NULL;
|
|
|
+ int64_t n = strtoll(pszNum, &pszEnd, 0);
|
|
|
+ if((((n == LLONG_MIN) || (n == LLONG_MAX)) && (errno == ERANGE)) || *pszEnd)
|
|
|
+ return nDefault;
|
|
|
+ return n;
|
|
|
+ }
|
|
|
+
|
|
|
+ return nDefault;
|
|
|
+}
|
|
|
+
|
|
|
+/////////////////////////////////////////////////////////////////////////////
|
|
|
+
|
|
|
+void GfaTfuCmdOptInitOpts(LPCMD_LINE_ARGS pcla)
|
|
|
+{
|
|
|
+ memset(pcla, 0, sizeof(CMD_LINE_ARGS));
|
|
|
+ pcla->nBaudrate = CMD_OPT_DEFAULT_BAUDRATE;
|
|
|
+ pcla->nVerbosity = CMD_OPT_DEFAULT_VERBOSITY;
|
|
|
+ pcla->nBlockSize = CMD_OPT_DEFAULT_SEND_BLOCK_SIZE;
|
|
|
+}
|
|
|
+
|
|
|
+/////////////////////////////////////////////////////////////////////////////
|
|
|
+
|
|
|
+int GfaTfuCmdOptParse(int argc, char* argv[], LPCMD_LINE_ARGS pcla)
|
|
|
+{
|
|
|
+ int opt, nCount = 0;
|
|
|
+ pcla->nOptFlags = 0;
|
|
|
+
|
|
|
+ while((opt = getopt_long(argc, argv, "-a:b:v:n:s:i:?", g_lo, NULL)) != -1)
|
|
|
+ {
|
|
|
+ const char *arg = optarg;
|
|
|
+
|
|
|
+ switch(opt)
|
|
|
+ {
|
|
|
+ case ov_img_file:
|
|
|
+ if(arg)
|
|
|
+ {
|
|
|
+ pcla->pszImgFile = arg;
|
|
|
+ pcla->nOptFlags |= _OV_HAS_IMG_FILE;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case ov_itf_name:
|
|
|
+ if(arg)
|
|
|
+ {
|
|
|
+ pcla->pszDevName = arg;
|
|
|
+ pcla->nOptFlags |= _OV_HAS_ITF_NAME;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case ov_show_dev_img_info:
|
|
|
+ pcla->bShowDevImgInfo = true;
|
|
|
+ pcla->nOptFlags |= _OV_HAS_SHOW_DEV_IMG_INFO;
|
|
|
+ break;
|
|
|
+ case ov_show_file_img_info:
|
|
|
+ pcla->bShowFileImgInfo = true;
|
|
|
+ pcla->nOptFlags |= _OV_HAS_SHOW_FILE_IMG_INFO;
|
|
|
+ break;
|
|
|
+ case ov_show_mat_ser:
|
|
|
+ pcla->bShowMatSer = true;
|
|
|
+ pcla->nOptFlags |= _OV_HAS_SHOW_MAT_SER;
|
|
|
+ break;
|
|
|
+ case ov_validate_img:
|
|
|
+ pcla->bValidateImg = true;
|
|
|
+ pcla->nOptFlags |= _OV_HAS_VALIDATE_IMG;
|
|
|
+ break;
|
|
|
+ case ov_upload_img:
|
|
|
+ pcla->bUploadImg = true;
|
|
|
+ pcla->nOptFlags |= _OV_HAS_UPLOAD_IMG;
|
|
|
+ break;
|
|
|
+ case ov_boot_ping:
|
|
|
+ pcla->bPing = true;
|
|
|
+ pcla->nOptFlags |= _OV_HAS_BOOT_PING;
|
|
|
+ break;
|
|
|
+ case ov_ping_interval:
|
|
|
+ pcla->nPingIntervalSec = (int32_t)_ArgStr2Num(arg, 0);
|
|
|
+ if(pcla->nPingIntervalSec > 0)
|
|
|
+ pcla->nOptFlags |= _OV_HAS_PING_INTERVAL;
|
|
|
+ break;
|
|
|
+ case ov_set_material:
|
|
|
+ if(arg)
|
|
|
+ {
|
|
|
+ pcla->pszMaterial = arg;
|
|
|
+ pcla->nOptFlags |= _OV_HAS_SET_MATERIAL;
|
|
|
+ if(pcla->nOptFlags & _OV_HAS_SET_SERIAL)
|
|
|
+ pcla->nOptFlags |= _OV_HAS_SET_MAT_SER;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case ov_set_serial:
|
|
|
+ if(arg)
|
|
|
+ {
|
|
|
+ pcla->pszSerial = arg;
|
|
|
+ pcla->nOptFlags |= _OV_HAS_SET_SERIAL;
|
|
|
+ if(pcla->nOptFlags & _OV_HAS_SET_MATERIAL)
|
|
|
+ pcla->nOptFlags |= _OV_HAS_SET_MAT_SER;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case ov_block_size:
|
|
|
+ pcla->nBlockSize = (uint32_t)_ArgStr2Num(arg, CMD_OPT_DEFAULT_SEND_BLOCK_SIZE);
|
|
|
+ pcla->nOptFlags |= _OV_HAS_BLOCK_SIZE;
|
|
|
+ break;
|
|
|
+ case ov_app_addr:
|
|
|
+ pcla->nStartAddr = (uint32_t)_ArgStr2Num(arg, (uint32_t)-1);
|
|
|
+ pcla->nOptFlags |= _OV_HAS_APP_ADDR;
|
|
|
+ break;
|
|
|
+ case ov_baud_rate:
|
|
|
+ pcla->nBaudrate = (uint32_t)_ArgStr2Num(arg, CMD_OPT_DEFAULT_BAUDRATE);
|
|
|
+ pcla->nOptFlags |= _OV_HAS_BAUD_RATE;
|
|
|
+ break;
|
|
|
+ case ov_station_number:
|
|
|
+ pcla->nStationNr = (uint8_t)_ArgStr2Num(arg, 0);
|
|
|
+ pcla->nOptFlags |= _OV_HAS_STATION_NUMBER;
|
|
|
+ pcla->nOptFlags |= _OV_HAS_SLAVE_ADDR;
|
|
|
+ break;
|
|
|
+ case ov_node_addr:
|
|
|
+ pcla->nNodeAddr = (uint8_t)_ArgStr2Num(arg, 0);
|
|
|
+ pcla->nOptFlags |= _OV_HAS_NODE_ADDR;
|
|
|
+ pcla->nOptFlags |= _OV_HAS_SLAVE_ADDR;
|
|
|
+ break;
|
|
|
+ case ov_verbosity:
|
|
|
+ pcla->nVerbosity = (int)_ArgStr2Num(arg, CMD_OPT_DEFAULT_VERBOSITY);
|
|
|
+ break;
|
|
|
+ case ov_help:
|
|
|
+ pcla->bShowHelp = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ ++nCount;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(nCount == 0)
|
|
|
+ pcla->bShowHelp = true;
|
|
|
+
|
|
|
+ return nCount;
|
|
|
+}
|
|
|
+
|
|
|
+/////////////////////////////////////////////////////////////////////////////
|
|
|
+
|
|
|
+int GfaTfuCmdOptProcess(LPCMD_LINE_ARGS pcla)
|
|
|
+{
|
|
|
+ /////////////////////////////////////////////////////////////////////////
|
|
|
+ // If help is requested, do nothing else
|
|
|
+
|
|
|
+ if(pcla->bShowHelp)
|
|
|
+ return 1;
|
|
|
+
|
|
|
+ /////////////////////////////////////////////////////////////////////////
|
|
|
+ // adjust verbosity
|
|
|
+
|
|
|
+ if(pcla->nVerbosity < CMD_OPT_MIN_VERBOSITY)
|
|
|
+ pcla->nVerbosity = CMD_OPT_MIN_VERBOSITY;
|
|
|
+ else if(pcla->nVerbosity > CMD_OPT_MAX_VERBOSITY)
|
|
|
+ pcla->nVerbosity = CMD_OPT_MAX_VERBOSITY;
|
|
|
+ g_nVerbosity = pcla->nVerbosity;
|
|
|
+
|
|
|
+ /////////////////////////////////////////////////////////////////////////
|
|
|
+ // validate commands
|
|
|
+
|
|
|
+ pcla->nCmdFlags = _GET_CMD(pcla->nOptFlags);
|
|
|
+ if(!_HAS_CMD(pcla->nOptFlags))
|
|
|
+ {
|
|
|
+ if(!(pcla->nOptFlags & (_OV_HAS_SET_MATERIAL | _OV_HAS_SET_SERIAL)))
|
|
|
+ return GFA_FU_ERROR_NOTHING_TO_DO;
|
|
|
+ }
|
|
|
+ else if(!_HAS_VALID_CMD(pcla->nOptFlags))
|
|
|
+ return GFA_FU_ERROR_MULTIPLE_COMMANDS;
|
|
|
+
|
|
|
+ /////////////////////////////////////////////////////////////////////////
|
|
|
+ // validate connection options if required
|
|
|
+
|
|
|
+ if(!_IS_OFFLINE_CMD(pcla->nOptFlags))
|
|
|
+ {
|
|
|
+ if(!GfaSerialIsValidBaudrate(pcla->nBaudrate))
|
|
|
+ return GFA_FU_ERROR_INVALID_BAUDRATE;
|
|
|
+ else if((pcla->nOptFlags & (_OV_HAS_STATION_NUMBER | _OV_HAS_NODE_ADDR)) == (_OV_HAS_STATION_NUMBER | _OV_HAS_NODE_ADDR))
|
|
|
+ return GFA_FU_ERROR_NODE_STATION_MUTEX;
|
|
|
+ else if(pcla->nOptFlags & _OV_HAS_STATION_NUMBER)
|
|
|
+ {
|
|
|
+ if(!_IS_VALID_STATION_NUMBER(pcla->nStationNr))
|
|
|
+ return GFA_FU_ERROR_INVALID_STATION_NUM;
|
|
|
+ pcla->nNodeAddr = g_nodeTable[pcla->nStationNr - 1];
|
|
|
+ }
|
|
|
+ else if((pcla->nOptFlags & _OV_HAS_NODE_ADDR) && (NODE_IS_MULTICAST(pcla->nNodeAddr) || (pcla->nNodeAddr < MINET_MIN_NODE_ADDRESS)))
|
|
|
+ return GFA_FU_ERROR_INVALID_NODE_ADDR;
|
|
|
+ }
|
|
|
+
|
|
|
+ /////////////////////////////////////////////////////////////////////////
|
|
|
+ // validate command options
|
|
|
+
|
|
|
+ switch(pcla->nCmdFlags)
|
|
|
+ {
|
|
|
+ case _OV_HAS_UPLOAD_IMG:
|
|
|
+ if(!_HAS_REQUIRED_OPTIONS(pcla->nOptFlags, _REQ_OPTS_UPLOAD_IMG))
|
|
|
+ {
|
|
|
+ pcla->nMissingOptFlags = _GET_MISSING_OPTS(pcla->nOptFlags, _REQ_OPTS_UPLOAD_IMG);
|
|
|
+ return GFA_FU_ERROR_MISSING_COMMAND_OPT;
|
|
|
+ }
|
|
|
+ else if((pcla->nOptFlags & _OV_HAS_BLOCK_SIZE) && !_IS_VALID_BLOCK_SIZE(pcla->nBlockSize))
|
|
|
+ return GFA_FU_ERROR_INVALID_BLOCK_SIZE;
|
|
|
+ else if(pcla->nStartAddr == (uint32_t)-1)
|
|
|
+ return GFA_FU_ERROR_INVALID_APP_START_ADDR;
|
|
|
+ pcla->nUnusedOptFlags = _GET_UNUSED_OPTS(pcla->nOptFlags, _REQ_OPTS_UPLOAD_IMG, _OPT_OPTS_UPLOAD_IMG);
|
|
|
+ pcla->bNeedImgFile = true;
|
|
|
+ break;
|
|
|
+ case _OV_HAS_SHOW_FILE_IMG_INFO:
|
|
|
+ if(!_HAS_REQUIRED_OPTIONS(pcla->nOptFlags, _REQ_OPTS_SHOW_IMG_INFO_OFFLINE))
|
|
|
+ {
|
|
|
+ pcla->nMissingOptFlags = _GET_MISSING_OPTS(pcla->nOptFlags, _REQ_OPTS_SHOW_IMG_INFO_OFFLINE);
|
|
|
+ pcla->bIsOffline = true;
|
|
|
+ return GFA_FU_ERROR_MISSING_COMMAND_OPT;
|
|
|
+ }
|
|
|
+ pcla->nUnusedOptFlags = _GET_UNUSED_OPTS(pcla->nOptFlags, _REQ_OPTS_SHOW_IMG_INFO_OFFLINE, _OPT_OPTS_SHOW_IMG_INFO_OFFLINE);
|
|
|
+ pcla->bNeedImgFile = true;
|
|
|
+ break;
|
|
|
+ case _OV_HAS_SHOW_DEV_IMG_INFO:
|
|
|
+ if(!_HAS_REQUIRED_OPTIONS(pcla->nOptFlags, _REQ_OPTS_SHOW_IMG_INFO_ONLINE))
|
|
|
+ {
|
|
|
+ pcla->nMissingOptFlags = _GET_MISSING_OPTS(pcla->nOptFlags, _REQ_OPTS_SHOW_IMG_INFO_ONLINE);
|
|
|
+ return GFA_FU_ERROR_MISSING_COMMAND_OPT;
|
|
|
+ }
|
|
|
+ pcla->nUnusedOptFlags = _GET_UNUSED_OPTS(pcla->nOptFlags, _REQ_OPTS_SHOW_IMG_INFO_ONLINE, _OPT_OPTS_SHOW_IMG_INFO_ONLINE);
|
|
|
+ break;
|
|
|
+ case _OV_HAS_VALIDATE_IMG:
|
|
|
+ if(!_HAS_REQUIRED_OPTIONS(pcla->nOptFlags, _REQ_OPTS_VALIDATE_IMG))
|
|
|
+ {
|
|
|
+ pcla->nMissingOptFlags = _GET_MISSING_OPTS(pcla->nOptFlags, _REQ_OPTS_VALIDATE_IMG);
|
|
|
+ return GFA_FU_ERROR_MISSING_COMMAND_OPT;
|
|
|
+ }
|
|
|
+ pcla->nUnusedOptFlags = _GET_UNUSED_OPTS(pcla->nOptFlags, _REQ_OPTS_VALIDATE_IMG, _OPT_OPTS_VALIDATE_IMG);
|
|
|
+ pcla->bNeedImgFile = true;
|
|
|
+ break;
|
|
|
+ case _OV_HAS_SHOW_MAT_SER:
|
|
|
+ if(!_HAS_REQUIRED_OPTIONS(pcla->nOptFlags, _REQ_OPTS_SHOW_MAT_SER))
|
|
|
+ {
|
|
|
+ pcla->nMissingOptFlags = _GET_MISSING_OPTS(pcla->nOptFlags, _REQ_OPTS_SHOW_MAT_SER);
|
|
|
+ return GFA_FU_ERROR_MISSING_COMMAND_OPT;
|
|
|
+ }
|
|
|
+ pcla->nUnusedOptFlags = _GET_UNUSED_OPTS(pcla->nOptFlags, _REQ_OPTS_SHOW_MAT_SER, _OPT_OPTS_SHOW_MAT_SER);
|
|
|
+ break;
|
|
|
+ case _OV_HAS_SET_MAT_SER:
|
|
|
+ if(!_HAS_REQUIRED_OPTIONS(pcla->nOptFlags, _REQ_OPTS_SET_MAT_SER))
|
|
|
+ {
|
|
|
+ pcla->nMissingOptFlags = _GET_MISSING_OPTS(pcla->nOptFlags, _REQ_OPTS_SET_MAT_SER);
|
|
|
+ return GFA_FU_ERROR_MISSING_COMMAND_OPT;
|
|
|
+ }
|
|
|
+ pcla->nUnusedOptFlags = _GET_UNUSED_OPTS(pcla->nOptFlags, _REQ_OPTS_SET_MAT_SER, _OPT_OPTS_SET_MAT_SER);
|
|
|
+ break;
|
|
|
+ case _OV_HAS_BOOT_PING:
|
|
|
+ if(!_HAS_REQUIRED_OPTIONS(pcla->nOptFlags, _REQ_OPTS_BOOT_PING))
|
|
|
+ {
|
|
|
+ pcla->nMissingOptFlags = _GET_MISSING_OPTS(pcla->nOptFlags, _REQ_OPTS_BOOT_PING);
|
|
|
+ return GFA_FU_ERROR_MISSING_COMMAND_OPT;
|
|
|
+ }
|
|
|
+ else if(pcla->nPingIntervalSec < 0)
|
|
|
+ return GFA_FU_ERROR_INVALID_COMMAND_OPT;
|
|
|
+ pcla->nUnusedOptFlags = _GET_UNUSED_OPTS(pcla->nOptFlags, _REQ_OPTS_BOOT_PING, _OPT_OPTS_BOOT_PING);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ if(pcla->nOptFlags & (_OV_HAS_SET_MATERIAL | _OV_HAS_SET_SERIAL))
|
|
|
+ return GFA_FU_ERROR_MAT_OR_SER_MISSING;
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+#if 0
|
|
|
+static void _PrintOptionLine(const char *pszOpt, int nMaxOptLen, char cShortOpt, const char *pszDesc)
|
|
|
+{
|
|
|
+ char szOptBuf[256];
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
+/////////////////////////////////////////////////////////////////////////////
|
|
|
+// Examples:
|
|
|
+//
|
|
|
+// ./gfativaflashutil --upload-img --itf-name="/dev/ttyO4" --baud-rate=115200 --app-addr=0x2000 --stat-num=1 "/opt/GfA/gfativaflashutil/OLS-1V1_0009_crc.bin"
|
|
|
+// ./gfativaflashutil --validate-img --itf-name="/dev/ttyO4" --app-addr=0x2000 --node-addr=0x11 "/opt/GfA/gfativaflashutil/OLS-1V1_0009_crc.bin"
|
|
|
+// ./gfativaflashutil --show-mat-ser --itf-name="/dev/ttyO4" --stat-num=1
|
|
|
+// ./gfativaflashutil --set-material="" --set-serial="" --itf-name="/dev/ttyO4" --baud-rate=115200 --node-addr=0x11
|
|
|
+// ./gfativaflashutil --show-file-img-info "/opt/GfA/gfativaflashutil/OLS-1V1_0009_crc.bin"
|
|
|
+// ./gfativaflashutil --show-dev-img-info --itf-name="/dev/ttyO4" --baud-rate=115200 --node-addr=0x11
|
|
|
+// ./gfativaflashutil --boot-ping --ping-int=2 --itf-name="/dev/ttyO4" --baud-rate=115200 --node-addr=0x11 --stat-num=1
|
|
|
+//
|
|
|
+
|
|
|
+void GfaTfuCmdOptDisplayHelp(void)
|
|
|
+{
|
|
|
+ printf("gfativaflashutil v%d.%d GfA GmbH (%s %s)\n\n", GFA_FU_VER_MAJOR, GFA_FU_VER_MINOR, __DATE__, __TIME__);
|
|
|
+ printf(" Usage: gfativaflashutil COMMAND [OPTIONS] [IMG FILE]\n\n");
|
|
|
+ printf(" COMMANDS (only one at a time can be executed):\n");
|
|
|
+ printf(" --%-*s Upload <IMG FILE> to the device.\n", _MAX_CMD_LENGTH, _OPT_STRING_UPLOAD_IMG);
|
|
|
+ printf(" --%-*s Validate <IMG FILE> with the device. (Attempts to\n", _MAX_CMD_LENGTH, _OPT_STRING_VALIDATE_IMG);
|
|
|
+ printf(" %-*s match the material numbers as well).\n", _MAX_CMD_LENGTH, "");
|
|
|
+ printf(" --%-*s Validate <IMG FILE> offline and display image\n", _MAX_CMD_LENGTH, _OPT_STRING_SHOW_FILE_IMG_INFO);
|
|
|
+ printf(" %-*s information.\n", _MAX_CMD_LENGTH, "");
|
|
|
+ printf(" --%-*s Display bootloader and (if available) application\n", _MAX_CMD_LENGTH, _OPT_STRING_SHOW_DEV_IMG_INFO);
|
|
|
+ printf(" %-*s image information of the target device.\n", _MAX_CMD_LENGTH, "");
|
|
|
+ printf(" --%-*s Display the material and serial number of the\n", _MAX_CMD_LENGTH, _OPT_STRING_SHOW_MAT_SER);
|
|
|
+ printf(" %-*s target device.\n", _MAX_CMD_LENGTH, "");
|
|
|
+ printf(" --%-*s Set the material number of the target device. This\n", _MAX_CMD_LENGTH, _OPT_STRING_SET_MATERIAL);
|
|
|
+ printf(" %-*s command works only in combination with --%s.\n", _MAX_CMD_LENGTH, "", _OPT_STRING_SET_SERIAL);
|
|
|
+ printf(" --%-*s Set the serial number of the target device. This\n", _MAX_CMD_LENGTH, _OPT_STRING_SET_SERIAL);
|
|
|
+ printf(" %-*s command works only in combination with --%s.\n", _MAX_CMD_LENGTH, "", _OPT_STRING_SET_MATERIAL);
|
|
|
+ printf(" --%-*s Ping the target device either once or continually\n", _MAX_CMD_LENGTH, _OPT_STRING_BOOT_PING);
|
|
|
+ printf(" %-*s dependig on the parameter --%s.\n\n", _MAX_CMD_LENGTH, "", _OPT_STRING_PING_INTERVAL);
|
|
|
+ printf(" OPTIONS:\n");
|
|
|
+ printf(" --%-*s -d <INTERFACE> The name of the communication interface.\n", _MAX_OPT_LENGTH, _OPT_STRING_ITF_NAME);
|
|
|
+ printf(" --%-*s -s <STATION NUM> Station number. Will be mapped internally\n", _MAX_OPT_LENGTH, _OPT_STRING_STATION_NUMBER);
|
|
|
+ printf(" %-*s to a node address. Must not be used in\n", _MAX_OPT_LENGTH, "");
|
|
|
+ printf(" %-*s combination with --%s.\n", _MAX_OPT_LENGTH, "", _OPT_STRING_NODE_ADDR);
|
|
|
+ printf(" --%-*s -n <NODE ADDR> The target's node address. Must not be used\n", _MAX_OPT_LENGTH, _OPT_STRING_NODE_ADDR);
|
|
|
+ printf(" %-*s in combination with --%s.\n", _MAX_OPT_LENGTH, "", _OPT_STRING_STATION_NUMBER);
|
|
|
+ printf(" --%-*s -b <BAUDRATE> Baud-rate to use for some (but not all)\n", _MAX_OPT_LENGTH, _OPT_STRING_BAUD_RATE);
|
|
|
+ printf(" %-*s commands. Because a baud-rate switch\n", _MAX_OPT_LENGTH, "");
|
|
|
+ printf(" %-*s involves data transfer as well, it will\n", _MAX_OPT_LENGTH, "");
|
|
|
+ printf(" %-*s only be used with commands that require big\n", _MAX_OPT_LENGTH, "");
|
|
|
+ printf(" %-*s amounts of data to be transferred!\n", _MAX_OPT_LENGTH, "");
|
|
|
+ printf(" --%-*s -a <BASE ADDR> Flash address where to load <IMG FILE>.\n", _MAX_OPT_LENGTH, _OPT_STRING_APP_BASE_ADDR);
|
|
|
+ printf(" --%-*s -p <BLOCK SIZE> Size of an upload-block (4-76, must be a\n", _MAX_OPT_LENGTH, _OPT_STRING_BLOCK_SIZE);
|
|
|
+ printf(" %-*s multiple of 4!). This option is only used\n", _MAX_OPT_LENGTH, "");
|
|
|
+ printf(" %-*s with the --%s command. Defaults to %d.\n", _MAX_OPT_LENGTH, "", _OPT_STRING_UPLOAD_IMG, CMD_OPT_DEFAULT_SEND_BLOCK_SIZE);
|
|
|
+ printf(" --%-*s -i <SECONDS> The optional ping interval in seconds. If a\n", _MAX_OPT_LENGTH, _OPT_STRING_PING_INTERVAL);
|
|
|
+ printf(" %-*s value greater than 0 is provided, a ping will\n", _MAX_OPT_LENGTH, "");
|
|
|
+ printf(" %-*s be made every <SECONDS> seconds. If the value\n", _MAX_OPT_LENGTH, "");
|
|
|
+ printf(" %-*s is 0 (the default), only one ping will be\n", _MAX_OPT_LENGTH, "");
|
|
|
+ printf(" %-*s executed before the application exits.\n", _MAX_OPT_LENGTH, "");
|
|
|
+ printf(" --%-*s -v <0-4> Verbosity. 0 = quiet, 1 = error, 2 = info,\n", _MAX_OPT_LENGTH, _OPT_STRING_VERBOSITY);
|
|
|
+ printf(" %-*s 3 = status, 4 = debug.\n", _MAX_OPT_LENGTH, "");
|
|
|
+ printf(" --%-*s -? Show this help\n", _MAX_OPT_LENGTH, _OPT_STRING_HELP);
|
|
|
+ printf("\n");
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ printf(" %-*s \n", _MAX_CMD_LENGTH, "");
|
|
|
+ printf(" %-*s \n", _MAX_OPT_LENGTH, "");
|
|
|
+*/
|