Zephyr USB设备控制器驱动程序文档

原文链接

USB设备控制器驱动程序

USB设备控制器驱动层实现低级别控制例程,直接处理硬件。所有设备控制器驱动程序都应实现include/zephyr/drivers/usb/usb_dc.h中描述的API。这允许在不更改上层的情况下集成新的USB设备控制器。使用此API无法在运行时支持多个控制器实例。

API 参考

usb_device_controller_api 组
USB设备控制器API。

Typedefs

// USB端点状态的回调函数签名
typedef void (*usb_dc_ep_callback)(uint8_t ep, enum usb_dc_ep_cb_status_code cb_status);

// 设备的回调函数签名
typedef void (*usb_dc_status_callback)(enum usb_dc_status_code cb_status, const uint8_t *param);

Enums(枚举)

/**
* 描述: USB驱动程序状态码。已注册设备状态回调报告的状态码。
*/
enum usb_dc_status_code {
	/** 控制器报告USB错误 */
	USB_DC_ERROR,
	/** USB 复位 */
	USB_DC_RESET,
	/** USB连接建立,硬件枚举完成 */
	USB_DC_CONNECTED,
	/** USB配置完成 */
	USB_DC_CONFIGURED,
	/** USB连接丢失 */
	USB_DC_DISCONNECTED,
	/** USB连接被主机挂起 */
	USB_DC_SUSPEND,
	/** 主机恢复USB连接 */
	USB_DC_RESUME,
	/** 选择USB接口 */
	USB_DC_INTERFACE,
	/** 收到设置特征ENDPOINT_HALT。 */
	USB_DC_SET_HALT,
	/** 收到清除特征ENDPOINT_HALT。 */
	USB_DC_CLEAR_HALT,
	/** 帧开始接收 */
	USB_DC_SOF,
	/** USB连接初始状态 */
	USB_DC_UNKNOWN
};



/**
* 描述: USB端点回调状态码。由注册端点回调报告的状态码。
*/
enum usb_dc_ep_cb_status_code {
	/** 收到SETUP请求。 */
	USB_DC_EP_SETUP,
	/** 在此端点上进行了Out事务,数据可供读取。 */
	USB_DC_EP_DATA_OUT,
	/** 在此端点上完成了In事务。 */
	USB_DC_EP_DATA_IN
};


/**
* 描述: USB端点传输类型。
*/
enum usb_dc_ep_transfer_type {
	/** 控制类型端点*/
	USB_DC_EP_CONTROL = 0,
	/** 同步类型端点。 */
	USB_DC_EP_ISOCHRONOUS,
	/** 批量传输类型端点 */
	USB_DC_EP_BULK,
	/** 中断类型端点  */
	USB_DC_EP_INTERRUPT
};



/**
* 描述: USB端点同步类型。
* 注意:仅对等时端点有效
*/
enum usb_dc_ep_synchronozation_type {
	/** 无同步 */
	USB_DC_EP_NO_SYNCHRONIZATION = (0U << 2U),
	/** 异步 */
	USB_DC_EP_ASYNCHRONOUS = (1U << 2U),
	/** 自适应 */
	USB_DC_EP_ADAPTIVE = (2U << 2U),
	/** 同步 */
	USB_DC_EP_SYNCHRONOUS = (3U << 2U)
};

函数

/**
 * 描述: 连接USB连接设备。
功能为设备连接连接USB。成功后,USB锁相环被启用,USB设备现在能够在USB总线上传输和接收并产生中断。
 *
 * 参数:
 *
 * 返回值: 成功时为0,失败时为负errno代码
 */
int usb_dc_attach(void);



/**
 * 描述: 卸载USB设备。
命令功能,卸载USB设备。成功后,USB硬件锁相环被下电,USB通信被禁用。
 *
 * 参数:usb_descriptor —— USB描述符
 *
 * 返回值: 成功时为0,失败时为负errno代码
 */
 int usb_dc_detach(void);
 

/**
 * 描述: 重置USB设备。
此函数将USB设备和固件返回到初始状态。注意:USB锁相环由usb_detach函数处理
 *
 * 参数:usb_descriptor —— USB描述符
 *
 * 返回值: 成功时为0,失败时为负errno代码
 */
 int usb_dc_reset(void);



/**
 * 描述: 设置USB设备地址。
 *
 * 参数:usb_descriptor —— USB描述符
 *
 * 返回值: addr – [in] 设备地址
 */
 int usb_dc_set_address(const uint8_t addr);
 


/**
 * 描述: 设置USB设备控制器状态回调。
命令功能设置USB设备控制器状态回调。注册回调用于报告设备控制器状态的变化。状态码由usb_dc_status_code枚举描述。
 *
 * 参数:cb – [in] 回调函数
 *
 * 返回值: 
 */
 void usb_dc_set_status_callback(const usb_dc_status_callback cb)



/**
 * 描述: 检查端点功能
函数检查端点的能力。Usb_dc_ep_cfg_data结构提供端点配置参数:端点地址、端点最大数据包大小和端点类型。驱动程序应该检查端点功能,如果端点配置是可能的,则返回0。
 *
 * 参数:cfg – [in] 端点配置
 *
 * 返回值: 成功时为0,失败时为负errno代码
 */
 int usb_dc_ep_check_cap(const struct usb_dc_ep_cfg_data *const cfg);


/**
 * 描述: 配置端点。
函数配置端点。Usb_dc_ep_cfg_data结构提供端点配置参数:端点地址、端点最大数据包大小和端点类型。
 *
 * 参数:cfg – [in] 端点配置
 *
 * 返回值: 成功时为0,失败时为负errno代码
 */
 int usb_dc_ep_configure(const struct usb_dc_ep_cfg_data *const cfg)



/**
 * 描述: 为所选端点设置停顿条件。
 *
 * 参数:ep - [in] 终端地址,与设备配置表中的终端地址对应
 *
 * 返回值: 成功时为0,失败时为负errno代码
 */
int usb_dc_ep_set_stall(const uint8_t ep);



/**
 * 描述: 清除所选端点的停顿条件。
 *
 * 参数:ep - [in] 终端地址,与设备配置表中的终端地址对应
 *
 * 返回值: 成功时为0,失败时为负errno代码
 */
int usb_dc_ep_clear_stall(const uint8_t ep);



/**
 * 描述: 检查所选端点是否已停止。
 *
 * 参数:ep - [in] 终端地址,与设备配置表中的终端地址对应
 * 		stopped - [out]端点停止状态
 *
 * 返回值: 成功时为0,失败时为负errno代码
 */
int usb_dc_ep_is_stalled(const uint8_t ep, uint8_t *const stalled)


/**
 * 描述: 停止选定的端点。
 *
 * 参数:ep - [in] 终端地址,与设备配置表中的终端地址对应
 *
 * 返回值: 成功时为0,失败时为负errno代码
 */
 int usb_dc_ep_halt(const uint8_t ep);




/**
 * 描述: 启用所选端点。
函数启用所选端点。一旦成功,相应的端点将启用中断,并且该端点已准备好传输/接收数据。
 *
 * 参数:ep - [in] 终端地址,与设备配置表中的终端地址对应
 *
 * 返回值: 成功时为0,失败时为负errno代码
 */
 int usb_dc_ep_enable(const uint8_t ep);


/**
 * 描述: 禁用所选端点。
函数禁用所选端点。一旦成功,相应端点的中断将被禁用,并且该端点不再能够传输/接收数据。
 *
 * 参数:ep - [in] 终端地址,与设备配置表中的终端地址对应
 *
 * 返回值: 成功时为0,失败时为负errno代码
 */
 int usb_dc_ep_disable(const uint8_t ep);



/**
 * 描述: 刷新所选端点。
此函数将刷新选定端点的fifo。
 *
 * 参数:ep - [in] 终端地址,与设备配置表中的终端地址对应
 *
 * 返回值: 成功时为0,失败时为负errno代码
 */
 int usb_dc_ep_flush(const uint8_t ep);



/**
 * 描述: 将数据写入指定的端点。
调用此函数将数据写入指定端点。当数据传输出去时,将调用提供的usb_ep_callback函数。
 *
 * 参数:ep – [in] 终端地址,与设备配置表中的终端地址对应
 * 		data – [in] 指向要写入数据的指针
 * 		data_len – [in] 请求写入的数据的长度。对于一个长度为零的状态包,这个值可能为零。
 * 		ret_bytes – [out] 预定传输的字节数。如果应用程序希望写入所有字节,则该值可能为NULL
 *
 * 返回值: 成功时为0,失败时为负errno代码
 */
 int usb_dc_ep_write(const uint8_t ep, const uint8_t *const data, const uint32_t data_len, uint32_t *const ret_bytes);



/**
 * 描述: 从指定端点读取数据。
在接收到该EP的OUT中断后,端点处理程序函数将调用该函数。应用程序只能通过提供的usb_ep_callback函数调用此函数。如果已经读取了端点FIFO中的所有数据,则该函数将清除端点NAK,以便从主机接收更多数据。
 *
 * 参数:ep – [in] 终端地址,与设备配置表中的终端地址对应
 * 		data – [in] 要写入的数据缓冲区的指针
 * 		max_data_len - [in]读取的最大数据长度
 * 		read_bytes - [out]读取的字节数。如果data为NULL且max_data_len为0,则应返回可读取的字节数。
 *
 * 返回值: 成功时为0,失败时为负errno代码
 */
 int usb_dc_ep_read(const uint8_t ep, uint8_t *const data, const uint32_t max_data_len, uint32_t *const read_bytes);



/**
 * 描述: 为指定端点设置回调函数。
函数设置回调函数,用于通知已接收的数据并可用于应用程序或在选定端点上完成传输,如果应用程序代码不需要回调,则为NULL。回调状态代码由usb_dc_ep_cb_status_code描述。
 *
 * 参数:ep – [in] 终端地址,与设备配置表中的终端地址对应
 * 		cb - [in] 回调函数
 *
 * 返回值: 成功时为0,失败时为负errno代码
 */
int usb_dc_ep_set_callback(const uint8_t ep, const usb_dc_ep_callback cb);




/**
 * 描述: 从指定端点读取数据。
这类似于usb_dc_ep_read,不同之处在于,它不清除端点NAKs,因此消费者在完成数据处理之前不会被进一步的向上调用所困。调用方应该通过调用usb_dc_ep_read_continue()来重新激活ep。
 *
 * 参数:ep – [in] 终端地址,与设备配置表中的终端地址对应
 * 		data – [in] 要写入的数据缓冲区的指针
 * 		max_data_len - [in]读取的最大数据长度
 * 		read_bytes - [out]读取的字节数。如果data为NULL且max_data_len为0,则应返回可读取的字节数。
 *
 * 返回值: 成功时为0,失败时为负errno代码
 */
int usb_dc_ep_read_wait(uint8_t ep, uint8_t *data, uint32_t max_data_len, uint32_t *read_bytes);




/**
 * 描述: 继续从端点读取数据。
清除端点NAK并允许端点接受来自主机的更多数据。当使用者可以接受更多数据时,通常在usb_dc_ep_read_wait()之后调用。因此,这些调用一起充当流控制机制。
 *
 * 参数:ep – [in] 终端地址,与设备配置表中的终端地址对应
 *
 * 返回值: 成功时为0,失败时为负errno代码
 */
 int usb_dc_ep_read_continue(uint8_t ep)
 

/**
 * 描述: 获取端点最大数据包大小。
 *
 * 参数:ep – [in] 终端地址,与设备配置表中的终端地址对应
 *
 * 返回值: 端点最大包大小(mps)
 */
 int usb_dc_ep_mps(uint8_t ep);
 

/**
 * 描述: 启动主机唤醒过程。
函数唤醒主机,如果主机当前处于睡眠模式。
 *
 * 参数:
 *
 * 返回值: 成功时为0,失败时为负errno代码
 */
 int usb_dc_wakeup_request(void);
 

结构体

/**
 * 描述: USB端点配置。该结构包含端点的配置。
 * 定义的位置:#include <usb_device.h>
 */
struct usb_dc_ep_cfg_data {
	/** 设备端点号,注意输入端点与输出端点的配置
	 *       IN  EP = 0x80 | \<endpoint number\>
	 *       OUT EP = 0x00 | \<endpoint number\>
	 */
	 
	uint8_t ep_addr;
	/** 端点最大包大小 */
	uint16_t ep_mps;
	
	/** 端点传输类型。可能是批量,中断,控制或同步 */
	enum usb_dc_ep_transfer_type ep_type;
};

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Zephyr是一种开源的实时操作系统(RTOS),主要用于边缘设备物联网应用程序的开发。Zephyr驱动开发指的是为支持特定硬件的设备编写驱动程序Zephyr驱动开发的目标是为了使硬件设备与操作系统之间能够进行有效的通信和交互。通过编写驱动程序,可以实现对硬件设备的控制、数据的采集和传输,从而实现设备的功能。 Zephyr驱动开发的步骤一般包括以下几个方面: 1. 硬件分析和规划:首先需要深入了解所要驱动的硬件设备,并分析其特性和规范。这包括硬件接口、通信协议、寄存器配置等方面的研究。 2. 驱动程序设计:根据硬件分析的结果,设计驱动程序的接口和功能。这涉及到底层的硬件访问和控制,例如初始化硬件、读取传感器数据、控制设备状态等。 3. 驱动程序实现:根据设计的接口和功能,编写具体的驱动程序代码。在Zephyr中,可以使用C语言或其他支持的编程语言来实现驱动。 4. 驱动程序集成:将驱动程序Zephyr RTOS集成,使其能够在操作系统中运行。这包括将驱动程序编译成可执行文件、配置驱动程序的参数和选项等步骤。 5. 测试和调试:对驱动程序进行测试和调试,确保其功能和性能符合要求。这包括功能测试、性能测试和稳定性测试等。 总之,Zephyr驱动开发是为实现对特定硬件设备的控制和数据交互而编写驱动程序的过程。这需要对硬件设备有深入的了解,同时掌握Zephyr RTOS的使用技巧,以实现高效、稳定的驱动程序。驱动开发的目标是为了提供更好的用户体验和应用性能,促进物联网技术的发展和应用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值