gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:44:15 25 4
gpt4 key购买 nike

我是内核开发的新手。我在基于 Geode 的 PC/104 板上运行了 Lubuntu 12.04 (uname -r == 3.2.0-107-generic)。 CPU 不支持 PAE,所以 12.04 就是我所在的位置。有一 block 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?

最佳答案

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

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

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

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

关于为两个 SC2681 DUART 配置内核驱动程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39250372/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com