#include <linux/module.h>
#include <linux/slab.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/device.h>
#include <linux/cdev.h>
#include <linux/major.h>
#include <asm/uaccess.h>
static ssize_t flash_env_dev_open(struct inode *inode,struct file *file)
{
return 0;
}
static ssize_t flash_env_dev_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
{
unsigned char *p = (unsigned char *)kmalloc(11,GFP_KERNEL);
memcpy(p,"lingjiujianke",13);
if(!(copy_to_user(buf,p,10)))
{
printk("<1>copy ok\n");
}
return 0;
}
static ssize_t flash_env_dev_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
{
unsigned char *p=kmalloc(11,GFP_KERNEL);
if(copy_from_user(p,buf,10)==0)
{
printk("<1>%s\n",p);
}
kfree(p);
return 0;
}
static ssize_t flash_env_dev_ioctl(struct inode *inode,struct file *file,unsigned int cmd,unsigned long arg)
{
printk("<1> %d\n",cmd);
switch(cmd){
case 0:
printk("<1> in flash 0\n");
break;
case 1:
printk("<1> in flash 1\n");
break;
default:
printk("<1> others\n");
}
return 0;
}
static const struct file_operations flash_fops = {
.owner =THIS_MODULE,
.open = flash_env_dev_open,
.read = flash_env_dev_read,
.write = flash_env_dev_write,
.ioctl = flash_env_dev_ioctl,
};
#define MAX_FLASH_ENV_MINORS 262
static struct cdev flash_cdev;
dev_t dev;
static __init int flash_env_dev_init(void)
{
int res;
dev=MKDEV(263,262);
cdev_init(&flash_cdev,&flash_fops);
res=register_chrdev_region(dev, MAX_FLASH_ENV_MINORS, "/dev/read_dev");
if(res)
printk("<1> fuck\n");
res=cdev_add(&flash_cdev,dev,MAX_FLASH_ENV_MINORS);
if(res)
printk("<1> fuck2 \n");
/* devfs_mk_dir("flash_env_dev");*/
printk("<1> Hello World\n");
return 0;
}
static void __exit flash_env_dev_exit(void)
{
unregister_chrdev_region(dev,MAX_FLASH_ENV_MINORS);
printk("<1> exit Hello World\n");
}
module_init(flash_env_dev_init);
module_exit(flash_env_dev_exit);
|