我是内核开发的新手。我在基于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?
答案 0 :(得分:0)
我将回答我自己的问题,以防下一位读者需要这些信息。答案是只有在司机已经支持它的情况下才有可能。
我构建了一个4.8的自定义内核,但是这需要花费大量的时间和磁盘空间,而不是答案。我仍然在可加载模块中工作,因为相比之下,内核构建和安装周期很长。我无法找到与x86设备树相关的任何最新的有用资源,而我的传统电路板也不支持ACPI。总之,没有办法配置"驱动程序加载两次单独的芯片。
拥有所有内核源代码,我认为答案必须在某处。我找到了另一个与我需要的功能类似的串行驱动程序(sb1250-duart.c)并将其用作示例。我更改了探测功能以期望并配置多个芯片的配置数据。我最初想到的错误是尝试在init期间注册两个独立的平台设备,但解决方案是在init期间注册单个平台设备并在探测功能中注册多个UART驱动程序(和端口)。
我也想谈谈GPL评论。 GNU's GPL FAQ明确声明您不必发布修改后的版本,除非您向公众发布任何版本,我不是。这纯粹是一个内部项目。但是在这次经历之后,我确实希望分享我的更改,所以在清理了公司和平台特定的位之后,我将推出一个补丁,使这个驱动程序支持多个DUART。