add some auto test code, maybe useful for someone
authorlyx <lyx@rock-chips.com>
Wed, 1 Jun 2011 07:33:09 +0000 (00:33 -0700)
committerlyx <lyx@rock-chips.com>
Thu, 2 Jun 2011 01:47:40 +0000 (18:47 -0700)
arch/arm/mach-rk29/board-rk29-phonesdk.c
drivers/Kconfig [changed mode: 0644->0755]
drivers/Makefile
drivers/testcode/Kconfig [new file with mode: 0755]
drivers/testcode/Makefile [new file with mode: 0755]
drivers/testcode/gpio_wave.c [new file with mode: 0755]
drivers/testcode/gpio_wave.h [new file with mode: 0755]

index 943b98b689efee417644780ba11f2d3306a21fb6..105291e971f195bd659e8a1a3cd9cfe57e848759 100755 (executable)
 #include <linux/mtk23d.h>
 #endif
 
+#ifdef CONFIG_USE_GPIO_GENERATE_WAVE
+#include "../../../drivers/testcode/gpio_wave.h"
+#endif
+
 #include "../../../drivers/headset_observe/rk_headset.h"
 /*set touchscreen different type header*/
 #if defined(CONFIG_TOUCHSCREEN_XPT2046_NORMAL_SPI)
@@ -71,7 +75,6 @@
 #elif defined(CONFIG_TOUCHSCREEN_XPT2046_CBN_SPI)
 #include "../../../drivers/input/touchscreen/xpt2046_cbn_ts.h"
 #endif
-
 #include "../../../drivers/misc/gps/rk29_gps.h"
 #include "../../../drivers/serial/sc8800.h"
 #ifdef CONFIG_VIDEO_RK29
@@ -2286,6 +2289,22 @@ static struct platform_device rk29_device_keys = {
 };
 #endif
 
+#ifdef CONFIG_USE_GPIO_GENERATE_WAVE
+static struct gpio_wave_platform_data gpio_wave_pdata = {
+       .gpio = RK29_PIN0_PA0,
+       .Htime = 2000,
+       .Ltime = 300,
+       .Dvalue = GPIO_HIGH,
+};
+static struct platform_device gpio_wave_device = {
+       .name           = "gpio_wave",
+       .id     = -1,
+       .dev            = {
+               .platform_data  = &gpio_wave_pdata,
+       },
+};
+#endif
+
 static void __init rk29_board_iomux_init(void)
 {
        #ifdef CONFIG_RK29_PWM_REGULATOR
@@ -2342,6 +2361,9 @@ static struct platform_device *devices[] __initdata = {
 #ifdef CONFIG_KEYS_RK29
        &rk29_device_keys,
 #endif
+#ifdef CONFIG_USE_GPIO_GENERATE_WAVE
+       &gpio_wave_device,
+#endif
 #ifdef CONFIG_SDMMC0_RK29
        &rk29_device_sdmmc0,
 #endif
old mode 100644 (file)
new mode 100755 (executable)
index e973e28..33a14a7
@@ -124,4 +124,6 @@ source "drivers/platform/Kconfig"
 
 source "drivers/cmmb/Kconfig"
 
+source "drivers/testcode/Kconfig"
+
 endmenu
index fed9bf8277a199df6ef1b58485572ef44250fc0e..d5633915775237d5062ade117cdade1643bf0e2a 100755 (executable)
@@ -114,6 +114,7 @@ obj-$(CONFIG_VLYNQ)         += vlynq/
 obj-$(CONFIG_STAGING)          += staging/
 obj-y                          += platform/
 obj-y                          += ieee802154/
-obj-$(CONFIG_CMMB)             += cmmb/        
+obj-$(CONFIG_CMMB)             += cmmb/
+obj-$(CONFIG_TEST_CODE)                += testcode/
 obj-y                          += dbg/
 
diff --git a/drivers/testcode/Kconfig b/drivers/testcode/Kconfig
new file mode 100755 (executable)
index 0000000..e3a89d7
--- /dev/null
@@ -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 (executable)
index 0000000..fa7569c
--- /dev/null
@@ -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 (executable)
index 0000000..9e3bae8
--- /dev/null
@@ -0,0 +1,108 @@
+#include <linux/delay.h>\r
+#include <linux/platform_device.h>\r
+#include <linux/clk.h>\r
+#include <mach/gpio.h>\r
+#include <linux/wakelock.h>\r
+\r
+#include "gpio_wave.h"\r
+\r
+struct wave_data {\r
+       struct delayed_work d_work;\r
+       int Htime;\r
+       int Ltime;\r
+       unsigned int gpio;\r
+       int cur_value;\r
+       int last_value;\r
+       struct device *dev;  \r
+};\r
+\r
+static struct wake_lock w_lock;\r
+\r
+static void gpio_wave_dwork_handle(struct work_struct *work)\r
+{\r
+       struct wave_data *data = (struct wave_data *)container_of(work, struct wave_data, d_work.work);\r
+       \r
+       int delay_time = data->cur_value ? data->Ltime : data->Htime;\r
+       data->cur_value = !data->cur_value;\r
+       gpio_set_value(data->gpio, data->cur_value);\r
+       schedule_delayed_work(&(data->d_work), msecs_to_jiffies(delay_time));\r
+}\r
+\r
+\r
+static int gpio_wave_probe(struct platform_device *pdev)\r
+{\r
+       int ret;\r
+       struct wave_data *data;\r
+       struct gpio_wave_platform_data *pdata = pdev->dev.platform_data;\r
+\r
+       data = kmalloc(sizeof(struct wave_data), GFP_KERNEL);\r
+       if (!data) {\r
+               printk("func %s, line %d, malloc fail\n", __func__, __LINE__);\r
+               return -ENOMEM;\r
+       }\r
+\r
+       data->dev = &pdev->dev;\r
+       platform_set_drvdata(pdev, data);\r
+       \r
+       if (pdata) {\r
+               int dtime = pdata->Dvalue ? pdata->Htime : pdata->Ltime;\r
+               data->gpio = pdata->gpio;\r
+               data->cur_value = pdata->Dvalue;\r
+               data->last_value = pdata->Dvalue;\r
+               data->Htime = pdata->Htime;\r
+               data->Ltime = pdata->Ltime;\r
+               \r
+               ret = gpio_request(data->gpio, NULL);\r
+               if (ret) {\r
+                       printk("func %s, line %d, gpio request err\n", __func__, __LINE__);\r
+                       return ret;\r
+               }\r
+               gpio_direction_output(data->gpio, data->cur_value);\r
+               gpio_set_value(data->gpio, data->cur_value);\r
+               wake_lock_init(&w_lock, WAKE_LOCK_SUSPEND, "gpio_wave");\r
+               INIT_DELAYED_WORK(&(data->d_work), gpio_wave_dwork_handle);\r
+               wake_lock(&w_lock);\r
+               schedule_delayed_work(&(data->d_work), msecs_to_jiffies(dtime));\r
+       }\r
+       else {\r
+               kfree(data);\r
+       }\r
+       \r
+       return 0;\r
+}\r
+\r
+static int gpio_wave_remove(struct platform_device *pdev)\r
+{\r
+       struct wave_data *data = platform_get_drvdata(pdev);\r
+       gpio_free(data->gpio);\r
+       kfree(data);\r
+       return 0;\r
+}\r
+\r
+static struct platform_driver gpio_wave_driver = {\r
+       .probe          = gpio_wave_probe,\r
+       .remove         = gpio_wave_remove,\r
+       .driver         = {\r
+               .owner  = THIS_MODULE,\r
+               .name   = "gpio_wave",\r
+       },\r
+};\r
+\r
+static int __init gpio_wave_init(void)\r
+{\r
+       return platform_driver_register(&gpio_wave_driver);\r
+}\r
+\r
+static void __exit gpio_wave_exit(void)\r
+{\r
+       platform_driver_unregister(&gpio_wave_driver);\r
+}\r
+\r
+\r
+module_init(gpio_wave_init);\r
+module_exit(gpio_wave_exit);\r
+\r
+MODULE_DESCRIPTION("Driver for gpio wave");\r
+MODULE_AUTHOR("lyx, lyx@rock-chips.com");\r
+MODULE_LICENSE("GPL");\r
+\r
diff --git a/drivers/testcode/gpio_wave.h b/drivers/testcode/gpio_wave.h
new file mode 100755 (executable)
index 0000000..592cfba
--- /dev/null
@@ -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