@@ -164,6 +164,17 @@ static int display_select(void)
return 0;
}
+static int display_change(int keyvalue)
+{
+ if (!(windata[current_win].nrdata))
+ return 0;
+
+ if (windata[current_win].ops && windata[current_win].ops->change)
+ return windata[current_win].ops->change(keyvalue);
+
+ return 0;
+}
+
static int display_next_panel(void)
{
size_t array_size = sizeof(windata) / sizeof(windata[0]);
@@ -406,6 +417,17 @@ static int display_keystroke(int fd, void *data)
display_select();
break;
+ case 'v':
+ case 'V':
+ case 'a':
+ case 'A':
+ case 'e':
+ case 'E':
+ case 'd':
+ case 'D':
+ display_change(toupper(keystroke));
+ break;
+
case EOF:
case 'q':
case 'Q':
@@ -20,6 +20,7 @@ struct display_ops {
int (*select)(void);
int (*find)(const char *);
int (*selectf)(void);
+ int (*change)(int keyvalue);
};
extern int display_print_line(int window, int line, char *str,
@@ -262,8 +262,51 @@ static int gpio_display(bool refresh)
return gpio_print_info(gpio_tree);
}
+static int gpio_change(int keyvalue)
+{
+ struct tree *t = display_get_row_data(GPIO);
+ struct gpio_info *gpio = t->private;
+
+ if (!t || !gpio)
+ return -1;
+
+ switch (keyvalue) {
+ case 'D':
+ if (strstr(gpio->direction, "in"))
+ sprintf(gpio->direction, "out");
+ else if (strstr(gpio->direction, "out"))
+ sprintf(gpio->direction, "in");
+ file_write_value(t->path, "direction", "%s", &gpio->direction);
+ break;
+
+ case 'V':
+ if (strstr(gpio->direction, "out")) {
+ gpio->value = !gpio->value;
+ file_write_value(t->path, "value", "%d", &gpio->value);
+ }
+ break;
+
+/* It is not good choise to change gpio irq status from userspace. */
+/*
+ case 'A':
+ gpio->active_low = !gpio->active_low;
+ file_write_value(t->path, "active_low", "%d", &gpio->active_low);
+ break;
+
+ case 'E':
+ file_write_value(t->path, "edge", "%s", &gpio->edge);
+ break;
+*/
+ default:
+ return -1;
+ }
+
+ return 0;
+}
+
static struct display_ops gpio_ops = {
.display = gpio_display,
+ .change = gpio_change,
};
/*
@@ -53,3 +53,39 @@ out_free:
free(rpath);
return ret;
}
+
+/*
+ * This functions is a helper to write a specific file content and store
+ * the content inside a variable pointer passed as parameter, the format
+ * parameter gives the variable type to be write to the file.
+ *
+ * @path : directory path containing the file
+ * @name : name of the file to be read
+ * @format : the format of the format
+ * @value : a pointer to a variable to store the content of the file
+ * Returns 0 on success, -1 otherwise
+ */
+int file_write_value(const char *path, const char *name,
+ const char *format, void *value)
+{
+ FILE *file;
+ char *rpath;
+ int ret;
+
+ ret = asprintf(&rpath, "%s/%s", path, name);
+ if (ret < 0)
+ return ret;
+
+ file = fopen(rpath, "wr");
+ if (!file) {
+ ret = -1;
+ goto out_free;
+ }
+
+ ret = fprintf(file, format, value) < 0 ? -1 : 0;
+
+ fclose(file);
+out_free:
+ free(rpath);
+ return ret;
+}
@@ -17,6 +17,8 @@
extern int file_read_value(const char *path, const char *name,
const char *format, void *value);
+extern int file_write_value(const char *path, const char *name,
+ const char *format, void *value);
#endif
For power consumption test, we can change gpio direction and value and check that power consumption is falled or not. use 'D' key to change gpio direction. And when gpio direction is "out", use 'V' key to change gpio value. Signed-off-by: sunshaojie <shaojie.sun@linaro.com> --- display.c | 22 ++++++++++++++++++++++ display.h | 1 + gpio.c | 43 +++++++++++++++++++++++++++++++++++++++++++ utils.c | 36 ++++++++++++++++++++++++++++++++++++ utils.h | 2 ++ 5 files changed, 104 insertions(+)