[Cortex-M0技术交流] 一个最简的 USB HID(Keyboard) 示例

[复制链接]
xukaiming 发表于 2013-6-30 09:47 | 显示全部楼层
顶了以备以后看
 楼主| john_lee 发表于 2013-7-1 18:23 | 显示全部楼层
本帖最后由 john_lee 于 2013-8-11 21:14 编辑

更新了,最明显的变化就是有关 string descriptor 的部分。
  1. #include <usbd/hal/numicro/nuc.hpp>
  2. #include <usbd/hid.hpp>
  3. #include <sfr/numicro/nuc/gpio.hpp>

  4. using namespace lestl::usb;                   // 使用 lestl::usb 名空间

  5. namespace ukey {
  6. using namespace hid;                          // 使用 hid 名空间

  7. template <typename Parent, typename Param>    // 定式
  8. class ep_t                                    // 定义 Endpoint 类
  9. : public hid::in::ep_impl_t <
  10.   ep_t, Parent, Param,                        // 定式
  11.   64,                                         // 指定 wMaxPacketSize
  12.   10                                          // 指定 bInterval
  13. > { };

  14. template <typename Parent, typename Param>    // 定式
  15. class if_t : public if_impl_t <               // 定义 Interface 类
  16.   if_t, Parent, Param,                        // 定式
  17.   0,                                          // 指定 bInterfaceSubClass
  18.   1,                                          // 指定 bInterfaceProtocol
  19.   string_t <>,                                // 指定 iInterface
  20.   0x110,                                      // 指定 bcdHID
  21.   0,                                          // 指定 bCountryCode
  22.   optional_t <                                // 定义 hid optional descriptor
  23.     report_t <                                // 定义 hid report descriptor
  24.       usage_page_t <CONSUMER_DEVICE>,         // 0x05, 0x0C,      //  Usage Page (Consumer Devices),
  25.       usage_t <1>,                            // 0x09, 0x01,      //  Usage (Consumer Control),
  26.       collection_t <APPLICATION,              // 0xA1, 0x01,      //  Collection (Application),
  27.         logical_extremum_t <0, 1>,            // 0x15, 0x00,      //    Logical Minimum (0),
  28.                                               // 0x25, 0x01,      //    Logical Maximum (1),
  29.         report_size_t <1>,                    // 0x75, 0x01,      //    Report Size (1),
  30.         report_count_t <2>,                   // 0x95, 0x02,      //    Report Count (2),
  31.         usage_t <0x23, 2>,                    // 0x0A, 0x23, 0x02,//    USAGE (0x223),      // WWW Browser
  32.         usage_t <0x94, 1>,                    // 0x0A, 0x94, 0x01,//    USAGE (0x194),      // My Computer
  33.         input_t <DATA, VARIABLE, ABSOLUTE>,   // 0x81, 0x02,      //    Input (Data, Variable, Absolute),
  34.         report_count_t <6>,                   // 0x95, 0x06,      //    Report Count (6),
  35.         input_t <CONSTANT>                    // 0x81, 0x01,      //    Input (Constant)
  36.       >                                       // 0xC0             //  End Collection
  37.     >
  38.   >,
  39.   ep_t                                        // 指定本 Interface 包含的 Endpoint
  40. > {
  41. public:
  42.   __INLINE void config ()         // Interface 初始化,当 Set Configuration 时被调用
  43.   {
  44.     if_t::if_impl_t::config ();   // 使用默认的 config 处理
  45.     using namespace sfr::gpio;
  46.     *reinterpret_cast<volatile uint32_t*>(0xe000e100) = (1 << EINT0_IRQn) | (1 << EINT1_IRQn);  // NVIC 使能 EINT0、EINT1 中断
  47.     GPIOB.IEN()
  48.          .IF_EN14(1)              // 使能 EINT0 下降沿中断
  49.          .IR_EN14(1)              // 使能 EINT0 上升沿中断
  50.          .IF_EN15(1)              // 使能 EINT1 下降沿中断
  51.          .IR_EN15(1);             // 使能 EINT1 上升沿中断
  52.   }
  53. };
  54. }

  55. class usbd_t                      // 定义 USB 类
  56. : public core::usbd_impl_t <
  57.     usbd_t,                       // 定式
  58.     0x110,                        // bcdUSB
  59.     0,                            // bDeviceClass
  60.     0,                            // bDeviceSubClass
  61.     0,                            // bDeviceProtocol
  62.     64,                           // bMaxPacketSize
  63.     0x0416,                       // idVendor
  64.     0x5011,                       // idProduct
  65.     0x100,                        // bcdDevice
  66.     string_langid_t <langid_t::English_UnitedStates>,                                                           // 指定 language id
  67.     string_t <u'j', u'.', u'y', u'.', u'l', u'e', u'e', u'@', u'y', u'e', u'a', u'h', u'.', u'n', u'e', u't'>,  // iManufacture
  68.     string_t <u'U', u'S', u'B', u' ', u'渭', u'K', u'e', u'y'>,                                                 // iProduct
  69.     string_t <u'0', u'0', u'0', u'0'>,                                                                          // iSerialNumber
  70.     true,                         // bmAttributes, Bus Powered
  71.     false,                        // bmAttributes, Self Powered
  72.     false,                        // bmAttributes, Remote Wakeup
  73.     10_mA,                        // bMaxPower
  74.     string_t <>,                  // iConfiguration
  75.     ukey::if_t> {                 // 指定 usb 包含的 Interface,可连续加入多个 Function 和 Interface
  76. public:
  77.   __INLINE usbd_t () { }
  78. };

  79. usbd_t usbd;                      // 定义 USB 类对象


  80. void usbd_isr ()                  // USBD_IRQn 中断向量 handler
  81. {
  82.   usbd.isr ();                    // 调用 USB 类的中断处理
  83. }

  84. void eint0_isr ()                 // EINT0_IRQn 中断向量 handler
  85. {
  86.   static uint8_t code;
  87.   using namespace sfr::gpio;
  88.   auto pin = GPIOB.PIN();
  89.   auto isrc = GPIOB.ISRC();
  90.   GPIOB.ISRC = isrc;
  91.   if (isrc.ISRC14)
  92.     code = pin.PIN14 == 0 ? 1 : 0;  // WWW Browser
  93.   else
  94.     code = pin.PIN15 == 0 ? 2 : 0;  // My Computer
  95.   static_cast<usbd_t::if_t>(usbd).write (&code, sizeof (code));     // 使用 usbd_t::if_t 发送数据
  96. }

  97. void eint1_isr ()           // EINT1_IRQn 中断向量 handler
  98. {
  99.   eint0_isr ();
  100. }

  101. int main ()
  102. {
  103.   usbd.open (true);       // 初始化 usb 对象
  104.   while (true);
  105. }
缥缈九哥 发表于 2013-7-1 23:06 | 显示全部楼层
顶起。我们在用LOOK。
laoxu 发表于 2013-7-5 12:33 | 显示全部楼层
不错,写的很精练~~~
技美电子 发表于 2013-7-17 16:03 | 显示全部楼层
帮顶
aihe 发表于 2013-7-21 11:29 | 显示全部楼层
xuyiyi
zxcscm 发表于 2013-8-2 22:38 | 显示全部楼层
有客户在做这方面的产品 重拾M0
顶起
ilee123 发表于 2013-8-14 21:49 | 显示全部楼层
:handshake
wkman 发表于 2013-8-24 09:24 | 显示全部楼层
学习下。
kpzclxtx 发表于 2013-8-30 12:26 | 显示全部楼层
有开发板了  入手学习。。:lol
swx100 发表于 2013-10-18 13:25 | 显示全部楼层
学习啦.。。。。。。。。。。。。。。
mcuzone 发表于 2014-12-9 22:24 | 显示全部楼层
不错,顶一下
xxsun08 发表于 2015-9-24 12:08 | 显示全部楼层
向李老师学习!:handshake
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部
快速回复 在线客服 返回列表 返回顶部