Linux多串口驱动

本文详细分析了一台集成13个串口的ATM机在Linux环境下无法识别全部串口的问题。问题在于Linux内核默认配置仅支持4个串口,且IO地址与实际硬件不匹配。解决方案包括修改内核配置以匹配串口地址,并通过设置串口为轮询模式使其工作。虽然通过轮询模式解决了串口工作问题,但中断触发问题尚未解决,可能涉及芯片型号差异或板级设计问题,需要主板电路原理图进一步排查。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:机器集成了13个串口,linux操作系统启动后,只能识别到4个串口且无法使用。
是否解决:已基本解决。
问题分析:
    经测试,该ATM定制机使用的串口控制芯片为通用串口控制器8250系列的16550A型号。该芯片内置3根地址线寻址范围达8字节,具有10个可编程寻址寄存器(通过地址复用),支持4级中断控制,收发双缓冲寄存器,拥有16字节fifo缓存。
    8250系列芯片默认的IO寄存器基地址以及中断号分布如下:
    /dev/ttyS0 (COM1), port 0x3f8, irq 4
    /dev/ttyS1 (COM2), port 0x2f8, irq 3
    /dev/ttyS2 (COM3), port 0x3e8, irq 4
    /dev/ttyS3 (COM4), port 0x2e8, irq 3
    但是**ATM机没有按照默认约定部署板级芯片,而是采用以下的方式分配IO寄存器地址:
    0x2E8,     /* COM1*/    
    0x3E8,     /* COM2 */    
    0x240,     /* COM3 */    
    0x248,     /* COM4 */    
    0x250,     /* COM5 */    
    0x258,     /* COM6 */    
    0x260,     /* COM7 */    
    0x268,     /* COM8 */    
    0x270,     /* COM9 */    
    0x278,     /* COM10 */    
    0x2F0,     /* COM11 */    
    0x2F8,     /* COM12 */        /* BIOS 中默认关闭 */
    0x3F8,     /* COM13 */        /* BIOS 中默认关闭 */
    而linux内核采用8250系列芯片约定的IO基地址进行配置,且默认只支持创建最多4个串口设备:
 
    ===================  _ASM_X86_SERIAL_H ==================
     #define SERIAL_PORT_DFNS                \
     /* UART    CLK    PORT    IRQ    FLAGS                */    \
    { .uart = 0,  BASE_BAUD,  0x3F8,  4,  STD_COMX_FLAGS }, /* ttyS0 */    \
    { .uart = 0,  BASE_BAUD,  0x2F8,  3,  STD_COMX_FLAGS }, /* ttyS1 */    \
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值