in common/recipes-core/asd_1.4.7/files/daemon/asd_main.c [86:290]
bool process_command_line(int argc, char** argv, asd_args* args)
{
int c = 0;
opterr = 0; // prevent getopt_long from printing shell messages
uint8_t bus_counter = 0; // Up to 4 buses
// Set Default argument values.
args->busopt.enable_i2c = DEFAULT_I2C_ENABLE;
args->busopt.enable_i3c = DEFAULT_I3C_ENABLE;
args->busopt.bus = DEFAULT_I2C_BUS;
args->use_syslog = DEFAULT_LOG_TO_SYSLOG;
args->log_level = DEFAULT_LOG_LEVEL;
args->log_streams = DEFAULT_LOG_STREAMS;
args->session.n_port_number = DEFAULT_PORT;
args->session.cp_certkeyfile = DEFAULT_CERT_FILE;
args->session.cp_net_bind_device = NULL;
args->session.e_extnet_type = EXTNET_HDLR_NON_ENCRYPT;
args->session.e_auth_type = AUTH_HDLR_NONE;
args->xdp_fail_enable = DEFAULT_XDP_FAIL_ENABLE;
args->force_jtag_hw = DEFAULT_FORCE_JTAG_HW;
args->msg_flow = DEFAULT_JTAG_FLOW;
args->fru = DEFAULT_FRU;
enum
{
ARG_LOG_LEVEL = 256,
ARG_LOG_STREAMS,
ARG_HELP,
ARG_XDP
};
struct option opts[] = {
{"xdp-ignore", 0, NULL, ARG_XDP},
{"log-level", 1, NULL, ARG_LOG_LEVEL},
{"log-streams", 1, NULL, ARG_LOG_STREAMS},
{"help", 0, NULL, ARG_HELP},
{NULL, 0, NULL, 0},
};
while ((c = getopt_long(argc, argv, "p:uk:n:si:c:f:j:m", opts, NULL)) != -1)
{
switch (c)
{
case 'f':
{
uint8_t fru = (uint8_t)strtol(optarg, NULL, 10);
args->fru = fru;
break;
}
case 'j':
{
args->msg_flow = (uint8_t)strtol(optarg, NULL, 10);
break;
}
case 'm':
{
args->force_jtag_hw = true;
break;
}
case 'p':
{
uint16_t port = (uint16_t)strtol(optarg, NULL, 10);
fprintf(stderr, "Setting Port: %d\n", port);
args->session.n_port_number = port;
break;
}
case 's':
{
args->use_syslog = true;
break;
}
case 'u':
{
args->session.e_extnet_type = EXTNET_HDLR_NON_ENCRYPT;
args->session.e_auth_type = AUTH_HDLR_NONE;
break;
}
case 'k':
{
args->session.cp_certkeyfile = optarg;
break;
}
case 'n':
{
args->session.cp_net_bind_device = optarg;
break;
}
case 'i':
{
char* pch;
uint8_t bus;
bool first_i2c = true;
char* endptr;
args->busopt.enable_i2c = true;
pch = strtok(optarg, ",");
while (pch != NULL)
{
errno = 0;
bus = (uint8_t)strtol(pch, &endptr, 10);
if ((errno == ERANGE) || (endptr == pch))
{
fprintf(stderr, "Wrong I2C bus list arguments(-i)\n");
break;
}
if (bus_counter >= MAX_IxC_BUSES)
{
fprintf(stderr, "Discard I2C bus: %d\n", bus);
}
else
{
if (first_i2c)
{
args->busopt.bus = bus;
first_i2c = false;
}
fprintf(stderr, "Enabling I2C bus: %d\n", bus);
args->busopt.bus_config_type[bus_counter] =
BUS_CONFIG_I2C;
args->busopt.bus_config_map[bus_counter] = bus;
}
pch = strtok(NULL, ",");
bus_counter++;
}
break;
}
case 'c':
{
char* pch;
uint8_t bus;
bool first_i3c = true;
char* endptr;
args->busopt.enable_i3c = true;
pch = strtok(optarg, ",");
while (pch != NULL)
{
errno = 0;
bus = (uint8_t)strtol(pch, &endptr, 10);
if ((errno == ERANGE) || (endptr == pch))
{
fprintf(stderr, "Wrong I3C bus list arguments(-c)\n");
break;
}
if (bus_counter >= MAX_IxC_BUSES)
{
fprintf(stderr, "Discard I3C bus: %d\n", bus);
}
else
{
if (first_i3c)
{
args->busopt.bus = bus;
first_i3c = false;
}
fprintf(stderr, "Enabling I3C bus: %d\n", bus);
args->busopt.bus_config_type[bus_counter] =
BUS_CONFIG_I3C;
args->busopt.bus_config_map[bus_counter] = bus;
}
pch = strtok(NULL, ",");
bus_counter++;
}
break;
}
case ARG_XDP:
{
args->xdp_fail_enable = false;
fprintf(stderr, "Ignore XDP presence\n");
break;
}
case ARG_LOG_LEVEL:
{
if (!strtolevel(optarg, &args->log_level))
{
showUsage(argv);
return false;
}
break;
}
case ARG_LOG_STREAMS:
{
if (!strtostreams(optarg, &args->log_streams))
{
showUsage(argv);
return false;
}
break;
}
case ARG_HELP:
default:
{
showUsage(argv);
return false;
}
}
}
fprintf(stderr, "ASD ver: %s\n", asd_version);
fprintf(stderr, "Setting Port: %d, FRU: %d\n", args->session.n_port_number, args->fru);
fprintf(stderr, "Msg Flow: %d\n", args->msg_flow);
fprintf(stderr, "Log level: %s\n", ASD_LogLevelString[args->log_level]);
if (args->force_jtag_hw)
fprintf(stderr, "Force JTAG driver in HW mode\n");
return true;
}