USB HID键盘实现:详解usb_class_in()和scan_key()函数

本文将深入探讨USB HID键盘驱动程序中的两个核心函数:usb_class_in()scan_key(),并解释它们如何协同工作以实现键盘功能。

usb_class_in() 函数:发送按键码

usb_class_in()函数是USB类输入处理函数,负责将按键码发送到主机。其工作流程如下:

  1. 检查状态: 函数首先检查设备是否已配置,USB是否空闲,以及是否有按键按下。如果任何条件不满足,函数直接返回。2. 初始化发送状态: 将按键码的发送状态标记 (fKeyOK) 设置为0,表示按键码尚未发送。3. 清空发送缓冲区: 清空发送缓冲区 (key 数组)。4. 设置按键码: 根据按键码 (bKeyCode) 的值,将对应位置的按键码设置为非零值。例如,代码中可能将按键码 0x0e 对应于 'CTRL' 键,0x0d 对应于 'C' 键,0x0b 对应于 'V' 键,0x07 对应于 'x' 键。5. 准备USB发送: 设置USB相关的寄存器,准备发送按键码。这包括: - 禁止中断 (EUSB = 0)。 - 设置发送缓冲区的索引 (usb_write_reg(INDEX, 1))。 - 将按键码写入FIFO寄存器 (usb_write_reg(FIFO1, key[i]))。 - 设置发送就绪标志 (usb_write_reg(INCSR1, INIPRDY))。6. 启动发送: 使能中断 (EUSB = 1),并将USB发送忙标志 (UsbInBusy) 设置为1,表示按键码正在发送。

scan_key() 函数:扫描按键并防抖

scan_key() 函数负责扫描按键状态并进行防抖处理。其工作流程如下:

  1. 初始化按键变量:key 变量初始化为0。2. 读取按键状态: 通过P3端口的位操作,读取P3.2到P3.5的按键状态,并将其右移2位,得到按键码。3. 检测按键变化: 检查当前按键码是否与上一次的按键码有所变化: - 如果有变化,将新的按键码赋值给 bKeyCode,并将防抖计数器 (bKeyDebounce) 设置为20。 - 如果没有变化,则进入下一步。4. 防抖处理: - 如果当前按键码与上一次相同,判断防抖计数器的值。 - 如果计数器不为零,则将计数器减1。 - 如果计数器减到0,表示按键状态已经稳定,将发送按键码的标志 (fKeyOK) 设置为1。

总结

usb_class_in()scan_key() 协同工作,实现了HID键盘的核心功能。 usb_class_in() 函数负责将按键码发送到主机,而 scan_key() 函数则负责检测按键状态,并在按键状态稳定后触发按键码的发送。理解这两个函数的工作原理对于开发和维护USB HID键盘驱动程序至关重要。

USB HID键盘实现:详解usb_class_in()和scan_key()函数

原文地址: https://www.cveoy.top/t/topic/OZq 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录