summaryrefslogtreecommitdiff
path: root/drivers/testcode
diff options
context:
space:
mode:
authorlyx <lyx@rock-chips.com>2011-06-01 00:33:09 -0700
committerlyx <lyx@rock-chips.com>2011-06-01 18:47:40 -0700
commit1b9ac442969c6b1311f7fea188fbc90a3b0480ab (patch)
tree32446e6306e7c476ff25ef75531179d75f5a3a2e /drivers/testcode
parent085ccecf9bb80c31692db8f0c8762633ca1694a6 (diff)
add some auto test code, maybe useful for someone
Diffstat (limited to 'drivers/testcode')
-rwxr-xr-xdrivers/testcode/Kconfig16
-rwxr-xr-xdrivers/testcode/Makefile7
-rwxr-xr-xdrivers/testcode/gpio_wave.c108
-rwxr-xr-xdrivers/testcode/gpio_wave.h11
4 files changed, 142 insertions, 0 deletions
diff --git a/drivers/testcode/Kconfig b/drivers/testcode/Kconfig
new file mode 100755
index 000000000000..e3a89d7c734c
--- /dev/null
+++ b/drivers/testcode/Kconfig
@@ -0,0 +1,16 @@
+#
+# Input misc drivers configuration
+#
+menuconfig TEST_CODE
+ bool "some test code for kernel"
+ help
+ Say Y here, and a list of test code will be displayed.
+
+ If unsure, say N.
+
+if TEST_CODE
+
+config USE_GPIO_GENERATE_WAVE
+ tristate "use gpio to generate square wave"
+
+endif
diff --git a/drivers/testcode/Makefile b/drivers/testcode/Makefile
new file mode 100755
index 000000000000..fa7569c07fe5
--- /dev/null
+++ b/drivers/testcode/Makefile
@@ -0,0 +1,7 @@
+#
+# Makefile for the test code drivers.
+#
+
+# Each configuration option enables a list of files.
+
+obj-$(CONFIG_USE_GPIO_GENERATE_WAVE) += gpio_wave.o
diff --git a/drivers/testcode/gpio_wave.c b/drivers/testcode/gpio_wave.c
new file mode 100755
index 000000000000..9e3bae87fd7b
--- /dev/null
+++ b/drivers/testcode/gpio_wave.c
@@ -0,0 +1,108 @@
+#include <linux/delay.h>
+#include <linux/platform_device.h>
+#include <linux/clk.h>
+#include <mach/gpio.h>
+#include <linux/wakelock.h>
+
+#include "gpio_wave.h"
+
+struct wave_data {
+ struct delayed_work d_work;
+ int Htime;
+ int Ltime;
+ unsigned int gpio;
+ int cur_value;
+ int last_value;
+ struct device *dev;
+};
+
+static struct wake_lock w_lock;
+
+static void gpio_wave_dwork_handle(struct work_struct *work)
+{
+ struct wave_data *data = (struct wave_data *)container_of(work, struct wave_data, d_work.work);
+
+ int delay_time = data->cur_value ? data->Ltime : data->Htime;
+ data->cur_value = !data->cur_value;
+ gpio_set_value(data->gpio, data->cur_value);
+ schedule_delayed_work(&(data->d_work), msecs_to_jiffies(delay_time));
+}
+
+
+static int gpio_wave_probe(struct platform_device *pdev)
+{
+ int ret;
+ struct wave_data *data;
+ struct gpio_wave_platform_data *pdata = pdev->dev.platform_data;
+
+ data = kmalloc(sizeof(struct wave_data), GFP_KERNEL);
+ if (!data) {
+ printk("func %s, line %d, malloc fail\n", __func__, __LINE__);
+ return -ENOMEM;
+ }
+
+ data->dev = &pdev->dev;
+ platform_set_drvdata(pdev, data);
+
+ if (pdata) {
+ int dtime = pdata->Dvalue ? pdata->Htime : pdata->Ltime;
+ data->gpio = pdata->gpio;
+ data->cur_value = pdata->Dvalue;
+ data->last_value = pdata->Dvalue;
+ data->Htime = pdata->Htime;
+ data->Ltime = pdata->Ltime;
+
+ ret = gpio_request(data->gpio, NULL);
+ if (ret) {
+ printk("func %s, line %d, gpio request err\n", __func__, __LINE__);
+ return ret;
+ }
+ gpio_direction_output(data->gpio, data->cur_value);
+ gpio_set_value(data->gpio, data->cur_value);
+ wake_lock_init(&w_lock, WAKE_LOCK_SUSPEND, "gpio_wave");
+ INIT_DELAYED_WORK(&(data->d_work), gpio_wave_dwork_handle);
+ wake_lock(&w_lock);
+ schedule_delayed_work(&(data->d_work), msecs_to_jiffies(dtime));
+ }
+ else {
+ kfree(data);
+ }
+
+ return 0;
+}
+
+static int gpio_wave_remove(struct platform_device *pdev)
+{
+ struct wave_data *data = platform_get_drvdata(pdev);
+ gpio_free(data->gpio);
+ kfree(data);
+ return 0;
+}
+
+static struct platform_driver gpio_wave_driver = {
+ .probe = gpio_wave_probe,
+ .remove = gpio_wave_remove,
+ .driver = {
+ .owner = THIS_MODULE,
+ .name = "gpio_wave",
+ },
+};
+
+static int __init gpio_wave_init(void)
+{
+ return platform_driver_register(&gpio_wave_driver);
+}
+
+static void __exit gpio_wave_exit(void)
+{
+ platform_driver_unregister(&gpio_wave_driver);
+}
+
+
+module_init(gpio_wave_init);
+module_exit(gpio_wave_exit);
+
+MODULE_DESCRIPTION("Driver for gpio wave");
+MODULE_AUTHOR("lyx, lyx@rock-chips.com");
+MODULE_LICENSE("GPL");
+
diff --git a/drivers/testcode/gpio_wave.h b/drivers/testcode/gpio_wave.h
new file mode 100755
index 000000000000..592cfba8a641
--- /dev/null
+++ b/drivers/testcode/gpio_wave.h
@@ -0,0 +1,11 @@
+#ifndef __GPIO_PWM_H__
+#define __GPIO_PWM_H__
+
+struct gpio_wave_platform_data {
+ unsigned int gpio; //the pin use to exert spuare wave
+ int Htime; //spuare wave Hight width
+ int Ltime; //spuare wave Low width
+ int Dvalue; //gpio default value
+};
+
+#endif