目前正在为带有 S3C6410 CPU 的 SBC 开发板支持包。该板的供应商只提供了对 2.6 内核的支持,我正在尝试迁移到更新的 3.x 内核。不幸的是,我一直遇到一些问题,因为后者的内核没有正确支持许多设备。例如,USB 支持对项目至关重要。我可以让它与 3.0.x 系列一起使用,但 3.2.x 及更高版本无法正常运行。我搜索了补丁/更新无济于事,所以我卷起袖子,在内核源代码中弄脏了。
我注意到内核树arch/arm/plat-samsung
(例如,
Linux 3.0.80arch/arm/plat-samsung/dev-usb-hsotg.c
#include <linux/kernel.h>
#include <linux/string.h>
#include <linux/platform_device.h>
#include <linux/dma-mapping.h>
#include <mach/irqs.h>
#include <mach/map.h>
#include <plat/devs.h>
static struct resource s3c_usb_hsotg_resources[] = {
[0] = {
.start = S3C_PA_USB_HSOTG,
.end = S3C_PA_USB_HSOTG + 0x10000 - 1,
.flags = IORESOURCE_MEM,
},
[1] = {
.start = IRQ_OTG,
.end = IRQ_OTG,
.flags = IORESOURCE_IRQ,
},
};
static u64 s3c_hsotg_dmamask = DMA_BIT_MASK(32);
struct platform_device s3c_device_usb_hsotg = {
.name = "s3c-hsotg",
.id = -1,
.num_resources = ARRAY_SIZE(s3c_usb_hsotg_resources),
.resource = s3c_usb_hsotg_resources,
.dev = {
.dma_mask = &s3c_hsotg_dmamask,
.coherent_dma_mask = DMA_BIT_MASK(32),
},
};
此文件已被删除,支持已转移到arch/arm/plat-samsung/devs.c
但是,将原始代码与较新内核中的代码进行比较...
Linux 3.2.48arch/arm/plat-samsung/devs.c
/* USB HSOTG */
#ifdef CONFIG_S3C_DEV_USB_HSOTG
static struct resource s3c_usb_hsotg_resources[] = {
[0] = DEFINE_RES_MEM(S3C_PA_USB_HSOTG, SZ_16K),
[1] = DEFINE_RES_IRQ(IRQ_OTG),
};
struct platform_device s3c_device_usb_hsotg = {
.name = "s3c-hsotg",
.id = -1,
.num_resources = ARRAY_SIZE(s3c_usb_hsotg_resources),
.resource = s3c_usb_hsotg_resources,
.dev = {
.dma_mask = &samsung_device_dma_mask,
.coherent_dma_mask = DMA_BIT_MASK(32),
},
};
#endif /* CONFIG_S3C_DEV_USB_HSOTG */
...驱动程序发生了一些变化,在我天真的眼中,这些变化看起来像错误:
- 内存大小
s3c_usb_hsotg_resources[0]
从 64K 更改为 16K。 s3c_device_usb_hsotg.dev.dma_mask
不再使用局部u64
变量,而是使用对多个结构共享的一个变量的 引用platform_device
。
现在,尽管在两个月的大部分时间里翻遍了内核代码,但在驱动程序开发方面,我仍然是个菜鸟。内存大小的更改很可能是有保证的,并且是当前支持该模块的任何人所做的部分更改,但我担心使用对单个共享u64
变量的引用是否会导致我一直看到的一些问题使用此特定设备等。在 USB 驱动程序的情况下,我看到它在我启动板时加载,但它从未检测到任何连接到它的设备。我已经确认这不是硬件相关问题,因为 2.6 和 3.0 内核可以正确识别这些设备。所以这让我倾向于它是由更新的内核代码引起的。
所以,
- 有谁知道这个共享参考是否可能是问题的罪魁祸首?
- 任何人都可以解释为什么对内核源代码进行如此剧烈的更改的原因吗?
- 是否有一些简明的资源(链接、书籍等)涵盖了内核设备驱动程序从 3.0 系列到 3.2+ 系列的变化?