#include <linux/init.h>
#include <linux/platform_device.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/fs.h>
#include <linux/types.h>
#include <linux/cdev.h>
#include <linux/slab.h>
#include <asm/uaccess.h>
#include <linux/device.h>
#include <linux/interrupt.h>
#include <linux/kthread.h>
#include <linux/workqueue.h>
#include <linux/delay.h>
#include <linux/proc_fs.h>
#include <linux/timer.h>
#include <linux/of.h>
#include <linux/of_irq.h>
#include <linux/irqreturn.h>
#include <linux/gpio.h>
#include <linux/of_gpio.h>
#include <linux/irq.h>
#include <linux/spinlock.h>
#include <linux/err.h>
#include <linux/debugfs.h>
#include <linux/idr.h>
#include <linux/bitops.h>
#include <linux/clk.h>
#include <linux/i2c.h>
#include <linux/spi/spi.h>
#include <linux/of_device.h>
#include <linux/serial_core.h>
#include <linux/serial.h>
#include <linux/serial_reg.h>
#include <linux/tty.h>
#include <linux/tty_flip.h>
#include <linux/uaccess.h>
#include "linux/version.h"
struct tpd_device {
struct device *tpd_dev;
struct regulator *reg;
struct input_dev *dev;
struct input_dev *kpd;
struct timer_list timer;
struct tasklet_struct tasklet;
int btn_state;
};
struct class *newmobi_class;
struct device *newmobi_cmd_dev;
static dev_t newmobi_devno;
static struct cdev newmobi_cdev;
//extern struct tpd_device *tpd;
//struct input_dev *dev;
#define GPIO96 96
#define GPIO94 94
#define GPIO95 95
#define GPIO57 57
#define GPIO58 58
#define GPIO_MODE_00 0
#define GPIO_OUT_ONE 1
#define GPIO_OUT_ZERO 0
typedef enum {
GPIO_DIR_UNSUPPORTED = -1,
GPIO_DIR_IN = 0,
GPIO_DIR_OUT = 1,
GPIO_DIR_MAX,
GPIO_DIR_DEFAULT = GPIO_DIR_IN,
} GPIO_DIR;
extern int mt_set_gpio_out(unsigned long pin, unsigned long output);
extern int mt_set_gpio_mode(unsigned long pin, unsigned long mode);
extern int mt_set_gpio_dir(unsigned long pin, unsigned long dir);
/*
unsigned int strict_strtoul(const char *data, unsigned int len)
{
int i , number = 0 , lens = 0;
for(i=0;data[i]!=0xa;i++)
{
lens++;
}
lens = 3;
for(i=lens;i!=0;i--)
{
number *= 10;
number += (data[lens-i] - 0x30);
}
return number;
}
*/
static ssize_t RedLight_store(struct device *dev,struct device_attribute *attr, const char *buf, size_t size)
{
unsigned long num;
kstrtoul(buf, 0, &num);
if(num == 0)
{
mt_set_gpio_out(GPIO57,GPIO_OUT_ZERO);
mt_set_gpio_out(GPIO58,GPIO_OUT_ZERO);
}
else
{
mt_set_gpio_out(GPIO57,GPIO_OUT_ONE);
mt_set_gpio_out(GPIO57,GPIO_OUT_ONE);
}
return size;
}
static ssize_t IRcut_store(struct device *dev,struct device_attribute *attr, const char *buf, size_t size)
{
unsigned long num = 1;
printk("newmobi the num1 is %ld \n",num);
kstrtoul(buf, 0, &num);
printk("newmobi the num is %ld \n",num);
mt_set_gpio_out(GPIO94,GPIO_OUT_ZERO);
if(num == 0)
mt_set_gpio_out(GPIO94,GPIO_OUT_ZERO);
else
mt_set_gpio_out(GPIO94,GPIO_OUT_ONE);
return size;
}
static ssize_t LaserLight_store(struct device *dev,struct device_attribute *attr, const char *buf, size_t size)
{
unsigned long num;
kstrtoul(buf, 0, &num);
if(num == 0)
mt_set_gpio_out(GPIO96,GPIO_OUT_ZERO);
else
mt_set_gpio_out(GPIO96,GPIO_OUT_ONE);
return size;
}
static ssize_t BLueLight_store(struct device *dev,struct device_attribute *attr, const char *buf, size_t size)
{
unsigned long num;
kstrtoul(buf, 0, &num);
if(num == 0)
mt_set_gpio_out(GPIO95,GPIO_OUT_ZERO);
else
mt_set_gpio_out(GPIO95,GPIO_OUT_ONE);
return size;
}
/*
void input_dev_init(struct input_dev *dev)
{
__set_bit(EV_SYN, dev->evbit); //设置位
__set_bit(EV_KEY, dev->evbit); //设置一个按键类事件,表示能够产生按键事件。
__set_bit(KEY_1, dev->keybit);//表示能产生哪些按键
__set_bit(KEY_2, dev->keybit);
}
*/
static void Gpio_Init(void)
{
mt_set_gpio_mode(GPIO96,GPIO_MODE_00);
mt_set_gpio_dir(GPIO96, GPIO_DIR_OUT);
mt_set_gpio_out(GPIO96, GPIO_OUT_ZERO);
mt_set_gpio_mode(GPIO94, GPIO_MODE_00);
mt_set_gpio_dir(GPIO94, GPIO_DIR_OUT);
mt_set_gpio_out(GPIO94, GPIO_OUT_ZERO);
mt_set_gpio_mode(GPIO95,GPIO_MODE_00);
mt_set_gpio_dir(GPIO95, GPIO_DIR_OUT);
mt_set_gpio_out(GPIO95, GPIO_OUT_ZERO);
mt_set_gpio_mode(GPIO57,GPIO_MODE_00);
mt_set_gpio_dir(GPIO57, GPIO_DIR_OUT);
mt_set_gpio_out(GPIO57, GPIO_OUT_ZERO);
mt_set_gpio_mode(GPIO58,GPIO_MODE_00);
mt_set_gpio_dir(GPIO58, GPIO_DIR_OUT);
mt_set_gpio_out(GPIO58, GPIO_OUT_ZERO);
}
static DEVICE_ATTR(RedLight,0660, NULL, RedLight_store);
static DEVICE_ATTR(IRcut, 0660, NULL , IRcut_store);
static DEVICE_ATTR(LaserLight, 0660, NULL , LaserLight_store);
static DEVICE_ATTR(BLueLight, 0660, NULL , BLueLight_store);
static struct file_operations newmobi_fops = {
.owner = THIS_MODULE
};
static int newmobi_probe(struct platform_device *pdev)
{
Gpio_Init();
alloc_chrdev_region(&newmobi_devno, 0, 1, "newmobi");
cdev_add(&newmobi_cdev, newmobi_devno, 1);
cdev_init(&newmobi_cdev, &newmobi_fops);
newmobi_cdev.owner = THIS_MODULE;
newmobi_class = class_create(THIS_MODULE, "newmobi");
newmobi_cmd_dev = device_create(newmobi_class,NULL, 0, NULL, "newmobi");
device_create_file(newmobi_cmd_dev, &dev_attr_RedLight);
device_create_file(newmobi_cmd_dev , &dev_attr_IRcut);
device_create_file(newmobi_cmd_dev , &dev_attr_LaserLight);
device_create_file(newmobi_cmd_dev , &dev_attr_BLueLight);
//dev = input_allocate_device();
//input_dev_init(dev);
//input_register_device(dev);
return 0;
}
static struct platform_driver newmobi_Driver = {
.probe = newmobi_probe,
.driver =
{
.name = "newmobi",
.owner = THIS_MODULE,
}
};
static struct platform_device newmobi_Device = {
.name = "newmobi",
.id = 0,
.dev = {}
};
static int newmobi_init(void)
{
platform_driver_register(&newmobi_Driver);
platform_device_register(&newmobi_Device);
return 0;
}
static void newmobi_exit(void)
{
cdev_del(&newmobi_cdev);
platform_driver_unregister(&newmobi_Driver);
platform_device_unregister(&newmobi_Device);
device_remove_file(newmobi_cmd_dev, &dev_attr_RedLight);
device_remove_file(newmobi_cmd_dev, &dev_attr_IRcut);
device_remove_file(newmobi_cmd_dev, &dev_attr_LaserLight);
device_remove_file(newmobi_cmd_dev, &dev_attr_BLueLight);
device_destroy(newmobi_class , newmobi_devno);
class_destroy(newmobi_class);
//input_unregister_device(dev);
//input_free_device(dev);
}
MODULE_LICENSE("Dual BSD/GPL");
module_init( newmobi_init );
module_exit( newmobi_exit );