pwrkey.c
#include <linux/module.h>
#include <linux/sched.h>
#include <linux/timer.h>
#include <linux/major.h>
#include <linux/fcntl.h>
#include <linux/mm.h>
#include <linux/slab.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/fs.h>
#include <linux/spinlock.h>
#include <linux/pm.h>
#include <linux/pm_legacy.h>
#include <linux/cdev.h>
#include <linux/init.h>
#include <linux/device.h>
#include <asm/io.h>
#include <asm/uaccess.h>
#include <asm/jzsoc.h>
#define NAME "pwrkey"
#define GPIO_PW_I GPIO_WAKEUP
#define POWEROFF_PIN GPIO_PW_I
static struct device *mydev = NULL;
static struct class *myclass = NULL;
static unsigned int read_gpio_pin(void)
{
unsigned int try_loop = 1000;
unsigned int t, v;
unsigned int i;
i = try_loop;
v = t = 0;
while (i--) {
t = __gpio_get_pin(POWEROFF_PIN);
if (v != t)
i = try_loop;
v = t;
}
return v;
}
static ssize_t pwrkey_show(struct device *dev, struct device_attribute *attr, char *buf)
{
return sprintf(buf, "%d\n", read_gpio_pin());
}
static DEVICE_ATTR(pwrkey, 664, pwrkey_show, NULL);
int ldd_init(void)
{
int r = 0;
myclass = class_create(THIS_MODULE, NAME);
mydev = device_create(myclass, NULL, MKDEV(168, 0), "%s", NAME);
r = device_create_file(mydev, &dev_attr_pwrkey);
return 0;
}
void ldd_exit(void)
{
device_remove_file(mydev, &dev_attr_pwrkey);
device_destroy(myclass, MKDEV(168, 0));
class_destroy(myclass);
}
module_init(ldd_init);
module_exit(ldd_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Steward Fu");
MODULE_DESCRIPTION("Powerkey driver for d88 handheld");
P.S. /sys/class/pwrkey/pwrkey/pwrkey