微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > linux 一个简单的字符设备驱动例子

linux 一个简单的字符设备驱动例子

时间:06-30 来源:互联网 点击:

**********************************
然后可以写一个简单的内核模块的Makefile,编译make后生成mycdev.ko文件,insmod mycdev.ko,
装上我们自己的驱动,注意有可能在装的时候提示说device busy什么的,这就是我们前面指定的主设备号现在
有设备在用,我们就在重新指定一个在编译。
那怎么看有那些设备呢?可以用cat /proc/devices,就可以查看已经有哪些主设备号已被占用。

然后就可以自己先创建一个虚拟的字符设备mknod /dev/mycdev c 250 0

******************************************************
下面就可以自己写一个应用程序来看我们自己的字符设备驱动是否OK。

#include stdio.h>
#include fctl.h>
#include string.h>
#include sys/stat.h>

#define BUFFERSIZE 200

int main( void )
{
int fp = 0 ;
char str[BUFFERSIZE];

fp = open( "/dev/mycdev", O_RDWR, S_IRUSR|S_IWUSR );
if ( !fp )
{
printf("Open device failed\n");
return -1;
}

write( fp, "Hello, my devices", strlen("Hello, my devices") );

lseek( fp, 0, 0 );/*修改字符设备里字符数组的位置,将字符数据位置设到开始的位置,不然下面的read操作将读不到数据*/

read( fp, str, BUFFERSIZE );

printf("Read content: %s\n", str );

close(fp);
}

gcc -o sample sample.c

最后运行./sample

应该会输出:Read content: Hello, my devices

总结一下,我个人觉得字符设备驱动相关的API和数据结构。
1. struct cdev 一个设备对应一个这个的数据结构,结构体是重要的两个字段ops 和dev(设备号)
2. struct file_opertions 文件操作结构体
3. cdev_init(struct cdev *, struct file_opertions *) 主要就是把字符设备和对这个设备的文件操作结构体对应起来
4. cdev_add(struct cdev *, dev_t, unsigned) 注册设备
5. register_chrdev_region(dev_t, unsigned, const char *name)/alloc_chrdev_region() 申请设备号,为注册设备(cdev_add())准备
6. 就是内核空间的数据和用户空间的数据交换

本文有粤嵌教育(www.gec-edu.org)嵌入式培训机构提供。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top