历史上的今天
今天是:2024年10月17日(星期四)
2018年10月17日 | AVR Mega8 V-USB general & multimedia keys via IR transmitor
2018-10-17 来源:eefocus
http://www.obdev.at/products/vusb/index.html
USB1.1 模拟实现的开源项目。
本次实验用途:红外电脑遥控,主要是音量控制,MediaPlayer播放器的控制。
解决方案:Mega8接红外传感器,解码后,由USB 模拟的多媒体键盘,向主机发送转译的键控信息。
参考V-USB范例,项目中添加如下文件
main.c(参考samples)
usbconfig.h(修改USB设备参数)
asmcommon.inc
usbdrv.c
usbdrv.h
oddebug.c
oddebug.h
usbdrvasm16.inc(根据晶振选择,这里选用16MHz)
usbdrvasm.S
usbportability.h

电路参考了V-USB的原始电路。
在文件 usbconfig.h 中修改
#define USB_CFG_VENDOR_ID 0x5e, 0x04
#define USB_CFG_DEVICE_ID 0x0b, 0x00
这里的Vid/Pid参数时来模拟Microsoft USB Natural Keyboard设备的,Windows系统加载时自带驱动。
main()主程式中的HID设备报告描述改为如下结构:
PROGMEM char usbHidReportDescriptor[82] = {
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x06, // USAGE (Keyboard)
0xa1, 0x01, // COLLECTION (Application)
0x85, 0x01, //Report ID (1)
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)
0x25, 0x65, // LOGICAL_MAXIMUM (101)
0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated))
0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application)
0x81, 0x00, // INPUT (Data,Ary,Abs)
0xc0, // END_COLLECTION
0x05, 0x0c, // USAGE_PAGE (Consumer Page)
0x09, 0x01, // USAGE (Consumer Control)
0xa1, 0x01, // COLLECTION (Application)
0x85, 0x02, //Report ID (2)
0x09, 0xea, // USAGE (Volume Decrement)
0x09, 0xe9, // USAGE (Volume Increment)
0x09, 0xb5, // USAGE (Track Next)
0x09, 0xb6, // USAGE (Track Previous)
0x09, 0xcd, // USAGE (Play/Pause)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x95, 0x05, // REPORT_COUNT (5)
0x75, 0x01, // REPORT_SIZE (1)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x05, 0x07, // USAGE_PAGE (Generic Desktop)
0x09, 0x00, // USAGE ()
0x75, 0x01, // REPORT_SIZE (1)
0x95, 0x02, // REPORT_COUNT (1)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x95, 0x01, // REPORT_COUNT (2)
0x75, 0x01, // REPORT_SIZE (1)
0x81, 0x03, // INPUT (Cnst,Var,Abs)
0xc0 // END_COLLECTION
};
这样修改的目的是USB EndPoint传送两种类型的HID报告。
一类是普通键盘的,HID Usage Page代码07。一类是多媒体键盘的,HIDUsagePage代码0c。
详细参考usb.org官方的《Device Class Definition for Human Interface Devices (HID)》文档。
usbHidReportDescriptor数组的长度现在是82,同步修改文件 usbconfig.h 中
#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 82
HID报告描述处理:
源程式中reportBuffer 修改为
static unsigned char reportBuffer[]={0,0,0};
reportBuffer[0] 表示 reportID 字段
在report id为 1 的时候/
reportBuffer[1] 表示 普通键盘shift/ctrl/alt的掩码位
reportBuffer[2] 表示 普通键盘键值,如发送F1(0x3A),发送数组为{0x01, 0x00, 0x3A}、
report id为 1 报告发送函数:
usbSetInterrupt((void *)&reportBuffer, sizeof(reportBuffer));
或
usbSetInterrupt((void *)&reportBuffer, 3);
在report id为 2 的时候/
reportBuffer[1] 表示多媒体键盘的控制掩码位(参考usbHidReportDescriptor/Report ID (2)段)
reportBuffer[1],
0位USAGE (Volume Decrement);
1位USAGE (Volume Increment);
2位USAGE (Track Next);
3位USAGE (Track Previous);
4位USAGE (Play/Pause)
reportBuffer[2] 没有用到。
在report id为 2 报告发送函数:
usbSetInterrupt((void *)&reportBuffer, 2); //因为只定义了两个字节的报告数据实验中IR处理用了AVR的ICP。
需要注意的是,发送按键HID报告后,紧接着发送同类型的零数据HID报告。否则系统会认为之前的按键一直保持按下状态。
例如,发送了普通按键F1 的HID报告{0x01, 0x00, 0x3A},紧接着发送{0x01, 0x00, 0x00}。
整体上V-USB 1.1的协议,比PDIUSBD12芯片没太大区别。成本却低不少。代码也比PDIUSBD12的简单些。值得成品应用。
史海拾趣
|
我现在用Windows Embedded CE 5.0 Platform Builder评估版的,180天的使用期限 我想知道使用它编译出来的OS,也就是NK,烧到我的设备上,是否也只能使用180天就不能用呢? 还是说仅仅是这个PB是180天的限制?… 查看全部问答> |
|
SetSystemPowerState(NULL,POWER_STATE_OFF,POWER_NAME);// ExitWindowsEx(EWX_SHUTDOWN,0); 这两个都没有用… 查看全部问答> |
|
请教斑竹!STM32103 TIM1 中断问题 如果我 用TIM1 发 SVPWM 波 就不能使用void TIM1_UP_IRQHandler(void) 了?… 查看全部问答> |




