[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