问题描述:机器集成了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 */ \
是否解决:已基本解决。
问题分析:
经测试,该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 */ \