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

时间:2016-08-31 12:59:55

标签: c linux linux-kernel serial-port linux-device-driver

我是内核开发的新手。我在基于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个uarts。这将加载并创建/ dev / ttySC0和/ dev / ttySC1。如何在端口0x110上加载第二个DUART?

1 个答案:

答案 0 :(得分:0)

我将回答我自己的问题,以防下一位读者需要这些信息。答案是只有在司机已经支持它的情况下才有可能。

我构建了一个4.8的自定义内核,但是这需要花费大量的时间和磁盘空间,而不是答案。我仍然在可加载模块中工作,因为相比之下,内核构建和安装周期很长。我无法找到与x86设备树相关的任何最新的有用资源,而我的传统电路板也不支持ACPI。总之,没有办法配置"驱动程序加载两次单独的芯片。

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

我也想谈谈GPL评论。 GNU's GPL FAQ明确声明您不必发布修改后的版本,除非您向公众发布任何版本,我不是。这纯粹是一个内部项目。但是在这次经历之后,我确实希望分享我的更改,所以在清理了公司和平台特定的位之后,我将推出一个补丁,使这个驱动程序支持多个DUART。