/*
* och177.c - Linux kernel modules for ambient light sensor
*
* Copyright (C) 2011
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
static struct class *dunk_1_gpio_test_class=NULL;
static ssize_t dunk_1_gnss_set_high(struct class *cls, struct class_attribute *attr, const char *_buf, size_t _count)
{
int gpio=0;
sscanf(_buf, "%d", &gpio);
printk("%s: gpio: %d
", __FUNCTION__, gpio);
gpio_direction_output(gpio, 1);
return _count;
}
static ssize_t dunk_1_gnss_set_low(struct class *cls, struct class_attribute *attr, const char *_buf, size_t _count)
{
int gpio=0;
sscanf(_buf, "%d", &gpio);
printk("%s: gpio: %d
", __FUNCTION__, gpio);
gpio_direction_output(gpio, 0);
return _count;
}
//这里可以去看一下class_attribute这个结构体,这个结构体对理解这个声明有用
static struct class_attribute dunk_1_gpio_test_attr[] = {
__ATTR(output_high,0666, NULL, dunk_1_gnss_set_high),
__ATTR(output_low,0666, NULL, dunk_1_gnss_set_low),
__ATTR_NULL,
};
static int __init dunk_1_gpio_test_init(void)
{
int ret;
int i = 0;
printk("%s start
", __FUNCTION__);
//用class_create在sys/class/下面生成sys文件系统
dunk_1_gpio_test_class=class_create(THIS_MODULE,"dunk_1_gpioex_test");
if(IS_ERR(dunk_1_gpio_test_class))
{
printk("create dunk_1_gnss fail
");
return PTR_ERR(dunk_1_gpio_test_class);;
}
for (i = 0 ; NULL != attr_name(dunk_1_test_attr[i]);i++)
{
ret = class_create_file(dunk_1_gpio_test_class, &dunk_1_gpio_test_attr[i]);
if (0 != ret)
{
printk("creat %s class file fail
",attr_name(dunk_1_gpio_test_attr[i]));
break;
}
}
printk("%s end
", __FUNCTION__);
return 0;
}
static void __exit dunk_1_gpio_test_exit(void)
{
int i = 0;
printk("dunk_1 gnss module cleanup start.
");
for (i = 0 ; NULL != attr_name(dunk_1_gpio_test_attr[i]);i++)
{
class_remove_file(dunk_1_gpio_test_class, &dunk_1_gpio_test_attr[i]);
}
class_destroy(dunk_1_gpio_test_class);
printk("dunk_1 gnss module cleanup OK!
");
}
MODULE_AUTHOR("dunk_1 ");
MODULE_DESCRIPTION("dunk_1gpio test MODULE");
MODULE_LICENSE("GPL");
MODULE_VERSION("ver0.1");
module_init(dunk_1_gpio_test_init);
module_exit(gota_gpio_test_exit);