一个完整的linux 驱动demo 加应用测试 demo
2011-12-18 23:15
921 查看
ssihc0 原创, 转载请注明出处,谢谢!
/article/7819661.html
测试环境,开发环境
feadora 11
kernal 2.6.29.4
驱动代码
driverdemo.c
Makefile 文件
生成安装驱动
创建设备文件
我们在前面代码里
应用程序code
test.c
生成
运行./a.out
open /dev/fgj successfully
read successfully:http://blog.csdn.net/ssihc0
下面是一些我们在驱动开发过程经常要用到的COMMAND
/article/7819661.html
测试环境,开发环境
feadora 11
kernal 2.6.29.4
驱动代码
driverdemo.c
#include <linux/module.h> #include <linux/init.h> #include <linux/types.h> #include <linux/fs.h> #include <linux/mm.h> #include <linux/cdev.h> #include <linux/errno.h> #include <linux/sched.h> #include <asm/io.h> #include <asm/system.h> #include <asm/uaccess.h> #define simple_MAJOR 200 static unsigned char simple_inc=0; static char demoBuffer[256]; int simple_open(struct inode *inode,struct file *filp){ if(simple_inc>0) return -ERESTARTSYS; simple_inc++; return 0; } int simple_release(struct inode *inode,struct file *filp){ simple_inc--; return 0; } ssize_t simple_read(struct file *filp,char __user *buf,size_t count,loff_t *f_pos){ if(copy_to_user(buf,demoBuffer,count)){ count=-EFAULT; } return count; } size_t simple_write(struct file *file,const char __user *buf,size_t count,loff_t *f_pos){ if (copy_from_user(demoBuffer + *f_pos,buf,count)){ count = -EFAULT; } return count; } void simple_cleanup_module(void){ unregister_chrdev(simple_MAJOR,"simple"); printk("simple_cleanup_module!\n"); } static const struct file_operations simple_fops={ .owner=THIS_MODULE, .open=simple_open, .release=simple_release, .read=simple_read, .write=simple_write, }; int simple_init_module(void){ int ret; ret=register_chrdev(simple_MAJOR,"simple",&simple_fops); if(ret<0){ printk("Unable to register character device %d!/n",simple_MAJOR); return ret; } return 0; } module_init(simple_init_module); module_exit(simple_cleanup_module); MODULE_LICENSE("Dual BSD/GPL");
Makefile 文件
ifeq ($(KERNELRELEASE),) KERNELDIR ?=/usr/src/linux-2.6.29.4 INCLUDE ?=./ PWD :=$(shell pwd) modules: $(MAKE) -C $(KERNELDIR) -I $(INCLUDE) M=$(PWD) modules modules_install: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install clean: rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions else obj-m :=driverdemo.o endif
生成安装驱动
make //会生成driverdemo.ko文件 insmod driverdemo.ko //安装到系统内 需要在root 下运行
创建设备文件
mknod /dev/fgj c 200 0这里我们只要关心200是什么, 200为设备号,也需要在root 下运行
我们在前面代码里
#define simple_MAJOR 200这就是设备号
应用程序code
test.c
#include <stdio.h> #include <fcntl.h> int main(void){ int fd; int i; char data[256]; int retval; fd=open("/dev/fgj",O_RDWR); if(fd==-1){ perror("error open\n"); exit(-1); } printf("open /dev/fgj successfully\n"); //writing data retval=write(fd,"http://blog.csdn.net/ssihc0",26); if(retval==-1){ perror("write error \n"); exit(-1); } retval=read(fd,data,26); if(retval==-1){ perror("read error\n"); exit(-1); } data[retval]=0; printf("read successfully:%s\n",data); close(fd); return 0; }
生成
gcc test.c
运行./a.out
open /dev/fgj successfully
read successfully:http://blog.csdn.net/ssihc0
下面是一些我们在驱动开发过程经常要用到的COMMAND
history cat /var/log/messages | tail //看一下我们的调试消息 mknod /dev/fgj c 200 0 //建设备文件 cat /proc/modules | grep d* //查看我们的驱动MODULE insmod driverdemo.ko //安装 设备 rmmod 1-2module.ko //删除设备 ismod //查看设备信息 dmesg | tail //看一下我们的调试消息 insmod test.ko a=3 b=2 AddOrSub=2 //带参数加载驱动
相关文章推荐
- 一个完整的linux 驱动demo 加应用测试 demo
- 一个完整的linux驱动 + 应用测试demo
- 嵌入式系统开发之驱动篇002——完整的linux驱动 + 应用测试demo(神文)
- 一个完整的SQLite的应用DEMO
- Redis企业级应用-Linux安装搭建一个完整的linxu线上服务(上)
- 部门、测试-一个直观感性的方法认识linux的系统驱动架构-by小雨
- 编译和安装linux内核2.6.24,并且写一个简单的内核驱动测试之
- [应用] 【整理】linux下测试RTC驱动相关的命令date和hwclock常见用法简介
- Unix/Linux C++应用开发-一个完整的C++实例
- linux应用项目(二)摄像头(2)从零写一个V4L2虚拟摄像头驱动之详细分析
- 编译和安装linux内核2.6.x,一个简单的内核驱动测试
- Android应用程序访问linux驱动第二步:实现并测试hardware层
- 使用axis测试一个简单的webservice的应用例子
- 提供一个在测试环境中,监控应用服务器的外部接口调用的方法(高峰)
- 基于Linux伙伴算法和DirecfFB架构的帧缓冲驱动层内存管理的一个实现
- 数据挖掘在商业应用上的一个完整的流程
- [转]Spring.NET企业架构实践之 NHibernate + Spring.NET + WCF + Windows服务 + Silverlight 中小企业应用架构完整Demo
- linux使用一个刚编译驱动方法
- 例说linux内核与应用数据通信(三):读写内核设备驱动文件
- Linux入职基础-5.24_可执行程序arpwatch做成系统一个服务(应用实战8)