diff options
author | Adam Malinowski <a.malinowsk2@partner.samsung.com> | 2016-07-01 14:48:12 +0200 |
---|---|---|
committer | Adam Malinowski <a.malinowsk2@partner.samsung.com> | 2016-08-12 13:44:42 +0200 |
commit | 347af99570c4e4018ac3a59f3605469b8a89552c (patch) | |
tree | 0da3a0ed025385f443da77b8eaac44a8900b8804 /src/main.cpp | |
parent | 992f65d2ad0fe4219f1d41f9d0bc04dfafd729f1 (diff) | |
download | sd-mux-347af99570c4e4018ac3a59f3605469b8a89552c.tar.gz sd-mux-347af99570c4e4018ac3a59f3605469b8a89552c.tar.bz2 sd-mux-347af99570c4e4018ac3a59f3605469b8a89552c.zip |
Add dynamic jumpers (DyPer) control
Change-Id: Iccaff3ce196d4c25d1740c50b41b728e22f65870
Diffstat (limited to 'src/main.cpp')
-rw-r--r-- | src/main.cpp | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/src/main.cpp b/src/main.cpp index 3d84e40..87c3fb7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -34,6 +34,8 @@ #define USB_SEL (0x01 << 0x03) #define POWER_SW_OFF (0x01 << 0x02) #define POWER_SW_ON (0x01 << 0x04) +#define DYPER1 (0x01 << 0x05) +#define DYPER2 (0x01 << 0x06) #define DELAY_100MS 100000 @@ -48,6 +50,8 @@ enum CCCommand { CCC_SetSerial, CCC_Init, CCC_Status, + CCC_DyPer1, + CCC_DyPer2, CCC_None }; @@ -62,6 +66,7 @@ enum CCOption { CCO_TickTime, CCO_BitsInvert, CCO_Vendor, + CCO_DyPer, CCO_MAX }; @@ -414,6 +419,40 @@ int showStatus(CCOptionValue options[]) { return 0; } +int setDyPer(CCCommand cmd, CCOptionValue options[]) { + unsigned char pins; + bool switchOn; + int ret = EXIT_SUCCESS, dyper; + + struct ftdi_context *ftdi = prepareDevice(options, &pins); + if (ftdi == NULL) + return EXIT_FAILURE; + + #define STRON "ON" + #define STROFF "OFF" + + if (strncasecmp(STRON, options[CCO_DyPer].args, strlen(STRON)) == 0) { + switchOn = true; + } else if (strncasecmp(STROFF, options[CCO_DyPer].args, strlen(STROFF)) == 0) { + switchOn = false; + } else { + fprintf(stderr,"Invalid DyPer argument! Use \"on\" or \"off\".\n"); + goto finish_him; + } + + dyper = cmd == CCC_DyPer1 ? DYPER1 : DYPER2; + pins = switchOn ? pins | dyper : pins & ~dyper; + + if (writePins(ftdi, pins) != EXIT_SUCCESS) + ret = EXIT_FAILURE; + +finish_him: + ftdi_usb_close(ftdi); + ftdi_free(ftdi); + + return ret; +} + int parseArguments(int argc, const char **argv, CCCommand *cmd, int *arg, char *args, size_t argsLen, CCOptionValue options[]) { char c; @@ -432,6 +471,8 @@ int parseArguments(int argc, const char **argv, CCCommand *cmd, int *arg, char * { "pins", 'p', POPT_ARG_INT, arg, 'p', "write pin state in bitbang mode", NULL }, { "tick", 'c', POPT_ARG_NONE, NULL, 'c', "turn off and on power supply of DUT", NULL }, { "status", 'u', POPT_ARG_NONE, NULL, 'u', "show current status: DUT or TS or NOINIT", NULL }, + { "dyper1", 'y', POPT_ARG_STRING, &options[CCO_DyPer].args, 'y', "Connect or disconnect terminals of 1st dynamic jumper; STRING = \"on\" or \"off\"", NULL }, + { "dyper2", 'z', POPT_ARG_STRING, &options[CCO_DyPer].args, 'z', "Connect or disconnect terminals of 2nd dynamic jumper; STRING = \"on\" or \"off\"", NULL }, // Options { "tick-time", 'm', POPT_ARG_INT, &options[CCO_TickTime].argn, 'm', "set time delay for 'tick' command", NULL }, @@ -483,6 +524,12 @@ int parseArguments(int argc, const char **argv, CCCommand *cmd, int *arg, char * case 'u': *cmd = CCC_Status; break; + case 'y': + *cmd = CCC_DyPer1; + break; + case 'z': + *cmd = CCC_DyPer2; + break; case 'n': options[CCO_BitsInvert].argn = 1; break; @@ -538,6 +585,9 @@ int main(int argc, const char **argv) { return doPower(true, true, options); case CCC_Pins: return setPins((unsigned char)arg, options); + case CCC_DyPer1: + case CCC_DyPer2: + return setDyPer(cmd, options); case CCC_Status: return showStatus(options); } |