Androidkerneldriversbaseplatform.c 에 있는 소스중에
int platform_driver_register(struct platform_driver *drv)
라는 함수가 있습니다.
이 함수가 하는일은 대략 보니...
platform driver 구조체와 device driver의 type-safe를 위해서, probe 및 remove, shutdown 등의 함수를
매칭(?) 시켜주는 역할을 하는 것 같은데요.
여기서 질문이 있습니다.
int platform_driver_register(struct platform_driver *drv)
{
drv->driver.bus = &platform_bus_type;
if (drv->probe)
drv->driver.probe = platform_drv_probe;
:
:
:
return driver_register(&drv->driver);
}
에서, 굳이
drv -> driver.probe 에
platform_drv_probe를 매칭 시켜주는 이유를 모르겠습니다.
drv->drver.probe = drv->probe 로 매칭 시켜주면 되는일 아닌지요?
음, 굳이 platform_drv_probe로 들어가서 container_of 함수까지 꺼내써야 되는 이유를 모르겠습니다.
혹시 알고 계신분 있으시면 알려주셨으면 감사하겠습니다.
매번 여기 회원님들께서 친절히 답변을 달아주셔서, 정말 감사하고 있습니다.
platform_driver_register() 에서 왜 drv -> driver.probe 에 platform_drv_probe를 매칭 시켜주는 이유를 모르겠습니다.
drv->drver.probe = drv->probe 로 매칭 시켜주면 되는일 아닌지요?
A : 저도 kernel object 의 hierarchy 구조까지는 분석하지 못했습니다. 사실상 kernel object 내부를 분석한다는 것이나
마찮가지여서 엄두가 나지 않다군요.
개념위주로 설명드리겠습니다.
device / driver 는 kernel 이 외부와의 통로로 사용하기 위한 하나의 수단입니다.
kernel 은 platform-device/platform-driver 와 device/driver 를 구분하지 않고
무조건 device / driver 만을 생각합니다.
따라서, 이런 커널에게 platform-device / platform-driver 에서 사용할 함수들이 있다면, 이함수들을 사용해야할
kernel 에게 어떤 함수를 사용해야하는지를 알려주기 위한 어떤 방법이 필요합니다.
kernel 은 platform-device / platform-driver 라는 구조는 모르기 때문입니다.
즉, 이 통로 역할을 하는 것이 device/driver 구조입니다.
결국, platform_device_add() / platform_driver_register() 등의 내부에는 device_add() / driver_register() 함수가 있는데
이것은 kernel object 와의 interface 를 담당하여 kernel 이 device/driver 계층을 통하여 platform-device/platform-driver 함수들을
이상없이 Call 하게 되는 것입니다.
이상의 개념설명을 바탕으로 platform.c 의 platform_drv_probe() 함수의 소스코드를 보시면
device 에서 platform-device 를 찾아내고 driver 에서 platform-driver 를 찾아낸 후에
결국에는 찾아낸 platform-driver 의 probe() 함수를 호출하고 그 함수의 매개인자로 찾아진 platform-device 를 넘겨주고 있는 것을
알 수 있습니다.
정리하면, kernel object 와 platform-device/platform-driver 간의 정형화된
하나의 수단(;정형화된 interface function between kernel and platform-device/platformdriver )이라고 생각하면 됩니다.