리눅스 커널에 대한 Q&A 게시판 입니다. (비밀글 체크는 꼭 필요한 경우에만)
kernel device driver probe 관련 질문이 있습니다!
작성자
두번하고싶어요
작성일
2020-04-17 15:14
조회
487
안녕하세요.
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 못하도록 되어있는 이유는 뭔지 알고싶습니다.
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 못하도록 되어있는 이유는 뭔지 알고싶습니다.
디바이스 드라이버의 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";
};
결국 같은 hw를 다루는 디바이스 드라이버의 초기화는 한 번만 되야 겠죠.
-> 같은 HW module을 쓰더라도 회로구성이 다르고, 구분된 variable들에 대해서는 dtsi에서 파싱해와서 진행한다고 하면
동일한 driver에서 probe를 여러번 타도 문제가 되지 않을것 같아서요.
지금 개발하고 있는 driver에서도 독립적은 hw variable들에 대해서는 dtsi를 통해서 parsing후에 진행하도록 소스가 구성되어 있어서요.
여러번 probe할 수 잇는 방법이 있다면,
몇번째 probe인지를 구분해서 피쳐링해서 각각 다른 HW variable을 처리한다면
똑같은 소스파일을 2번 쓰는것 보다 관리측면이나 메모리 면에서도 좋을 것 같은데요.
혹시 이렇게 처리가 가능할까 해서 질문드립니다.
버스(bus) 종류에 따라 멀티 probe를 사용해야 편리한 경우가 있습니다.
예를 들어 I2c 버스는 여러개의 i2c slave 장치들이 연결되는데,
온도 센서를 예를 들면 한 종류의 다수 개의 온도 센서들에 대한 주소(i2c hw addr)들을 지정(hw로 설정)하고
해당 온도 센서 드라이버 코드에서 멀티 probe 시마다 디바이스의 인스턴스를 추가 할당하여 관리합니다.
감사합니다.
답변해주셔서 감사합니다.