[Kernel] Device-tree probe Platform Driver
Linux

[Kernel] Device-tree probe Platform Driver

테스트 환경

  • Ubuntu 22.04 (Kernel v6.1)
  • SK-AM62A-LP

본 글은 플랫폼 디바이스가 디바이스 트리 메커니즘과 상호 작용하는 방법을 설명한다. 디바이스 트리는 특정 시스템의 하드웨어 구성에 대한 설명서와 같다. 커널은 디바이스 트리를 구문분석하고 이를 통해 실제로 실행중인 시스템에 대해 알 수 있다. 

 

- /driver/base/platform.c::platform_match() 함수에 probe()를 호출하는 4가지 조건이 있다. 

 

  1. OF(open firmware,즉, devicetree) style 매칭으로 devicetree의 compatible과 of_device_id의 compatible이 매칭될 때 probe()가 호출된다.
  2. ACPI를 이용하는 방법인데, 실무에서 잘 쓰이지 않는다. 여기서는 ACPI에 대한 부분은 설명하지 않는다.
  3. ID table을 이용한 매칭으로 XXX_device_id의 name과 platform_device의 name이 같으면 호출된다.
  4. platform_driver 이름과 platform_device 이름이 같을 때 probe()가 호출된다. 

플랫폼 디바이스는 struct platform_device로 정의되며 <linux/platform_device.h>에서 찾을 수 있다. 이 장치들은 가상 "플랫폼 버스"에 연결된 것으로 간주된다. 따라서 플랫폼 디바이스의 드라이버는 플랫폼 버스에 등록해야 한다. 이 등록은 platform_driver 구조체를 통해 수행된다.

 

디바이스 트리에 플랫폼 디바이스가 포함되어있는 경우 해당 디바이스가 인스턴스화되고 드라이버와 일치된다.
디바이스의 probe() 함수에서 사용할 수 있다. 드라이버는 디바이스가 하드 코딩 된 플랫폼 디바이스 정의이거나 디바이스 트리에서 인스턴스화되었다는 것을 알 필요가 없다.

 

디바이스 트리와 함께 사용하기 위해 플랫폼 디바이스에 식별자가 필요하다. 커널은 이러한 목적으로 사용할 수 있는 of_device_id 구조체를 제공한다.

linux/mod_devicetable.h

devicetree에 platform_device를 작성해서 호출하는 방식. devicetree의 compatible 속성과 driver 소스에 작성된 of_device_id의 .compatible의 값이 같아야 한다! 

플랫폼 드라이버가 선언되면 드라이버 하위 구조에 이 테이블에 대한 포인터를 저장한다.

 

드라이버는 디바이스 트리가 인스턴스화 될 때 모듈의 자동 로드를 활성화하기 위해 ID 테이블을 장치 테이블로 선언 할 수도 있다.

MODULE_DEVICE_TABLE(of, rorosi_of_match);

 

MODULE_DEVICE_TABLE 매크로는 사용자 공간에서 이 드라이버가 제어할 수 있는 장치를 파악하는 데 필요하다..

컴파일하는 동안 빌드 프로세스는 모든 드라이버에서 이 정보를 추출하여 장치 테이블을 준비하게 된다.

장치를 삽입하면 커널이 장치 테이블을 참조하고 장치 테이블과 일치하는 항목을 찾으면,

추가된 디바이스의 디바이스/벤더 ID를 입력하면 모듈이 로드되어 초기화된다.

 

module_platform_driver 매크로를 사용하면 커널은 모듈이 로드될 때 플랫폼 장치 드라이버를 자동으로 등록하고 드라이버 이름을 장치 트리의 장치 노드와 일치시킵니다. 일치가 성공하면 커널은 드라이버 구조에 지정된 장치 감지 기능을 호출하여 장치를 초기화합니다. 모듈이 언로드되면 커널은 드라이버 구조에 지정된 장치 등록 취소 함수를 자동으로 호출하여 장치 등록을 취소합니다.

linux/platform_device.h
include/linux/device/driver.h

 

소스를 확인해 보면 module_platform_driver가 최종적으로 module_init를 호출한 코드를 보면 알 수 있다. 그리고 module_init뿐만 아니라 platform_driver_registerand 및 platform_driver_unregister 도 호출하고 있는데 두 함수의 기능은 플랫폼 드라이버를 등록하고 제거한다.

 

driver source:

device-tree:

arch/arm64/boot/dts/ti/k3-am62a-main.dtsi

 

위와 같이 of_device_id.compatible과 node.compatible이 같으면 probe가 호출된다.

위에서 보인 platform_device와 platform_driver는 각각 아래의 경로에서 확인이 가능하다. 

  • /sys/bus/platform/devices

  • /sys/bus/platform/drivers

참고 :

https://coder-in-war.tistory.com/entry/Linux-Kernel-23-Platform-Device-Driver

 

[ Linux Kernel ] 23. Platform Device & Driver

23. Platform Device & Driver 플랫폼디바이스는 하드웨어에 내장되어 있기 때문에 hot-pluggable이 아니다. 이 장치를 위한 드라이버는 장치의 존재를 확인할 필요가 없고 그냥 작동시키고(전원을 켜고) 장

coder-in-war.tistory.com

https://yohda.tistory.com/entry/LINUXKERNEL-platform-driver-probe%EB%A5%BC-%ED%98%B8%EC%B6%9C%ED%95%98%EB%8A%94-4%EA%B0%80%EC%A7%80-%EB%B0%A9%EB%B2%95

 

[리눅스 커널] platform driver probe를 호출하는 4가지 방법.

글의 참고 - https://docs.kernel.org/driver-api/driver-model/platform.html - https://linux-kernel-labs.github.io/refs/heads/master/labs/device_model.html#overview 글의 전제 - 밑줄로 작성된 글은 강조 표시를 의미한다. - 그림 출처

yohda.tistory.com

 

'Linux' 카테고리의 다른 글

v4l2loopback  (0) 2024.01.21
Device Tree  (0) 2023.12.19
expect 명령어  (0) 2023.11.25
ubuntu 네트워크 장치 이름 변경  (0) 2023.07.16
PCIe ASPM Error  (0) 2023.07.02