aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2019-02-24 23:04:45 +0100
committerKévin Redon <kredon@sysmocom.de>2019-02-27 13:44:28 +0000
commit1b9a5b81253e0fc147b1b8942704fecfe1c860d6 (patch)
treeb5e15999a62407325a57af752ef80f590a6d5be2
parentff9f4ceca9500eb23bb1def8d67ff31bc99d0dae (diff)
Add various SIM card related debug command
this allows commands like sim-status 0 # read the status sim-voltage 0 5 # set voltage to 5V sim-clkdiv 0 2 # set clock-divider to 2 (10 MHz) sim-reset 0 0 # disable reset sim-power 0 1 # enable power Change-Id: Id6131be60d37cba769c79952fa44f3ec6c976a38
-rw-r--r--sysmoOCTSIM/main.c165
-rw-r--r--sysmoOCTSIM/ncn8025.c27
-rw-r--r--sysmoOCTSIM/ncn8025.h1
3 files changed, 193 insertions, 0 deletions
diff --git a/sysmoOCTSIM/main.c b/sysmoOCTSIM/main.c
index ef87162..dc67406 100644
--- a/sysmoOCTSIM/main.c
+++ b/sysmoOCTSIM/main.c
@@ -16,6 +16,8 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
+#include <stdlib.h>
+#include <stdio.h>
#include <parts.h>
#include <hal_cache.h>
#include <hri_port_e54.h>
@@ -55,6 +57,163 @@ DEFUN(hello_fn, cmd_hello,
printf("Hello World!\r\n");
}
+static int validate_slotnr(int argc, char **argv, int idx)
+{
+ int slotnr;
+ if (argc < idx+1) {
+ printf("You have to specify the slot number (0..7)\r\n");
+ return -1;
+ }
+ slotnr = atoi(argv[idx]);
+ if (slotnr < 0 || slotnr > 7) {
+ printf("You have to specify the slot number (0..7)\r\n");
+ return -1;
+ }
+ return slotnr;
+}
+
+DEFUN(sim_status, cmd_sim_status, "sim-status", "Get state of specified NCN8025")
+{
+ struct ncn8025_settings settings;
+ int slotnr = validate_slotnr(argc, argv, 1);
+ if (slotnr < 0)
+ return;
+ ncn8025_get(slotnr, &settings);
+ printf("SIM%d: ", slotnr);
+ ncn8025_dump(&settings);
+ printf("\r\n");
+}
+
+DEFUN(sim_power, cmd_sim_power, "sim-power", "Enable/disable SIM card power")
+{
+ struct ncn8025_settings settings;
+ int slotnr = validate_slotnr(argc, argv, 1);
+ int enable;
+
+ if (slotnr < 0)
+ return;
+
+ if (argc < 3) {
+ printf("You have to specify 0=disable or 1=enable\r\n");
+ return;
+ }
+ enable = atoi(argv[2]);
+ ncn8025_get(slotnr, &settings);
+ if (enable)
+ settings.cmdvcc = true;
+ else
+ settings.cmdvcc = false;
+ ncn8025_set(slotnr, &settings);
+}
+
+DEFUN(sim_reset, cmd_sim_reset, "sim-reset", "Enable/disable SIM reset")
+{
+ struct ncn8025_settings settings;
+ int slotnr = validate_slotnr(argc, argv, 1);
+ int enable;
+
+ if (slotnr < 0)
+ return;
+
+ if (argc < 3) {
+ printf("You have to specify 0=disable or 1=enable\r\n");
+ return;
+ }
+ enable = atoi(argv[2]);
+ ncn8025_get(slotnr, &settings);
+ if (enable)
+ settings.rstin = true;
+ else
+ settings.rstin = false;
+ ncn8025_set(slotnr, &settings);
+}
+
+DEFUN(sim_clkdiv, cmd_sim_clkdiv, "sim-clkdiv", "Set SIM clock divider (1,2,4,8)")
+{
+ struct ncn8025_settings settings;
+ int slotnr = validate_slotnr(argc, argv, 1);
+ int clkdiv;
+
+ if (slotnr < 0)
+ return;
+
+ if (argc < 3) {
+ printf("You have to specify a valid divider (1,2,4,8)\r\n");
+ return;
+ }
+ clkdiv = atoi(argv[2]);
+ if (clkdiv != 1 && clkdiv != 2 && clkdiv != 4 && clkdiv != 8) {
+ printf("You have to specify a valid divider (1,2,4,8)\r\n");
+ return;
+ }
+ ncn8025_get(slotnr, &settings);
+ switch (clkdiv) {
+ case 1:
+ settings.clkdiv = SIM_CLKDIV_1;
+ break;
+ case 2:
+ settings.clkdiv = SIM_CLKDIV_2;
+ break;
+ case 4:
+ settings.clkdiv = SIM_CLKDIV_4;
+ break;
+ case 8:
+ settings.clkdiv = SIM_CLKDIV_8;
+ break;
+ }
+ ncn8025_set(slotnr, &settings);
+}
+
+DEFUN(sim_voltage, cmd_sim_voltage, "sim-voltage", "Set SIM voltage (5/3/1.8)")
+{
+ struct ncn8025_settings settings;
+ int slotnr = validate_slotnr(argc, argv, 1);
+
+ if (slotnr < 0)
+ return;
+
+ if (argc < 3) {
+ printf("You have to specify a valid voltage (5/3/1.8)\r\n");
+ return;
+ }
+ ncn8025_get(slotnr, &settings);
+ if (!strcmp(argv[2], "5"))
+ settings.vsel = SIM_VOLT_5V0;
+ else if (!strcmp(argv[2], "3"))
+ settings.vsel = SIM_VOLT_3V0;
+ else if (!strcmp(argv[2], "1.8"))
+ settings.vsel = SIM_VOLT_1V8;
+ else {
+ printf("You have to specify a valid voltage (5/3/1.8)\r\n");
+ return;
+ }
+ ncn8025_set(slotnr, &settings);
+}
+
+DEFUN(sim_led, cmd_sim_led, "sim-led", "Set SIM LED (1=on, 0=off)")
+{
+ struct ncn8025_settings settings;
+ int slotnr = validate_slotnr(argc, argv, 1);
+
+ if (slotnr < 0)
+ return;
+
+ if (argc < 3) {
+ printf("You have to specify 0=disable or 1=enable\r\n");
+ return;
+ }
+ ncn8025_get(slotnr, &settings);
+ if (atoi(argv[2]))
+ settings.led = true;
+ else
+ settings.led = false;
+ ncn8025_set(slotnr, &settings);
+}
+
+
+
+
+
int main(void)
{
atmel_start_init();
@@ -66,6 +225,12 @@ int main(void)
board_init();
command_init("sysmoOCTSIM> ");
command_register(&cmd_hello);
+ command_register(&cmd_sim_status);
+ command_register(&cmd_sim_power);
+ command_register(&cmd_sim_reset);
+ command_register(&cmd_sim_clkdiv);
+ command_register(&cmd_sim_voltage);
+ command_register(&cmd_sim_led);
printf("\r\n\r\nsysmocom sysmoOCTSIM\r\n");
while (true) { // main loop
diff --git a/sysmoOCTSIM/ncn8025.c b/sysmoOCTSIM/ncn8025.c
index 99b93b8..5f9b03d 100644
--- a/sysmoOCTSIM/ncn8025.c
+++ b/sysmoOCTSIM/ncn8025.c
@@ -8,6 +8,7 @@
#include <stdint.h>
#include <string.h>
+#include <stdio.h>
#include <utils_assert.h>
#include <utils.h>
#include "octsim_i2c.h"
@@ -134,3 +135,29 @@ int ncn8025_init(unsigned int slot)
return rc;
return ncn8025_set(slot, &def_settings);
}
+
+static const char *volt_str[] = {
+ [SIM_VOLT_3V0] = "3.0",
+ [SIM_VOLT_5V0] = "5.0",
+ [SIM_VOLT_1V8] = "1.8",
+};
+
+static const unsigned int div_val[] = {
+ [SIM_CLKDIV_1] = 1,
+ [SIM_CLKDIV_2] = 2,
+ [SIM_CLKDIV_4] = 4,
+ [SIM_CLKDIV_8] = 8,
+};
+
+void ncn8025_dump(const struct ncn8025_settings *set)
+{
+ printf("VOLT=%s, CLKDIV=%u", volt_str[set->vsel], div_val[set->clkdiv]);
+ if (set->rstin)
+ printf(", RST");
+ if (set->cmdvcc)
+ printf(", VCC");
+ if (set->simpres)
+ printf(", SIMPRES");
+ if (set->led)
+ printf(", LED");
+}
diff --git a/sysmoOCTSIM/ncn8025.h b/sysmoOCTSIM/ncn8025.h
index a392c5d..79e8b60 100644
--- a/sysmoOCTSIM/ncn8025.h
+++ b/sysmoOCTSIM/ncn8025.h
@@ -26,3 +26,4 @@ struct ncn8025_settings {
int ncn8025_set(uint8_t slot, const struct ncn8025_settings *set);
int ncn8025_get(uint8_t slot, struct ncn8025_settings *set);
int ncn8025_init(unsigned int slot);
+void ncn8025_dump(const struct ncn8025_settings *set);