linux 一个简单的字符设备驱动例子
**********************************
然后可以写一个简单的内核模块的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)嵌入式培训机构提供。
嵌入式新闻 嵌入式资料 嵌入式培训 嵌入式linux 嵌入式系统 嵌入式开发 嵌入式 相关文章:
- 煤矿井下综合自动化系统中的应用(04-06)
- 软件Overlay:程序编写与调试(01-20)
- USB数据通信接□模块的程序设计(10-17)
- 东江产业园:力争2017年产值达千亿(09-30)
- 硅谷数模的SlimPort扩大了Nexus7的显示屏选择(08-01)
- Lonworks控制网络技术在城市排水泵站自动化中的应用(06-06)