마더보드에 있는 직렬 포트 6개 중 4개를 사용하는 데 문제가 있습니다.
상황은 다음과 같습니다
ttyS0부터 ttyS5까지 6개의 직렬 포트를 사용할 수 있습니다. 그 중 0개는 마더보드 가장자리에 있는 RS232 포트이고 나머지 5개는 마더보드에 직접 연결된 직렬 헤더입니다. 표준 BIOS 구성에서 이러한 맵은 다음과 같습니다.
- ttyS0: IRQ 4
- ttyS1:IRQ 3
- ttyS2: IRQ 10
- ttyS3: IRQ 10
- ttyS4: IRQ 10
- ttyS5:IRQ 10
Linux는 dmesg를 사용하여 이를 올바르게 보고하여 초기 설정 방법을 확인하고, seterial 명령을 사용하여 이러한 값을 변경할 수 있습니다. 부팅 중에 IRQ, 속도 및 기타 설정을 자동으로 구성할 수 있도록 부팅 시 실행되는 스크립트에 이를 작성했습니다. 2-5에서는 IRQ 10만 사용할 수 있기 때문에 BIOS에서 대부분을 변경할 수 없습니다.
그러나 이 구성에서는 Python 스크립트를 사용하여 한 포트에서 다른 포트로(또는 외부 PC에서) 100,000자를 전송할 때 4개의 포트에서 IRQ 10을 공유하는 것이 작동하지 않습니다. 커널에서 IRQ 공유가 활성화되어 있지만 이 기능을 지원하는 GPIO 칩이 있습니다(Fintek F81866A). 일반적으로 Python 프로그램은 포트 개방 라인(읽기/쓰기)에서 잠겨 있습니다. ttyS0과 ttyS1은 동일한 스크립트를 사용하여 올바르게 실행되며 실제로 아래에서 언급한 모든 테스트는 동일한 코드를 사용합니다. 한 스크립트는 포트를 열고 정보를 기다리는 반면, 다른 스크립트는 100,000개의 임의 문자를 생성하여 정보를 보냅니다. 양쪽 끝의 정보가 동일한지 확인하는 기본 검사가 있습니다.
IRQ 0(폴링 모드)으로 전환하면 기능을 수행할 수 있지만 속도와 안정성이 해당 애플리케이션에 적합하지 않습니다. 2-5 중 하나를 IRQ로 변경하고 이를 ttyS0에 연결하면 IRQ(4)를 공유할 때 정상적인 기능을 얻을 수 있지만 ttyS0이 비활성 상태인 경우(예: 외부 시스템에서 ttyS2로 이동 -5) IRQ 10으로 설정된 경우와 동일한 동작입니다.
내가 실행한 유일한 주목할만한 테스트는 BIOS의 마지막 3개 포트를 비활성화하여 ttyS2가 IRQ 10의 유일한 포트가 되도록 하는 것이었습니다. 이 시점에서는 ttyS0 및 1과 동일한 속도로 제대로 실행되었습니다. 나에게 이것은 문제가 특히 공유 인터럽트에 있다는 것을 의미하지만 포트를 다른 비어 있는 IRQ(제대로 기억한다면 11과 12)로 이동하려고 하면 개선이 없습니다.
특히 Python 스크립트가 IRQ 3 및 IRQ 4를 실행하여 인터럽트를 관찰하면 예상한 대로 작동하고 필요에 따라 인터럽트가 발생합니다. 그러나 IRQ 10으로 설정된 다른 포트 중 하나를 호출하려고 하면 예외가 발생합니다. 포트를 열 때 첫 번째입니다. 하나의 포트만 IRQ 10을 사용하는 경우 인터럽트는 3 및 4의 인터럽트와 동일하게 동작합니다.
나는 왜 이런 일이 일어나는지 조사하기 위해 몇 가지 방법을 시도해 보았고 Fintek 칩이 원인이라는 확신이 점점 더 커지고 있습니다. 내 커널(3.19) 설정 및 드라이버에서 이전 Fintek 제품에 대한 참조를 찾을 수 있지만 이 제품은 찾을 수 없습니다. 칩에 문제가 있다고 생각한 또 다른 이유는 마더보드에 역시 이상한 반기능 상태의 GPIO 헤더가 있었기 때문입니다. 거기에 있는 것을 볼 수 있고 ID를 올바르게 얻을 수 있지만 실제로 액세스하거나 이 범위 밖에서 사용하지 마세요.
이 문제를 해결하려면 어떤 옵션이 있어야 합니까? Fintek IO 컨트롤러에 일부 호환성 문제가 있을 수 있나요? 저는 현재 필요한 경우 F81866A에 대한 기본 지원이 있는지 확인하기 위해 최신 커널 버전을 설치하고 있습니다. 이를 구동하기 위해 직접 무언가를 작성해 본 경험이 없습니다.