历史上的今天
返回首页

历史上的今天

今天是:2024年10月17日(星期四)

正在发生

2018年10月17日 | AVR Mega8 V-USB general & multimedia keys via IR transmitor

2018-10-17 来源:eefocus

AVR <wbr>Mega8 <wbr>V-USB <wbr>general <wbr>& <wbr>multimedia <wbr>keys <wbr>via <wbr>IR <wbr>transmitor 

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    


    AVR <wbr>Mega8 <wbr>V-USB <wbr>general <wbr>& <wbr>multimedia <wbr>keys <wbr>via <wbr>IR <wbr>transmitor

        电路参考了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的简单些。值得成品应用。

推荐阅读

史海拾趣

Component Research Co公司的发展小趣事

Component Research Co最初只是一家小型电子元件研发公司,面临着激烈的市场竞争。然而,公司研发团队在一次实验中意外发现了一种新型半导体材料,这种材料具有出色的导电性能和稳定性。公司迅速将这一发现转化为实际产品,并推向市场。新产品因其卓越性能迅速受到客户青睐,Component Research Co因此名声大噪,逐渐在电子元件市场占据一席之地。

西安航天民芯公司的发展小趣事

随着公司业务的不断拓展和市场规模的逐步扩大,西安航天民芯吸引了众多投资者的关注。多家知名投资机构纷纷入股公司,为公司的发展提供了强大的资本支持。这些资金的注入不仅加速了公司的技术研发和市场拓展步伐,也为公司的持续发展注入了新的活力。

这五个故事展示了西安航天民芯公司在电子行业中的发展历程和取得的成就。通过不断地技术创新和市场拓展,西安航天民芯已经逐渐成为了电子行业中的领军企业之一,为行业的发展做出了积极的贡献。

Ememory Technology Inc公司的发展小趣事

随着电子行业的快速发展和市场竞争的加剧,eMemory始终保持着对新技术和新市场的敏锐洞察力。公司不断推出新的硅智财产品和解决方案,以满足客户不断变化的需求。同时,eMemory还积极拓展国际市场,与全球多家知名芯片设计厂商建立了长期稳定的合作关系。这些努力使得eMemory在电子行业中保持着领先地位,并为其未来的发展奠定了坚实的基础。

永丰盈(CST)公司的发展小趣事

深圳市永丰盈电子有限公司(CST)成立于2003年,初始阶段,公司只有几名员工和几台设备,专注于电子接插件产品的生产与销售。在创始人坚定的信念和团队不懈的努力下,CST逐步在市场上崭露头角。公司秉持“诚信、踏实、齐心、努力”的经营理念,通过严格的质量控制和持续的技术创新,赢得了客户的信任。

思博科技(Cybermax)公司的发展小趣事

在2005年的一个阳光明媚的春天,思博科技(Cybermax)公司在硅谷正式成立。创始人李明,一位经验丰富的电子工程师,看准了当时电子市场蓬勃发展的机遇,决定创办自己的公司。起初,公司只有几名员工,主要致力于研发和生产高性能的电子元器件。通过不懈的努力和优质的产品,思博科技逐渐在市场上崭露头角。

AverLogic公司的发展小趣事

AverLogic公司深知人才是企业发展的核心竞争力。因此,公司一直致力于人才培养和团队建设。通过定期的培训和学习,公司不断提升员工的技能和素质,打造了一支高效、专业的团队。这支团队在产品研发、市场拓展等方面都发挥了重要作用,为公司的持续发展提供了有力的保障。

问答坊 | AI 解惑

谁能出售FPGA的开发板

因为FPGA强大的功能吸引我,所以在论坛上求购二手的FPGA开发板~~~~~~…

查看全部问答>

汽车烟火定位器

爱车找不到?快用汽车烟火定位器 外出参加运动并将车停在大型户外停车场里的时候,你的爱车会很容消散在茫茫车海之中。如果对当地的情况不够熟悉,想要迅速找到自己的爱车恐怕就没那么容易了。这时,就需要通过一些特别的手段来快速定位。比如, ...…

查看全部问答>

请推荐几个wince游戏软件下载的地方

最近开始玩wince,请推荐几个好的地方,可以下载游戏,软件的.多谢拉!…

查看全部问答>

紧急咨询一个问题,关于WINCE版本

我现在用Windows Embedded CE 5.0 Platform Builder评估版的,180天的使用期限 我想知道使用它编译出来的OS,也就是NK,烧到我的设备上,是否也只能使用180天就不能用呢? 还是说仅仅是这个PB是180天的限制?…

查看全部问答>

我想问下,要ppc关机要调用哪个函数?

SetSystemPowerState(NULL,POWER_STATE_OFF,POWER_NAME);// ExitWindowsEx(EWX_SHUTDOWN,0); 这两个都没有用…

查看全部问答>

请教斑竹!STM32103TIM1中断问题

请教斑竹!STM32103 TIM1 中断问题 如果我 用TIM1 发 SVPWM 波 就不能使用void TIM1_UP_IRQHandler(void) 了?…

查看全部问答>

如何 设计开关电源

如何设计一个简单的开关电源,输出5V,3A。输入220V…

查看全部问答>

PADS2007专业教程分享

给大家分享一款最好用最实用的PCB画板专业教程。…

查看全部问答>