기존 이솝 임베디드 포럼의 지식인 서비스가 게시판 형태로 변경되었습니다.
안녕하세요 ? 한가지 여쭈보려고 합니다.
Device driver를 보면, 모두 probe()함수가 있습니다.
이 함수가 “언제 호출되는지 ? (시점), 또는 어떤 경우가 만족될 때 호출되는지 ? (조건)”을 알고 싶습니다.
먼저, 제가 알고 있는 두 가지의 경우를 말씀 드리고, 세 번째 경우에 대해서 문의를 드리고자 합니다.
#.첫째 경우: platform driver의 경우
struct platform_device AAA = {
. name = “ BBB “
}
struct platform_driver CCC = {
.driver = {
.name = “BBB”
}
}
platform_device_register()함수를 이용하여 AAA(device)구조체를 등록하고,
platform_driver_register()함수를 이용하여 BBB(driver)구조체를 등록한 다음에
두 구조체의 .name (여기서는 BBB)이 동일하면, platform_driver 구조체 멤버인 probe()함수가 호출됩니다.
#.둘째 경우: I2C, SPI와 같은 BUS 로 통신하는 device driver 경우
struct i2c_board_info DDD= {
I2C_BOARD_INFO("EEE", ),
};
static struct i2c_driver FFF = {
.driver = {
.name = "EEE",
},
};
i2c_register_board_info()함수를 이용하여 DDD구조체를 등록하고,
i2c_add_driver()함수를 이용하여 FFF 구조체를 등록한 다음에 두 구조체의 .name (여기서는 EEE)이 동일하면,
i2c_driver 구조체 멤버인 probe()함수가 호출됩니다.
# 셋째 경우: USB, PCI, SDIO, 기타 등등의 BUS로 통신하는 device driver의 경우
이 경우(유형)의 driver의 구조(체)는 위의 둘째 경우와 유사하며,
BUS마다 정형화된 포멧(driver 구조체와 그 등록함수)이 있더군요…
그러나, 이 경우의 device의 구조(체) 유형은 제 판단으로는 정형화된 포멧이 없는 것 같습니다.
BUS유형의 driver이면서도 위의 둘째 경우와는 다른 것 같습니다.
즉, 위의 첫째 경우와 둘째 경우에는
device와 driver 구조체 각각에 존재하는 .name 멤버가 같아야 probe()함수가 호출이 되는데,
셋째 경우처럼 ‘device 구조체’가 등록이 안 되는 구조라면, .name멤버를 이용하여, device<->driver 상호간의 쌍(짝)을 검색하지는 못할 것으로 추측됩니다.
그렇게 되면, 첫째, 둘째의 방법(메커니즘)으로는 probe()함수의 호출이 불가능할 것 같습니다.
그렇다면, 어떤 메커니즘, 어떤 방법에 의해서(또는 어떤 시점에서) probe()함수가 호출이 되는지요 ?
그리고, I2C,SPI BUS경우는, device를 표현하는 정형화된 포멧(=struct i2c_board_info & i2c_register_board_info()함수) 있는데, USB,PCI,SDIO 등의 대부분 BUS는 device를 표현하는 정형화된 포멧이 왜 없는지요 ?
(만약, 제가 잘못 알고 있고, 실제로 있다면 그것을 알려 주시면 감사하겠습니다.)
lxr 사이트 들어갔더니....오늘 접속 안되네요...ㅠ.ㅠ
일단, 대부분의 bus관련은 각 버스마다 고유의 device 형태를 가지거나, 아니면 그대로 링크드 리스트에 붙이는 함수가 있습니다(e.g. i2c).
제 기억으로는 각 bus 고유의 device는 항상 struct device를 가지게 되며, 이 녀석을 이용하는 것으로 기억이 납니다(지금 검색할 상황이 아니라서 추정과 기억에 의존합니다).
정형화된 format은 struct device 만 보시면 될 듯 하며, 나머지 부분은 구현하기 편한대로 했다라고 밖엔 생각이 안드네요...^^, 커널 메인테이너들 주관이 들어가 있을테니깐요....ㅎ