Hack BBS

[全部のスレッド一覧][新着順に表示][返信フォーム][この記事のスレッド][記事の削除・変更] [Home Page]

この記事のスレッドの最初は【No.6216】の投稿です

記事番号 【No.6227】
投稿者: そのだ
投稿日時: 14/08/17(日) 17:35:53
タイトル: Re: 追伸
コメント: 電源SWの状態を取得できるようにls_hgl-setup.cを修正しました。
カーネル3.12.22で動作確認しています。参考にして頂けると幸いです。

下記の処理が行えます。
@電源SWの状態取得 #cat /proc/ls-gpio/sw
Afuncswの状態取得 #cat /proc/ls-gpio/funcsw
Busb電源の状態取得 #cat /proc/ls-gpio/powers/usb
電源off操作 #echo off > /proc/ls-gpio/powers/usb
電源on操作 #echo on > /proc/ls-gpio/powers/usb
CHDD電源の状態取得 #cat /proc/ls-gpio/powers/hdd
電源off操作 #echo off > /proc/ls-gpio/powers/hdd
電源on操作 #echo on > /proc/ls-gpio/powers/hdd
DLEDランプ操作は標準(ただしLED名称を変更しています。)
LED名称変更
.name = "alarm:red" → "alarm"
.name = "info:amber" → "info"
.name = "func:blue:top" → "func"
.name = "power:blue:bottom" → "power"

LED操作例1 alarm on # echo 1 > /sys/class/leds/alarm/brightness
LED操作例2 func off # echo 0 > /sys/class/leds/func/brightness


以下 修正内容です。

--- linux-3.12.22.org/arch/arm/mach-orion5x/ls_hgl-setup.c 2014-06-11 16:07:28.000000000 +0900
+++ linux-3.12.22/arch/arm/mach-orion5x/ls_hgl-setup.c 2014-08-17 17:22:20.000000000 +0900
@@ -21,11 +21,44 @@
#include <linux/gpio.h>
#include <asm/mach-types.h>
#include <asm/mach/arch.h>
+#include <asm/system.h>
#include <mach/orion5x.h>
#include "common.h"
#include "mpp.h"

/*****************************************************************************
+ * Add
+ ****************************************************************************/
+
+#include <linux/proc_fs.h>
+#include <linux/seq_file.h>
+
+#define PROC_WRITE_MAX_LENGTH 8 /* maximum chars written to proc file */
+
+/*****************************************************************************
+ * Add
+ ****************************************************************************/
+
+static struct proc_dir_entry *proc_root;
+static struct proc_dir_entry *proc_powers;
+
+/*****************************************************************************
+ * Add
+ ****************************************************************************/
+#define GPIO_LED_FUNC 17
+#define GPIO_LED_POWER 0
+#define GPIO_LED_ALARM 2
+#define GPIO_LED_INFO 3
+#define GPIO_LED_ETH 11
+
+#define GPIO_SW_POWER 8
+#define GPIO_SW_AUTO 10
+#define GPIO_SW_FUNC 15
+
+#define GPIO_POWER_USB 9
+#define GPIO_POWER_HDD 1
+
+/*****************************************************************************
* Linkstation LS-HGL Info
****************************************************************************/

@@ -88,19 +121,19 @@

static struct gpio_led ls_hgl_led_pins[] = {
{
- .name = "alarm:red",
+ .name = "alarm",
.gpio = LS_HGL_GPIO_LED_ALARM,
.active_low = 1,
}, {
- .name = "info:amber",
+ .name = "info",
.gpio = LS_HGL_GPIO_LED_INFO,
.active_low = 1,
}, {
- .name = "func:blue:top",
+ .name = "func",
.gpio = LS_HGL_GPIO_LED_FUNC,
.active_low = 1,
}, {
- .name = "power:blue:bottom",
+ .name = "power",
.gpio = LS_HGL_GPIO_LED_PWR,
},
};
@@ -190,6 +223,183 @@


/*****************************************************************************
+ * Add
+ ****************************************************************************/
+
+static int proc_sw_show(struct seq_file *m, void *v)
+{
+ if ( gpio_get_value(GPIO_SW_AUTO) == 0 ) {
+ seq_printf(m, "%s\n", "auto");
+ } else {
+ if ( gpio_get_value(GPIO_SW_POWER) == 0 ) {
+ seq_printf(m, "%s\n", "on");
+ } else {
+ seq_printf(m, "%s\n", "off");
+ }
+ }
+ return 0;
+}
+
+static int proc_sw_open(struct inode *inode, struct file *file)
+{
+ return single_open(file, proc_sw_show, NULL);
+}
+
+static const struct file_operations proc_sw_operations = {
+ .open = proc_sw_open,
+ .read = seq_read,
+ .llseek = seq_lseek,
+ .release = single_release,
+};
+
+static int proc_fsw_show(struct seq_file *m, void *v)
+{
+ if ( gpio_get_value(GPIO_SW_FUNC) == 0 ) {
+ seq_printf(m, "%s\n", "on");
+ } else {
+ seq_printf(m, "%s\n", "off");
+ }
+ return 0;
+}
+
+static int proc_fsw_open(struct inode *inode, struct file *file)
+{
+ return single_open(file, proc_fsw_show, NULL);
+}
+
+static const struct file_operations proc_fsw_operations = {
+ .open = proc_fsw_open,
+ .read = seq_read,
+ .llseek = seq_lseek,
+ .release = single_release,
+};
+
+static int proc_usb_power_show(struct seq_file *m, void *v)
+{
+ if ( gpio_get_value(GPIO_POWER_USB) != 0 ) {
+ seq_printf(m, "%s\n", "on");
+ } else {
+ seq_printf(m, "%s\n", "off");
+ }
+ return 0;
+}
+
+static int proc_usb_power_open(struct inode *inode, struct file *file)
+{
+ return single_open(file, proc_usb_power_show, NULL);
+}
+
+static ssize_t proc_usb_power_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos)
+{
+ char *buf = NULL;
+
+ if (count > PROC_WRITE_MAX_LENGTH)
+ count = PROC_WRITE_MAX_LENGTH;
+
+ buf = kmalloc(sizeof(char) * (count + 1), GFP_KERNEL);
+ if (!buf)
+ return -ENOMEM;
+
+ if (copy_from_user(buf, buffer, count)) {
+ kfree(buf);
+ return -EFAULT;
+ }
+
+ buf[count] = '\0';
+
+ /* work around \n when echo'ing into proc */
+ if (buf[count - 1] == '\n')
+ buf[count - 1] = '\0';
+
+ if(strcmp(buf, "on") == 0 ) {
+ gpio_set_value(GPIO_POWER_USB, 1 );
+ } else if(strcmp(buf, "off") == 0 ) {
+ gpio_set_value(GPIO_POWER_USB, 0 );
+ }
+
+ kfree(buf);
+
+ return count;
+}
+
+static const struct file_operations proc_usb_power_operations = {
+ .open = proc_usb_power_open,
+ .read = seq_read,
+ .llseek = seq_lseek,
+ .release = single_release,
+ .write = proc_usb_power_write,
+};
+static int proc_hdd_power_show(struct seq_file *m, void *v)
+{
+ if ( gpio_get_value(GPIO_POWER_HDD) != 0 ) {
+ seq_printf(m, "%s\n", "on");
+ } else {
+ seq_printf(m, "%s\n", "off");
+ }
+ return 0;
+}
+
+static int proc_hdd_power_open(struct inode *inode, struct file *file)
+{
+ return single_open(file, proc_hdd_power_show, NULL);
+}
+
+
+static ssize_t proc_hdd_power_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos)
+{
+ char *buf = NULL;
+
+ if (count > PROC_WRITE_MAX_LENGTH)
+ count = PROC_WRITE_MAX_LENGTH;
+
+ buf = kmalloc(sizeof(char) * (count + 1), GFP_KERNEL);
+ if (!buf)
+ return -ENOMEM;
+
+ if (copy_from_user(buf, buffer, count)) {
+ kfree(buf);
+ return -EFAULT;
+ }
+
+ buf[count] = '\0';
+
+ /* work around \n when echo'ing into proc */
+ if (buf[count - 1] == '\n')
+ buf[count - 1] = '\0';
+
+ if(strcmp(buf, "on") == 0 ) {
+ gpio_set_value(GPIO_POWER_HDD, 1 );
+ } else if(strcmp(buf, "off") == 0 ) {
+ gpio_set_value(GPIO_POWER_HDD, 0 );
+ }
+
+ kfree(buf);
+ return count;
+}
+
+static const struct file_operations proc_hdd_power_operations = {
+ .open = proc_hdd_power_open,
+ .read = seq_read,
+ .llseek = seq_lseek,
+ .release = single_release,
+ .write = proc_hdd_power_write,
+};
+
+static int gpio_proc_init(void)
+{
+ proc_root = proc_mkdir("ls-gpio", 0 );
+
+ proc_create("ls-gpio/sw", 0, NULL, &proc_sw_operations);
+ proc_create("ls-gpio/funcsw", 0, NULL, &proc_fsw_operations);
+
+ proc_powers = proc_mkdir("ls-gpio/powers",0);
+ proc_create("ls-gpio/powers/usb", 0, NULL, &proc_usb_power_operations);
+ proc_create("ls-gpio/powers/hdd", 0, NULL, &proc_hdd_power_operations);
+
+ return 0;
+}
+
+/*****************************************************************************
* General Setup
****************************************************************************/

@@ -262,6 +472,9 @@
pm_power_off = ls_hgl_power_off;

pr_info("%s: finished\n", __func__);
+
+ gpio_proc_init();
+
}



この記事のスレッド

★の赤文字はこの記事【No.6227】です

返信用投稿フォーム


記事番号【No.6227】に返信投稿する方は下にご記入の上送信してください
お名前:
タイトル:(変更可)
コメント: ↓引用が不要な場合は、適宜削除してください

削除用パスワード。コメントの変更および削除の際必要です
(半角英数字使用)

ボタンは1回だけ押して下さい。押した後にエラーになるかも知れませんが、おそらくちゃんと書込まれています。