【转】Linux那些事儿 之 戏说USB(15)繁华落尽

台湾作家林清玄在接受记者采访时,如此评价自己的30多年写作生涯:“第一个十年我才华横 溢,‘贼光闪现’,令周边黯然失色;第二个十年,我终于‘宝光现形’,不再去抢风头,反而与身边的美丽相得益彰;进入第三个十年,繁华落尽见真醇,我进入 了‘醇光初现’的阶段,真正体味到了境界之美。”
很久很久以前,在自己还比较喜欢散文的时候,林清玄是我仅次于余秋雨的第二偶像。长夜有穷,真水无香。看过了Linux设备模型固的繁华似锦,该是体味境界之美的时候了。
Linux设备模型中的总线落实在USB子系统里就是usb_bus_type,它在usb_init函数的874行注册,在drivers/usb/core/driver.c文件里定义
1524          .name =         "usb",
1525          .match =       usb_device_match,
1526          .uevent =       usb_uevent,
1527          .suspend =     usb_suspend,
1528          .resume =      usb_resume,
1529 };
看 来是要向这个分叉走了,既然没有回头的路,就放平心情,欣赏沿路美景吧。name自然就是usb总线的绰号了,与芙蓉姐姐一般无二,人在江湖,身不由己。 match这个函数指针就比较有意思了,它充当了一个红娘的角色,在总线的设备和驱动之间牵线搭桥,类似于交大BBS上的鹊桥版,虽然它们上面的条件都琳 琅满目的,但明显这里match的条件不是那么的苛刻,要实际些。match指向了函数 usb_device_match
 
usb_device_match()返回0表示匹配失败;1表示匹配成功
struct device *dev        代表usb_device或者usb_interface
struct device_driver *drv 代表usb_driver   


static intusb_device_match(struct device *dev, struct device_driver *drv)
{
    /* devices and interfaces are handled separately */
    if (
is_usb_device(dev)) { // for usb_device

        /* interface drivers never match devices */
        if (!
is_usb_device_driver(drv))
            return 0;

        /* TODO: Add real matching code */
        return 1;

    } else {                  // for usb_interface
        struct
usb_interface *intf;
        struct
usb_driver *usb_drv;
        const struct usb_device_id *id;

        /* device drivers never match interfaces */
        if (is_usb_device_driver(drv))
            return 0;

        intf =
to_usb_interface(dev);
        usb_drv =
to_usb_driver(drv);

        id =
usb_match_id(intf, usb_drv->id_table); //(1)
        if (id)
            return 1;

        id = usb_match_dynamic_id(intf, usb_drv);
        if (id)
            return 1;
    }

    return 0;
}

其中
usb_device_match() --> to_usb_interface()

linux-2.6.21.5/include/linux/usb.h
to_usb_interface() -- 返回参数d(struct device)所在的usb_interface
#define to_usb_interface(d) container_of(d, struct usb_interface, dev)


经历了linux设备模型的繁华,参数我们都已经很熟悉了,对应的就是总线两条链表里的设备和驱动,也可以说是鹊桥版上的挂牌的和摘牌的。总线上有新 设备或新的驱动添加时,这个函数总是会被调用,如果指定的驱动能够处理指定的设备,也就是匹配成功,函数返回1。梦想是美好的,现实是残酷的,匹配是未必 成功的,红娘再努力,双方对不上眼也是实在没办法的事。 一遇到if和else,我们就知道又处在两难境地了,代码里我们可选择的太多,生活里我们可选择的太少,出生,长大,死亡,好像一直身不由己的随着命运在走。这里的岔路口只有两条路,一条给USB设备走,一条给USB接口走,各走各的路,分开了,就不再相见。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值