LDD3学习笔记(16):USB驱动

 

#include <linux/usb.h>

所有和 USB 相关的头文件. 它必须被所有的 USB 设备驱动包含.

struct usb_driver;

描述 USB 驱动的结构.

struct usb_device_id;

描述这个驱动支持的 USB 设备的结构.

int usb_register(struct usb_driver *d);

用来从USB核心注册和注销一个 USB 驱动的函数.

struct usb_device *interface_to_usbdev(struct usb_interface *intf);

从 struct usb_interface 获取控制 struct usb_device *.

struct usb_device;

控制完整 USB 设备的结构.

struct usb_interface;

主 USB 设备结构, 所有的 USB 驱动用来和 USB 核心通讯的.

void usb_set_intfdata(struct usb_interface *intf, void *data);

void *usb_get_intfdata(struct usb_interface *intf);

设置和获取在 struct usb_interface 中的私有数据指针部分的函数.

struct usb_class_driver;

描述 USB 驱动的一个结构, 这个驱动要使用 USB 主编号来和用户空间程序通讯.

int usb_register_dev(struct usb_interface *intf, struct usb_class_driver *class_driver);

void usb_deregister_dev(struct usb_interface *intf, struct usb_class_driver *class_driver);

用来注册和注销一个特定 struct usb_interface * 结构到 struct usb_class_driver 结构的函数.

struct urb;

描述一个 USB 数据传输的结构.

struct urb *usb_alloc_urb(int iso_packets, int mem_flags);

void usb_free_urb(struct urb *urb);

用来创建和销毁一个 struct usb urb*的函数.

int usb_submit_urb(struct urb *urb, int mem_flags);

int usb_kill_urb(struct urb *urb);

int usb_unlink_urb(struct urb *urb);

用来启动和停止一个 USB 数据传输的函数.

void usb_fill_int_urb(struct urb *urb, struct usb_device *dev, unsigned int pipe, void *transfer_buffer, int 

buffer_length, usb_complete_t complete, void *context, int interval);

void usb_fill_bulk_urb(struct urb *urb, struct usb_device *dev, unsigned int pipe, void *transfer_buffer, int 

buffer_length, usb_complete_t complete, void *context);

void usb_fill_control_urb(struct urb *urb, struct usb_device *dev, unsigned int pipe, unsigned char 

*setup_packet, void *transfer_buffer, int buffer_ length, usb_complete_t complete, void *context);

用来在被提交给 USB 核心之前初始化一个 struct urb 的函数. 

int usb_bulk_msg(struct usb_device *usb_dev, unsigned int pipe, void *data, int len, int *actual_length, int 

timeout);

int usb_control_msg(struct usb_device *dev, unsigned int pipe, __u8 request, __u8 requesttype, __u16 

value, __u16 index, void *data, __u16 size, int timeout);

用来发送和接受 USB 数据的函数, 不必使用一个 struct urb. 

时间: 2024-10-25 21:22:06

LDD3学习笔记(16):USB驱动的相关文章

spring学习笔记(16)趣谈spring 事件机制[2]:多监听器流水线式顺序处理

上一篇我们使用到的ApplicationListener是无序的,结合异步调度它能满足了我们的大部分应用场景,但现在我们来个另类的需求,我们来模拟一条作业调度流水线,它不能异步,必须按照先后次序执行不同的任务才能得到我们的最终结果. 需求示例:现在假如华中科技大学的小白想要为它的智能机器人作品申报国家创新奖,需要经过学校.省级创新科研机构.国家创新科研机构逐层审核.我们尝试通过事件来实现,核心就在监听器实现SmartApplicationListener接口.示例如下: 1. 配置事件发布者小白

LDD3学习笔记(20):网络驱动

  #include <linux/netdevice.h> 定义 struct net_device 和 struct net_device_stats 的头文件, 包含了几个其他网络驱动需要的头 文件. struct net_device *alloc_netdev(int sizeof_priv, char *name, void (*setup)(struct net_device *); struct net_device *alloc_etherdev(int sizeof_pri

LDD3学习笔记(15):PCI驱动

 #include <linux/pci.h> 包含 PCI 寄存器的符号名和几个供应商和设备 ID 值的头文件. struct pci_dev; 表示内核中一个 PCI 设备的结构. struct pci_driver; 代表一个 PCI 驱动的结构. 所有的 PCI 驱动必须定义这个. struct pci_device_id; 描述这个驱动支持的 PCI 设备类型的结构. int pci_register_driver(struct pci_driver *drv); int pci_m

LDD3学习笔记(1):设备驱动简介

 1.几乎每个系统操作都被映射到具体的物理设备上,而任何设备的控制操作都由特定于要寻址的相关代码来进行,这些代码成为设备驱动. 2.linux可以在运行时扩展由内核提供的特性,既可以在系统运行时增加内核的功能(也可以删除). 3.每块可以在运行时添加到内核的代码称为一个模块,每个模块由目标代码组成(既功能的实现). 4.linux将设备分为三种基本类型:字符设备.块设备.网络设备.典型的字符设备如:/dev/tty1(串口),块设备如:/dev/sda(磁盘),网络设备如:eth0(网卡),在这

LDD3学习笔记(21):tty驱动

  #include <linux/tty_driver.h> 头文件, 包含 struct tty_driver 的定义和声明一些在这个结构中的不同的标志. #include <linux/tty.h> 头文件, 包含 tty_struct 结构的定义和几个不同的宏定义来易于存取 struct termios 的成员的单个值. 它还含有 tty 驱动核心的函数声明. #include <linux/tty_flip.h> 头文件, 包含几个 tty flip 缓冲内联

LDD3学习笔记(6):字符驱动4

  1.快速参考 本章介绍了下面符号和头文件. struct file_operations 和 struct file 中的成员的列表这里不重复了. #include <linux/types.h> dev_t  dev_t 是用来在内核里代表设备号的类型. int MAJOR(dev_t dev); int MINOR(dev_t dev); 从设备编号中抽取主次编号的宏. dev_t MKDEV(unsigned int major, unsigned int minor); 从主次编号

LDD3学习笔记(9):高级字符驱动操作

 1.ioctl接口 ioctl 驱动方法有和用户空间版本不同的原型: int (*ioctl) (struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg); 2.阻塞I/O 阻塞进程,使它进入睡眠直到请求可继续. 当一个进程被置为睡眠,它被标识为处于一个特殊的状态并且从调度器的运行队列中去除,直到发生某些事情改变了那个状态.一个睡着的进程将不被任何CPU调度,因此不会运行,一个睡着的进程已被搁置到系

LDD3学习笔记(5):字符驱动3

  1.字符设备注册 在运行时获得一个独立的cdev结构的代码: Struct cdev* my_cdev=cdev_alloc(); My_codev->ops=&my_fops; 将cdev结构嵌入自己设备特定的结构: Void cdev_init(struct cdev* cdev , struct file_operations* fops); Cdev结构建立后,告诉内核: Int cdev_add(struct cdev*dev ,dev_t num,unsigned int c

LDD3学习笔记(3):字符驱动1

1.scull( Simple Character Utility for Loading  Localities)的设计 Scull是一个字符驱动,它操作一块内存区域,就好像它是一个设备,因此在以下的介绍中我们可以互换的使用设备和scull操作的内存区. 编写驱动的第一步是定义驱动将要提供给用户的功能. 模块实现的每种设备都被引用为一种类型. Scull源码实现: scull0到scull3四个设备,每个都由一个全局永久的内存区组成,全局表示如果设备被多次打开设备中含有的数据将由所有打开它的文