arm64 아키텍처의 장치 목록을 채우기 위해 장치 트리는 언제 구문 분석됩니까?

arm64 아키텍처의 장치 목록을 채우기 위해 장치 트리는 언제 구문 분석됩니까?

platform device이 질문은 내장 드라이버가 부팅 시 어떻게 초기화되는지 이해하려는 시도에서 나온 것입니다 .

저는 SoC(ARM + FPGA)에서 임베디드 Linux 배포판(Yocto)을 사용하고 있습니다. 장치 드라이버는 platform device플랫폼 장치로 설명되는 장치 트리에서 찾을 수 있는 IP 용으로 작성됩니다 . "호환" 속성은 C 드라이버와 일치하며 지금까지는 매우 좋습니다.

플랫폼 장치에 대한 커널 문서를 참조하세요.[1],

일반적으로 "호환" 속성을 가진 모든 노드는 일종의 장치를 나타내는 것으로 가정하며, 둘째, 트리 루트에 있는 모든 노드는 프로세서 버스에 직접 연결되거나 프로세서 버스에 연결될 수 없는 기타 장치라고 가정할 수 있습니다. 시스템에서 다른 방식으로 설명할 수 없습니다.각 노드에 대해 Linux는 platform_device를 할당하고 등록하며, 이는 차례로 platform_driver에 바인딩될 수 있습니다.

뿐만 아니라

2.4 장치 수

마더보드가 인식되고 초기 구성 데이터가 구문 분석되면 커널 초기화가 정상적으로 진행될 수 있습니다. [...] 이는 ARM의 machine_desc .init_early(), .init_irq() 및 .init_machine() 후크와 같은 시스템별 설정 후크가 호출되는 시간이기도 합니다.

[...]

DT 컨텍스트에서 가장 흥미로운 후크는 .init_machine()입니다. 이는 주로 플랫폼에 대한 데이터로 Linux 장치 모델을 채우는 일을 담당합니다.

궁극적으로 (Tegra 보드에 대한 문서 예를 따름)

.init_machine() 시간에 Tegra 보드 지원 코드는 이 DT를 확인하고 platform_devices를 생성할 노드를 결정해야 합니다.

물론, 조사 arch/arm[2init_machine] 장치 트리를 "보기"하는 기능을 찾을 수 있습니다 . 그러나 arm64 아키텍처에는 이 기능이 없습니다. machine_desc구조팔 활에만 적용됩니다..

소스 코드를 탐색하면서 장치 트리에서 setup_machine_fdt [에서 발생하는 이해하기 쉬운 작업 중 일부를 찾을 수 있었습니다.4early_dt_scan] 이것을 단 이라고 부른다.장치를 채우지 않는 것 같습니다.:

    /* Retrieve various information from the /chosen node */
    rc = of_scan_flat_dt(early_init_dt_scan_chosen, boot_command_line);

    /* Initialize {size,address}-cells info */
    of_scan_flat_dt(early_init_dt_scan_root, NULL);

    /* Setup memory, calling early_init_dt_add_memory_arch */
    of_scan_flat_dt(early_init_dt_scan_memory, NULL);

여기서 문제는 부트스트래핑 프로세스를 계속 따르면 , 및 결국 을 do_basic_setup호출 하게 된다는 것입니다 .driver initbus_initplatform_bus_initof_core_init

"devicetree"라는 kset을 생성하는 마지막 항목에 대한 희망이 있습니다. 하지만 여기서 트리가 실제로 구문 분석되는지는 이해할 수 없습니다.

그 후에 initcalls호출됩니다. 이는 드라이버 초기화가 발생한다는 것을 의미하지만 여기에 관련된 DT 구문 분석은 어떻습니까? "호환" 속성은 실제로 어디에 사용됩니까? 다시 문서에서 :

비결은 커널이 트리의 루트에서 시작하여 "호환 가능한" 속성을 가진 노드를 찾는 것입니다. 첫째, 일반적으로 "호환" 속성을 가진 모든 노드는 일종의 장치를 나타내는 것으로 가정하고, 둘째, 트리 루트에 있는 모든 노드는 프로세서 버스에 직접 연결되거나 기타 장치라고 가정할 수 있습니다. 다른 방법으로는 설명할 수 없는 시스템 장치입니다. 각 노드에 대해Linux는 platform_device를 할당하고 등록하며, 이는 platform_drive에 바인딩될 수 있습니다.

"플랫폼 드라이버에 바인딩" 부분은 드라이버 코드에 정의된 initcall에 의해 수행됩니다. 제가 이해하지 못하는 것은 "플랫폼 장치 할당 및 등록"입니다.

[1]Linux 및 장치 트리

[2]로봇팔 초기화

[삼]bootlin에서 machine_desc 검색

[4]setup_machine_fdt arm64

관련 정보