免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1862 | 回复: 3

LINUX下的字符驱动问题 [复制链接]

论坛徽章:
1
处女座
日期:2014-09-18 16:18:00
发表于 2013-09-12 17:12 |显示全部楼层
第一次学习和开发驱动程序,有许多问题还是很模糊,希望能够得到大家的帮助。
最近需要开发一款CAN卡的驱动,恰好实验室有另外一块研华的CAN1680是有linux下的驱动的,于是学习了源代码,也看了《LINUX设备驱动程序》一书,看了一部分,感觉讲的很模糊,概念性的东西太多了,好了进入正题。问题是这样的:
static struct file_operations can_fops = {
    .owner  =   THIS_MODULE,
    .open   =   can_open,
    .release    =   can_close,
    .read   =   can_read,
    .write  =   can_write,
    .poll   =   can_select,
    .ioctl  =   can_ioctl,
    .fasync =   can_fasync,
};
例如字符型设备驱动对file_operations这个结构体进行填充,我可不可以理解为重新实现了open(),wirte(),read()等函数?
因为我发现CAN1680那家公司给的CAN驱动例程里用的write(),和read()函数都是用的unstd.h或者fcntl.h里面的库函数。。。。那如果这样的话,我在驱动程序里实现的这些write(),read()之类的函数又是谁在调用呢?驱动程序本身么???

论坛徽章:
0
发表于 2013-09-13 10:57 |显示全部楼层
在linux中的操作基本都是以文件形式,
字符设备:会有了字符设备文件 然后用户像操作文件一样操作它,你说谁调用write(),read()。当然是应用程序。
块设备:也有对应文件,不过一般是通过格式化然后挂载使用。
网络设备:要基于linux的网络四层结构,不过对于用户来说,操作socket也像操作文件一样。

can我以前在一款freescale的16位单片机(无os)搞过,好久了

如果想要更多的沟通:

linux驱动群: 163617970

论坛徽章:
1
处女座
日期:2014-09-18 16:18:00
发表于 2013-09-13 15:53 |显示全部楼层
回复 2# wwxxxxll
谢谢,我今天又仔细回头读了读《LINUX设备驱动》那本书,上面写的很清楚了,只是当时看不懂,回头看才理解。
LINUX对待所有的设备和对待文件一样,只不过其实linux在每一次open一个新文件时,内核内部会构造一个file的结构体,这个结构体是一个内核结构,和我们通常说的用户空间的file不是一个概念。对于设备文件来说,也是同样的道理,linux打开一个设备文件,同时会内核的file结构体中传入一个file_operations的结构体,而file_operations里就是我们在驱动程序init的所有的重要操作,如write(),read(),ioctl(),poll()等等。那么在我打开一个设备文件后(当然前提是这个设备文件是有驱动的),内核就会把我驱动程序中的这些函数地址传送给file结构体。那么之后我在用户空间进行操作的 write()和read()实际上就是调用上面说的我在驱动程序中实现的函数了。
不知道这样理解有没有问题,新手还望大家指出不对的地方。

   

论坛徽章:
0
发表于 2013-09-13 17:58 |显示全部楼层
那么之后我在用户空间进行操作的 write()和read()实际上就是调用上面说的我在驱动程序中实现的函数了
确实是这样
如果可以你就加群,问题会更快被回答。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP