Linux 内核中的 NetWinder 机器支持:I/O 端口、中断与 DMA 资源分配全解析

发布时间:2026/9/11 1:35:03

Linux 内核中的 NetWinder 机器支持:I/O 端口、中断与 DMA 资源分配全解析 Linux 内核中的 NetWinder 机器支持I/O 端口、中断与 DMA 资源分配全解析【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linuxNetWinder 是一台以运行 Linux 为主要设计目标的小型低功耗计算机其硬件围绕 StrongARM RISC 处理器与 DC21285FootBridgePCI 桥构建并胶合了大量 PC 风格外设。本文以 Linux 内核 Documentation/arch/arm/netwinder.rst 为骨架完整梳理 NetWinder 平台的 I/O 端口、中断与 DMA 资源分配表并结合arch/arm/mach-footbridge/下的平台实现源码SuperIO 芯片 W83977F 配置、PCI 中断路由、ISA DMA 控制器等深入讲解每项资源在真实驱动代码中的落地方式帮助读者从资源表直达内核实现。NetWinder 平台概述NetWinder由 Rebel.com 推出的 Rebel-NetWinder是一台小体积、低功耗的计算机设计初衷就是专门用来运行 Linux。它的硬件结构很特殊核心是 StrongARM RISC 处理器通过DC21285 PCI 桥内核中称之为 FootBridge连接 PCI 总线外围则是与标准 PC 兼容的芯片与接口——ISA 总线、双 8259 中断控制器PIC、8237 DMA 控制器、PS/2 键盘鼠标、串口、并口、软驱、IDE、VGA 以及音频芯片等。在 Linux 内核中NetWinder 属于 FootBridge 机器家族与 EBSA285 同族。从 arch/arm/mach-footbridge/Kconfig 可以看到menuconfig ARCH_FOOTBRIDGE bool FootBridge Implementations (DEPRECATED) select CPU_SA110 select FOOTBRIDGE ... Support for systems based on the DC21285 companion chip (FootBridge), used in the EBSA285 and the Rebel NetWinder.而ARCH_NETWINDER配置项则明确了其依赖config ARCH_NETWINDER bool NetWinder select CLKEVT_I8253 select CLKSRC_I8253 select ISA select FORCE_PCI即 NetWinder 使用 i8253 定时器作为时钟事件与时钟源启用 ISA 总线并强制启用 PCI。机器类型在 arch/arm/tools/mach-types 中登记为netwinder ARCH_NETWINDER NETWINDER 5对应的MACHINE_START(NETWINDER, Rebel-NetWinder)描述块位于 arch/arm/mach-footbridge/netwinder-hw.c。由于平台同时具备 PCI 桥与完整 ISA 外设其 I/O 空间、IRQ 与 DMA 通道的分配必须像传统 PC 一样精心规划。内核文档 Documentation/arch/arm/netwinder.rst 正是这份资源分配的总纲。I/O 端口分配表NetWinder 的 I/O 端口空间沿用标准 PC/AT 布局并在其上叠加了 NetWinder 特有设备IRDA、GPIO、W83977F 配置寄存器、RWA010 配置口等。原文档给出的端口分配表如下逐项列出MinMax描述0x00000x000fDMA10x00200x0021PIC10x00600x006f键盘0x00700x007fRTC0x00800x0087DMA10x00880x008fDMA20x00a00x00a3PIC20x00c00x00dfDMA20x01800x0187IRDA0x01f00x01f6ide00x0201Game port0x0203RWA010 配置读0x0220?SoundBlaster0x0250?WaveArtist0x0279RWA010 配置索引0x02f80x02ff串口 ttyS10x03000x031fEther100x0338GPIO10x033aGPIO20x03700x0371W83977F 配置寄存器0x0388?AdLib0x03c00x03dfVGA0x03f6ide00x03f80x03ff串口 ttyS00x04000x0408DC211430x04800x0487DMA10x04880x048fDMA20x0a79RWA010 配置写0xe8000xe80fide0/ide1 BM DMA这份表可以分成三类来理解标准 PC 兼容设备、NetWinder 特色设备、SuperIO/音频芯片配置口。标准 PC 兼容端口PIC、DMA、键盘、RTC、串口、IDEPIC10x0020–0x0021与 PIC20x00a0–0x00a3两片级联的 8259 中断控制器。在 arch/arm/mach-footbridge/isa-irq.c 中内核将这两个端口区间注册为 I/O 资源pic1_resource、pic2_resource并在isa_init_irq()中完成初始化主片PIC_LO级联从片到 IRQ 2从片PIC_HI级联回主片 IRQ 2最后通过写入 0x11、0xf5/0xfa 掩码模式再读回的方式自动探测 ISA PIC 是否存在——若读回值与写入模式不一致则打印IRQ: ISA PIC not found并放弃 ISA 中断支持。DMA 控制器端口低位通道0–3占用 0x0000–0x000f页寄存器在 0x0080–0x008f高位通道4–7占用 0x00c0–0x00df页寄存器在 0x0480–0x048f。这与 arch/arm/mach-footbridge/dma-isa.c 中注册的dma_resources[]完全一一对应。键盘0x0060–0x006f标准 i8042 键盘/鼠标控制器。其 IRQ 定义见 arch/arm/mach-footbridge/include/mach/irqs.h键盘用IRQ_ISA_KEYBOARDISA IRQ 1鼠标在 NetWinder 上则使用专门的IRQ_NETWINDER_PS2MOUSEISA IRQ 5与其他 FootBridge 机器不同。RTC0x0070–0x007f兼容 MC146818 的 CMOS 实时时钟。初始化逻辑在 arch/arm/mach-footbridge/isa-rtc.c 中通过CMOS_READ/CMOS_WRITE探测 RTC 是否存在将分频器设为 32kHz 基准、寄存器 B 设为 24 小时模式并检查电池状态——若寄存器 D 的电池位为 0会打印RTC: *** warning: CMOS battery bad警告。串口 ttyS00x03f8–0x03ff与 ttyS10x02f8–0x02ff两个标准 16550 兼容串口分别对应 ISA IRQ 4 与 IRQ 3。IDE0x01f0–0x01f6、0x03f6主 IDE 通道及其控制寄存器BM DMA0xe800–0xe80f是 ide0/ide1 的总线主控 DMA 寄存器区。VGA0x03c0–0x03dfVGA 显示控制器端口。NetWinder 特色设备IRDA、GPIO、Ether10、DC21143IRDA0x0180–0x0187红外通信接口。内核在 arch/arm/mach-footbridge/netwinder-hw.c 定义#define IRDA_IO_BASE 0x180并在wb977_init_irda()中通过 W83977F 的配置寄存器将 IR 基地址设为 0x180、IRQ 设为 6、RX 使用 ISA DMA 通道 0、关闭 TX DMA。GPIO10x0338与 GPIO20x033a两组通用 I/O 口由 W83977F 的逻辑设备 7/8 提供。内核在 arch/arm/mach-footbridge/netwinder-hw.c 定义GP1_IO_BASE 0x338、GP2_IO_BASE 0x33a并提供nw_gpio_read()、nw_gpio_modify_op()、nw_gpio_modify_io()等导出符号操作这两组端口。Ether100x0300–0x031f10M 以太网控制器Winbond 89C940F的 I/O 窗口。DC211430x0400–0x0408100M 以太网控制器Intel/DEC 21143 Tulip 家族的寄存器窗口。SuperIO 与音频芯片配置口NetWinder 的板载多功能 I/O 芯片是Winbond W83977F内核注释中写作 W83977AF/W83977F其配置入口采用标准 Winbond SuperIO 序列向 0x370 连续写入两个 0x87 打开配置门EFER gate通过 0x370索引/0x371数据访问配置寄存器最后写 0xaa 关闭。对应实现static inline void wb977_open(void) { outb(0x87, 0x370); outb(0x87, 0x370); } static inline void wb977_close(void) { outb(0xaa, 0x370); } static inline void wb977_wb(int reg, int val) { outb(reg, 0x370); outb(val, 0x371); }出处见 arch/arm/mach-footbridge/netwinder-hw.c。wb977_init()会依次初始化并口逻辑设备 1EPP 模式、键盘控制器逻辑设备 5KBC 8MHz、键盘 IRQ 1、鼠标 IRQ 5、IRDA逻辑设备 6以及两组 GPIO逻辑设备 7/8并注册request_region(0x370, 2, W83977AF configuration)保护配置口。RWA010则是板载音频/游戏口多功能芯片Analog Devices AD1816 之类其配置口非常特殊索引端口 0x0279、配置写端口 0x0a79、配置读端口 0x0203。内核通过WRITE_RWA(r,v)宏访问#define WRITE_RWA(r,v) do { outb((r), 0x279); udelay(10); outb((v), 0xa79); } while (0)并配合一段 34 字节的解锁序列rwa_unlock[]打开芯片配置见 arch/arm/mach-footbridge/netwinder-hw.c。rwa010_init()完成全局初始化禁用 modem、cdrom、MPU-401 段、游戏口初始化、WaveArtist 初始化与 SoundBlaster 初始化并执行一次 SoundBlaster DSP 复位与 OPL3 开启。由此端口表中的 SoundBlaster0x0220、WaveArtist0x0250、AdLib0x0388的默认取值与源码调用一一对应rwa010_waveartist_init(0x250, 3, 7); /* base 0x250, irq 3, dma 7 */ rwa010_soundblaster_init(0x220, 0x388, 3, 1); /* sb 0x220, adlib 0x388, irq 3, dma 1 */来源arch/arm/mach-footbridge/netwinder-hw.c。中断IRQ分配表NetWinder 的中断体系分为两大部分ISA 中断0–15来自两片级联的 8259 PICDC21285 中断16–35来自 FootBridge 桥本身。原文档的 ISA 中断分配表如下IRQ类型描述0ISA100Hz 定时器1ISA键盘2ISA级联3ISA串口 ttyS14ISA串口 ttyS05ISAPS/2 鼠标6ISAIRDA7ISA打印机8ISARTC 闹钟9ISA10ISAGP10橙色复位按钮11ISA12ISAWaveArtist13ISA14ISAhda115ISA该表在 arch/arm/mach-footbridge/include/mach/irqs.h 中被编码为一组命名宏其中 NetWinder 特有的分配是#define IRQ_NETWINDER_ETHER10 IRQ_IN0 #define IRQ_NETWINDER_ETHER100 IRQ_IN1 #define IRQ_NETWINDER_VIDCOMP IRQ_IN2 #define IRQ_NETWINDER_PS2MOUSE _ISA_IRQ(5) #define IRQ_NETWINDER_IR _ISA_IRQ(6) #define IRQ_NETWINDER_BUTTON _ISA_IRQ(10) #define IRQ_NETWINDER_VGA _ISA_IRQ(11) #define IRQ_NETWINDER_SOUND _ISA_IRQ(12)几点值得注意的实现细节IRQ 0100Hz 定时器由 i8253 PIT 产生通过CLKEVT_I8253/CLKSRC_I8253接入内核时钟框架初始化入口为isa_timer_init()见 arch/arm/mach-footbridge/common.h 与 Makefile 中obj-$(CONFIG_ARCH_NETWINDER) netwinder-hw.o isa-timer.o。IRQ 2级联两片 PIC 的级联中断内核在isa_init_irq()中通过request_irq(irq, no_action, 0, cascade, NULL)申请并把irq_canonicalize()定义为将 IRQ 2 规范化为 IRQ 9见 arch/arm/mach-footbridge/include/mach/irqs.h。IRQ 10橙色复位按钮GPIO 组 1 的 GP10 引脚配置为去抖滤波使能、IRQ、输入模式寄存器 0xe0 写 0x19见 arch/arm/mach-footbridge/netwinder-hw.c。IRQ 11 的特殊处理NetWinder 板上该中断线缺少上拉电阻arch/arm/mach-footbridge/isa-irq.c 因此在机器匹配 NetWinder 时对_ISA_IRQ(11)设置IRQ_NOAUTOEN避免请求时自动使能造成误触发。Ether10/Ether100/VIDCOMP 中断分别接到 DC21285 的 IN0/IN1/IN2 输入对应内核 IRQ 21/22/23而非 ISA PIC——这正是 PCI 设备中断经 FootBridge 路由的结果。ISA 中断通过isa_irq_handler()统一分发当某个 DC21285 中断被触发时处理器读取 PCI IACK 周期地址PCIIACK_BASE获得 ISA IRQ 号再generic_handle_irq()派发见 arch/arm/mach-footbridge/isa-irq.c。主/从 PIC 分别由isa_lo_chip与isa_hi_chip两个irq_chip管理从片中断 ACK 时需先对主片发 0x62 的级联 EOI 命令。PCI 设备中断路由NetWinder 的 PCI 中断路由通过 arch/arm/mach-footbridge/netwinder-pci.c 的netwinder_map_irq()按 PCI 槽位映射PCI 槽位设备中断0主机桥host bridge无09CyberProVGAIRQ_NETWINDER_VGAISA IRQ 1110DC21143100M 网卡IRQ_NETWINDER_ETHER100DC21285 IN112Winbond 553IDE 控制器IRQ_ISA_HARDDISK1ISA IRQ 1413Winbond 89C940F10M 网卡IRQ_NETWINDER_ETHER10DC21285 IN0其余槽位会打印PCI: unknown device in slot %s错误。整个 PCI 控制器的初始化挂接在netwinder_pci结构上使用dc21285_ops、dc21285_setup/preinit/postinit并由subsys_initcall(netwinder_pci_init)在machine_is_netwinder()时执行pci_common_init()。对应的 Makefile 规则为pci-$(CONFIG_ARCH_NETWINDER) netwinder-pci.o见 arch/arm/mach-footbridge/Makefile。DMA 通道分配表NetWinder 使用标准的 8237 ISA DMA 体系共 8 个通道。原文档分配如下DMA类型描述0ISAIRDA1ISA2ISA级联3ISAWaveArtist4ISA5ISA6ISA7ISAWaveArtist对应内核实现要点DMA 2 为级联通道dma-isa.c在初始化时通过request_dma(DMA_ISA_CASCADE, cascade)预留。IRDA 使用 DMA 0在wb977_init_irda()中通过 W83977F 配置寄存器 0x74 写 0x00 将 RX DMA 绑定到通道 0寄存器 0x75 写 0x04 关闭 TX DMA见 arch/arm/mach-footbridge/netwinder-hw.c。WaveArtist 使用 DMA 3 与 7rwa010_waveartist_init(0x250, 3, 7)中把 WaveArtist 配置到 IRQ 3 与两个 DMA 通道支持 16 位通道 7与 8 位通道 3访问。DMA 控制器驱动位于 arch/arm/mach-footbridge/dma-isa.c内核维护了一张 8×7 的isa_dma_port[8][7]端口表把每个通道的 MASK/MODE/CLRFF/PAGE_HI/PAGE_LO/ADDR/COUNT 寄存器映射到实际 I/O 地址低位通道 0x0a–0x07 一带高位通道 0xd4–0xce 一带页寄存器分别落在 0x080–0x08b 与 0x480–0x48b与端口分配表一致。isa_dma_init()core_initcall会对 DMA 控制器做自动探测先写 0xff 到 0x0d/0xda 复位触发器再向通道 0 地址寄存器交替写入 0x55/0xaa 并读回验证探测成功后注册 4 个 I/O 资源区间dma1、dma low page、dma2、dma high page并把 8 个通道全部登记到 ISA DMA 框架isa_dma_add。通道 4–7 是 16 位通道isa_get_dma_residue()对其余量做count 1换算isa_enable_dma()在使能时还会通过dma_map_single为 ISA 风格驱动补做 cache 一致性映射。端口表最后通过dma_direct_set_offset(isa_dma_dev, PHYS_OFFSET, BUS_OFFSET, SZ_256M)设置 ISA 总线的物理/总线地址偏移。从资源表到内核实现源码对照小结Documentation/arch/arm/netwinder.rst中三张资源表并非孤立文档而是与arch/arm/mach-footbridge/下的实现代码精确对应形成文档—代码闭环资源类别文档条目内核实现位置I/O 端口 0x0180 IRDAIRDAnetwinder-hw.cwb977_init_irda()I/O 端口 0x0338/0x033a GPIOGPIO1/GPIO2netwinder-hw.c GPIO 操作函数I/O 端口 0x0370/0x0371 W83977F 配置W83977F configuration registersnetwinder-hw.cwb977_*系列I/O 端口 0x0279/0x0a79/0x0203 RWA010RWA010 confignetwinder-hw.cWRITE_RWA与rwa010_*IRQ 0–15 ISA 分配Interrupt usageinclude/mach/irqs.h 与 isa-irq.cIRQ 10 橙色复位按钮GP10netwinder-hw.c GPIO 组配置DMA 0 IRDA / DMA 3,7 WaveArtistDMA usagenetwinder-hw.c、dma-isa.c补充LED 控制与重启逻辑NetWinder 的独特之处除资源表外NetWinder 平台实现还有两个值得开发者注意的硬件特性均可在 arch/arm/mach-footbridge/netwinder-hw.c 中找到LED 极性反转NetWinder 的 LED 控制是反逻辑的——置位表示关灯清位表示开灯。内核注册了netwinder:greenheartbeat 触发与netwinder:redcpu0 触发两个led_classdev通过 GPIO1 口控制见netwinder_led_set()/netwinder_led_get()netwinder-hw.c。重启路径netwinder_restart()在软件重启REBOOT_SOFT时跳入 ROM 地址 0x41000000硬重启则打开 W83977F、将 GP16 设置为看门狗定时器输出WD-TIMER并置红色 LED、翻转 WD_TIMER 触发复位netwinder-hw.c。结语NetWinder 是 ARM 平台早期PC 化设计的代表StrongARM DC21285 PCI 桥 完整 ISA 外设的组合使得它的 I/O、中断与 DMA 资源分配既保留 PC/AT 惯例又叠加了板级特色设备。Linux 内核通过arch/arm/mach-footbridge/下的 SuperIO 配置W83977F、RWA010 音频芯片初始化、ISA PIC/DMA 自动探测以及按槽位映射的 PCI 中断路由将 Documentation/arch/arm/netwinder.rst 中的三张资源表完整落地为可运行的平台代码。阅读这套文档 源码的组合既是理解 ARM 早期机器支持代码的绝佳入口也是学习 ISA/PCI 资源管理与板级初始化machine fixup的经典范例。【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/11 1:35:03

数据结构基础:算法复杂度分析,几秒判断代码性能

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/11 2:40:10

源码证据驱动:如何审阅Valhalla这类开源基础设施项目

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/11 2:40:10

CPPS 2026全景:11位嘉宾、9大专题与C++的下一个十年

2026年11月20-21日,北京万达文华酒店,C及系统软件技术大会(CPP-Summit)将再次启幕。作为与奇点智能技术大会同期同场举办的技术盛会,CPPS 2026以11位演讲嘉宾与9大专题,勾勒出C与系统软件的下一个十年。 直…

2026/9/11 2:40:09

车载Android串口通信实战:UART/RS232/RS485选型与Modbus RTU对接

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/11 2:35:09

声振温监测方案拆解:从传感器选型到可视化看板落地

设备管理人员最怕的,从来不是“设备坏了”这件事本身,而是“不知道它快坏了”。传统模式下,转动设备就像一台关在铁皮柜子里的黑箱——巡检员拿听音棒贴上去听一听,用手背试一下壳体温度,再凭经验判断“还行”或者“有…

2026/9/10 16:39:38

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/10 11:16:38

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/9 16:31:09

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/10 12:32:02

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/10 15:19:50

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/10 15:49:53

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码