求助!linux字符设备驱动开发

大脸猫_Mars 2013-01-06 10:19:21
刚接触linux驱动开发,看了宋宝华老师的《linux设备驱动开发详解》,关于内核模块的加载、驱动注册等流程都基本清楚了,也知道设备驱动和设备文件是通过设备号关联起来的,但是有一点很困惑的,那就是设备驱动程序是如何跟硬件设备关联起来的,驱动程序如何让操作系统知道自己是适合哪个硬件设备的驱动呢?
我知道windows下的驱动程序会有一个表,表里包含硬件厂商、设备类型等信息,操作系统会根据这些信息去匹配相关硬件,但是linux下的字符驱动里面我没找到相似的信息,书上也到处找不到,希望高手可以帮忙解答一下。
...全文
203 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
alvin0712 2013-04-05
  • 打赏
  • 举报
回复
有没有开发Linux驱动的朋友,找项目合作伙伴QQ:94189725
lr2131 2013-01-08
  • 打赏
  • 举报
回复
引用 6 楼 guomeng198613 的回复:
追问 引用 2 楼 lr2131 的回复:应用层和驱动层是通过设备文件这个东西来联系的。你打开对应的设备文件,由于之前驱动程序注册时也和这个设备文件建立了联系,所以你在打开这个对应的设备文件时,Linux的文件系统会把相应的驱动程序和你的应用层建立联系。不会说你要打开串口的,结果成了打开键盘的。 如果要问驱动程序怎么和硬件设备怎么联系的,这个就有些难了。有的驱……
这个.....,很久没弄驱动了,自己也没弄那么深。 这样吧,你对照着源代码,找本讲驱动的书,我记得你问的这些结构体什么的在一般的书上是有讲到的,结构体里面确实有很多内容,我以前也这么看过,现在已经不记得了。书上有讲到的,结构体里面有个别没讲到的要么是留待兼容扩展,要么是不重要的。 另外,有些问题可能确实是“如人饮水,冷暖自知”,需要你自己设计实验来验证(可以验证流程性的问题)。 设备文件不一定是在驱动加载时创建的,创建设备文件的方法有两种: 1.命令创建 mknod ,LZ查查这个命令。可以手工命令来创建,可能用system(mknod....)也可以,我也没试过。 2.用代码的方式创建设备文件。有些驱动的程序在加载时会检查设备文件,创建设备文件。用的是源代码方法。 所以,设备文件的创建不一定是在驱动加载时做的,要看驱动里面有没有这个行为。当然,好的驱动程序一般是会这么做的。但请不要一知片解的认为所有的都是这么样的。希望能帮到你。
swq1982 2013-01-08
  • 打赏
  • 举报
回复
引用 5 楼 guomeng198613 的回复:
追问 引用 1 楼 swq1982 的回复:字符设备需要先建立访问的设备文件,可利用mknod或者MAKEDEV工具创建设备文件,而每个设备文件拥有主设备号和从设备号。二者共同形成一个唯一的号码,内核可由此查找对应的设备驱动程序。内核采用主从设备号来标识匹配的驱动程序,即主设备号相同的字符设备是同类设备(使用同一驱动程序)。你可以在内核代码里找/drivers/ch……
lr2131说得很对: 设备文件不一定是在驱动加载时创建的,创建设备文件的方法有两种: 1.命令创建 mknod并制定设备的类型主次设备号(或者利用MAKEDEV工具建立) 2.用代码的方式创建设备文件。有些驱动的程序在加载时会检查设备文件,创建设备文件。 一般驱动程序很可能都不去创建这个字符设备的接口,字符设备驱动比较简单的,你可以自己手动写一个代码测试一下,你可以参考《Linux Device Driver》里面有scull字符实例。
LinuxMan 2013-01-07
  • 打赏
  • 举报
回复
前两天看了下WDK。。。楼主加油
大脸猫_Mars 2013-01-07
  • 打赏
  • 举报
回复
追问
引用 3 楼 gongyf1977 的回复:
你说的windows下的驱动里的表是指设备的DeviceId和VenderId表吧,这些Id是对应实际硬件的Id的,Linux如果要驱动这些设备,也要写入这些信息的,不同的是windows驱动可以写在ini文件里,但是linux驱动是写在源程序里的。你说的linux驱动里找不到对应的表是因为那些例子驱动的设备都是虚拟设备,不是真实的设备,没有真实的id,所以没有。 ……
我看了linux内核源码/drivers/char下面的一些文件,但是里面没有一个完成的驱动的信息,里面很多都是很杂、包含很多对其他地方的引用,在哪能找到一个包含所有信息、完整的驱动代码呢?
大脸猫_Mars 2013-01-07
  • 打赏
  • 举报
回复
追问
引用 2 楼 lr2131 的回复:
应用层和驱动层是通过设备文件这个东西来联系的。你打开对应的设备文件,由于之前驱动程序注册时也和这个设备文件建立了联系,所以你在打开这个对应的设备文件时,Linux的文件系统会把相应的驱动程序和你的应用层建立联系。不会说你要打开串口的,结果成了打开键盘的。 如果要问驱动程序怎么和硬件设备怎么联系的,这个就有些难了。有的驱动简单,能比较容易懂,有的复杂了,文件系统就可能……
我知道设备文件是通过设备号和相应设备号的驱动关联起来的。而驱动程序可以动态分配设备号,那就是设备文件是应该在驱动安装时创建的是吧。 linux所有的硬件设备都会保存在bus_type结构体的device链表中,这个链表中的device节点包含哪些设备信息呢。比如说一个最简单的串口设备,我的驱动里面应该包含哪些信息才能和我想要的串口设备关联起来呢?
gongyf1977 2013-01-07
  • 打赏
  • 举报
回复
你说的windows下的驱动里的表是指设备的DeviceId和VenderId表吧,这些Id是对应实际硬件的Id的,Linux如果要驱动这些设备,也要写入这些信息的,不同的是windows驱动可以写在ini文件里,但是linux驱动是写在源程序里的。你说的linux驱动里找不到对应的表是因为那些例子驱动的设备都是虚拟设备,不是真实的设备,没有真实的id,所以没有。
大脸猫_Mars 2013-01-07
  • 打赏
  • 举报
回复
追问
引用 1 楼 swq1982 的回复:
字符设备需要先建立访问的设备文件,可利用mknod或者MAKEDEV工具创建设备文件,而每个设备文件拥有主设备号和从设备号。二者共同形成一个唯一的号码,内核可由此查找对应的设备驱动程序。内核采用主从设备号来标识匹配的驱动程序,即主设备号相同的字符设备是同类设备(使用同一驱动程序)。你可以在内核代码里找/drivers/char/目录下的源码来看看就明白了。 ……
linux下设备文件是在驱动安装时创建吗?那就是一个硬件设备在没有安装相应驱动的时候,系统是不会给它创建设备文件的咯?
lr2131 2013-01-07
  • 打赏
  • 举报
回复
应用层和驱动层是通过设备文件这个东西来联系的。你打开对应的设备文件,由于之前驱动程序注册时也和这个设备文件建立了联系,所以你在打开这个对应的设备文件时,Linux的文件系统会把相应的驱动程序和你的应用层建立联系。不会说你要打开串口的,结果成了打开键盘的。 如果要问驱动程序怎么和硬件设备怎么联系的,这个就有些难了。有的驱动简单,能比较容易懂,有的复杂了,文件系统就可能会参与。这块我也没有深究,不敢瞎说,但是对于初学者,建议不要纠缠这块,先学会用再说,不要管原理(不会原理也不会影响你的学习流程),用多了,再看看内核源代码就清楚了。
swq1982 2013-01-06
  • 打赏
  • 举报
回复
字符设备需要先建立访问的设备文件,可利用mknod或者MAKEDEV工具创建设备文件,而每个设备文件拥有主设备号和从设备号。二者共同形成一个唯一的号码,内核可由此查找对应的设备驱动程序。内核采用主从设备号来标识匹配的驱动程序,即主设备号相同的字符设备是同类设备(使用同一驱动程序)。你可以在内核代码里找/drivers/char/目录下的源码来看看就明白了。

1,318

社区成员

发帖
与我相关
我的任务
社区描述
主要是开发驱动技术
社区管理员
  • 驱动程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧