我有一个控制面板上LED指示灯的硬件设备,它有一个用于PC控制LED的串口。
我希望能够使用Linux LED类API从用户空间应用程序控制LED,即通过/sys/class/leds/whatever/brightness
。所以我想为这个设备制作Linux内核驱动程序。
但是,从我所读过的内容来看,Linux内核驱动程序打开串行设备似乎并不常见。例如。 StackOverflow问题Accessing a serial port from a linux kernel module。我已经读过内核驱动程序可以用来打开设备文件的filp_open()
,但似乎不鼓励使用它。
另一方面,似乎不可能在用户空间中实现这一点,因为我不知道从用户空间创建Linux LED类设备的方法。
为串行端口控制的LED设备提供Linux LED类API接口的好方法是什么?
filp_open()
?答案 0 :(得分:1)
据我所知,"适当的"在Linux中执行此操作的方法是write a custom tty line discipline kernel driver实现Linux LED API并将命令发送到串行端口。然后Linux LED代码可以在内核驱动程序中,但它不依赖于特定的串行端口。
然后,要将其链接到特定串行端口,用户空间程序将打开串行端口,并使用ioctl(serial_fd, TIOCSETD, ...)
调用将串行端口连接到自定义线路规则驱动程序。线路规则驱动程序从那时起完成所有工作。用户空间程序的唯一目的是将自定义线路规则驱动程序与正确的串行设备相关联。
另一种方法是编写一个用户空间程序,它是一个"伪驱动程序",它连接到串行设备,并提供类似于Linux内核LED类API的LED API,但是在不同的位置,使用FUSE filesystem。
例如,该程序可能名为foo-serial-leds
,它可以在/var/run/foo-serial-leds/
下提供一些类似于Linux内核LED类驱动程序的API。
然后另一个程序可以通过写入例如LED来控制LED。 /var/run/foo-serial-leds/status/brightness
。这与控制/sys/class/leds/status/brightness
的真正Linux内核LED类的程序非常相似,除了文件系统上的位置不同。该程序可以移植到具有不同LED设备的另一个平台,只要该程序具有其想要控制的LED的可配置文件系统路径。
这有两个缺点:
/sys/class/leds/
另一种选择是编写一个Linux内核驱动程序,允许用户空间程序在Linux内核LED类中创建LED设备。驱动程序可以使用configfs
来允许用户空间程序创建LED设备,然后显示在/sys/class/leds/
下。当LED亮度发生变化时,可能需要提供一种通知用户空间程序的方法(可能是在自定义sysfs属性上通过sysfs_notify()
,用户空间程序可以poll()
)。
使用该驱动程序,用户空间程序可以实现LED API并写入串行设备以实现LED控制。该程序是一种用户空间驱动程序。即它将使用Linux驱动程序创建一个或多个LED级LED,并打开串行端口与LED硬件通信。当通知某些内容已写入LED亮度时,需要将相关命令发送到串行设备。
然后,想要控制LED的其他用户空间程序将能够在/sys/class/leds/
下的通常位置写入LED级API。
2017年11月更新:显然Linux内核4.10添加了用户空间LED类驱动程序uleds
。听起来好像它实现了如上所述的东西。但是,控制是通过设备/dev/uleds
进行的,而不是通过configfs进行的。
答案 1 :(得分:-1)
3种方式:
1 - 您必须了解发送到CPU Board的数据以进行修改,因为您希望数据在LED板上显示消息。
2 - 你必须要有一个linux API,但大多数时候CPU是在中国制造的,中国人不喜欢linux。
3 - 您可以使用arduino或覆盆子为控制LED板编写自己的API,以控制LED板的每个引脚。
祝你好运!