linux设备驱动看不懂,linux设备驱动之USB驱动剖析

usb_init

->bus_register(&usb_bus_type);

注册到linux设备模型中的USB总线

->usb_hub_init();

->usb_register(&hub_driver)

static struct usb_driver hub_driver = {

.name = "hub",

.probe = hub_probe,

.disconnect = hub_disconnect,

.suspend = hub_suspend,

.resume = hub_resume,

.reset_resume = hub_reset_resume,

.pre_reset = hub_pre_reset,

.post_reset = hub_post_reset,

.ioctl = hub_ioctl,

.id_table = hub_id_table,

.supports_autosuspend = 1,

};

->usb_register_driver(driver, THIS_MODULE, KBUILD_MODNAME);

注册USB HUB的接口驱动(linux设备模型)

->new_driver->drvwrap.driver.name = (char *)

new_driver->name;

->new_driver->drvwrap.driver.bus =

&usb_bus_type;

->new_driver->drvwrap.driver.probe =

usb_probe_interface;

->driver_register(&new_driver->drvwrap.driver);

->kthread_run(hub_thread, NULL, "khubd");

->hub_events();

->usb_reset_device(hdev);

->usb_reset_and_verify_device(udev);

->hub_port_init(parent_hub, udev, port1, i);

->hub_port_reset(hub, port1, udev, delay);

->set_port_feature(hub->hdev, port1,

USB_PORT_FEAT_RESET);

->usb_get_device_descriptor(udev, 8);

->hub_port_connect_change(hub, i, portstatus,

portchange);

->usb_alloc_dev(hdev, hdev->bus, port1);

linux设备驱动模型,属于usb device

->dev->dev.bus = &usb_bus_type;

->dev->dev.type = &usb_device_type;

struct device_type usb_device_type = {

.name = "usb_device",

.release = usb_release_dev,

.uevent = usb_dev_uevent,

.pm = &usb_device_pm_ops,

};

->choose_address(udev); 设置地址

->hub_port_init(hub, udev, port1, i);

->usb_new_device(udev); 设备挂载到linux设备驱动模型的usb总线

->usb_device_match

挂接成功之后与usb_generic_driver实现了match,会调用

usb_probe_device

->usb_register_device_driver(&usb_generic_driver,

THIS_MODULE);

struct usb_device_driver usb_generic_driver = {

.name = "usb",

.probe = generic_probe,

.disconnect = generic_disconnect,

#ifdef CONFIG_PM

.suspend = generic_suspend,

.resume = generic_resume,

#endif

.supports_autosuspend = 1,

};

->new_udriver->drvwrap.driver.name = (char *)

new_udriver->name;

->new_udriver->drvwrap.driver.bus = &usb_bus_type;

这可是linux设备驱动模型的USB总线

->new_udriver->drvwrap.driver.probe =

usb_probe_device;

->usb_probe_device

->udriver->probe(udev);

实际指向usb_generic_driver的generic_probe

->generic_probe

->driver_register(&new_udriver->drvwrap.driver);

注册USB设备驱动到USB总线(linux设备驱动)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值