我有一个完全自定义的、最小的、嵌入式 Linux(vanilla、3.3.8、i486、Vortex86dx)系统,它从 initramfs 映像启动。没有使用标准的分发脚本,只有一个用于初始化的 rcS 文件。
我有一个 IDE 闪存盘,在 /dev/hda1 和 /dev/hda2 中有两个分区。
由于这是一个固定系统的最小嵌入式发行版,它有一个包含 /dev/hda1 和 /dev/hda2 的静态 /dev 目录,并且没有 UDEV。
在 init 调用 rcS 时,/dev/hda1 条目不再存在。此时没有运行其他脚本、用户应用程序或守护程序。/dev/hda1似乎已被内核删除(?)
如果我在开发过程中通过 NFS 根文件系统启动我的目标,我不会遇到同样的问题。
我使用 Buildroot 通过 device_table_dev.txt 文件创建 /dev 目录。例如
# IDE Devices
/dev/hda b 640 0 0 3 0 0 0 -
/dev/hda b 640 0 0 3 1 1 1 4
Run Code Online (Sandbox Code Playgroud)
我从 Buildroot 输出/图像中检查了 rootfs.tar.gz。/dev 目录包含 /dev/hda1:
brw-r----- 1 root root 3, 0 Jul 2 13:44 hda
brw-r----- 1 …
Run Code Online (Sandbox Code Playgroud) 我有一个基于 Vortex86DX CPU 的板子,它是一个基于 x86 的微控制器。它有五个 16550A UART,其中四个 (COM1-COM4) 位于通常的 io 端口地址 (0x3f8, 0x2f8, 0x3e8, 0x2e8) 但第五个 (COM9) 位于 0x010, irq 9。
检测到前四个UARTS,我对它们没有问题。问题是我无法让第五个 (COM9) 在 Linux 中工作。COM9 在独立的 DOS 应用程序中工作,但我什至无法从 Linux 中检测到它。
到目前为止我所做的:
将我额外的 UART 添加到/drivers/tty/serial/8250/
在/drivers/tty/serial/8250/8250.c 中启用 DEBUG_AUTOCONF,以便我可以查看何时以及哪些地址正在被探测。
editted /arch/x86/kernel/setup.c因为IO端口量0x010重叠为DMA1保留现有的区域
结果:内核无法探测地址 0x010 处的 UART
所以我写了一个io端口探测实用程序直接从io端口0x010读取,在0x010到0x017区域检测不到任何16550A寄存器。那里似乎什么都没有。我一直在尝试从暂存寄存器(偏移量 +7)写入和读取数据,但在地址 0x017 处什么也没得到。
CPU的数据表并没有说太多。它表示南桥寄存器中有一个控制位为 COM9 做“某事”。我写了一个 PCI 实用程序来写入这个位,但是当我进行 io 端口探测时,它似乎没有启用 COM 端口或更改任何内容。
在这一点上,任何帮助将不胜感激!