Problem with Arduino USB driver linux

We are 2 students and we want to make a simple custom usb module (not the original)for Arduino in linux.
The project is to establish communication between arduino uno and a linux pc . We want to be like the Arduino's Serial Monitor.
The problem is with the write and read functions via usb protocol. There are the module and a simple program for data transmission.
We know that the code is wrong but we believe that we give you the basic idea of our project.
Please if there is anyone who has involved in a project like this help us :~

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/usb.h>
       

struct usb_device {
 char data[100];
 struct semaphore sem;
} arduino;



int arduino_open(struct inode *inode, struct file *filp);
int arduino_release(struct inode *inode, struct file *filp);
ssize_t arduino_read(struct file *filp, char *buf, size_t count, loff_t *f_pos);
ssize_t arduino_write(struct file *filp, char *buf, size_t count, loff_t *f_pos);
struct file_operations arduino_fops = {
	read: arduino_read,
	write: arduino_write,
	open: arduino_open,
	release: arduino_release
};

int arduino_open(struct inode *inode, struct file *filp) {
	/* Success */
	return 0;
}


int arduino_release(struct inode *inode, struct file *filp) {
	/* Success */
	return 0;
}

static struct usb_device_id arduino_table[] = {
	//2341:0043
	{USB_DEVICE(0x2341, 0x0043) },
	{} //TELOS EGRAFHS
};


static int arduino_probe(struct usb_interface *interface, const struct usb_device_id *id)
{
	printk(KERN_INFO "[*] arduino driver (%04X:%04X) Connected\n", id->idVendor, id->idProduct);
	return 0;
}


static void arduino_disconnect(struct usb_interface *interface){
		printk(KERN_INFO "[*] arduino Disconnected\n");
}


static struct usb_driver arduino_driver = 
{
	.name = "Arduino USB Driver",
	.id_table = arduino_table,// usb id
	.probe = arduino_probe,
	.disconnect = arduino_disconnect,
};


static int __init arduino_init(void){
	int ret = -1;
	printk(KERN_INFO "[*]Arduino Constructor of Driver");
	printk(KERN_INFO "\t Registering Driver with kernel");
	ret=usb_register(&arduino_driver);
	register_chrdev(245, "arduino", &arduino_fops);
	printk(KERN_INFO "[*]Registration complete");
	return ret;
}

static void __exit arduino_exit(void){
		//deregister
		printk(KERN_INFO "[*]Arduino Destructor of Driver");
		usb_deregister(&arduino_driver);
		printk(KERN_INFO "\t UnRegistration complete! \n");		
}

/******************************************************************************************************
*************************************   1st Problem**************************************************
******************************************************************************************************/
ssize_t device_read(struct file* filp, char* bufStoreData, size_t bufCount, loff_t* curOffset){

 printk(KERN_INFO "Arduino: Reading from device");
 ret = copy_to_user(bufStoreData,arduino.data,bufCount);
 return ret;
}

/******************************************************************************************************
*************************************   2nd Problem**************************************************
******************************************************************************************************/
ssize_t device_write(struct file* filp, const char* bufSourceData,size_t bufCount, loff_t* curOffset){

 printk(KERN_INFO "Arduino: writing to device");
 ret = copy_from_user( arduino.data, bufSourceData, bufCount);
 return ret;
}


module_init(arduino_init);
module_exit(arduino_exit);
		
MODULE_LICENSE("GPL");
MODULE_AUTHOR("PanosTolis");
MODULE_DESCRIPTION("USB arduino Registration Driver");
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>

#define DEVICE "/dev/arduino"


int main(){
	int i , fd ;
	char ch,write_buf[100],read_buf[100];
	
	fd = open(DEVICE, O_RDWR); 
	if(fd == -1){
	
		printf("file %s ACCESS Denied!!!\n", DEVICE);
		exit(-1);
		}
	
	printf("r = read from device\nw = write to device\nENTER COMMAND: /n");
	scanf ("%c", &ch);
	
	switch (ch){
		case 'w' :
			printf ("enter data/n");
			scanf("% [^\n]",write_buf);
			write(fd,write_buf,sizeof(write_buf));
			break;
		case 'r' :
			read(fd,read_buf,sizeof(read_buf));
			printf ("device : %s\n",read_buf);
			break;
		default :
			printf ("wrong choice");
			break;
			
		}
		
		
	close(fd);
	return 0;
	}

Custom USB for Linux...
This is one correct path using LUFA:

http://www.avrfreaks.net/index.php?name=PNphpBB2&file=printview&t=118583&start=0