드라이버
2021.03.20 19:06

플랫폼 디바이스 및 디바이스 트리

조회 수 6505 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

플랫폼 디바이스가 디바이스 트리 메커니즘과 상호 작용하는 방법을 설명한다.

본질적으로 디바이스 트리는 특정 시스템의 하드웨어 구성에 대한 설명서와 같다. 부트 로더는 r2를 통해 DTB (디바이스 트리 blob)주소를 커널로 전달한다. 커널은 디바이스 트리를 구문분석하고 이를 통해 실제로 실행중인 시스템에 대해 알 수 있다. 즉, 디바이스 트리는 시스템 간의 차이를 부팅 데이터로 추상화하고 일반 커널이 훨씬 더 다양한 하드웨어에서 실행될 수 있도록 한다.

 

디바이스 트리 예제 일부 :

...
		apbx@80040000 {
			compatible = "simple-bus";
			#address-cells = <1>;
			#size-cells = <1>;
			reg = <0x80040000 0x40000>;
			ranges;
...
			auart0: serial@8006a000 {
				compatible = "fsl,imx28-auart", "fsl,imx23-auart";
				reg = <0x8006a000 0x2000>;
				interrupts = <112>;
				dmas = <&dma_apbx 8>, <&dma_apbx 9>;
				dma-names = "rx", "tx";
				clocks = <&clks 45>;
				status = "disabled";
			};
...

디바이스 트리에 플랫폼 디바이스가 포함되어있는 경우 (디바이스 트리 컨텍스트에서 이러한 장치는 루트의 직접적인 자식이거나 "simple-bus"의 자식 노드) 해당 디바이스가 인스턴스화되고 드라이버와 일치된다. 메모리 매핑 된 I/O 및 인터럽트 리소스는 디바이스 트리 설명에서 마샬링되고 일반적인 방식으로 디바이스의 probe() 함수에서 사용할 수 있다. 드라이버는 디바이스가 하드 코딩 된 플랫폼 디바이스 정의이거나 디바이스 트리에서 인스턴스화되었다는 것을 알 필요가 없다.

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

static const struct of_device_id mxs_auart_dt_ids[] = {
	{
		.compatible = "fsl,imx28-auart",
		.data = (const void *)IMX28_AUART
	}, {
		.compatible = "fsl,imx23-auart",
		.data = (const void *)IMX23_AUART
	}, {
		.compatible = "alphascale,asm9260-auart",
		.data = (const void *)ASM9260_AUART
	}, { /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, mxs_auart_dt_ids);

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

static struct platform_driver mxs_auart_driver = {
	.probe = mxs_auart_probe,
	.remove = mxs_auart_remove,
	.driver = {
		.name = "mxs-auart",
		.of_match_table = mxs_auart_dt_ids,
	},
};

of_match_device()를 사용하면 mxs_auart_dt_ids 테이블에서 일치하는 항목을 가져올 수 있다.

static int my_probe(struct platform_device *pdev)
{
  const struct of_device_id *of_id =
      of_match_device(mxs_auart_dt_ids, &pdev->dev);
  if (of_id) {
    /* Use of_id->data here */
    // [...]
  }
  // [...]
}

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

MODULE_DEVICE_TABLE(of, mxs_auart_dt_ids);

드라이버가 디바이스 트리 코드에서 인스턴스화 된후 디바이스 트리에서 직접 정보를 가져올 수 있다.

이 경우 드라이버는 플랫폼 디바이스 dev.of_node 필드에서 device_node 포인터를 찾는다. 그런 다음 다양한 디바이스 트리 액세스 함수 (주로 of_get_property())를 사용하여 장치 트리에서 필요한 정보를 추출 할 수 있다.

static int imx_uart_probe(struct platform_device *pdev)
{
    struct device_node *np = pdev->dev.of_node;
    if (of_get_property(np, "rts-gpios", NULL))
		    ...
}

 몇가지 예제:

  • 클럭에 대한 참조 얻기

    • described by the clocks property
    s->clk = clk_get(&pdev->dev, NULL);
    
  • I/O 레지스터 리소스 얻기

    • described by the reg property
    r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
    
  • 인터럽트 얻기

    • described by the interrupts property
    s->irq = platform_get_irq(pdev, 0);
    
  • DMA 채널 얻기

    • described by the dmas property
    s->rx_dma_chan = dma_request_slave_channel(s->dev, "rx");
    s->tx_dma_chan = dma_request_slave_channel(s->dev, "tx");
    
  • 사용자 지정 속성 얻기

    struct device_node *np = pdev->dev.of_node;
    if (of_get_property(np, "fsl,uart-has-rtscts", NULL))
    

 

디바이스 트리 노드와 드라이버 간의 바인딩을 만들 수 있도록 올바른 이름을 지정하는 것이 중요하다. 이로써 정적 platform_device 선언이 포함 된 보드 파일들이 사라지고, 결국 커널에서 상용구 코드를 제거하는 동시에 커널을 더 유연하게 만들 수 있다.

TAG •

  1. 임베디드 리눅스 시스템에서 Flutter와 Wayland의 조합

    Date2025.08.21 Category그래픽스 Bymakersweb Views3285
    Read More
  2. OpenAMP 간단한 소개

    Date2024.09.21 Category통신 Bymakersweb Views3578
    Read More
  3. No Image

    Rockchip VOP

    Date2024.04.22 Category드라이버 Bymakersweb Views3531
    Read More
  4. No Image

    Raspberry Pi에서 I²C 그리고 Bit-bang (비트뱅)

    Date2023.08.27 Category통신 Bymakersweb Views4410
    Read More
  5. No Image

    Yocto 프로젝트 3.4 릴리스(honister) 이상 버전으로 마이그레이션 시 참고 사항

    Date2023.03.21 Category개발환경 Bymakersweb Views4640
    Read More
  6. Raspberry Pi 와 ATtiny85 간 I²C 통신

    Date2023.03.18 Category통신 Bymakersweb Views4263
    Read More
  7. 로직분석기와 함께 PulseView 를 사용해서 CAN 신호 캡쳐

    Date2023.03.16 Category통신 Bymakersweb Views3970
    Read More
  8. 임베디드 개발자를 위한 Hex,Bin,Dec 변환기 유틸

    Date2023.02.27 Category개발환경 Bymakersweb Views6235
    Read More
  9. ATtiny85 개발보드(HW-260)

    Date2023.01.02 Category개발환경 Bymakersweb Views4154
    Read More
  10. No Image

    플랫폼 디바이스 및 디바이스 트리

    Date2021.03.20 Category드라이버 Bymakersweb Views6505
    Read More
  11. Android 기기를 사용하여 Raspberry Pi SD 카드 작성 방법

    Date2020.08.01 CategorySBC Bymakersweb Views4860
    Read More
  12. No Image

    Raspberry Pi 의 프레임버퍼(Framebuffer)구성

    Date2020.05.15 CategorySBC Bymakersweb Views6282
    Read More
  13. 라즈베리파이2에서 RTOS기반 GPIO제어(LED)

    Date2020.04.21 CategorySBC Bymakersweb Views5398
    Read More
  14. POSIX를 지원하는 오픈소스 RTOS, RTEMS

    Date2020.04.15 Category운영체제 Bymakersweb Views5332
    Read More
  15. No Image

    라즈베리파이 부팅 가능한 sd카드 파티션 생성

    Date2020.04.15 Category운영체제 Bymakersweb Views5353
    Read More
  16. No Image

    플랫폼 디바이스 및 드라이버에 대해서

    Date2020.02.01 Category드라이버 Bymakersweb Views11698
    Read More
  17. No Image

    디바이스 트리(Device Tree, DT)

    Date2020.01.12 Category운영체제 Bymakersweb Views9825
    Read More
  18. RISC-V : 자유롭고 개방 된 RISC 명령어 세트 아키텍처

    Date2020.01.01 CategoryMCU Bymakersweb Views4583
    Read More
  19. 임베디드 비대칭 멀티 프로세싱(asymmetric multiprocessing) 시스템

    Date2019.12.31 Category운영체제 Bymakersweb Views4599
    Read More
  20. No Image

    임베디드 시스템에서 베어메탈(Bare metal) 이란?

    Date2019.12.11 Category펌웨어 Bymakersweb Views8495
    Read More
Board Pagination Prev 1 2 3 Next
/ 3