zoukankan      html  css  js  c++  java
  • Linux 内核注册一个 USB 驱动

    所有 USB 驱动必须创建的主要结构是 struct usb_driver. 这个结构必须被 USB 驱动填 充并且包含多个函数回调和变量, 来向 USB 核心代码描述 USB 驱动:

    struct module *owner

    指向这个驱动的模块拥有者的指针. USB 核心使用它正确地引用计数这个 USB 驱 动, 以便它不被在不合适的时刻卸载. 这个变量应当设置到 THIS_MODULE 宏.

    const char *name

    指向驱动名子的指针. 它必须在内核 USB 驱动中是唯一的并且通常被设置为和驱 动的模块名相同. 它出现在 sysfs 中在 /sys/bus/usb/drivers/ 之下, 当驱动在 内核中时.

    const struct usb_device_id *id_table

    指向 struct usb_device_id 表的指针, 包含这个驱动可接受的所有不同类型 USB 设备的列表. 如果这个变量没被设置, USB 驱动中的探测回调函数不会被调用. 如 果你需要你的驱动给系统中每个 USB 设备一直被调用, 创建一个只设置这个 driver_info 成员的入口项:

    static struct usb_device_id usb_ids[] = {

    {.driver_info = 42},

    {}

    };

    int (*probe) (struct usb_interface *intf, const struct usb_device_id *id)

    指向 USB 驱动中探测函数的指针. 这个函数(在"探测和去连接的细节"一节中描述) 被 USB 核心调用当它认为它有一个这个驱动可处理的 struct usb_interface. 一 个指向 USB 核心用来做决定的 struct usb_device_id 的指针也被传递到这个函 数. 如果这个 USB 驱动主张传递给它的 struct usb_interface, 它应当正确地初 始化设备并且返回 0. 如果驱动不想主张这个设备, 或者发生一个错误, 它应当返 回一个负错误值.

    void (*disconnect) (struct usb_interface *intf)

    指向 USB 驱动的去连接函数的指针. 这个函数(在"探测和去连接的细节"一节中描 述)被 USB 核心调用, 当 struct usb_interface 已被从系统中清除或者当驱动被 从 USB 核心卸载.

    为创建一个值 struct usb_driver 结构, 只有 5 个成员需要被初始化:

    static struct usb_driver skel_driver = {

    .owner = THIS_MODULE,

    .name = "skeleton",

    .id_table = skel_table,

    .probe = skel_probe,

    .disconnect = skel_disconnect,

    };

    struct usb_driver 确实包含更多几个回调, 它们通常不经常用到, 并且不被要求使 USB 驱动正确工作:

    int (*ioctl) (struct usb_interface *intf, unsigned int code, void *buf)

    指向 USB 驱动的 ioctl 函数的指针. 如果它出现, 在用户空间程序对一个关联到 USB 设备的 usbfs 文件系统设备入口, 做一个 ioctl 调用时被调用. 实际上, 只 有 USB 集线器驱动使用这个 ioctl, 因为没有其他的真实需要对于任何其他 USB 驱动要使用.

    int (*suspend) (struct usb_interface *intf, u32 state)

    指向 USB 驱动中的悬挂函数的指针. 当设备要被 USB 核心悬挂时被调用. int (*resume) (struct usb_interface *intf)

    指向 USB 驱动中的恢复函数的指针. 当设备正被 USB 核心恢复时被调用.

    为注册 struct usb_driver 到 USB 核心, 一个调用 usb_register_driver 带一个指向 struct usb_driver 的指针. 传统上在 USB 驱动的模块初始化代码做这个:

    static int   init usb_skel_init(void)

    {

    int result;

    /* register this driver with the USB subsystem */ result = usb_register(&skel_driver);

    if (result)

    err("usb_register failed. Error number %d", result); return result;

    }

    当 USB 驱动被卸载, struct usb_driver 需要从内核注销. 使用对 usb_deregister_driver 的调用做这个. 当这个调用发生, 任何当前绑定到这个驱动的 USB 接口被去连接, 并且去连接函数为它们而被调用.

    static void   exit usb_skel_exit(void)

    {

    /* deregister this driver with the USB subsystem */ usb_deregister(&skel_driver);

    }

  • 相关阅读:
    移动端meta标签
    document.ready 和 window.onload
    axios 源码分析
    vue 中的 el
    安卓和Ios 手机兼容性
    一些移动端问题
    Python 局部变量与全局变量
    Linux常用命令大全(非常全!!!)
    Python_爬虫_基础
    linux 常用命令
  • 原文地址:https://www.cnblogs.com/fanweisheng/p/11147373.html
Copyright © 2011-2022 走看看