Q&A 게시판

kernel device driver probe 관련 질문이 있습니다!

작성자
두번하고싶어요
작성일
2020-04-17 15:14
조회
181
안녕하세요.

kernel device driver, probe 관련해서 질문이 있어서 글 적습니다.

현재 device driver는 소스파일내에 module_init()이 불리면서 i2c_driver구조체가 initcall6 에 등록이 되고,
등록된 구조체의 probe function이 i2c-core-base.c 파일의 아래부분에서 호출되는걸로 알고있는데요.

/*
* When there are no more users of probe(),
* rename probe_new to probe.
*/
if (driver->probe_new)
status = driver->probe_new(client);
else if (driver->probe)
status = driver->probe(client,
i2c_match_id(driver->id_table, client));
else
status = -EINVAL;

이런 구조 때문에 한개의 driver device의 probe는 한번밖에 호출될 수 없는걸로 이해를 했는데요.

똑같은 device driver source 파일을 여러개의 hw module을 위해서 여러번 probe 못하도록 되어있는 이유는 뭔지 알고싶습니다.
전체 5
  • 2020-04-18 14:05
    안녕하세요?

    디바이스 드라이버의 probe가 하는 역할을 생각해보시면 알 수 있습니다.
    probe에서는 보통 특정 hw의 초기화 및 등록 작업들을 수행합니다.

    그런데 사용 중이던 hw에 대해 같은 hw가 추가되었다고, 다시 초기화되면 안되잖아요?
    결국 같은 hw를 다루는 디바이스 드라이버의 초기화는 한 번만 되야 겠죠.

    단 probe가 2 번 이상되는 경우도 있습니다.
    예를 들어 2 개의 i2c bus controller를 가진 hw는 2 개의 각각 다른 레지스터들을 사용합니다.
    이런 경우는 당연하게도 두 번 probe하여 사용합니다. 당연히 각각의 다른 레지스터를 초기화하여 사용합니다.

    다음 예를 보여드립니다.

    arch/arm64/boot/dts/broadcom/northstart2/ns2.dtsi

    i2c0: i2c@66080000 {
    compatible = "brcm,iproc-i2c";
    reg = <0x66080000 0x100>;
    #address-cells = <1>;
    #size-cells = <0>;
    interrupts = ;
    clock-frequency = <100000>;
    status = "disabled";
    };

    i2c1: i2c@660b0000 {
    compatible = "brcm,iproc-i2c";
    reg = <0x660b0000 0x100>;
    #address-cells = <1>;
    #size-cells = <0>;
    interrupts = ;
    clock-frequency = <100000>;
    status = "disabled";
    };

    • 2020-04-21 16:34
      그런데 사용 중이던 hw에 대해 같은 hw가 추가되었다고, 다시 초기화되면 안되잖아요?
      결국 같은 hw를 다루는 디바이스 드라이버의 초기화는 한 번만 되야 겠죠.
      -> 같은 HW module을 쓰더라도 회로구성이 다르고, 구분된 variable들에 대해서는 dtsi에서 파싱해와서 진행한다고 하면
      동일한 driver에서 probe를 여러번 타도 문제가 되지 않을것 같아서요.

  • 2020-04-21 16:23
    답변 감사합니다!

    지금 개발하고 있는 driver에서도 독립적은 hw variable들에 대해서는 dtsi를 통해서 parsing후에 진행하도록 소스가 구성되어 있어서요.

    여러번 probe할 수 잇는 방법이 있다면,
    몇번째 probe인지를 구분해서 피쳐링해서 각각 다른 HW variable을 처리한다면
    똑같은 소스파일을 2번 쓰는것 보다 관리측면이나 메모리 면에서도 좋을 것 같은데요.

    혹시 이렇게 처리가 가능할까 해서 질문드립니다.

  • 2020-06-23 08:28
    드라이버의 멀티 probe는 당연히 가능합니다.

    버스(bus) 종류에 따라 멀티 probe를 사용해야 편리한 경우가 있습니다.

    예를 들어 I2c 버스는 여러개의 i2c slave 장치들이 연결되는데,
    온도 센서를 예를 들면 한 종류의 다수 개의 온도 센서들에 대한 주소(i2c hw addr)들을 지정(hw로 설정)하고
    해당 온도 센서 드라이버 코드에서 멀티 probe 시마다 디바이스의 인스턴스를 추가 할당하여 관리합니다.

    감사합니다.

  • 2020-07-23 18:35
    module_init에서 i2c_add_driver 자체를 원하는 세팅맞춰서 해주면 되는거네요.
    답변해주셔서 감사합니다.