linux驱动成测试程序,一个完整的linux 驱动demo 加应用测试 demo

ssihc0 原创, 转载请注明出处,谢谢!

测试环境,开发环境

feadora 11

kernal 2.6.29.4

驱动代码

driverdemo.c

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#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

#include

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 //带参数加载驱动

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值