웹캠 복합 가젯을 커널 2.6.37에서 2.6.32로 포팅하려고 합니다. 이 버전용으로만 컴파일되는 다른 드라이버와 SDK에 의존하기 때문에 이에 대한 선택의 여지가 없습니다.
내 생각은 몇 가지 사소한 변경을 통해 이더넷 장치 기능을 모방하고 빠르게 작동하도록 하고 최소한 제대로 로드한 다음 비디오 스트리밍 기능 작업에 시간을 투자하는 것이었습니다.
-1 장치의 리소스가 사용 중이기 때문에 새 드라이버를 insmod로 설정할 수 없기 때문에 매우 빠르게 벽돌 벽에 부딪혔습니다.
나는 printk를 사용하여 더 깊이 파고들어 무슨 일이 일어나고 있는지 알아내려고 노력했습니다.
주요 초기화는 다음과 같이 진행되는 것 같습니다
module_init(webcam_init)
webcam_init()
usb_composite_register(&webcam_driver)
usb_gadget_register_driver(&composite_driver)
해당 기능은 다음과 같이 정의됩니다.
static struct usb_composite_driver webcam_driver = {
.name = "g_webcam",
.dev = &webcam_device_descriptor,
.strings = webcam_device_strings,
.bind = webcam_bind,
.unbind = webcam_unbind,
};
static int __init
webcam_init(void)
{
return usb_composite_register(&webcam_driver);
}
int __init usb_composite_register(struct usb_composite_driver *driver)
{
if (!driver || !driver->dev || !driver->bind || composite)
return -EINVAL;
if (!driver->name)
driver->name = "composite";
composite_driver.function = (char *) driver->name;
composite_driver.driver.name = driver->name;
composite = driver;
return usb_gadget_register_driver(&composite_driver);
}
usb_gadget_register_driver 매뉴얼 페이지는 이것을 보여줍니다
기본 USB 컨트롤러 드라이버에 드라이버에 대해 알리려면 가젯 드라이버의 모듈 초기화 함수에서 이를 호출하세요. 이 등록 호출이 반환되기 전에 드라이버의 바인딩 기능이 호출되어 가젯에 바인딩됩니다. 바인드 기능은 init 섹션에 있을 것으로 예상됩니다. 이 함수는 절전 모드가 가능한 컨텍스트에서 호출되어야 합니다.
나는 usb_gadget_register_driver가 둘 다 정의되어 있는 웹캠_bind의 complex_bind에 매핑될 것으로 예상합니다. 불행하게도 두 기능 모두의 printks는 dmesg에 표시되지 않으므로 여기에 뭔가 빠졌다고 가정합니다.
usb_gadget_register_driver
g_webcam.mod.c에 나타나서 어딘가에 매핑되어 있다고 알려주는데, 그 장소가 어디에 있는지 알 수 없습니다!