USB2.0全速设备的技术规范,所以支持远程唤醒的功能,本文简单介绍全速USB模式下,USB键盘如何休眠PC,唤醒PC机
- 描述符配置
APM32F103鼠标设备配置描述符源代码如下,从0数第7个字节0xE0(1110000b),标识设备是自供电且具有远程唤醒功能。所以APM32F103USB描述符配置为。
对应个报告描述符可以配置为;
上述报告描述符没用到下面几个配置,直接在键值中发送即可。
0x85, REPORT_ID_SYSTEM, // Report ID
0x09, 0x83, // Usage (Sys Wake Up)
0x09, 0x82, // Usage (Sys Sleep)
0x09, 0x81, // Usage (Sys Power Down)
- 发送SYSTEM CONTROL的键值休眠电脑
定义/* Generic Desktop Page(0x01) - system power control */
#define SYSTEM_POWER_DOWN 0x0081
#define SYSTEM_SLEEP 0x0082
#define SYSTEM_WAKE_UP 0x0083
定义发送系统控制键值接口
void send_system(uint16_t data)
{
HidKeyboard_Write(REPORT_ID_SYSTEM, data);
}
发送休眠键值
send_system(SYSTEM_SLEEP);
- 唤醒休眠状态的PC机
唤醒休眠状态的PC机;远程唤醒的操作就是把USB控制寄存器的第4位置1,然后等待10ms把USB控制寄存器的第4位置为0,最后进入RESUME_OFF状态,设备的一次远程唤醒请求完成.
根据APM32F103提供的库接口,
其定义联合体如下
typedef struct
{
/** Endpoint */
USBD_EP_REG_T EP[8];
__IM uint32_t RESERVED[8];
/** @brief Control register */
union
{
__IOM uint32_t CTRL;
struct
{
__IOM uint32_t FORRST : 1;
__IOM uint32_t PWRDOWN : 1;
__IOM uint32_t LPWREN : 1;
__IOM uint32_t FORSUS : 1;
__IOM uint32_t WUPREQ : 1;
__IM uint32_t RESERVED1 : 3;
__IOM uint32_t ESOFIEN : 1;
__IOM uint32_t SOFIEN : 1;
__IOM uint32_t RSTIEN : 1;
__IOM uint32_t SUSIEN : 1;
__IOM uint32_t WUPIEN : 1;
__IOM uint32_t ERRIEN : 1;
__IOM uint32_t PMAOUIEN : 1;
__IOM uint32_t CTRIEN : 1;
__IM uint32_t RESERVED2 : 16;
}CTRL_B;
};
所以下面WUPREQ为唤醒位。
#define USBD_SetResume() (USBD->CTRL_B.WUPREQ = BIT_SET)
#define USBD_ResetResume() (USBD->CTRL_B.WUPREQ = BIT_RESET)
直接调用
USBD_SetResume();
delayMs(10);
USBD_ResetResume();