fishonesea

android 驱动,移植,qq群:91386163 推荐《Android深度探索(卷1):HAL与驱动开发》
  博客园  :: 首页  :: 新随笔  :: 管理

最简单的字符设备驱动gobalvar

Posted on 2012-02-21 17:04  fishonesea  阅读(389)  评论(2编辑  收藏  举报

最简单的字符设备驱动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


原理既不多做作介绍了,很简单。