새 보드에서 직렬 포트를 식별하는 방법

새 보드에서 직렬 포트를 식별하는 방법

저는 맞춤형 I.MX233 기반 보드를 포팅하기 위해 yocto를 사용하고 있는데 처음에 "콘솔" 커널 매개변수를 어떻게 설정했는지 궁금합니다.

커널은 장치 트리의 첫 번째 언급 또는 메모리 주소를 기반으로 직렬 장치를 할당합니까?

콘솔 이름이 무엇인지 어떻게 알 수 있나요? 예: ttyACM0, ttyS0 또는 serial0

답변1

커널은 장치 트리의 첫 번째 언급 또는 메모리 주소를 기반으로 직렬 장치를 할당합니까?

이는 하드웨어에 사용 가능한 정확한 직렬 드라이버에 따라 달라질 수 있습니다. 일종의 자동 검색 기능이 있는 경우 메모리 주소(또는 관련 자동 검색 메커니즘에 적합한 모든 것)로 진행될 수 있으며, 그렇지 않으면 장치 트리 순서 배열로 진행될 수 있습니다.

콘솔 이름이 무엇인지 어떻게 알 수 있나요?

기본 이름은 드라이버에 의해 결정됩니다. 하드웨어가 클래식 8250 칩이나 그 하위 항목/복제/호환 칩을 기반으로 하는 경우 ttyS<N>스타일 이름을 사용하는 선례가 있습니다. 다른 드라이버에는 고유한 이름 지정 체계가 있습니다.

이러한 ttyACM<N>이름은 USB 모뎀용 USB 추상 제어 모델 드라이버를 올바르게 참조하며 USB 직렬 어댑터가 내장된 ISDN 직렬 콘솔은 이 사양을 준수하는 USB 장치로 표시될 수 있으므로 공급업체가 필요하지 않습니다. 특정 USB 직렬 어댑터 드라이버 사용할 수 있습니다. 그러나 이것은 단지 의미개발 워크스테이션보드를 USB 직렬 콘솔에 연결했습니다. /dev/ttyACM0마더보드 자체는 이를 일반 직렬 포트로 처리합니다(마더보드 하드웨어 아키텍처에서 "일반 직렬 포트"라고 부르는 것과 관계 없음).

("양쪽 끝"에 ACM 인터페이스를 제공하는 USB 인터페이스 장치를 구축하는 것은 기술적으로 가능하지만 콘솔로 사용하기 전에 시작하려면 매우 복잡한 USB 하위 시스템이 필요하기 때문에 콘솔로는 불리합니다. 일반적으로 말하면 , 다른 하드웨어를 초기화할 때 발생하는 문제를 더 쉽게 디버깅할 수 있도록 부팅 프로세스 초기에 사용할 수 있도록 콘솔 장치를 최대한 단순하게 만들고 싶습니다.

ARM 아키텍처에서 첫 번째 직렬 포트는 AMBA PrimeCell UART(PL011 UART라고도 함)를 사용하여 구현될 수 있으며 이로 인해 ttyAMA0커널 드라이버에 의해 이름이 지정됩니다.


"저는 맞춤형 I.MX233 기반 보드를 포팅하기 위해 yocto를 사용하고 있습니다"라고 말씀하셨습니다. 이것은 지금까지 Linux에서 실행된 적이 없는 맞춤형 보드 유형에서 Linux를 실행하려고 한다는 의미입니까? 그렇다면 먼저 하드웨어 데이터시트가 필요합니다. 사용자 정의 하드웨어에 대한 장치 트리 설명을 작성하거나 대략 유사한 기존 장치 트리 설명을 조정해야 합니다. 이렇게 하려면 보드의 모든 하드웨어 요소를 이해(또는 파악)하고 각 하드웨어 요소에 적합한 Linux 드라이버를 식별(또는 최악의 경우 작성)해야 합니다. 또한 하드웨어 요소(또는 드라이버가 하드웨어 요소에 액세스하는 데 필요한 모든 것)의 기본 주소를 찾아야 합니다.

PC 하드웨어에서 시스템 하드웨어/펌웨어는 자신을 설명하는 여러 가지 방법을 가지고 있습니다. PCI/PCIe 버스에는 모든 PCI/PCIe 장치가 가져야 하는 지정된 표준 기능 세트가 있으며 버스의 모든 장치를 자동으로 감지할 수 있도록 설계되었습니다. ACPI 펌웨어는 또한 직렬 포트, 인터럽트 컨트롤러 등과 같이 PCI(e) 버스에 없는 모든 PC 하드웨어 요소에 대한 광범위한 시스템 정보를 제공합니다.

어떤 경우에는(예: ISAPnP 없이 ISA 버스를 사용하는 매우 오래된 시스템에서 실행하는 경우) 해당 하드웨어 정보를 사용할 수 없지만 직렬 포트와 호환되는 첫 번째 4개의 8250을 갖는 것과 같은 특정 산업 표준 규칙이 있습니다. /O 기본 주소는 순서대로 0x3f8, 0x2f8, 0x3e8, 0x2e8입니다. 이러한 규칙을 사용하면 직렬 포트 드라이버가 특정 주소를 주의 깊게 조사하고 UART처럼 응답하는지 확인할 수 있지만, 색다른 방식으로 구성하면 시스템이 충돌하거나 중단될 수 있으므로 현대에서는 "통과"와 같은 자동 감지를 위해 맹목적으로 탐색합니다. "는 최후의 수단으로 간주되므로 가능하면 피해야 합니다.

ARM 하드웨어에서는이러한 기능은 사용하지 못할 수도 있습니다.ARM 하드웨어는 매우 다양하고(작은 Raspberry Pi Zero부터 다수의 PCIe 슬롯이 있는 다중 프로세서 서버 시스템까지) 시스템 버스 아키텍처가 다르기 때문에 감지를 자동화하려는 노력은 소용이 없습니다. 대신, Linux를 새로운 ARM 시스템 유형으로 포팅할 때 첫 번째 작업 중 하나는 시스템에 어떤 하드웨어 요소가 있는지, 해당 요소가 프로세서 주소 공간에 있는지, 어떤 드라이버가 사용되는지를 커널에 알려주는 장치 트리 설명을 작성하는 것입니다. 각각을 제어하십시오.

만약에시스템에는 설계에 버스 자동 감지가 포함되어 있으며 장치 트리 설명에는 해당 버스에 대한 버스 컨트롤러만 설명하면 해당 버스 컨트롤러 드라이버가 해당 버스의 나머지 부분을 자동으로 감지할 수 있습니다.

예를 들어 Raspberry Pi의 직렬 포트를 식별하려면 먼저 하드웨어 설명서를 검토해야 합니다. RasPi는 Linux용으로 특별히 개발되었으므로 장치 트리 설명이 이미 존재합니다. 하지만 처음부터 시작한다고 가정해 보겠습니다.

Linux를 새로운 ARM 하드웨어 플랫폼으로 포팅할 때 하드웨어 데이터시트부터 시작합니다.RasPi에게는 그게 전부입니다.

8페이지에서는 "미니 UART"와 해당 레지스터 주소에 대한 첫 번째 언급을 찾을 수 있습니다. 8250 호환 UART에 익숙하다면 레지스터 레이아웃이 익숙해 보일 것입니다. 그러나 미니 UART에 대해 자세히 설명하는 10페이지를 계속 읽어보세요. 그것은 말한다:

구현된 UART는 16650 호환 UART는 아니지만 처음 8개의 제어 및 상태 레지스터는 가능한 한 16550 UART와 유사하게 배치됩니다.

16550은 원래 8250 PC UART의 후속 제품이며 이전 버전과 호환됩니다. 아하! 이 UART는 CONFIG_SERIAL_8250PC 직렬 포트 드라이버와 유사한 Linux 드라이버에 의해 구동될 수 있는 것으로 보입니다 . 따라서 UART는 ttyS0Linux PC 직렬 포트 드라이버가 수행하는 작업이므로 기본 이름을 갖게 됩니다.

UART에 대한 또 다른 설명은 135페이지에서 시작됩니다.

BCM2835 장치에는 2개의 UART가 있습니다. 미니 UART 및 PL011 UART. 이 섹션에서는 PL011 UART를 소개합니다. Mini UART에 대한 자세한 소개는 2.2 Mini UART를 참고하시기 바랍니다.

PL011 UART는 범용 비동기식 수신기/송신기입니다. 이는 ARM UART(PL011) 구현입니다.

따라서 미니 UART에 대해 설명했습니다. 이 설명은 다른 UART(예: "PL011 UART" 또는 "ARM UART")에 적용됩니다. 즉, 이 유형의 UART는 ARM 설계에만 적용됩니다.

Google에서 "PL011 UART Linux"를 검색하거나 직접 검색할 수 있습니다.drivers/tty/serial/KconfigLinux 소스 패키지의 파일"PL011"의 경우.

당신은 발견 할 것이다Linux에는 이미 커널 구성 항목으로 드라이버가 있습니다.CONFIG_SERIAL_AMBA_PL011. 다음 구성 옵션CONFIG_SERIAL_AMBA_PL011_CONSOLEPL011 UART를 시스템 콘솔로 사용할 수 있으며 구성 옵션 설명에서 부팅 매개변수가 임을 알려줍니다 console=ttyAMA0. 이제 별도의 작업을 하지 않고도 이 UART의 기본 Linux 이름을 알 수 있습니다.실제 UART 드라이버의 소스 코드를 읽어보세요.

하드웨어 데이터시트의 137페이지에는 RasPi에 대한 장치 트리 설명을 처음부터 작성하는 경우 필요한 PL011 UART의 기본 주소가 식별되어 있습니다.

그래서라즈베리 그 자체UART를 ttyS0합계로 처리합니다 ttyAMA0. 그러나 RasPi의 콘솔 출력을 보기 위해 USB-직렬(3.3v) 케이블을 다른 컴퓨터에 연결하는 경우 직렬 끝을 RasPi의 해당 GPIO 핀에 연결하고 USB 끝을 다른 컴퓨터에 연결하면,다른 컴퓨터볼 것이다USB-직렬 포트 어댑터또는 (특정 USB-직렬 어댑터 유형에 따라) 다른 컴퓨터에서도 Linux를 실행하는 경우 ttyACM0.ttyUSB0

간단한 USB 케이블을 사용하여 직렬 콘솔에 액세스할 수 있도록 USB-직렬 어댑터 칩이 사용자 정의 보드에 통합된 경우 상황은 동일합니다. 콘솔을 보는 데 사용되는 다른 컴퓨터에서 장치를 볼 수 있습니다 ttyACM0. USB 추상 제어 모델을 지원한다고 주장하는 USB 직렬 장치를 봅니다.

그러나 ARM 장치 자체는 자체 UART 중 하나를 사용하여 변환기 칩의 직렬 측에 연결합니다. ARM 장치 측의 직렬 장치 이름은 ARM 측에서 사용되는 UART에 의해 결정되며,아니요USB를 통해 칩의 직렬 포트를 직렬 포트로 변환합니다.

관련 정보