添加usb function <一>

1、usb描述信息

struct usb_interface_descriptor
{
	__u8  bLength;
	__u8  bDescriptorType;
	__u8  bInterfaceNumber;
	__u8  bAlternateSetting;
	__u8  bNumEndpoints;
	__u8  bInterfaceClass;
	__u8  bInterfaceSubClass;
	__u8  bInterfaceProtocol;
	__u8  iInterface;
}

/* 
接口描述信息
重要的几个字段
bLength:一般填USB_DT_INTERFACE_SIZE
bInterfaceNumber: 一般填USB_DT_INTERFACE
bNumEndpoints:根据自己的需求填需要的端点数量
bInterfaceClass:接口类型,根据自己需求选择一个,如果不知道可以填USB_CLASS_VENDOR_SPEC
以上4个字段为必填。
*/

2、端点描述

struct usb_endpoint_descriptor {
	__u8  bLength;
	__u8  bDescriptorType;
	__u8  bEndpointAddress;
	__u8  bmAttributes;
	__le16 wMaxPacketSize;
	__u8  bInterval;
	__u8  bRefresh;
	__u8  bSynchAddress;
} 
/*
bLength:一般填USB_DT_ENDPOINT_SIZE
bDescriptorType:一般填USB_DT_ENDPOINT
bEndpointAddress:可填USB_DIR_IN或USB_DIR_OUT
bmAttributes:可填USB_ENDPOINT_XFER_ISOC,USB_ENDPOINT_XFER_BULK,USB_ENDPOINT_XFER_INT
*/

3、注册USB function

在init函数中调用usb_function_register注册功能。
在struct usb_function_driver中必须实现alloc_inst和alloc_func回调函数。
在alloc_inst中,需要返回struct usb_function_instance指针,需要填充
free_func_inst回调函数,该函数在功能被移除时调用。所以可以将所有的资源
回收过程在此函数中实现。
并且可以把一些需要在功能被创建时实现的功能在此处实现。
在函数返回前需要调用config_group_init_type_name对group进行初始化。
这个可以实现给功能添加其它功能的目的。
调用config_group_init_type_name后就可以将struct usb_function_instance指针返回。

alloc_func回调函数返回struct usb_function指针,在struct usb_function指针返回前
需要填充name, bind,set_alt,get_alt,disable,setup,free_func。
name是这个功能的名字,在通过configfs创建功能时会用到。
bind是核心功能,用于分配ep端点,协商速率等待,此函数是在中断被调用的,所有在中断不能做的,当然也不能在此实现。
set_alt在该回调中主要是配置速率,开启端点。

4、数据交互

数据是通过在bind时协商的端点进行传输。
先调用usb_ep_alloc_request 分配request,

struct usb_request {
	void			*buf;
	unsigned		length;
	dma_addr_t		dma;
	struct scatterlist	*sg;
	unsigned		num_sgs;
	unsigned		num_mapped_sgs;
	unsigned		stream_id:16;
	unsigned		is_last:1;
	unsigned		no_interrupt:1;
	unsigned		zero:1;
	unsigned		short_not_ok:1;
	unsigned		dma_mapped:1;
	void			(*complete)(struct usb_ep *ep,
					struct usb_request *req);
	void			*context;
	struct list_head	list;
	unsigned		frame_number;
	int			status;
	unsigned		actual;
}
/* 
我们只需要填充buf, length, complete, context
buf:需要传输或作为接收缓冲区
length: buf的长度,
complete是一个回调函数,在发送或接收完成时调用。
context:上下文,在complete回调函数中可以使用。
actual:接收收到的数据大小。	

填充好上面4个字段后调用usb_ep_queue发起传输
*/
  • 11
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值