Linux에서 허브 및 직렬 장치 드라이버는 어디에 있습니까? 직렬 TTL 어댑터가 일정 시간이 지나면 데이터를 끊는 것을 본 적이 있습니까?

Linux에서 허브 및 직렬 장치 드라이버는 어디에 있습니까? 직렬 TTL 어댑터가 일정 시간이 지나면 데이터를 끊는 것을 본 적이 있습니까?

이 질문은 완전히 설명하기 어렵습니다. 미리 사과드립니다. 전체 설명을 읽어주세요. 감사해요.

참고: 주로 문서화하기 위해 이 글을 게시하고 있으며, 이 문제를 해결하기 위해 업데이트해야 하는 Linux 이미지 부분을 식별하는 방법에 대한 제안을 요청하고 있습니다. 어쩌면 누군가가 이를 보고 해결 방법을 찾을 수도 있습니다. 30년 넘게 직렬 TTL 통신을 사용해왔지만 이런 문제는 한번도 겪어본 적이 없습니다.

보안/대역폭 문제로 인해 쉽게 업데이트할 수 없는 내장 보드가 있습니다. 작은 업데이트는 가능하지만 목표는 아닙니다. 문제를 해결하는 것 외에도 시스템의 어느 부분에 교육용으로 이러한 드라이버가 포함되어 있는지 알고 싶습니다. 나는 문제를 해결하고 싶은 것이 아니라, 문제를 이해하고 싶다.

보드에는 다양한 장치를 연결할 수 있는 USB 커넥터가 있으며 일반적으로 작동합니다. 키보드, Wi-Fi 어댑터 등

외부 직렬 장치(예: Arduino 또는 기타 장치)와 통신하려고 할 때 자주 사용하는 장치 중 하나는 직렬 TTL 어댑터입니다.

이 어댑터를 USB 포트에 직접 연결하면 완벽하게 작동합니다. 나는 일반적으로 CP210x, 가장 일반적으로 CP2102/2104를 사용하지만 CH340, FTDI 등도 사용했습니다. 문제가 없습니다.

최근에 두 개의 USB 장치를 동시에 연결해야 하는 애플리케이션이 있어서 작은 USB 허브를 추가했습니다. HUB를 통해 직렬 TTL 어댑터를 연결한 후 약 678uS 이후에 전송되는 데이터가 모두 끊어지는 것을 발견했습니다. (!?)

예를 들어, 오실로스코프 트레이스의 스크린샷 세트는 직렬 TTL 어댑터에 직접 연결했을 때 회색 트레이스를 보여주고, 허브를 통해 연결했을 때 파란색 트레이스를 보여줍니다.

문제를 보여주는 범위 추적 스크린샷

여기에 이미지 설명을 입력하세요.

보시다시피 데이터의 중간 바이트가 잘렸습니다. 나중에 측정한 결과 데이터 길이나 전송 속도에 관계없이 시간이 약 20uS 정도 일관된 것으로 나타났습니다.

이는 x3 허브 및 x3 어댑터에서 발생합니다.

허브에 전원을 공급해 보았습니다. 하나는 자체 어댑터와 함께 제공되고, 다른 하나는 표준 전원 연결이 있고, 세 번째는 벤치 전원 공급 장치에 연결하는 전원 핀이 있습니다. 아무런 차이가 없습니다.

이것은 RS232가 아니므로 차지 펌프 고장이 없습니다. 칩의 전원 공급 장치를 모니터링했는데 정전이 발생하지 않았습니다.

동일한 허브와 어댑터는 PC x2 OS(Ubuntu 20.04, Windows 11)에 연결하면 완벽하게 작동합니다.

내 가설은 포함된 이미지의 USB 드라이버에 문제가 있다는 것입니다. 다시 말하지만, 작은 규모 외에는 업데이트할 수 없으며, 어쨌든 내 진짜 목표는 문제를 이해하는 것입니다.

  • 실제 질문은 Linux 스택의 어느 부분이 이를 제어하는가입니다.
  • 보너스 포인트: 해당 섹션만 어떻게 업데이트하시겠습니까?
  • 보너스 추가 크레딧: 전에 본 적이 있나요?

답변1

Linux 커널의 문제가 무엇인지 파악하는 데 필요한 작업량은 엄청납니다. 이를 발견하면 수정하려면 커널을 다시 컴파일해야 합니다. 현재 임베디드 장치와 해당 빌드 환경(컴파일러 등)에 있는 소스의 정확한 버전이 있어야 합니다. [이것은 Yocto가 이러한 유형의 하드웨어로 인기를 끄는 이유 중 하나입니다. 왜냐하면 이를 통해 무언가를 재구축하는 데 필요한 모든 것에 대한 스냅샷을 유지할 수 있기 때문입니다.]

진행하는 가장 이상적인 방법은 마더보드나 PC에서 문제를 재현하는 것입니다. 여기서 문제가 있는 가장 가까운 두 버전과 그렇지 않은 버전을 찾을 때까지 쉽게 다운로드하여 다양한 커널 버전을 사용해 볼 수 있습니다. 그런 다음 수정된 사항에 대한 단서를 찾기 위해 커널 소스 코드의 차이점을 살펴볼 수 있습니다.

소스를 찾아보고 문제를 파악하려면 다음 위치에서 호스트 허브 드라이버를 찾을 수 있습니다. ehci-hcd.c USB2의 경우 xhci-hub.c USB3의 경우. 일반 외부 허브 드라이버는 다음 위치에 있습니다. 허브 c. USB 직렬 어댑터(예: ch341.c. 위의 URL을 사용하면 다른 버전의 커널로 변경할 수 있습니다. 이전 버전의 커널로 돌아가면 파일 이름이 변경된 것을 확인할 수 있습니다. USB 코드에 관한 문서가 있습니다.여기.

예를 들어, github에서 동일한 파일을 찾을 수 있습니다 ch341.c, 클릭하면탓하다버튼을 누르면 각 줄의 현재 내용에 대한 이유를 설명하는 주석이 달린 목록을 얻을 수 있습니다. 이것역사버튼은 변경 사항 목록을 제공합니다. 이 커널 트리를 로컬로 다운로드하고 git 도구를 사용 하여 git커밋 변경 사항을 검색하고 특정 버전에 대한 소스 코드를 추출할 수 있습니다.

관련 정보