웹캠 복합 가젯을 커널 2.6.37에서 2.6.32로 포팅하려고 합니다. 나는 이 버전용으로만 컴파일된 다른 드라이버와 SDK에 의존하기 때문에 이에 대해 선택의 여지가 없습니다.
내 생각은 이더넷 가젯의 기능을 에뮬레이트하고, 약간의 변경을 가해 신속하게 작동하고, 최소한 올바르게 로드한 다음, 비디오 스트리밍 기능 작업에 시간을 투자하는 것이었습니다.
-1 장치 리소스가 사용 중이어서 새 드라이버를 수정할 수 없어서 문제가 빨리 발생했습니다.
나는 더 깊이 파고들어 무슨 일이 일어나고 있는지 알아내기 위해 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가 complex_bind 또는 웹캠_bind에 매핑될 것으로 예상했는데 둘 다 정의되었습니다. 불행하게도 이 두 함수의 printks는 dmesg에 전혀 표시되지 않으므로 여기에 뭔가 빠진 것 같습니다.
usb_gadget_register_driver
g_webcam.mod.c에 나타나며 어딘가에 매핑되어 있다고 알려주지만 그 장소에 갈 수 없습니다!