![구조 멤버 필드를 개별적으로 초기화할 수 없는 이유는 무엇입니까? ! (USB 장치 드라이버에서) [닫음]](https://linux55.com/image/142381/%EA%B5%AC%EC%A1%B0%20%EB%A9%A4%EB%B2%84%20%ED%95%84%EB%93%9C%EB%A5%BC%20%EA%B0%9C%EB%B3%84%EC%A0%81%EC%9C%BC%EB%A1%9C%20%EC%B4%88%EA%B8%B0%ED%99%94%ED%95%A0%20%EC%88%98%20%EC%97%86%EB%8A%94%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F%20!%20(USB%20%EC%9E%A5%EC%B9%98%20%EB%93%9C%EB%9D%BC%EC%9D%B4%EB%B2%84%EC%97%90%EC%84%9C)%20%5B%EB%8B%AB%EC%9D%8C%5D.png)
USB 장치 드라이버를 구현하려고 합니다. 나는 썼다
#include<linux/module.h>
#include<linux/kernel.h>
#include<linux/usb.h>
struct usb_device_id IDtable[]={
{USB_DEVICE(0x067b,0x2303)},
{}
};
int ttlprobe(struct usb_interface *interface, const struct usb_device_id *id)
{
printk(KERN_INFO "Probed (%04X:%04X) device\n", id->idVendor, id->idProduct);
printk(KERN_INFO "num_altsetting : %d\n",interface->num_altsetting);
return 0;
}
void ttldisconnect(struct usb_interface *interface)
{
printk(KERN_INFO "Device disconnected \n");
}
struct usb_driver busb;
busb.name="guru";
busb.id_table=IDtable;
busb.probe=ttlprobe(&busb,IDtable);
busb.disconnect=ttldisconnect;
int init_module(void){
printk(KERN_ALERT "intimodule exec Trying to register to USB CORE \n");
int k=usb_register(&busb);
printk(KERN_INFO "retuern value of usb_register_driver : %d\n",k);
pr_info("name = %s\n", THIS_MODULE->name);
pr_info("name = %s\n", KBUILD_MODNAME);
return k;
}
void cleanup_module(void){
printk(KERN_ALERT "Trying to de-register to USB CORE");
return usb_deregister(&busb);
}
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Anil Kumar Pugalia <email_at_sarika-pugs_dot_com>");
MODULE_DESCRIPTION("USB Pen Registration Driver");
출력은 다음과 같습니다.
make -C /lib/modules/4.10.0-28-generic/build M=/home/guru/Desktop/Linuxx/Drivers/USB/check modules
make[1]: Entering directory '/usr/src/linux-headers-4.10.0-28-generic'
CC [M] /home/guru/Desktop/Linuxx/Drivers/USB/check/chc.o
/home/guru/Desktop/Linuxx/Drivers/USB/check/chc.c:20:5: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘.’ token
busb.name="guru";
^
/home/guru/Desktop/Linuxx/Drivers/USB/check/chc.c:21:5: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘.’ token
busb.id_table=IDtable;
^
/home/guru/Desktop/Linuxx/Drivers/USB/check/chc.c:22:5: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘.’ token
busb.probe=ttlprobe(&busb,IDtable);
^
/home/guru/Desktop/Linuxx/Drivers/USB/check/chc.c:23:5: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘.’ token
busb.disconnect=ttldisconnect;
^
/home/guru/Desktop/Linuxx/Drivers/USB/check/chc.c: In function ‘init_module’:
/home/guru/Desktop/Linuxx/Drivers/USB/check/chc.c:27:1: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]
int k=usb_register(&busb);
^
scripts/Makefile.build:301: recipe for target '/home/guru/Desktop/Linuxx/Drivers/USB/check/chc.o' failed
make[2]: *** [/home/guru/Desktop/Linuxx/Drivers/USB/check/chc.o] Error 1
Makefile:1524: recipe for target '_module_/home/guru/Desktop/Linuxx/Drivers/USB/check' failed
make[1]: *** [_module_/home/guru/Desktop/Linuxx/Drivers/USB/check] Error 2
make[1]: Leaving directory '/usr/src/linux-headers-4.10.0-28-generic'
Makefile:4: recipe for target 'all' failed
make: *** [all] Error 2
이것이 유효할 때,
#include<linux/module.h>
#include<linux/kernel.h>
#include<linux/usb.h>
struct usb_device_id IDtable[]={ // Defined in "/include/linux/mod_devicetable.h" which is *included* into "linux/usb.h"
{USB_DEVICE(0x067b,0x2303)},
{}
};
int ttlprobe(struct usb_interface *interface, const struct usb_device_id *id)
{
printk(KERN_INFO "Probed (%04X:%04X) device\n", id->idVendor, id->idProduct);
printk(KERN_INFO "num_altsetting : %d\n",interface->num_altsetting);
return 0;
}
void ttldisconnect(struct usb_interface *interface)
{
printk(KERN_INFO "Device disconnected \n");
}
struct usb_driver DetectingUSB={ // Defined in /include/linux/usb.h
.name="USBtoTTL",
.id_table=IDtable,
.probe=ttlprobe,
.disconnect=ttldisconnect,
};
int init_module(void){
printk(KERN_ALERT "intimodule exec Trying to register to USB CORE \n");
int k=usb_register(&DetectingUSB);
printk(KERN_INFO "retuern value of usb_register_driver : %d\n",k);
pr_info("name = %s\n", THIS_MODULE->name);
pr_info("name = %s\n", KBUILD_MODNAME);
return k;
}
void cleanup_module(void){
printk(KERN_ALERT "Trying to de-register to USB CORE");
return usb_deregister(&DetectingUSB);
}
MODULE_LICENSE("GPL");
멤버 필드를 개별적으로 초기화할 수 없는 이유는 무엇입니까? !
답변1
함수 외부에서는 이 방법으로 필드 멤버를 초기화할 수 없습니다. 정말로 이 작업을 수행하려면 초기화 코드를 init_module
함수 내부로 옮겨야 합니다.
또한 귀하의
busb.probe=ttlprobe(&busb,IDtable);
함수에 대한 예상 포인터 대신에 ttlprobe(&busb, IDtable)
결과 를 할당합니다 .probe
초기화 블록을 사용하십시오. 이것이 여기서 예상되는 것입니다.