最简单的字符设备驱动gobalvar
2012-02-21 17:04
453 查看
最简单的字符设备驱动gobalvar
drv:
对应的app:
对应的加载脚本:
卸载脚本:
原理既不多做作介绍了,很简单。
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
原理既不多做作介绍了,很简单。
相关文章推荐
- 简单字符设备驱动代码+注释(ldd3第三章例子)
- linux 一个简单的字符设备驱动例子
- Linux驱动编程 step-by-step (二) 简单字符设备驱动
- 简单的一个字符设备驱动
- linux设备驱动第三篇:如何写一个简单的字符设备驱动?
- Linux 字符设备驱动简单总结
- __register_chrdev_region分析(简单字符设备驱动在内核的工作原理)
- Linux 字符设备驱动开发基础(二)—— 编写简单 PWM 设备驱动
- 字符设备驱动简单例子
- linux驱动开发--字符设备:简单的file_operations示例
- Linux 字符设备驱动简单总结
- 驱动学习第2天 之 最简单的字符设备驱动testchr
- Linux 字符设备驱动简单总结
- 简单字符设备驱动流程
- linux设备驱动第三篇:写一个简单的字符设备驱动
- Linux字符设备驱动的简单总结
- 简单字符设备驱动的编写
- 简单的LINUX字符设备驱动及编译进Linux内核…
- linux设备驱动程序之简单字符设备驱动
- linux设备驱动程序之简单字符设备驱动