为两个 SC2681 DUART 配置内核驱动程序

Configure kernel driver for Two SC2681 DUARTs

我是内核开发新手。我在基于 Geode 的 PC/104 板上安装了 Lubuntu 12.04 (uname -r == 3.2.0-107-generic) 运行。 CPU 不支持 PAE,所以 12.04 就是我所在的位置。有一块 I/O 板上有两个 SC2681 DUART。它们分别位于端口 0x100 和 0x110,并且都使用 IRQ 15。

我复制了sccnxp driver from a newer kernel (3.10)并修改它以在这个内核下工作。这是我的初始化数据:

static struct resource sc2681_0_resources[] = {
        DEFINE_RES_IO(0x100, 0x10),
        DEFINE_RES_IRQ(15),
  };

static struct sccnxp_pdata sc2681_0_info = {
        .frequency      = 3686400,
  };

static struct platform_device sc2681_0 = {
    .name       = "sc2681",
    .id     = -1,
    .resource   = sc2681_0_resources,
    .num_resources  = ARRAY_SIZE(sc2681_0_resources),
    .dev = {
        .platform_data  = &sc2681_0_info,
    },
};

我还添加了一个 __init,其中包含:

platform_device_register(&sc2681_0);
if ((ret = platform_driver_register(&sccnxp_uart_driver)))
{
platform_device_unregister(&sc2681_0);
return -EINVAL;
}
return 0;

和一个 __exit 包含:

platform_driver_unregister(&sccnxp_uart_driver);
platform_device_unregister(&sc2681_0);

驱动程序设置为处理 2 个 uart。这将加载并创建 /dev/ttySC0 和 /dev/ttySC1。如何使此负载在端口 0x110 处加载第二个 DUART?

我将回答我自己的问题,以防下一个 reader 需要这些信息。答案是只有驱动已经支持才可以。

我构建了一个基于 4.8 的自定义内核,但这会花费大量时间和磁盘 space,并且不是解决问题的办法。我仍然在可加载模块中工作,因为相比之下,内核构建和安装周期很长。我找不到任何与 x86 设备树相关的最新有用资源,而且我的旧主板不支持 ACPI。简而言之,无法 "configure" 驱动程序为两个单独的芯片加载两次。

有了所有的内核源代码,我想答案一定在某处。我找到了另一个与我需要的功能相似的串行驱动程序 (sb1250-duart.c) 并将其用作示例。我更改了探测功能以期望并配置配置数据中的多个芯片。我最初想法的错误是试图在 init 期间注册两个独立的平台设备,但解决方案是在 init 期间注册单个平台设备并在 probe 函数中注册多个 UART 驱动程序(和端口)。

我还想解决 GPL 评论。 GNU's GPL FAQ 特别声明您不必发布修改后的版本,除非您将其中任何一个发布到 public,而我没有。这纯粹是一个内部项目。然而,在这次经历之后,我确实想分享我的更改,所以在我清理了公司和平台特定的位之后,我将推送一个补丁,使这个驱动程序支持多个 DUART。