将内核 4.6 移植到运行 2.6.38 的 ARMv6 板(三星 S3C6410)

将内核 4.6 移植到运行 2.6.38 的 ARMv6 板(三星 S3C6410)

我正在尝试让内核 4.6 在 S3C6410 板上运行。

为了完成移植并完全启动,我需要配置内核以与板上的 NAND 闪存和 SD 控制器配合使用。

这是我第一次尝试移植/交叉编译内核,因此我更多地寻求有关如何处理和诊断问题的建议,而不是确切的解决方案。

我的主板可以启动内核 4.6,但我无法让它看到 NAND 闪存或 SD 卡(因此没有 rootfs)。

提供了可以运行的内核

该主板附带“2.6.38-GZSD”,与普通的 2.6.38 进行比较时,包括:

  • 一些音频/视频/电视/LCD触摸屏驱动程序,我不关心

  • 按钮/gpio/pwm/adc 的字符设备驱动程序,我不关心

  • yaffs2 文件系统(我已经移植到 4.6)

  • 针对此板的机器gzsd4610定义arch/arm/mach/mach-s3c64xx

  • NAND 驱动器位于drivers/mtd/nand/s3c_nand.c.内核 4.6 有适用于该平台的 NAND 和 ONENAND 驱动程序,因此我尝试使用这些驱动程序,而不是从 2.6.38 移植旧驱动程序。

设置

我通过板上内置的引导加载程序将软件上传到板上。它从 SD 卡加载到 NAND 闪存中:一个 u-boot 映像、一个内核映像和一个 rootfs 映像。

我正在通过串口与主板进行通信。

我正在使用 GCC 6.1.1 编译内核 4.6。 2.6.38-GZSD 内核已编译。我需要一些版本的 GCC 4 才能自己编译它。


我尝试使用 4.6 内核源代码而不进行源代码修改 - 所以只能通过配置 UI(make nconfig在本例中)。我已经设置了平台,并启用了所有相关的驱动程序(我希望如此)。

该机器设置为 SMDK6410 而不是 GZSD6410,因为 GZSD6410 不在主线中(从 2.6.38 移植它需要比我现在更了解内核的知识)。我认为这个以及可能的 NAND 驱动程序是导致启动失败的原因。

我目前正在使用命令行:

init=/linuxrc console=ttySAC0,115200 root=/dev/mtdblock2 loglevel=7 earlyprintk

相比之下,工作 2.6.38-GZSD 内核的命令行是:

init=/linuxrc console=ttySAC0,115200 root=/dev/mtdblock2

具体问题(和日志)

内核SD读卡器初始化失败

它也是ONENAND初始化失败

如果我尝试使用 NAND 而不是 ONENAND 那么也失败了

无论如何,这都会导致内核被无法挂载 rootfs 并出现恐慌

相比之下,使用 2.6.38-GZSD 成功启动的日志看起来如下像这样

相关内容