Add package pwm-gpio-custom
SVN-Revision: 22350
This commit is contained in:
		
							
								
								
									
										54
									
								
								package/pwm-gpio-custom/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								package/pwm-gpio-custom/Makefile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,54 @@ | ||||
| # | ||||
| # Copyright (C) 2010 OpenWrt.org | ||||
| # | ||||
| # This is free software, licensed under the GNU General Public License v2. | ||||
| # See /LICENSE for more information. | ||||
| # | ||||
|  | ||||
| include $(TOPDIR)/rules.mk | ||||
| include $(INCLUDE_DIR)/kernel.mk | ||||
|  | ||||
| PKG_NAME:=pwm-gpio-custom | ||||
| PKG_RELEASE:=1 | ||||
|  | ||||
| include $(INCLUDE_DIR)/package.mk | ||||
|  | ||||
| define KernelPackage/pwm-gpio-custom | ||||
|   SUBMENU:=Other modules | ||||
|   TITLE:=Custom GPIO-based PWM device | ||||
|   DEPENDS:=+kmod-pwm-gpio | ||||
|   FILES:=$(PKG_BUILD_DIR)/pwm-gpio-custom.ko | ||||
|   KCONFIG:= | ||||
| endef | ||||
|  | ||||
| define KernelPackage/pwm-gpio-custom/description | ||||
|  Kernel module to register a custom pwm-gpio platform device. | ||||
| endef | ||||
|  | ||||
| EXTRA_KCONFIG:= \ | ||||
| 	CONFIG_PWM_GPIO_CUSTOM=m | ||||
|  | ||||
| EXTRA_CFLAGS:= \ | ||||
| 	$(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=m,%,$(filter %=m,$(EXTRA_KCONFIG)))) \ | ||||
| 	$(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=y,%,$(filter %=y,$(EXTRA_KCONFIG)))) | ||||
|  | ||||
| MAKE_OPTS:= \ | ||||
| 	ARCH="$(LINUX_KARCH)" \ | ||||
| 	CROSS_COMPILE="$(TARGET_CROSS)" \ | ||||
| 	SUBDIRS="$(PKG_BUILD_DIR)" \ | ||||
| 	EXTRA_CFLAGS="$(EXTRA_CFLAGS)" \ | ||||
| 	$(EXTRA_KCONFIG) | ||||
|  | ||||
| define Build/Prepare | ||||
| 	mkdir -p $(PKG_BUILD_DIR) | ||||
| 	$(CP) ./src/* $(PKG_BUILD_DIR)/ | ||||
| endef | ||||
|  | ||||
| define Build/Compile | ||||
| 	$(MAKE) -C "$(LINUX_DIR)" \ | ||||
| 		$(MAKE_OPTS) \ | ||||
| 		modules | ||||
| endef | ||||
|  | ||||
| $(eval $(call KernelPackage,pwm-gpio-custom)) | ||||
|  | ||||
							
								
								
									
										4
									
								
								package/pwm-gpio-custom/src/Kconfig
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								package/pwm-gpio-custom/src/Kconfig
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | ||||
| config PWM_MASTER_GPIO_CUSTOM | ||||
| 	tristate "Custom GPIO-based PWM driver" | ||||
| 	depends on GENERIC_GPIO | ||||
| 	select PWM_GENERIC_GPIO | ||||
							
								
								
									
										1
									
								
								package/pwm-gpio-custom/src/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								package/pwm-gpio-custom/src/Makefile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| obj-${CONFIG_PWM_GPIO_CUSTOM}	+= pwm-gpio-custom.o | ||||
							
								
								
									
										217
									
								
								package/pwm-gpio-custom/src/pwm-gpio-custom.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										217
									
								
								package/pwm-gpio-custom/src/pwm-gpio-custom.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,217 @@ | ||||
| /* | ||||
|  *  Custom GPIO-based PWM driver | ||||
|  * | ||||
|  *  Based on w1-gpio-custom by Copyright (C) 2007 Gabor Juhos <juhosg at openwrt.org> | ||||
|  *  Copyright (C) 2010 Claudio Mignanti <c.mignanti@gmail.com > | ||||
|  * | ||||
|  *  This program is free software; you can redistribute it and/or modify | ||||
|  *  it under the terms of the GNU General Public License version 2 as | ||||
|  *  published by the Free Software Foundation. | ||||
|  * | ||||
|  * --------------------------------------------------------------------------- | ||||
|  * | ||||
|  *  The behaviour of this driver can be altered by setting some parameters | ||||
|  *  from the insmod command line. | ||||
|  * | ||||
|  *  The following parameters are adjustable: | ||||
|  * | ||||
|  *	bus0	These four arguments must be arrays | ||||
|  *	bus1 | ||||
|  *	..... | ||||
|  *	bus10	<id>,<pin>,<od> | ||||
|  * | ||||
|  *  where: | ||||
|  * | ||||
|  *  <id>	ID to used as device_id for the corresponding bus (required) | ||||
|  *  <pin>	GPIO pin ID for PWM channel (required) | ||||
|  * * | ||||
|  *  If this driver is built into the kernel, you can use the following kernel | ||||
|  *  command line parameters, with the same values as the corresponding module | ||||
|  *  parameters listed above: | ||||
|  * | ||||
|  *	pwm-gpio-custom.bus0 | ||||
|  *	pwm-gpio-custom.bus1 | ||||
|  *	pwm-gpio-custom.bunN | ||||
|  *	pwm-gpio-custom.bus10 | ||||
|  */ | ||||
|  | ||||
| #include <linux/kernel.h> | ||||
| #include <linux/module.h> | ||||
| #include <linux/init.h> | ||||
| #include <linux/platform_device.h> | ||||
|  | ||||
| #include <linux/pwm/pwm.h> | ||||
|  | ||||
| #define DRV_NAME	"pwm-gpio-custom" | ||||
| #define DRV_DESC	"Custom GPIO-based pwm driver" | ||||
| #define DRV_VERSION	"0.1.0" | ||||
|  | ||||
| #define PFX		DRV_NAME ": " | ||||
|  | ||||
| #define BUS_PARAM_ID		0 | ||||
| #define BUS_PARAM_PIN		1 | ||||
|  | ||||
| #define BUS_PARAM_REQUIRED	2 | ||||
| #define BUS_PARAM_COUNT		2 | ||||
| #define BUS_COUNT_MAX		10 | ||||
|  | ||||
| static unsigned int bus0[BUS_PARAM_COUNT] __initdata; | ||||
| static unsigned int bus1[BUS_PARAM_COUNT] __initdata; | ||||
| static unsigned int bus2[BUS_PARAM_COUNT] __initdata; | ||||
| static unsigned int bus3[BUS_PARAM_COUNT] __initdata; | ||||
| static unsigned int bus4[BUS_PARAM_COUNT] __initdata; | ||||
| static unsigned int bus5[BUS_PARAM_COUNT] __initdata; | ||||
| static unsigned int bus6[BUS_PARAM_COUNT] __initdata; | ||||
| static unsigned int bus7[BUS_PARAM_COUNT] __initdata; | ||||
| static unsigned int bus8[BUS_PARAM_COUNT] __initdata; | ||||
| static unsigned int bus9[BUS_PARAM_COUNT] __initdata; | ||||
|  | ||||
| static unsigned int bus_nump[BUS_COUNT_MAX] __initdata; | ||||
|  | ||||
| #define BUS_PARM_DESC " config -> id,pin" | ||||
|  | ||||
| module_param_array(bus0, uint, &bus_nump[0], 0); | ||||
| MODULE_PARM_DESC(bus0, "bus0" BUS_PARM_DESC); | ||||
| module_param_array(bus1, uint, &bus_nump[1], 0); | ||||
| MODULE_PARM_DESC(bus1, "bus1" BUS_PARM_DESC); | ||||
| module_param_array(bus2, uint, &bus_nump[2], 0); | ||||
| MODULE_PARM_DESC(bus2, "bus2" BUS_PARM_DESC); | ||||
| module_param_array(bus3, uint, &bus_nump[3], 0); | ||||
| MODULE_PARM_DESC(bus3, "bus3" BUS_PARM_DESC); | ||||
| module_param_array(bus4, uint, &bus_nump[4], 0); | ||||
| MODULE_PARM_DESC(bus4, "bus4" BUS_PARM_DESC); | ||||
| module_param_array(bus5, uint, &bus_nump[5], 0); | ||||
| MODULE_PARM_DESC(bus5, "bus5" BUS_PARM_DESC); | ||||
| module_param_array(bus6, uint, &bus_nump[6], 0); | ||||
| MODULE_PARM_DESC(bus6, "bus6" BUS_PARM_DESC); | ||||
| module_param_array(bus7, uint, &bus_nump[7], 0); | ||||
| MODULE_PARM_DESC(bus7, "bus7" BUS_PARM_DESC); | ||||
| module_param_array(bus8, uint, &bus_nump[8], 0); | ||||
| MODULE_PARM_DESC(bus8, "bus8" BUS_PARM_DESC); | ||||
| module_param_array(bus9, uint, &bus_nump[9], 0); | ||||
| MODULE_PARM_DESC(bus9, "bus9" BUS_PARM_DESC); | ||||
|  | ||||
| static struct platform_device *devices[BUS_COUNT_MAX]; | ||||
| static unsigned int nr_devices; | ||||
|  | ||||
| static void pwm_gpio_custom_cleanup(void) | ||||
| { | ||||
| 	int i; | ||||
|  | ||||
| 	for (i = 0; i < nr_devices; i++) | ||||
| 		if (devices[i]) | ||||
| 			platform_device_put(devices[i]); | ||||
| } | ||||
|  | ||||
| static int __init pwm_gpio_custom_add_one(unsigned int id, unsigned int *params) | ||||
| { | ||||
| 	struct platform_device *pdev; | ||||
| 	struct gpio_pwm_platform_data pdata; | ||||
| 	int err; | ||||
|  | ||||
| 	if (!bus_nump[id]) | ||||
| 		return 0; | ||||
|  | ||||
| 	if (bus_nump[id] < BUS_PARAM_REQUIRED) { | ||||
| 		printk(KERN_ERR PFX "not enough parameters for bus%d\n", id); | ||||
| 		err = -EINVAL; | ||||
| 		goto err; | ||||
| 	} | ||||
|  | ||||
| 	pdev = platform_device_alloc("gpio_pwm", params[BUS_PARAM_ID]); | ||||
| 	if (!pdev) { | ||||
| 		err = -ENOMEM; | ||||
| 		goto err; | ||||
| 	} | ||||
|  | ||||
| 	pdata.gpio = params[BUS_PARAM_PIN]; | ||||
|  | ||||
| 	err = platform_device_add_data(pdev, &pdata, sizeof(pdata)); | ||||
| 	if (err) | ||||
| 		goto err_put; | ||||
|  | ||||
| 	err = platform_device_add(pdev); | ||||
| 	if (err) | ||||
| 		goto err_put; | ||||
|  | ||||
| 	devices[nr_devices++] = pdev; | ||||
| 	return 0; | ||||
|  | ||||
|  err_put: | ||||
| 	platform_device_put(pdev); | ||||
|  err: | ||||
| 	return err; | ||||
| } | ||||
|  | ||||
| static int __init pwm_gpio_custom_probe(void) | ||||
| { | ||||
| 	int err; | ||||
|  | ||||
| 	nr_devices = 0; | ||||
| 	printk(KERN_INFO DRV_DESC " version " DRV_VERSION "\n"); | ||||
|  | ||||
| 	err = pwm_gpio_custom_add_one(0, bus0); | ||||
| 	if (err) goto err; | ||||
|  | ||||
| 	err = pwm_gpio_custom_add_one(1, bus1); | ||||
| 	if (err) goto err; | ||||
|  | ||||
| 	err = pwm_gpio_custom_add_one(2, bus2); | ||||
| 	if (err) goto err; | ||||
|  | ||||
| 	err = pwm_gpio_custom_add_one(3, bus3); | ||||
| 	if (err) goto err; | ||||
|  | ||||
| 	err = pwm_gpio_custom_add_one(4, bus4); | ||||
| 	if (err) goto err; | ||||
|  | ||||
| 	err = pwm_gpio_custom_add_one(5, bus5); | ||||
| 	if (err) goto err; | ||||
|  | ||||
| 	err = pwm_gpio_custom_add_one(6, bus6); | ||||
| 	if (err) goto err; | ||||
|  | ||||
| 	err = pwm_gpio_custom_add_one(7, bus7); | ||||
| 	if (err) goto err; | ||||
|  | ||||
| 	err = pwm_gpio_custom_add_one(8, bus8); | ||||
| 	if (err) goto err; | ||||
|  | ||||
| 	err = pwm_gpio_custom_add_one(9, bus9); | ||||
| 	if (err) goto err; | ||||
|  | ||||
| 	if (!nr_devices) { | ||||
| 		printk(KERN_ERR PFX "no bus parameter(s) specified\n"); | ||||
| 		err = -ENODEV; | ||||
| 		goto err; | ||||
| 	} | ||||
|  | ||||
| 	return 0; | ||||
|  | ||||
| err: | ||||
| 	pwm_gpio_custom_cleanup(); | ||||
| 	return err; | ||||
| } | ||||
|  | ||||
| #ifdef MODULE | ||||
| static int __init pwm_gpio_custom_init(void) | ||||
| { | ||||
| 	return pwm_gpio_custom_probe(); | ||||
| } | ||||
| module_init(pwm_gpio_custom_init); | ||||
|  | ||||
| static void __exit pwm_gpio_custom_exit(void) | ||||
| { | ||||
| 	pwm_gpio_custom_cleanup(); | ||||
| } | ||||
| module_exit(pwm_gpio_custom_exit); | ||||
| #else | ||||
| subsys_initcall(pwm_gpio_custom_probe); | ||||
| #endif /* MODULE*/ | ||||
|  | ||||
| MODULE_LICENSE("GPL v2"); | ||||
| MODULE_AUTHOR("Bifferos <bifferos at yahoo.co.uk >"); | ||||
| MODULE_AUTHOR("Claudio Mignanti <c.mignanti@gmail.com >"); | ||||
| MODULE_DESCRIPTION(DRV_DESC); | ||||
| MODULE_VERSION(DRV_VERSION); | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 Claudio Mignanti
					Claudio Mignanti