[PATCH] lis302dl-debug.patch: /sys debug files for the accelerometers
Simon Kagstrom
simon.kagstrom at gmail.com
Sun Oct 5 15:13:50 CEST 2008
Debug support for lis302dl. Allows lis302dl registers to be displayed
and modified in the /sys filesystem. Can be useful during development,
but is obviously in an end-user system.
Signed-off-by: Simon Kagstrom <simon.kagstrom at gmail.com>
---
drivers/input/misc/Kconfig | 7 +++
drivers/input/misc/lis302dl.c | 97 +++++++++++++++++++++++++++++++++++++++++
2 files changed, 104 insertions(+), 0 deletions(-)
diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig
index 5a15edd..f4e4c5b 100644
--- a/drivers/input/misc/Kconfig
+++ b/drivers/input/misc/Kconfig
@@ -192,4 +192,11 @@ config INPUT_LIS302DL
The userspece interface is a 3-axis (X/Y/Z) relative movement
Linux input device, reporting REL_[XYZ] events.
+config INPUT_LIS302DL_DEBUG
+ boolean "Debug files in /sys for LIS302DL"
+ depends on INPUT_LIS302DL
+ help
+ Select this if you want to be able to read and set register
+ values of the LIS302DL in the /sys filesystem
+
endif
diff --git a/drivers/input/misc/lis302dl.c b/drivers/input/misc/lis302dl.c
index b01ca04..31b0e00 100644
--- a/drivers/input/misc/lis302dl.c
+++ b/drivers/input/misc/lis302dl.c
@@ -455,12 +455,109 @@ static DEVICE_ATTR(freefall_wakeup_1, S_IRUGO | S_IWUSR, show_freefall_1,
static DEVICE_ATTR(freefall_wakeup_2, S_IRUGO | S_IWUSR, show_freefall_2,
set_freefall_2);
+#ifdef CONFIG_INPUT_LIS302DL_DEBUG
+static ssize_t show_register(struct lis302dl_info *lis, u8 reg,
+ char *buf)
+{
+ return sprintf(buf, "0x%x\n", reg_read(lis, reg));
+}
+
+static ssize_t set_register(struct lis302dl_info *lis, u8 reg,
+ const char *buf, size_t count)
+{
+ u32 val;
+ int r;
+
+ if (sscanf(buf, "0x%x\n", &val) != 1)
+ return -EINVAL;
+ r = reg_write(lis, reg, val);
+
+ return count;
+}
+
+#define DEBUG_REG_WHICH(name, which_reg) \
+static ssize_t show_register_##name(struct device *dev, \
+ struct device_attribute *attr, char *buf) \
+{ \
+ return show_register(dev_get_drvdata(dev), \
+ which_reg, buf); \
+} \
+ \
+static ssize_t set_register_##name(struct device *dev, \
+ struct device_attribute *attr, const char *buf, \
+ size_t count) \
+{ \
+ return set_register(dev_get_drvdata(dev), \
+ which_reg, buf, count); \
+}
+
+DEBUG_REG_WHICH(ctrl1, LIS302DL_REG_CTRL1)
+DEBUG_REG_WHICH(ctrl2, LIS302DL_REG_CTRL2)
+DEBUG_REG_WHICH(ctrl3, LIS302DL_REG_CTRL3)
+DEBUG_REG_WHICH(hp_filter_reset, LIS302DL_REG_HP_FILTER_RESET)
+DEBUG_REG_WHICH(who_am_i, LIS302DL_REG_WHO_AM_I)
+DEBUG_REG_WHICH(status, LIS302DL_REG_STATUS)
+DEBUG_REG_WHICH(ff_wu_cfg1, LIS302DL_REG_FF_WU_CFG_1)
+DEBUG_REG_WHICH(ff_wu_cfg2, LIS302DL_REG_FF_WU_CFG_2)
+DEBUG_REG_WHICH(ff_wu_src1, LIS302DL_REG_FF_WU_SRC_1)
+DEBUG_REG_WHICH(ff_wu_src2, LIS302DL_REG_FF_WU_SRC_2)
+DEBUG_REG_WHICH(ff_wu_ths1, LIS302DL_REG_FF_WU_THS_1)
+DEBUG_REG_WHICH(ff_wu_ths2, LIS302DL_REG_FF_WU_THS_2)
+DEBUG_REG_WHICH(ff_wu_duration1, LIS302DL_REG_FF_WU_DURATION_1)
+DEBUG_REG_WHICH(ff_wu_duration2, LIS302DL_REG_FF_WU_DURATION_2)
+
+static DEVICE_ATTR(debug_reg_ctrl1, S_IRUGO | S_IWUSR,
+ show_register_ctrl1, set_register_ctrl1);
+static DEVICE_ATTR(debug_reg_ctrl2, S_IRUGO | S_IWUSR,
+ show_register_ctrl2, set_register_ctrl2);
+static DEVICE_ATTR(debug_reg_ctrl3, S_IRUGO | S_IWUSR,
+ show_register_ctrl3, set_register_ctrl3);
+static DEVICE_ATTR(debug_reg_hp_filter_reset, S_IRUGO,
+ show_register_hp_filter_reset, set_register_hp_filter_reset);
+static DEVICE_ATTR(debug_reg_who_am_i, S_IRUGO,
+ show_register_who_am_i, set_register_who_am_i);
+static DEVICE_ATTR(debug_reg_status, S_IRUGO,
+ show_register_status, set_register_status);
+static DEVICE_ATTR(debug_reg_ff_wu_cfg1, S_IRUGO | S_IWUSR,
+ show_register_ff_wu_cfg1, set_register_ff_wu_cfg1);
+static DEVICE_ATTR(debug_reg_ff_wu_cfg2, S_IRUGO | S_IWUSR,
+ show_register_ff_wu_cfg2, set_register_ff_wu_cfg2);
+static DEVICE_ATTR(debug_reg_ff_wu_src1, S_IRUGO,
+ show_register_ff_wu_src1, set_register_ff_wu_src1);
+static DEVICE_ATTR(debug_reg_ff_wu_src2, S_IRUGO,
+ show_register_ff_wu_src2, set_register_ff_wu_src2);
+static DEVICE_ATTR(debug_reg_ff_wu_ths1, S_IRUGO | S_IWUSR,
+ show_register_ff_wu_ths1, set_register_ff_wu_ths1);
+static DEVICE_ATTR(debug_reg_ff_wu_ths2, S_IRUGO | S_IWUSR,
+ show_register_ff_wu_ths2, set_register_ff_wu_ths2);
+static DEVICE_ATTR(debug_reg_ff_wu_duration1, S_IRUGO | S_IWUSR,
+ show_register_ff_wu_duration1, set_register_ff_wu_duration1);
+static DEVICE_ATTR(debug_reg_ff_wu_duration2, S_IRUGO | S_IWUSR,
+ show_register_ff_wu_duration2, set_register_ff_wu_duration2);
+#endif
+
static struct attribute *lis302dl_sysfs_entries[] = {
&dev_attr_sample_rate.attr,
&dev_attr_full_scale.attr,
&dev_attr_dump.attr,
&dev_attr_freefall_wakeup_1.attr,
&dev_attr_freefall_wakeup_2.attr,
+#ifdef CONFIG_INPUT_LIS302DL_DEBUG
+ &dev_attr_debug_reg_ctrl1.attr,
+ &dev_attr_debug_reg_ctrl2.attr,
+ &dev_attr_debug_reg_ctrl3.attr,
+ &dev_attr_debug_reg_hp_filter_reset.attr,
+ &dev_attr_debug_reg_who_am_i.attr,
+ &dev_attr_debug_reg_status.attr,
+ &dev_attr_debug_reg_ff_wu_cfg1.attr,
+ &dev_attr_debug_reg_ff_wu_cfg2.attr,
+ &dev_attr_debug_reg_ff_wu_src1.attr,
+ &dev_attr_debug_reg_ff_wu_src2.attr,
+ &dev_attr_debug_reg_ff_wu_ths1.attr,
+ &dev_attr_debug_reg_ff_wu_ths2.attr,
+ &dev_attr_debug_reg_ff_wu_duration1.attr,
+ &dev_attr_debug_reg_ff_wu_duration2.attr,
+#endif
NULL
};
More information about the openmoko-kernel
mailing list