如何使用Linux"platform_driver"?

How to use a Linux "platform_driver"?

有一个嵌入式系统,它以platform_driver:

的结构提供功能
static struct platform_driver infinity_wdt_driver = {
    .probe      = infinity_wdt_probe,
    .remove     = infinity_wdt_remove,
    .shutdown   = infinity_wdt_shutdown,
    .driver     = {
        .owner  = THIS_MODULE,
        .name   = "infinity-wdt",
        .of_match_table = ms_watchdog_of_match_table,
    },
};

module_platform_driver(infinity_wdt_driver);

infinity_wdt_probe 中调用 devm_kzallocdevm_ioremap_resource:

static int infinity_wdt_probe(struct platform_device *pdev) {
  ...
  wdt = devm_kzalloc(&pdev->dev, sizeof(*wdt), GFP_KERNEL);
  ...
  wdt->reg_base = devm_ioremap_resource(&pdev->dev, res);
  ...
}

我该如何使用这个驱动程序?我是否需要编写一些 C 代码,或者 Linux 通过文件系统提供一些标准方法来控制它?

在文件系统中,在 /sys/bus/platform/drivers/infinity-wdt 下有一个目录,但它只包含几个文件:

# ls -l
total 0
lrwxrwxrwx    1 root     root             0 Nov 16 20:23 1f006000.watchdog -> ../../../../devices/soc0/soc/1f006000.watchdog
--w-------    1 root     root          4096 Nov 16 20:23 bind
--w-------    1 root     root          4096 Nov 16 20:23 uevent
--w-------    1 root     root          4096 Nov 16 20:23 unbind

是否可以将驱动程序与上述文件系统一起使用?

一些额外信息:1f006000.watchdog 是指向包含以下内容的目录的符号链接:

# ls -l
total 0
lrwxrwxrwx    1 root     root             0 Nov 16 20:23 driver -> ../../../../bus/platform/drivers/infinity-wdt
-rw-r--r--    1 root     root          4096 Nov 16 20:23 driver_override
-r--r--r--    1 root     root          4096 Nov 16 20:23 modalias
lrwxrwxrwx    1 root     root             0 Nov 16 20:23 of_node -> ../../../../firmware/devicetree/base/soc/watchdog
lrwxrwxrwx    1 root     root             0 Nov 16 20:23 subsystem -> ../../../../bus/platform
-rw-r--r--    1 root     root          4096 Nov 16 20:23 uevent

这是内核日志:

# cat /var/log/messages | grep -i watchdog
Jan  1 04:00:02 kernel: [WatchDog]infinity_wdt_probe 
Jan  1 04:00:02 kernel: [WatchDog]infinity_wdt_set_heartbeat 
Jan  1 04:00:04 kernel: [WatchDog]infinity_wdt_start 
Jan  1 04:00:04 kernel: [WatchDog] infinity_wdt_ping tmr_margin=a ^M
Jan  1 04:00:04 kernel: watchdog: watchdog0: watchdog did not stop!
Jan  1 04:00:04 kernel: [WatchDog] infinity_wdt_ping tmr_margin=a ^M
Jan  1 04:00:04 kernel: [WatchDog]infinity_wdt_set_timeout=60 
Jan  1 04:00:04 kernel: [WatchDog]infinity_wdt_set_timeout data=3c ^M
Jan  1 04:00:04 kernel: [WatchDog] infinity_wdt_ping tmr_margin=3c ^M
Jan  1 04:00:04 kernel: [WatchDog] infinity_wdt_ping tmr_margin=3c ^M
Nov 16 21:03:11 kernel: [WatchDog] infinity_wdt_ping tmr_margin=3c ^M
Nov 16 21:03:41 kernel: [WatchDog] infinity_wdt_ping tmr_margin=3c ^M

“平台”驱动程序是指不适合其他标准子系统(例如 USB、I2C 等)的驱动程序。在这种情况下,它是一个看门狗驱动程序,如果它没有响应,它显然应该重新启动嵌入式系统。

sysfs 中的条目是标准簿记条目,由内核为任何驱动程序自动创建。

由于驱动程序包含“of_match_table”,这意味着它必须在设备树中正确指定。鉴于它通常可以工作并且没有其他显式接口(例如 procfs、sysfs),这应该足以启用它。

您还可以检查相应的 /dev/watchdog* 是否由该驱动程序创建。如果是这样,可以通过在其配置文件中指定此 /dev/watchdog* 文件来使用标准用户空间看门狗。