android_mt6572_jiabo/hardware/ti/wlan/mac80211/ti-utils/misc_cmds.c
2025-09-05 16:56:03 +08:00

323 lines
6.3 KiB
C

#include <stdbool.h>
#include <errno.h>
#include <net/if.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include "calibrator.h"
#include "plt.h"
#include "ini.h"
#include "nvs.h"
SECTION(get);
SECTION(set);
static int get_nvs_mac(struct nl80211_state *state, struct nl_cb *cb,
struct nl_msg *msg, int argc, char **argv)
{
unsigned char mac_buff[12];
char *fname;
int fd;
argc -= 2;
argv += 2;
fname = get_opt_nvsinfile(argc, argv);
if (!fname)
return 1;
fd = open(fname, O_RDONLY);
if (fd < 0) {
perror("Error opening file for reading");
return 1;
}
read(fd, mac_buff, 12);
printf("MAC addr from NVS: %02x:%02x:%02x:%02x:%02x:%02x\n",
mac_buff[11], mac_buff[10], mac_buff[6],
mac_buff[5], mac_buff[4], mac_buff[3]);
close(fd);
return 0;
}
COMMAND(get, nvs_mac, "[<nvs filename>]", 0, 0, CIB_NONE, get_nvs_mac,
"Get MAC addr from NVS file (offline)");
/*
* Sets MAC address in NVS.
* The default value for MAC is random where 1 byte zero.
*/
static int set_nvs_mac(struct nl80211_state *state, struct nl_cb *cb,
struct nl_msg *msg, int argc, char **argv)
{
argc -= 2;
argv += 2;
if ((argc != 2) || (strlen(argv[1]) != 17))
return 1;
nvs_set_mac(argv[0], argv[1]);
return 0;
}
COMMAND(set, nvs_mac, "<nvs file> <mac addr>", 0, 0, CIB_NONE, set_nvs_mac,
"Set MAC addr in NVS file (offline), like XX:XX:XX:XX:XX:XX");
static int set_ref_nvs(struct nl80211_state *state, struct nl_cb *cb,
struct nl_msg *msg, int argc, char **argv)
{
struct wl12xx_common cmn = {
.arch = UNKNOWN_ARCH,
.parse_ops = NULL
};
argc -= 2;
argv += 2;
if (argc < 1 || argc > 2)
return 1;
if (read_ini(*argv, &cmn)) {
fprintf(stderr, "Fail to read ini file\n");
return 1;
}
argv++;
argc--;
cfg_nvs_ops(&cmn);
cmn.nvs_name = get_opt_nvsoutfile(argc, argv);
if (create_nvs_file(&cmn)) {
fprintf(stderr, "Fail to create reference NVS file\n");
return 1;
}
printf("%04X", cmn.arch);
return 0;
}
COMMAND(set, ref_nvs, "<ini file> [<nvs file>]", 0, 0, CIB_NONE, set_ref_nvs,
"Create reference NVS file");
static int set_upd_nvs(struct nl80211_state *state, struct nl_cb *cb,
struct nl_msg *msg, int argc, char **argv)
{
char *infname = NULL, *outfname = NULL;
struct wl12xx_common cmn = {
.arch = UNKNOWN_ARCH,
.parse_ops = NULL
};
argc -= 2;
argv += 2;
if (argc < 1)
return 1;
if (read_ini(*argv, &cmn)) {
fprintf(stderr, "Fail to read ini file\n");
return 1;
}
argc--;
argv++;
infname = get_opt_nvsinfile(argc, argv);
if (!infname)
return 1;
if (argc) {
argc--;
argv++;
}
outfname = get_opt_nvsoutfile(argc, argv);
if (!outfname)
return 1;
cfg_nvs_ops(&cmn);
if (update_nvs_file(infname, outfname, &cmn)) {
fprintf(stderr, "Fail to update NVS file\n");
return 1;
}
#if 0
printf("\n\tThe updated NVS file (%s) is ready\n\tCopy it to %s and "
"reboot the system\n\n", NEW_NVS_NAME, CURRENT_NVS_NAME);
#endif
return 0;
}
COMMAND(set, upd_nvs, "<ini file> [<nvs infile>] [<nvs_outfile>]", 0, 0, CIB_NONE, set_upd_nvs,
"Update values of a NVS from INI file");
static int get_dump_nvs(struct nl80211_state *state, struct nl_cb *cb,
struct nl_msg *msg, int argc, char **argv)
{
char *fname = NULL;
argc -= 2;
argv += 2;
fname = get_opt_nvsinfile(argc, argv);
if (!fname)
return 1;
if (dump_nvs_file(fname)) {
fprintf(stderr, "Fail to dump NVS file\n");
return 1;
}
return 0;
}
COMMAND(get, dump_nvs, "[<nvs file>]", 0, 0, CIB_NONE, get_dump_nvs,
"Dump NVS file, specified by option or current");
static int get_info_nvs(struct nl80211_state *state, struct nl_cb *cb,
struct nl_msg *msg, int argc, char **argv)
{
char *fname;
argc -= 2;
argv += 2;
fname = get_opt_nvsinfile(argc, argv);
if(!fname)
return 1;
if (info_nvs_file(fname)) {
fprintf(stderr, "Fail to read info from NVS file\n");
return 1;
}
return 0;
}
COMMAND(get, info_nvs, "[<nvs file>]", 0, 0, CIB_NONE, get_info_nvs,
"Print information from nvs file");
static int set_autofem(struct nl80211_state *state, struct nl_cb *cb,
struct nl_msg *msg, int argc, char **argv)
{
char *fname = NULL;
int res;
unsigned int val;
struct wl12xx_common cmn = {
.arch = UNKNOWN_ARCH,
.parse_ops = NULL
};
argc -= 2;
argv += 2;
if (argc < 1) {
fprintf(stderr, "Missing argument\n");
return 2;
}
res = sscanf(argv[0], "%x", &val);
if (res != 1 || val > 1) {
fprintf(stderr, "Invalid argument\n");
return 1;
}
argv++;
argc--;
fname = get_opt_nvsinfile(argc, argv);
if (set_nvs_file_autofem(fname, val, &cmn)) {
fprintf(stderr, "Fail to set AutoFEM\n");
return 1;
}
return 0;
}
COMMAND(set, autofem, "<0-manual|1-auto> [<nvs file>]", 0, 0, CIB_NONE, set_autofem,
"Set Auto FEM detection, where 0 - manual, 1 - auto detection");
static int set_fem_manuf(struct nl80211_state *state, struct nl_cb *cb,
struct nl_msg *msg, int argc, char **argv)
{
char *fname = NULL;
int res;
unsigned int val;
struct wl12xx_common cmn = {
.arch = UNKNOWN_ARCH,
.parse_ops = NULL
};
argc -= 2;
argv += 2;
if (argc < 1) {
fprintf(stderr, "Missing argument\n");
return 2;
}
res = sscanf(argv[0], "%x", &val);
if(res != 1 || val >= WL1271_INI_FEM_MODULE_COUNT) {
fprintf(stderr, "Invalid argument\n");
return 1;
}
argv++;
argc--;
fname = get_opt_nvsinfile(argc, argv);
if (set_nvs_file_fem_manuf(fname, val, &cmn)) {
fprintf(stderr, "Fail to set AutoFEM\n");
return 1;
}
return 0;
}
COMMAND(set, fem_manuf, "<0|1> [<nvs file>]", 0, 0, CIB_NONE, set_fem_manuf,
"Set FEM manufacturer");
static int get_drv_info(struct nl80211_state *state, struct nl_cb *cb,
struct nl_msg *msg, int argc, char **argv)
{
argc -= 2;
argv += 2;
if (argc < 1) {
fprintf(stderr, "Missing argument (device name)\n");
return 2;
}
return do_get_drv_info(argv[0], NULL);
}
COMMAND(get, drv_info, "<device name>", 0, 0, CIB_NONE, get_drv_info,
"Get driver information: PG version");
static int get_hw_version(struct nl80211_state *state, struct nl_cb *cb,
struct nl_msg *msg, int argc, char **argv)
{
int ret, chip_id = 0;
argc -= 2;
argv += 2;
if (argc < 1) {
fprintf(stderr, "Missing argument (device name)\n");
return 2;
}
ret = do_get_drv_info(argv[0], &chip_id);
if (!ret)
printf("%08X\n", chip_id);
return ret;
}
COMMAND(get, hw_version, "<device name>", 0, 0, CIB_NONE, get_hw_version,
"Get HW version (chip id)");