最简单的字符设备驱动gobalvar
drv:
#include <linux/module.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <asm/uaccess.h>
MODULE_LICENSE("GPL");
#define MAJOR_NUM 1024 //主设备号
static ssize_t globalvar_read(struct file *, char *, size_t, loff_t*);
static ssize_t globalvar_write(struct file *, const char *, size_t, loff_t*);
static int global_var = 0; //"globalvar"设备的全局变量
static ssize_t globalvar_read(struct file *filp, char *buf, size_t len, loff_t *off)
{
if (copy_to_user(buf, &global_var, sizeof(int))){ //将global_var从内核空间复制到用户空间
return - EFAULT;
}
printk("globalvar_read enter ,the data is %d\n",global_var);
return sizeof(int);
}
static ssize_t globalvar_write(struct file *filp, const char *buf, size_t len, loff_t *off)
{
if (copy_from_user(&global_var, buf, sizeof(int))){//将用户空间的数据复制到内核空间的global_var
return - EFAULT;
}
printk("globalvar_write enter ,the data is %d\n",global_var);
return sizeof(int);
}
//初始化字符设备驱动的file_operations结构体
struct file_operations globalvar_fops =
{
//read: globalvar_read, write: globalvar_write,
.write = globalvar_write,
.read =globalvar_read,
};
static int __init globalvar_init(void){
int ret;
ret = register_chrdev(MAJOR_NUM, "globalvar", &globalvar_fops); //注册设备驱动
if (ret){
printk("globalvar register failure");
}
else{
printk("globalvar register success");
}
return ret;
}
//注销设备驱动
static void __exit globalvar_exit(void)
{
unregister_chrdev(MAJOR_NUM, "globalvar");
}
module_init(globalvar_init);
module_exit(globalvar_exit);
对应的app:
#include <stdio.h>
#include <sys/stat.h> //获得文件的属性,它可以返回一个结构,里面包含文件全部属性
#include <fcntl.h> //设备驱动程序接口是由结构说明,它定义在fcntl.h中
#include <sys/types.h> //类型 clock_t,dev_t,off_t,ptrdiff,size_t,ssize_t,time_t
void main(void)
{
int fd, num;
fd = open("/dev/globalvar", O_RDWR, S_IRUSR | S_IWUSR);
if (fd != -1 ){
read(fd, &num, sizeof(int));
printf("The globalvar is %d\n", num);
printf("Please input the num written to globalvar\n");
scanf("%d", &num);
write(fd, &num, sizeof(int));
read(fd, &num, sizeof(int));
printf("The globalvar is %d\n", num);
close(fd);
}else{
printf("Device open failure\n");
}
}
对应的加载脚本:
# !/bin/sh
insmod /home/project/ddr3/ddr3_globalvartest/drv/globalvar.ko
mknod /dev/globalvar c 1024 0
../app/app
dmesg -c
卸载脚本:
# !/bin/sh
rmmod globalvar
dmesg -c
#killall -9 app
原理既不多做作介绍了,很简单。