setserial /dev/ttyS4: 직렬 정보를 설정할 수 없습니다.

setserial /dev/ttyS4: 직렬 정보를 설정할 수 없습니다.

따라서 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

관련 정보