From patchwork Wed Jul 31 00:52:11 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: sunshaojie X-Patchwork-Id: 18678 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-ye0-f197.google.com (mail-ye0-f197.google.com [209.85.213.197]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id 3E47C248D7 for ; Wed, 31 Jul 2013 00:52:25 +0000 (UTC) Received: by mail-ye0-f197.google.com with SMTP id q8sf114217yen.8 for ; Tue, 30 Jul 2013 17:52:25 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=mime-version:x-beenthere:x-forwarded-to:x-forwarded-for :delivered-to:from:to:cc:subject:date:message-id:x-mailer :x-gm-message-state:x-removed-original-auth:x-original-sender :x-original-authentication-results:precedence:mailing-list:list-id :x-google-group-id:list-post:list-help:list-archive:list-unsubscribe; bh=3G4xcso55slPIYybRJEZOv64ZOZHnJS7+N7hAb4HJ0w=; b=Dj5kS+GH0mf7q2ByMtIDqsqGsIDezSyRa/QliGrN5Fngpo3I+VSnIDgupBMJfxQ3MG vfS9lVRz7JZ/LP6B8XHHeu36ZEnhiihlNML6oZl9Zgk5e8VB6DxnMnzDXqME1EIwq+Z2 tU80ZjP3NFItOC0BxYAQEMbRURfTIf4NXrp0fuUUWmFOAGZ3Jij3EJEf78p7FDDNoSTO 6MPLDOQOPcoYc7EdunfnpCBSU/olmvtHcUnDo9z+JcMn8MMM9sEpbg5wRuN3jxOpfY7g VZJ5JX+PLGmAVdAJi0tQId64zNMoTQ8dVHfekDRKU+T5aUdxjpP6RWHQ2YhPqUePENnG T4pw== X-Received: by 10.224.163.14 with SMTP id y14mr73432803qax.3.1375231944802; Tue, 30 Jul 2013 17:52:24 -0700 (PDT) MIME-Version: 1.0 X-BeenThere: patchwork-forward@linaro.org Received: by 10.49.51.66 with SMTP id i2ls490599qeo.87.gmail; Tue, 30 Jul 2013 17:52:24 -0700 (PDT) X-Received: by 10.221.28.198 with SMTP id rv6mr10860529vcb.5.1375231944496; Tue, 30 Jul 2013 17:52:24 -0700 (PDT) Received: from mail-ve0-f176.google.com (mail-ve0-f176.google.com [209.85.128.176]) by mx.google.com with ESMTPS id xb6si19461943vdb.68.2013.07.30.17.52.24 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Tue, 30 Jul 2013 17:52:24 -0700 (PDT) Received-SPF: neutral (google.com: 209.85.128.176 is neither permitted nor denied by best guess record for domain of patch+caf_=patchwork-forward=linaro.org@linaro.org) client-ip=209.85.128.176; Received: by mail-ve0-f176.google.com with SMTP id b10so93501vea.35 for ; Tue, 30 Jul 2013 17:52:24 -0700 (PDT) X-Received: by 10.52.109.69 with SMTP id hq5mr9979781vdb.85.1375231944326; Tue, 30 Jul 2013 17:52:24 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patches@linaro.org Received: by 10.221.11.8 with SMTP id pc8csp206791vcb; Tue, 30 Jul 2013 17:52:23 -0700 (PDT) X-Received: by 10.68.245.7 with SMTP id xk7mr4422432pbc.147.1375231942864; Tue, 30 Jul 2013 17:52:22 -0700 (PDT) Received: from mail-pd0-f179.google.com (mail-pd0-f179.google.com [209.85.192.179]) by mx.google.com with ESMTPS id sr9si566722pab.154.2013.07.30.17.52.22 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Tue, 30 Jul 2013 17:52:22 -0700 (PDT) Received-SPF: neutral (google.com: 209.85.192.179 is neither permitted nor denied by best guess record for domain of shaojie.sun@linaro.org) client-ip=209.85.192.179; Received: by mail-pd0-f179.google.com with SMTP id v10so94633pde.10 for ; Tue, 30 Jul 2013 17:52:22 -0700 (PDT) X-Received: by 10.68.98.33 with SMTP id ef1mr76912259pbb.59.1375231942358; Tue, 30 Jul 2013 17:52:22 -0700 (PDT) Received: from localhost.localdomain ([58.251.159.202]) by mx.google.com with ESMTPSA id fa5sm44827765pbb.3.2013.07.30.17.52.19 for (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Tue, 30 Jul 2013 17:52:21 -0700 (PDT) From: Shaojie Sun To: sanjay.rawat@linaro.org Cc: private-pmwg@linaro.org, patches@linaro.org, sunshaojie@huawei.com, Shaojie Sun Subject: [POWERDEBUG v3] Add modify gpio function in powerdebug tool. Date: Wed, 31 Jul 2013 08:52:11 +0800 Message-Id: <1375231931-27635-1-git-send-email-shaojie.sun@linaro.com> X-Mailer: git-send-email 1.7.9.5 X-Gm-Message-State: ALoCoQmP+zMJ+kFF402WtUfQlpV8JakcDSrybveodc2ZPugCpJLObDHpe06tWukTj3BMjU+QeQ8U X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: shaojie.sun@linaro.org X-Original-Authentication-Results: mx.google.com; spf=neutral (google.com: 209.85.128.176 is neither permitted nor denied by best guess record for domain of patch+caf_=patchwork-forward=linaro.org@linaro.org) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Precedence: list Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org List-ID: X-Google-Group-Id: 836684582541 List-Post: , List-Help: , List-Archive: List-Unsubscribe: , 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: Shaojie Sun --- README | 8 +++++++- display.c | 18 ++++++++++++++++++ display.h | 1 + gpio.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ utils.c | 36 ++++++++++++++++++++++++++++++++++++ utils.h | 2 ++ 6 files changed, 110 insertions(+), 1 deletion(-) diff --git a/README b/README index fa997f6..3bf1659 100644 --- a/README +++ b/README @@ -7,4 +7,10 @@ information. Current version only displays regulator information and clock tree from debugfs. Support will be added for sensors later. - -- Amit Arora Fri, 08 Sep 2010 + -- Amit Arora Fri, 08 Sep 2010 + +Now we add gpio-change function for power consumption need. +When gpio is not in interrupt mode. use 'D' key to change gpio direction. +And when gpio direction is "out", use 'V' key to change gpio value. + + -- Shaojie Sun Mon, 29 Jul 2013 diff --git a/display.c b/display.c index 41a511d..c0afe03 100644 --- a/display.c +++ b/display.c @@ -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,13 @@ static int display_keystroke(int fd, void *data) display_select(); break; + case 'v': + case 'V': + case 'd': + case 'D': + display_change(toupper(keystroke)); + break; + case EOF: case 'q': case 'Q': diff --git a/display.h b/display.h index 6362a48..b28d26e 100644 --- a/display.h +++ b/display.h @@ -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, diff --git a/gpio.c b/gpio.c index 3ecc393..7cc16f7 100644 --- a/gpio.c +++ b/gpio.c @@ -264,8 +264,54 @@ 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': + /* Only change direction when gpio interrupt not set.*/ + if (!strstr(gpio->edge, "none")) + return 0; + + if (strstr(gpio->direction, "in")) + strcpy(gpio->direction, "out"); + else if (strstr(gpio->direction, "out")) + strcpy(gpio->direction, "in"); + file_write_value(t->path, "direction", "%s", &gpio->direction); + file_read_value(t->path, "direction", "%s", &gpio->direction); + file_read_value(t->path, "value", "%d", &gpio->value); + + break; + + case 'V': + /* Only change value when gpio direction is out. */ + if (!strstr(gpio->edge, "none") + || !strstr(gpio->direction, "out")) + return 0; + + if (gpio->value) + file_write_value(t->path, "direction", "%s", &"low"); + else + file_write_value(t->path, "direction", "%s", &"high"); + file_read_value(t->path, "value", "%d", &gpio->value); + + break; + + default: + return -1; + } + + return 0; +} + static struct display_ops gpio_ops = { .display = gpio_display, + .change = gpio_change, }; /* diff --git a/utils.c b/utils.c index e47c58e..4d4b780 100644 --- a/utils.c +++ b/utils.c @@ -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, "w"); + if (!file) { + ret = -1; + goto out_free; + } + + ret = fprintf(file, format, value) < 0 ? -1 : 0; + + fclose(file); +out_free: + free(rpath); + return ret; +} diff --git a/utils.h b/utils.h index d4ac65a..73159b9 100644 --- a/utils.h +++ b/utils.h @@ -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