源码在/drivers/input/touchscreen/usbtouchscreen.c中
static int __init usbtouch_init(void) //入口函数
{
return usb_register(&usbtouch_driver); //注册usb触摸屏驱动
}
module_init(usbtouch_init);
看usbtouch_driver的定义
static struct usb_driver usbtouch_driver = {
.name = "usbtouchscreen",
.probe = usbtouch_probe, //usb触摸屏探测到
.disconnect = usbtouch_disconnect,
.suspend = usbtouch_suspend,
.resume = usbtouch_resume,
.reset_resume = usbtouch_reset_resume,
.id_table = usbtouch_devices,
.supports_autosuspend = 1,
};
当有设备匹配的时候会调用probe方法,也就是usbtouch_probe
在static const struct usb_device_id usbtouch_devices[]中定义了的usb设备插入就会匹配并触发probe
可以用宏USB_DEVICE简化设置usb设备id信息,如下:
{USB_DEVICE(0x3823, 0x0001), .driver_info = DEVTYPE_EGALAX},
driver_info是驱动类型,有一下选择
enum {
DEVTYPE_IGNORE = -1,
DEVTYPE_EGALAX,
DEVTYPE_PANJIT,
DEVTYPE_3M,
DEVTYPE_ITM,
DEVTYPE_ETURBO,
DEVTYPE_GUNZE,
DEVTYPE_DMC_TSC10,
DEVTYPE_IRTOUCH,
DEVTYPE_IDEALTEK,
DEVTYPE_GENERAL_TOUCH,
DEVTYPE_GOTOP,
DEVTYPE_JASTEC,
DEVTYPE_E2I,
DEVTYPE_ZYTRONIC,
DEVTYPE_TC45USB,
DEVTYPE_NEXIO,
};
没有选择也可以自己添加一个在枚举体后面
(0x3823,0x0001)这两个分别是usb设备的厂商id和产品id
下面代码是我插拔usb触摸屏的打印信息
usb 1-1.1: new full speed USB device using musb-hdrc and address 9
usb 1-1.1: New USB device found, idVendor=0408, idProduct=3001
usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
usb 1-1.1: Product: HCTouch
usb 1-1.1: Manufacturer: HC
input: HC HCTouch as /devices/platform/omap/ti81xx-usbss/musb-hdrc.0/usb1/1-1/1-1.1/1-1.1:1.0/input/input6
input: HC HCTouch as /devices/platform/omap/ti81xx-usbss/musb-hdrc.0/usb1/1-1/1-1.1/1-1.1:1.1/input/input7
作为我的设备,我就把idVendor=0408, idProduct=3001添加进USB_DEVICE宏就行
{USB_DEVICE(0x0408, 0x3001), .driver_info = DEVTYPE_HCTOUCH},
OK!插上设备就会匹配的
input: HC HCTouch as /devices/platform/omap/ti81xx-usbss/musb-hdrc.0/usb1/1-1/1-1.1/1-1.1:1.0/input/input6
input: HC HCTouch as /devices/platform/omap/ti81xx-usbss/musb-hdrc.0/usb1/1-1/1-1.1/1-1.1:1.1/input/input7
这个就是匹配后的打印信息
接着就是probe方法了
static int usbtouch_probe(struct usb_interface *intf,const struct usb_device_id *id)
{
struct usbtouch_usb *usbtouch;
struct input_dev *input_dev;
struct usb_endpoint_descriptor *endpoint;
struct usb_device *udev = interface_to_usbdev(intf);
struct usbtouch_device_info *type;
int err = -ENOMEM;
/* some devices are ignored */
if (id->driver_info == DEVTYPE_IGNORE) //忽略的设备类型
return -ENODEV;
endpoint = usbtouch_get_input_endpoint(intf->cur_altsetting); //获取端点描述符数组指针
if (!endpoint)
return -ENXIO;
usbtouch = kzalloc(sizeof(struct usbtouch_usb), GFP_KERNEL); //分配usbtouch_usb结构体对象内存
input_dev = input_allocate_device(); //分配输入设备对象内存
if (!usbtouch || !input_dev) //分配不成功退出
goto out_free;
type = &usbtouch_dev_info[id->driver_info]; //根据id的driver_info信息获取全局usbtouch_dev_info数组项
usbtouch->type = type; //指定usbtouch_dev_info
if (!type->process_pkt) //若usbtouch_dev_info不存在process_pkt方法
type->process_pkt = usbtouch_process_pkt; //则默认设置为usbtouch_process_pkt
usbtouch->data = usb_alloc_coherent(udev, type->rept_size,GFP_KERNEL, &usbtouch->data_dma); //分配缓冲区
if (!usbtouch->data)
goto out_free;
if