我有一个硬件设备,可以控制面板上的LED,它还有一个用于PC控制LED的串口。
我希望能够使用Linux类API从用户空间应用程序中控制LED,即通过/sys/class/leds/whatever/brightness。所以我想为这个设备做一个Linux内核驱动程序。
然而,根据我所读到的,Linux内核驱动程序打开串行设备似乎是不寻常的。例如StackOverflow问题从linux内核模块访问串口。我读过关于filp_open()的文章,它可以被内核驱动程序用来打开设备文件,但是它的使用似乎是不受欢迎的。
另一方面,在用户空间中实现这一点似乎是不可能的,因为我不知道如何从用户空间创建Linux类设备。
向串口控制的LED设备提供Linux类API接口的好方法是什么?
filp_open()从Linux驱动程序访问串行端口的警告发布于 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。
这方面有两个缺点:
/sys/class/leds/不同的位置访问LED文件API。自定义驱动程序,允许创建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就会自动移除。
发布于 2016-04-25 20:57:36
3种方式:
你必须理解数据发送到CPU板进行修改,因为你想要在led板上显示你的信息。
你必须有一个linux API,但是大多数时候CPU是用中国做的,中国人不喜欢linux。
你写你自己的API控制LED板与arduino或覆盆子,以控制您的LED板的每一个引脚。
祝你好运!
https://stackoverflow.com/questions/36732128
复制相似问题