Linux에서 USB 프로토콜을 변경할 수 있습니까?

Linux에서 USB 프로토콜을 변경할 수 있습니까?

나는 uart-to-usb 브리지 없이 마이크로 컨트롤러가 usb를 통해 컴퓨터와 직접 통신하도록 하는 방법을 찾으려고 노력해 왔으며 USB 포트에 대한 USB 프로토콜을 비활성화하고 포트를 일반 직렬 포트로 사용하면 그렇게 할 수 있다고 생각했습니다. 포트. 그런데 USB 부분은 끌 수 없다고 들었습니다. 하지만 Linux에서는 운영 체제의 내부 작동 방식 중 훨씬 더 많은 부분을 변경할 수 있도록 남겨두었다고 들었습니다. Linux에서는 USB 프로토콜을 변경하고 USB 포트를 일반 직렬 포트로 전환할 수 있습니까?

답변1

USB는 이전 RS-232 직렬 포트 표준(EIA/TIA-232라고도 함)과 일치하는 "단순한 직렬 포트"가 아닙니다. "추가 요구 사항을 끄는 것"으로는 USB를 RS-232로 전환할 수 없습니다.

기존 RS-232 직렬 포트와 달리 USB는 차동 신호를 사용합니다. 신호 레벨과 기타 전기적 특성은 매우 다르지만 실제로는 RS-485와 약간(아주 조금) 비슷합니다.

RS-232는 최대 +/- 15V의 신호 전압을 사용할 수 있습니다. USB는 USB 1 모드에서 논리 로우에 <0.3V, 논리 하이에 2.8-3.6V를 사용합니다. USB 2 고속 모드에서는 전압이 그보다 훨씬 더 작습니다.

RS-232에서 TTL 로직 레벨(0..5V)을 사용하더라도 USB 송신기는 RS-232 "공간"(=고전압 상태) 신호를 안정적으로 생성할 수 없습니다. 신호 레벨은 이러한 표준 간에 일치하지 않습니다. USB 송신기의 신호는 RS-232 UART 수신기에 비해 너무 약하고 RS-232 출력 신호는 USB 수신기에 과부하가 걸립니다.

간단한 레벨 변환기 회로로는 비호환성을 해결할 수 없습니다. 즉, 시작 비트 1개, 데이터 1바이트, 정지 비트 1~2개를 보내는 대신 USB 트랜시버가 패킷을 처리합니다. 패킷 시작 부분에는 동기화 시퀀스(USB 1의 경우 8비트, USB 2 고속 전송의 경우 32비트)가 있어야 하며 몇 바이트가 전송되고 마지막으로 일치하지 않는 패킷 끝 신호가 발생합니다. 정상적인 "논리적 낮음" 또는 "논리적 높음" 상태 중 하나입니다. 이 모든 것은 효율성을 위해 하드웨어로 구현될 수 있으며 일반적으로 다른 작업을 수행할 이유가 없기 때문에 직접 소프트웨어 제어에서 실제 데이터 라인을 "비트뱅킹"하기 위해 이를 우회할 수 있는 조항이 없을 것입니다.

신호 예제를 비교하십시오.RS-232그리고USB 1.1위키피디아에서.

요약하자면, 아니요, 문제는 실제 하드웨어 수준에서 USB와 RS-232의 차이가 너무 크다는 것입니다.

관련 정보