pl2303

日頃からお世話になってるソレを読む事に。時間かかるかもしれませんが、ぼちぼち進めます。

エントリポイント

全部引用しちゃいますが、以下。

static int __init pl2303_init(void)
{
	int retval;

	retval = usb_serial_register(&pl2303_device);
	if (retval)
		goto failed_usb_serial_register;
	retval = usb_register(&pl2303_driver);
	if (retval)
		goto failed_usb_register;
	info(DRIVER_DESC);
	return 0;
failed_usb_register:
	usb_serial_deregister(&pl2303_device);
failed_usb_serial_register:
	return retval;
}

static void __exit pl2303_exit(void)
{
	usb_deregister(&pl2303_driver);
	usb_serial_deregister(&pl2303_device);
}

module_init(pl2303_init);
module_exit(pl2303_exit);

ポイントとしては module_init な pl2303_init で

  • usb_serial_register
  • usb_register

module_exit な pl2303_exit で

  • usb_deregister
  • usb_serial_deregister

という順で処理している模様。ちなみに usb_serial_register とか usb_serial_deregister とかは driver/usb/serial/usb-serial.c で定義されている模様。
あ、これ usbserial か。

# modprobe pl2303
# lsmod|grep pl2303
pl2303                 19268  0 
usbserial              29448  1 pl2303
usbcore               121352  6 pl2303,usbserial,zd1211rw,ehci_hcd,uhci_hcd
#

違うのかなぁ。一応 usb-serial.c では以下な定義があります。

/* Driver structure we register with the USB core */
static struct usb_driver usb_serial_driver = {
	.name =		"usbserial",
	.probe =	usb_serial_probe,
	.disconnect =	usb_serial_disconnect,
	.no_dynamic_id = 	1,
};

usb_driver 構造体は include/linux/usb.h にて定義されてますが、随分昔に usb なドライバの文書を読んだ記憶があるなぁ、と。
で、Documentation/usb の中を見てみたら usb-serial.txt というドキュメントを発見したので読んでみます。多分今日はこれで力尽きるはず。