如何打开内置设备

How to open a builtin device

我正在努力加快编写嵌入式设备驱动程序的速度 Linux,特别是用于视频接口的 V4L2 媒体控制器驱动程序。

我可以使用典型的 V4L2 模型为非内置驱动程序编写设备驱动程序,即由 modprobe 控制的模块。加载模块时,将调用此驱动程序的 __init 函数,然后在 /dev 目录中创建一个节点,显示为 /dev/video0。然后我可以编写用户端程序,从打开 /dev/video0 开始,我现在可以练习我编写的所有驱动程序代码。我理解这个模型,所以我有一个很好的开发环境,我可以在其中修改驱动程序代码,重新加载 .ko 驱动程序,修改我的用户端测试代码,并基本上行使我所有的驱动程序功能。

但是,在使用媒体控制器和 platform_device 模型驱动程序时,我仍然对内置驱动程序感到困惑。 (这些没有特定的 __init 例程,也不会动态加载)。我可以配置我的内核,将我的驱动程序构建为基于媒体控制器的内置驱动程序。我的所有 Kconfig 文件都是正确的,所以我现在可以在内核构建中包含我的新驱动程序。我知道我的驱动程序是正确内置的,因为当我的内核启动时,我可以在 /sys/bus/platform/drivers 目录中看到我的驱动程序。该目录有3个只写节点,分别为bind、uevent和unbind。

这是我的困惑:如何从用户端代码打开这个内置设备驱动程序以便我可以使用我的驱动程序界面?

由于该驱动程序是基于媒体控制器的内置驱动程序,因此在内核启动时不会在 /dev 中创建新的设备节点,或者至少,我不知道要打开什么设备,就像我为模块所做的那样基于驱动程序。

我是否必须编写一些 udev 规则以使内核在 /dev 目录中创建设备节点以便我可以使用用户端 open()?还是以不同的方式访问此驱动程序?

谢谢, -安德烈斯

如果您的驱动程序基于媒体控制器框架,则应该有一个管道 (refer) have you implemented that in your driver refer media controller api。即使您的驱动程序是内置的并且基于媒体控制器框架,它仍然应该创建 /dev/video0。我能想到没有创建 video0 节点的原因是缺少子开发驱动程序。