首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为串口控制LED设备制作Linux LED类驱动程序

为串口控制LED设备制作Linux LED类驱动程序
EN

Stack Overflow用户
提问于 2016-04-20 01:11:26
回答 2查看 1.6K关注 0票数 2

我有一个硬件设备,可以控制面板上的LED,它还有一个用于PC控制LED的串口。

我希望能够使用Linux类API从用户空间应用程序中控制LED,即通过/sys/class/leds/whatever/brightness。所以我想为这个设备做一个Linux内核驱动程序。

然而,根据我所读到的,Linux内核驱动程序打开串行设备似乎是不寻常的。例如StackOverflow问题从linux内核模块访问串口。我读过关于filp_open()的文章,它可以被内核驱动程序用来打开设备文件,但是它的使用似乎是不受欢迎的。

另一方面,在用户空间中实现这一点似乎是不可能的,因为我不知道如何从用户空间创建Linux类设备。

向串口控制的LED设备提供Linux类API接口的好方法是什么?

  • 忽略使用filp_open()从Linux驱动程序访问串行端口的警告
  • 有没有一些用户空间的方法来创建一个Linux类设备,这样我就可以在用户空间中实现这个功能了吗?
  • 放弃使用Linux类API的想法,而使用用户空间应用程序的替代API来控制LED?
  • 另一个?
EN

回答 2

Stack Overflow用户

发布于 2016-04-27 11:17:36

自定义tty线路纪律驱动程序

据我所知,在Linux中这样做的一种方法是实现Linux并将命令发送到串口的编写自定义的tty行纪律内核驱动程序。然后Linux代码可以放在内核驱动程序中,但它并不绑定到特定的串口。

然后,要将其链接到特定的串口,用户空间程序将打开串口,并使用ioctl(serial_fd, TIOCSETD, ...)调用将串行端口附加到自定义行规则驱动程序。从那一点起,所有的工作都是由线路纪律司机来完成的。用户空间程序的唯一目的实际上是将自定义行纪律驱动程序与正确的串行设备相关联。

使用FUSE文件系统的伪驱动程序

另一种选择是编写一个用户空间程序,它是一个“伪驱动程序”,它连接到串行设备,并提供一个类似于Linux内核LED类API的class,但是使用一个FUSE文件系统在不同的位置。

例如,该程序可能被命名为foo-serial-leds,它可以在/var/run/foo-serial-leds/下提供一些类似于Linux内核LED类驱动程序的API。

然后,另一个程序可以通过写入例如/var/run/foo-serial-leds/status/brightness来控制LED。这将非常类似于在/sys/class/leds/status/brightness上控制真正的Linux内核LED类的程序,除非文件系统上的位置不同。该程序将可移植到另一个平台,具有不同的LED设备,只要该程序有一个可配置的文件系统路径来控制LED。

这方面有两个缺点:

  • 想要控制LED的程序必须足够灵活,以便在与普通/sys/class/leds/不同的位置访问LED文件API。
  • 这些伪驱动LED不能使用Linux内核LED触发器。

自定义驱动程序,允许创建LED设备的用户空间

另一个选择是编写一个允许用户空间程序在Linux内核LED类中创建LED设备的Linux内核驱动程序。驱动程序可以使用configfs来允许用户空间程序创建/sys/class/leds/设备,然后显示在/sys/class/leds/下面。当LED亮度发生变化时,它需要提供一种通知用户空间程序的方法(可能通过自定义sysfs属性上的sysfs_notify()通知用户空间程序可以poll())。

有了驱动程序,用户空间程序可以实现LED API和写到串行设备,以实现LED控制。这个程序是一种用户空间驱动程序。也就是说,它将使用Linux驱动程序创建一个或多个LED类LED,并打开串口与LED硬件对话。当它接到通知,什么东西写到LED亮度,它将需要发送相关的命令到串行设备。

然后,其他希望控制LED的用户空间程序将能够在/sys/class/leds/下通常的位置写入LED类API。

Linux内核4.10用户空间LED类驱动程序

更新2017年11月:LinuxKern4.10增加了一个用户空间LED类驱动程序uleds。它实现了类似于上面描述的内容。然而,控制是通过设备/dev/uleds,而不是通过configfs。

一个应用程序应该为它想要创建的每个用户打开一次char设备文件/dev/uleds。它应该向文件中写入一个结构,该文件指定LED的名称。然后,它应该从打开的文件句柄读取,并将接收一个int,当LED的亮度被系统中的其他东西改变时,它将指定LED的亮度。如果要创建多个LED,应用程序应该多次打开char设备文件,每个LED一次。

当应用程序关闭,打开的/dev/uleds文件句柄关闭时,用户的LED就会自动移除。

票数 3
EN

Stack Overflow用户

发布于 2016-04-25 20:57:36

3种方式:

你必须理解数据发送到CPU板进行修改,因为你想要在led板上显示你的信息。

你必须有一个linux API,但是大多数时候CPU是用中国做的,中国人不喜欢linux。

你写你自己的API控制LED板与arduino或覆盆子,以控制您的LED板的每一个引脚。

祝你好运!

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36732128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档