From 1b9ac442969c6b1311f7fea188fbc90a3b0480ab Mon Sep 17 00:00:00 2001 From: lyx Date: Wed, 1 Jun 2011 00:33:09 -0700 Subject: [PATCH] add some auto test code, maybe useful for someone --- arch/arm/mach-rk29/board-rk29-phonesdk.c | 24 ++++- drivers/Kconfig | 2 + drivers/Makefile | 3 +- drivers/testcode/Kconfig | 16 ++++ drivers/testcode/Makefile | 7 ++ drivers/testcode/gpio_wave.c | 108 +++++++++++++++++++++++ drivers/testcode/gpio_wave.h | 11 +++ 7 files changed, 169 insertions(+), 2 deletions(-) mode change 100644 => 100755 drivers/Kconfig create mode 100755 drivers/testcode/Kconfig create mode 100755 drivers/testcode/Makefile create mode 100755 drivers/testcode/gpio_wave.c create mode 100755 drivers/testcode/gpio_wave.h diff --git a/arch/arm/mach-rk29/board-rk29-phonesdk.c b/arch/arm/mach-rk29/board-rk29-phonesdk.c index 943b98b689ef..105291e971f1 100755 --- a/arch/arm/mach-rk29/board-rk29-phonesdk.c +++ b/arch/arm/mach-rk29/board-rk29-phonesdk.c @@ -62,6 +62,10 @@ #include #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 diff --git a/drivers/Kconfig b/drivers/Kconfig old mode 100644 new mode 100755 index e973e28b8a83..33a14a76a6b3 --- a/drivers/Kconfig +++ b/drivers/Kconfig @@ -124,4 +124,6 @@ source "drivers/platform/Kconfig" source "drivers/cmmb/Kconfig" +source "drivers/testcode/Kconfig" + endmenu diff --git a/drivers/Makefile b/drivers/Makefile index fed9bf8277a1..d56339157752 100755 --- a/drivers/Makefile +++ b/drivers/Makefile @@ -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 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 +#include +#include +#include +#include + +#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 -- 2.34.1