目录
1. ftdi_quirk
2. id的特殊性
3. 将特殊操作赋值给串口的私有数据
.probe = ftdi_probe,
这个接口函数是FTDI设备插入时调用的函数。程序ftdi_probe里面主要是根据不同的VID和PID设备做了不同的probe函数。这一步最大的作用是probe特殊的一些应用,对于普通的串口应用,实际没有做任何处理,服从默认的初始化。
static int ftdi_probe(struct usb_serial *serial, const struct usb_device_id *id)
{const struct ftdi_quirk *quirk = (struct ftdi_quirk *)id->driver_info;if (quirk && quirk->probe) {int ret = quirk->probe(serial);if (ret != 0)return ret;}usb_set_serial_data(serial, (void *)id->driver_info);return 0;
}
1. ftdi_quirk
这是特殊的处理,这个结构体相当于定义了2个特殊的probe和port_probe
struct ftdi_quirk {int (*probe)(struct usb_serial *);/* Special settings for probed ports. */void (*port_probe)(struct ftdi_private *);
};
2. id的特殊性
在数组id_table_combined中,大部分的成员是2个ID,但是会有一些特殊的id申明,例如:
{ USB_DEVICE(FTDI_VID, FTDI_8U2232C_PID) ,.driver_info = (kernel_ulong_t)&ftdi_8u2232c_quirk },{ USB_DEVICE(FTDI_VID, FTDI_4232H_PID) },
第二个USB Device就是只有VID和PID,而第一个USB Device多了一个driver_info,结合上面ftdi_quirk的获取:
const struct ftdi_quirk *quirk = (struct ftdi_quirk *)id->driver_info;
这个地方就是从id那里得到这个设备特殊的处理。而这个特殊的处理只包括了新的probe。
static const struct ftdi_quirk ftdi_8u2232c_quirk = {.probe = ftdi_8u2232c_probe,
};
可以看到ftdi_8u2232c_probe里面初始化了JTAG的应用。这里先不深入这部分。
3. 将特殊操作赋值给串口的私有数据
usb_set_serial_data其实没有做什么,就是简单的把id那里定义的特殊处理赋值给serial这个变量的私有数据。
static inline void usb_set_serial_data(struct usb_serial *serial, void *data)
{serial->private = data;
}
也就是ftdi的probe步骤其实没什么特别需要处理了,除非是一些需要实现特殊功能的设备。