따라서 6개의 하드웨어 직렬 포트가 있는 보드가 있습니다. 처음 2개는 ETX 버스에 있고 마지막 4개는 ISA 버스에 있습니다. 다음 구성은 다음과 같아야 합니다.
/dev/ttyS0 port 0x03F8 irq 4
/dev/ttyS1 port 0x02F8 irq 3
/dev/ttyS2 port 0x0100 irq 5
/dev/ttyS3 port 0x0108 irq 5
/dev/ttyS4 port 0x0110 irq 5
/dev/ttyS5 port 0x0118 irq 5
시작 시 다음을 실행합니다.
# dmesg | egrep -i 'serial|ttys'
Serial: 8250/16550 driver, 6 ports, IRQ sharing enabled
serial8250: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
serial8250: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A
00:06: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
00:07: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A
# cat /proc/tty/driver/serial
Serinfo:1.0 driver revision:
0: uart:16550A port: 000003F8 irq:4 tx:0 rx:0
1: uart:16550A port: 000002F8 irq:3 tx:0 rx:0
2: uart:unknown port:000003E8 irq:4
3: uart:unknown port:000002E8 irq:3
4: uart:unknown port:00000000 irq:0
5: uart:unknown port:00000000 irq:0
그래서 setserial을 사용하여 포트 ttyS2-ttyS5를 올바른 값으로 구성해 보았습니다.
# setserial /dev/ttyS2 irq 5 port 0x100 uart 16550A
# setserial /dev/ttyS3 irq 5 port 0x108 uart 16550A
# setserial /dev/ttyS4 irq 5 port 0x110 uart 16550A
Cannot set serial info: Invalid argument
# setserial /dev/ttyS5 irq 5 port 0x118 uart 16550A
Cannot set serial info: Invalid argument
마지막 명령에서 uart 옵션을 제거합니다.
# setserial /dev/ttyS4 irq 5
Cannot set serial info: Invalid argument
setserial을 통해 ttyS4 및 ttyS5를 구성하려면 어떻게 해야 합니까?
답변1
/proc
귀하의 결과와 결과에서 제가 본 내용에 대해 dmesg
몇 가지 사항이 저에게 충격을 주었습니다 .
장치 간에 IRQ를 공유하려고 하면 안 됩니다. 작동할 수도 있지만 ISA의 목적은 작동을 위해 인터럽트 라인이 필요한 버스의 모든 장치에 자체 IRQ가 있다는 것입니다. 직렬 포트 카드가 충분한 IRQ 옵션을 제공하지 않으면 PC에서 두 옵션을 모두 사용하지 못할 수도 있습니다.
두 번째 직렬 포트 쌍에 사용되는 I/O 주소는 비표준입니다.
ttyS2
일반적으로 0x3E8,ttyS3
일반적으로 0x2E8에 위치합니다. 직렬 카드 옵션이 있다면 이 카드를 옮기겠습니다. (버전 1 이상에는 표준 I/O 주소나 IRQ가 없습니다ttyS4
.)
그 외에도 Linux 시스템에 6개의 직렬 포트가 필요한 경우에는 기존의 일반 직렬 포트 어댑터 카드를 사용하지 않을 것입니다. 나는 다음과 같은 것을 사용할 것입니다디지털 가속 포트. 그들은 여전히 ISA 슬롯에서 작동하는 Xe 모델을 제공합니다. 값싼 것이 필요하다면 당시 매우 인기가 있었던 중고 시장에서 찾을 수 있을 것입니다.
답변2
커널 부팅 매개변수에 또는 를 추가해 보십시오 8250.nr_uarts=6
.nr_uarts=6
편집: (희망적으로) 도움이 될 수 있는 몇 가지 정보입니다.
답변3
baud_rate 115200
매개변수를 사용해 보세요setserial
답변4
이 질문에 대한 다른 답변에서 언급한 base_baud 외에도 매개변수의 순서일 수도 있습니다. (base_baud가 작동했기 때문에 정확히 무엇이 수정되었는지 확인하기 위해 다른 순서를 시도할 시간이 없었습니다.)
임베디드 x86 애플리케이션에 새 직렬 포트를 설치하려고 시도하는 동안 비슷한 문제에 직면했습니다. 나에게 문제는 setserial 프로그램이 명령줄 인수를 해당 ioctl() 작업으로 순차적으로 변환하여 다양한 장치 매개변수를 설정한다는 것입니다. 기본적으로 seterial은 다음 전략을 적용합니다. 1) 특정 /dev/ttySx의 현재 설정을 읽습니다. 2) 각 명령줄 매개변수에 지정된 값을 수정합니다. 각 개별 명령줄 매개변수 또는 플래그는 ioctl이 됩니다.
따라서 포트 또는 irq를 지정하기 전에 uart 유형(또는 자동 구성)을 지정하면 /dev/ttyS3에 대한 포트 값이 어떤 값으로도 초기화되지 않기 때문에 /dev/ttyS3보다 큰 포트에서는 올바르게 작동하지 않습니다. 이로 인해 ioctl() 작업은 errno가 EINVAL(잘못된 인수)로 설정된 상태로 반환됩니다. 나는 ioctl()의 ^fourport 플래그와 low_latency 플래그의 체인이 드라이버에게 의미가 없는 것으로 의심됩니다.https://bugzilla.kernel.org/show_bug.cgi?id=8458