设计嵌入式Linux字符设备驱动遇到问题,请大侠们帮忙

gholeffy 2010-04-18 05:04:39
各位大侠好,小弟刚开始学习Linux驱动

现在需要写一个驱动带动3个步进电机,3个电机不需要同时工作,而是按顺序的,比如电机1运转--电机2运转--电机1运转--电机3运转。

我现在考虑有两种方式设计驱动,一种是写在同一个驱动里面,把次设备号0,1,2分别对应3个步进电机。咨询一下,这样的话是不是在1--2--1--3这样的顺序运转中,每次都要open和close设备?能不能用ioctl函数控制呢?

第二种是分别写3个驱动,这样貌似更麻烦了,但应该不用反复的打开和关闭设备了吧?

步进电机我是用GPIO口反复的置1和置0发送脉冲来驱动的,用的定时器OS Timer。板子有4个定时器,我想的是用一个就够了,不知是否需要用3个分别控制的?

应该有更好的解决办法的吧?希望大侠们不吝赐教,谢谢了!!!
...全文
154 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
feidouqwer 2011-03-16
  • 打赏
  • 举报
回复
觉得4楼的方法比较好,简单方便。

驱动只提供机制,这是一个真理,个人认为。所以说驱动只要能启动、关闭电机就行了,具体顺序让应用去做吧。
lkncjy 2010-04-20
  • 打赏
  • 举报
回复
主设备号不同,但次设备号可以相同。
主设备号相同,但次设备号不同。(比如misc设备的主设备号是10,没记错的话)
lkncjy 2010-04-20
  • 打赏
  • 举报
回复
有必要搞得什么要三个次设备号这么复杂吗?
三个电机就在一个驱动里用三个IO来控制就行了,而IO的控制可以通过ioctl(..)函数来传递参数。open(..)函数只需调用一次。
gholeffy 2010-04-20
  • 打赏
  • 举报
回复
回复4楼5楼
把3个电机都注册为一个设备,通过内部的寄存器调整来控制,这个想法我考虑过。我对次设备号理解还不深刻,我觉得在Linux里面好像每个设备都需要有所区别吧?如果主设备号(就是驱动程序)不同,那也次设备号也应该有区别吧,我理解偏到这边了,请大家指点一下。
Kyph 2010-04-19
  • 打赏
  • 举报
回复
遇见:
驱动仅仅提供机制,不提供策略。
所以,对于用GPIO接口控制若干电机的情况,一个驱动和一个设备就能搞定,ioctl来控制的电机启动和关闭,这样比较合理。应用程序自己通过调用ioctl来调整顺序
天亮后说晚安 2010-04-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 gholeffy 的回复:]
这么说来,在1--2--1--3工作顺序中需要open(1),close(1)-open(1),close(1)-open(2),close(2)--open(1),close(1)--open(3),close(3)
是不是?
[/Quote]是的
jiaguang3010717 2010-04-19
  • 打赏
  • 举报
回复
最好的驱动是提供机制,不提供策略,所以不要想应用程序设计的问题,有多少个驱动,你就写多少个对应的驱动,点击就一个对一个ioctl就行,驱动的学习可以看《LDD3》这本是
armed 2010-04-19
  • 打赏
  • 举报
回复
嗯,4楼的有道理。

更正一下二楼的说法,你可以把1、2、3全部open,爱怎么折腾就怎么折腾,折腾完了再close ---- 只要你的驱动经受得起就可以。
gholeffy 2010-04-18
  • 打赏
  • 举报
回复
这么说来,在1--2--1--3工作顺序中需要open(1),close(1)-open(1),close(1)-open(2),close(2)--open(1),close(1)--open(3),close(3)
是不是?
pottichu 2010-04-18
  • 打赏
  • 举报
回复
用第一种方法就可以了, 一个驱动 带3个设备, 主设备号相同, 次设备号不同。

open 函数打开的时候就知道是打开哪个设备了,所以,不会冲突的。

比如: ttyS0, ttyS1, ttyS2, 3个串口设备,其实是同一个驱动,
那么你 open ttyS0, 驱动就知道你要访问的是谁了。
具体的做法建议你参考 LDD 中的 scull 例程。

4,468

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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