【Linux c】驱动根据用户数据,回复特定数据

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







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值