要把鼠标从机改成键盘从机,只需要在鼠标从机源码的基础上进行更改即可。这里以stm32f103c8t6为例讲解。
更改如下:
方法一:
1、打开原来的工程(鼠标工程)由STM32Cube生成。
1、在main.c函数中,添加键盘键值代码, 这里模拟空格键
空格键:
uint8_t txbuffer[8]= {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
uint8_t sendbuffer[8]={0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x00};
某按键:
if(GPIO_PIN_RESET==HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1))//PTT按下,按下为低
{
USBD_HID_SendReport(&hUsbDeviceFS,sendbuffer,8);//发送报文
}
else if(GPIO_PIN_SET==HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1))
{
USBD_HID_SendReport(&hUsbDeviceFS,txbuffer,8);//发送报文
}
3,在usb_hid.c中,改核心实现代码(将核心从鼠标换成键盘),即修改usb配置数组或修改USB HID设备配置描述符。
4,修改USB HID设备描述符(在usb_hid.c中)
5,定义键盘描述符(在usb_hid.c中)
__ALIGN_BEGIN static uint8_t HID_KEYBOARD_ReportDesc[HID_KEYBOARD_REPORT_DESC_SIZE] __ALIGN_END =
{
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x06, // USAGE (Keyboard)
0xa1, 0x01, // COLLECTION (Application)
0x05, 0x07, // USAGE_PAGE (Keyboard)
0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl)
0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x75, 0x01, // REPORT_SIZE (1)
0x95, 0x08, // REPORT_COUNT (8)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x08, // REPORT_SIZE (8)
0x81, 0x03, // INPUT (Cnst,Var,Abs)
0x95, 0x05, // REPORT_COUNT (5)
0x75, 0x01, // REPORT_SIZE (1)
0x05, 0x08, // USAGE_PAGE (LEDs)
0x19, 0x01, // USAGE_MINIMUM (Num Lock)
0x29, 0x05, // USAGE_MAXIMUM (Kana)
0x91, 0x02, // OUTPUT (Data,Var,Abs)
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x03, // REPORT_SIZE (3)
0x91, 0x03, // OUTPUT (Cnst,Var,Abs)
0x95, 0x06, // REPORT_COUNT (6)
0x75, 0x08, // REPORT_SIZE (8)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0xFF, // LOGICAL_MAXIMUM (255)
0x05, 0x07, // USAGE_PAGE (Keyboard)
0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated))
0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application)
0x81, 0x00, // INPUT (Data,Ary,Abs)
0xc0 };
6,定义键盘描述符大小(在usb_hid.h中)
选择之前鼠标描述符大小,跟踪到鼠标描述符大小的宏定义处(usb_hid.h)。进行添加宏定义,定义键盘描述符大小
#define HID_MOUSE_REPORT_DESC_SIZE 74
#define HID_KEYBOARD_REPORT_DESC_SIZE 63
7,修改usb安装实现代码(在usb_hid.c中)
将 USBD_HID_Setup函数中的 case USB_REQ_GET_DESCRIPTOR: 分支中的:
len = MIN(HID_MOUSE_REPORT_DESC_SIZE , req->wLength);
pbuf = HID_MOUSE_ReportDesc;
替换成: len = MIN(HID_KEYBOARD_REPORT_DESC_SIZE , req->wLength);
pbuf = HID_KEYBOARD_ReportDesc;
8,修改PID/VID (在usb_desc.c中) (此步我捉摸了3天,才找到问题,否则电脑不能识别设备)
#define USBD_VID 1111
#define USBD_PID_FS 22111
每改一次设备,必须改变PID/VID,只要和上次不同就行。因为同一台电脑会默认识别出该PID/VID,如果不改,则识别为上次的设备(鼠标),因为你的代码已经改了(键盘),所以电脑的设备管理器是叹号。就是不能识别。
9,编译、下载,成功后,插入电脑,设备管理器可以识别出是一个HID或键盘设备。
方法二:不用像上面那样,分别添加代码,
这里只需把之前鼠标描述符修改即可。因为用STM32Cube生成的默认都是鼠标代码,不能实现生成键盘的代码,所以这里就把鼠标的代码替换成键盘的代码。
1,改配置描述符
2,把鼠标描述符替换成键盘描述符。
键盘描述符:
{
0x05, 0x01, // USAGE_PAGE (Generic Desktop)把红线框中的代码,替换成键盘描述符。
3,修改鼠标的宏定义。由74,改为63
#define HID_MOUSE_REPORT_DESC_SIZE 63 //74
4,修改PID/VID (在usb_desc.c中) (此步我捉摸了3天,才找到问题,否则电脑不能识别设备)
#define USBD_VID 1111
#define USBD_PID_FS 22111
每改一次设备,必须改变PID/VID,只要和上次不同就行。因为同一台电脑会默认识别出该PID/VID,如果不改,则识别为上次的设备(鼠标),因为你的代码已经改了(键盘),所以电脑的设备管理器是叹号。就是不能识别。
5,在main.c中添加相应的功能函数。
空格键:
uint8_t txbuffer[8]= {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//无
uint8_t sendbuffer[8]={0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x00};//空格
某按键:
if(GPIO_PIN_RESET==HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1))//PTT按下,按下为低
{
USBD_HID_SendReport(&hUsbDeviceFS,sendbuffer,8);//发送报文
}
else if(GPIO_PIN_SET==HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1))
{
USBD_HID_SendReport(&hUsbDeviceFS,txbuffer,8);//发送报文
}
当程序下载到开发板,电脑识别成功后,按下按键不放,记事本文档中不断输出空格,放开,空格不输出。