driver.c
#include<linux/init.h>
#include<linux/kernel.h>
#include<linux/module.h>
#include<linux/fs.h>
#include<linux/miscdevice.h>
#include <linux/types.h>
#include <linux/errno.h>
#include <linux/mm.h>
#include <linux/sched.h>
#include <asm/io.h>
#include <asm/uaccess.h>
#include <linux/slab.h>
MODULE_LICENSE("Dual BSD/GPL");
static char data[2][2][4] = {
{
{"123"},
{"456"},
},
{
{"789"},
{"012"},
},
};
static int pointer = -1;
static int misc_open(struct inode *nd,struct file *filp)
{
printk(KERN_ALERT"misc_open success\n");
return 0;
}
static ssize_t misc_read(struct file *filp, char __user *buf, size_t count,loff_t *ppos)
{
printk(KERN_ALERT"In the misc_read() function!\n");
printk("read ppos =%d\n",(unsigned int)*ppos);
char temp[4] = {0};
if(pointer != -1){
strcpy(temp,data[pointer][1]);
if(copy_to_user(buf,temp,count)){
pointer = -1;
return -EFAULT;
}
printk("read total data=%s\n",buf);
}
pointer = -1;
return 0;
}
static ssize_t misc_write(struct file *filp, const char __user *buf, size_t count,loff_t *ppos)
{
printk("in the write..\n");
printk("write ppos=%d\n",(unsigned int)*ppos);
char temp[4] = {0};
int i = 0;
if(copy_from_user(temp,buf,count)){
pointer = -1;
return -EFAULT;
}
printk("temp total data=%s\n",temp);
for(i = 0;i < sizeof(data)/sizeof(data[0]);i++){
if (strcmp(temp, data[i][0]) == 0){
pointer = i;
printk("find in array data:pointer=%d\n",pointer);
return 0;
}
}
return 0;
}
struct file_operations misc_ops =
{
.owner = THIS_MODULE,
.open = misc_open,
.read = misc_read,
.write = misc_write,
};
struct miscdevice misc=
{
.minor = MISC_DYNAMIC_MINOR,
.name = "my_misc_dev",
.fops = &misc_ops,
};
static int zx_init(void)
{
int ret = 0;
ret = misc_register(&misc);
printk(KERN_ALERT"\t initialized %s!\n",(0==ret)?"successed":"failed");
return ret;
}
static void zx_exit(void)
{
misc_deregister(&misc);
printk(KERN_ALERT"Removing misc_dev...!\n");
}
module_init(zx_init);
module_exit(zx_exit);
user.c
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#include<signal.h>
#include<sys/stat.h>
int main(){
int fd;
char a[4] = "789";
char result[4] = {0};
fd = open("/dev/my_misc_dev", O_RDWR);
printf("fd=%d\n", fd);
if(fd != -1){
printf("sizeof(a)=%d\n", sizeof(a)-1);
write(fd, a, sizeof(a)-1);
printf("write in a=%s\n", a);
read(fd, result, sizeof(result)-1);
printf("read out result=%s\n", result);
}else{
printf("Device open failure\n");
}
close(fd);
printf("Device open succeed!");
return 0;
}
Makefile:
MODULE = 5g_modem
obj-m := $(MODULE).o
$(MODULE)-objs := wr.o
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
all :
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
rm -f *.o *.ko *.mod.c *.cmd .* modules.order Module.symvers
.PHONY:clean