赞
踩
source "drivers/test/Kconfig"
obj-$(CONFIG_TESTHX) += test/
# # Test HX # menuconfig TESTHX default y bool "My TEST" ---help--- Yon can say N if don't want test. if TESTHX source "drivers/test/gpio/Kconfig" endif #TESTHX
(2) Makefile
#
#
#
obj-y += gpio/
#
# gpio contrl
#
config GPIO_CTRL
tristate "GPIO CTRL"
(2)Makefile
#
#
#
obj-$(CONFIG_GPIO_CTRL) += gpio-ctrl.o
ps:
Makefile文件的内容
obj-$(CONFIG_TESTDEV) +=gpio-ctrl.o
编译目标定义,定义gpio-ctrl.o这个目标是要编译进内核,还是作为模块编译:
obj-y +=gpio-ctrl.o //编译进内核
obj-m+= gpio-ctrl.o //作为模块编译
obj-n += gpio-ctrl.o //不编译
取值有$(CONFIG_GPIO_CTRL)决定,而它的只在内核模块编译配置时,有用户设置
(3)gpio-ctrl.c
#include <linux/kernel.h> #include <linux/init.h> #include <linux/module.h> #include <linux/delay.h> #define CONFIG_OF 1 #include <linux/gpio.h> #ifdef CONFIG_OF #include <linux/of.h> #include <linux/of_gpio.h> #include <linux/of_platform.h> #endif #define GPIO_LOW 0 #define GPIO_HIGH 1 static int firefly_hello_probe(struct platform_device *pdev) { int ret = -1; int i; int gpio; enum of_gpio_flags flag; struct device_node *hello_node = pdev->dev.of_node; printk("~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); printk("%s-%d: enter\n",__FUNCTION__,__LINE__); gpio = of_get_named_gpio_flags(hello_node,"led", 0,&flag); if (!gpio_is_valid(gpio)){ printk("hello: invalid gpio : %d\n",gpio); return -1; } ret = gpio_request(gpio, "hello_led"); if (ret != 0) { gpio_free(gpio); return -EIO; } printk("!!!flag:%d\n", flag); gpio_direction_output(gpio, GPIO_HIGH); printk("~~gpio:%d, value:%d\n",gpio,gpio_get_value(gpio)); // gpio_set_value(gpio, 1); gpio = of_get_named_gpio_flags(hello_node,"led1", 0,&flag); if (!gpio_is_valid(gpio)){ printk("hello: invalid gpio : %d\n",gpio); return -1; } ret = gpio_request(gpio, "hello_led"); if (ret != 0) { gpio_free(gpio); return -EIO; } gpio_direction_output(gpio, GPIO_HIGH); printk("~~gpio:%d, value:%d\n",gpio,gpio_get_value(gpio)); // gpio_set_value(gpio, 1); gpio = of_get_named_gpio_flags(hello_node,"led2", 0,&flag); if (!gpio_is_valid(gpio)){ printk("hello: invalid gpio : %d\n",gpio); return -1; } ret = gpio_request(gpio, "hello_led"); if (ret != 0) { gpio_free(gpio); return -EIO; } gpio_direction_output(gpio, GPIO_HIGH); printk("~~gpio:%d, value:%d\n",gpio,gpio_get_value(gpio)); //gpio_set_value(gpio, 1); gpio = of_get_named_gpio_flags(hello_node,"led3", 0,&flag); if (!gpio_is_valid(gpio)){ printk("hello: invalid gpio : %d\n",gpio); return -1; } ret = gpio_request(gpio, "hello_led"); if (ret != 0) { gpio_free(gpio); return -EIO; } gpio_direction_output(gpio, GPIO_HIGH); printk("~~gpio:%d, value:%d\n",gpio,gpio_get_value(gpio)); //gpio_set_value(gpio, 1); /* for(i=0; i < 10; i++) { gpio_set_value(gpio,GPIO_LOW); mdelay(500); gpio_set_value(gpio,GPIO_HIGH); mdelay(500); } */ printk("%s-%d: exit\n",__FUNCTION__,__LINE__); return 0; //return Ok } static int firefly_hello_remove(struct platform_device *pdev) { return 0; } #ifdef CONFIG_OF static const struct of_device_id of_firefly_hello_match[] = { { .compatible = "firefly,hello_led" }, { /* Sentinel */ } }; #endif static struct platform_driver firefly_hello_driver = { .probe = firefly_hello_probe, .remove = firefly_hello_remove, .driver = { .name = "firefly_hello", .owner = THIS_MODULE, #ifdef CONFIG_OF .of_match_table = of_firefly_hello_match, #endif }, }; static int __init hello_init(void) { printk(KERN_INFO "Enter %s\n", __FUNCTION__); return platform_driver_register(&firefly_hello_driver); return 0; } static void __exit hello_exit(void) { platform_driver_unregister(&firefly_hello_driver); printk("Exit Hello world\n"); } subsys_initcall(hello_init); module_exit(hello_exit); MODULE_AUTHOR("sai <271319925@qq.com>"); MODULE_DESCRIPTION("Firefly hello driver"); MODULE_LICENSE("GPL");
Ps:工程文件
make menuconfig
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。