[PATCH] This is my first commit

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: kevin <hnnnet48@xxxxxxxxx>

---
 gtserio.c | 188 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 188 insertions(+)
 create mode 100755 gtserio.c

diff --git a/gtserio.c b/gtserio.c
new file mode 100755
index 0000000..24f1e00
--- /dev/null
+++ b/gtserio.c
@@ -0,0 +1,188 @@
+/*
+ *  gtserio.c - Create an input/output character device for GeneralTouch serial screen
+ */
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/fs.h>
+#include <asm/uaccess.h>
+#include <linux/device.h>
+#include <linux/input.h>
+#include <linux/kd.h>
+//#include <linux/ioctl.h>
+
+#define MAJOR_NUM              100
+#define MAJOR_MIN              0
+#define SUCCESS                0
+#define DEVICE_NAME            "general_touch_serial"
+#define BUF_LEN                80
+MODULE_AUTHOR("GeneralTouch <support@xxxxxxxxxxxxxxxx>");
+MODULE_DESCRIPTION(DEVICE_NAME);
+MODULE_LICENSE("GPL");
+static int Device_Open = 0;
+struct input_dev *devq;
+char Message[BUF_LEN];
+dev_t gts_t;
+unsigned char val[10];
+int gtsdata[4];
+unsigned long min_x = 0;
+unsigned long max_x = 32767;
+unsigned long min_y = 0;
+unsigned long max_y = 32767;
+
+char *Message_Ptr;
+struct class *gts_class;
+
+static int device_open(struct inode *inode, struct file *file)
+{
+	printk("GTS device_open(%p)\n", file);
+
+#ifdef DEBUG
+	printk("device_open(%p)\n", file);
+#endif
+
+	/* 
+	 * We don't want to talk to two processes at the same time 
+	 */
+	if (Device_Open)
+		return -EBUSY;
+
+	Device_Open++;
+	/*
+	 * Initialize the message 
+	 */
+	Message_Ptr = Message;
+	return SUCCESS;
+}
+
+static int device_release(struct inode *inode, struct file *file)
+{
+#ifdef DEBUG
+	printk("device_release(%p,%p)\n", inode, file);
+#endif
+
+	/* 
+	 * We're now ready for our next caller 
+	 */
+	Device_Open--;
+
+	module_put(THIS_MODULE);
+	return SUCCESS;
+}
+
+/* 
+ * This function is called whenever a process which has already opened the
+ * device file attempts to read from it.
+ */
+static ssize_t device_read(struct file *file,
+			   char __user * buffer, size_t length, loff_t * offset)
+{
+
+	return 0;
+}
+
+static ssize_t
+device_write(struct file *file,
+	     const char __user * buffer, size_t length, loff_t * offset)
+{
+#ifdef DEBUG
+	printk("device_write(%p,%s,%d)", file, buffer, length);
+#endif
+
+	if (copy_from_user(&val, buffer, length)) {
+		length = -EFAULT;
+	}
+
+	printk("val[3] = %x,val[4] = %x\nval[5] = %x,val[6] = %x\n", val[3],
+	       val[4], val[5], val[6]);
+	gtsdata[0] = val[2];
+	gtsdata[1] = (val[4] << 8) | (val[3]);
+	gtsdata[2] = (val[6] << 8) | (val[5]);
+	gtsdata[3] = val[9];
+	printk("gtsdata[1] = %x\ngtsdata[2] = %x\n", gtsdata[1], gtsdata[2]);
+	input_report_abs(devq, ABS_X, gtsdata[1]);
+	input_report_abs(devq, ABS_Y, gtsdata[2]);
+	if (gtsdata[0] == 0x81) {
+
+		input_report_key(devq, BTN_TOUCH, 1);
+		input_report_abs(devq, ABS_PRESSURE, 1);
+		input_sync(devq);
+	}
+	if (gtsdata[0] == 0x84) {
+		input_report_key(devq, BTN_TOUCH, 0);
+		input_report_abs(devq, ABS_PRESSURE, 0);
+		input_sync(devq);
+	}
+	input_sync(devq);
+
+	return length;
+}
+
+struct file_operations Fops = {
+	.read = device_read,
+	.write = device_write,
+	.open = device_open,
+	.release = device_release,	/* a.k.a. close */
+};
+
+/* 
+ * Initialize the module - Register the character device 
+ */
+static int __init gts_init(void)
+{
+	int ret_val;
+	struct input_dev *gts_dev;
+	int err1;
+	gts_t = MKDEV(MAJOR_NUM, MAJOR_MIN);
+
+	gts_class = class_create(THIS_MODULE, "gts_class");
+	device_create(gts_class, NULL, gts_t, NULL, DEVICE_NAME);
+	ret_val = register_chrdev(MAJOR_NUM, DEVICE_NAME, &Fops);
+
+	if (ret_val < 0) {
+		printk("%s failed with %d\n",
+		       "Sorry, registering the character device ", ret_val);
+		return ret_val;
+	}
+
+	gts_dev = input_allocate_device();
+	if (!gts_dev) {
+		err1 = -ENOMEM;
+		goto fail1;
+	}
+	gts_dev->name = "GeneralTouch Serial TouchScreen";
+	gts_dev->phys = "generaltouch/input0";
+	gts_dev->id.bustype = BUS_RS232;
+	gts_dev->id.vendor = (int)("GT_SERIAL");
+	gts_dev->id.product = (int)("GT_SERIAL");
+	gts_dev->id.version = 0x0100;
+	gts_dev->evbit[0] =
+	    BIT_MASK(EV_SYN) | BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
+	gts_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH);
+
+	input_set_abs_params(gts_dev, ABS_X, min_x, max_x, 0, 0);
+	input_set_abs_params(gts_dev, ABS_Y, min_y, max_y, 0, 0);
+
+	err1 = input_register_device(gts_dev);
+	devq = gts_dev;
+fail1:	input_free_device(gts_dev);
+	return err1;
+}
+
+static void __exit gts_exit(void)
+{
+	int ret;
+
+	/* 
+	 * Unregister the device 
+	 */
+	unregister_chrdev(MAJOR_NUM, DEVICE_NAME);
+
+	/* 
+	 * If there's an error, report it 
+	 */
+	if (ret < 0)
+		printk("Error in module_unregister_chrdev: %d\n", ret);
+}
+
+module_init(gts_init);
+module_exit(gts_exit);
-- 
1.8.3.2

_______________________________________________
devel mailing list
devel@xxxxxxxxxxxxxxxxxxxxxx
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel




[Index of Archives]     [Linux Driver Backports]     [DMA Engine]     [Linux GPIO]     [Linux SPI]     [Video for Linux]     [Linux USB Devel]     [Linux Coverity]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux