[Atmel] 用SAM-BA或JLINK跑ATSAM4E16的程序(20) USB HID 键盘

[复制链接]
1117|0
 楼主| ddllxxrr 发表于 2015-11-30 21:05 | 显示全部楼层 |阅读模式
今天跑一下USB HID键盘例程Studio7自带。
这个程序展示了HID键盘,由于HID Windows自动识别,所以不需要驱动程序。使用十分方便。
这个程序用了以下的模块组:
* -基本模块:
*   Startup, board, clock, interrupt, power management
* - USB堆栈和HID模块:
*   <br>services/usb/
*   <br>services/usb/udc/
*   <br>services/usb/class/hid/
*   <br>services/usb/class/hid/keyboard/
*
*    - main.c完成:
*      初使化时钟
*      初始化中断
*      管理UI
*    - 每个目标板完成如下 "./examples/product_board/":
*       - conf_foo.h   配置每个模块
*       - ui.c        用户接口(buttons, leds)

以下是UI.c的内容:


  1. #include <asf.h>
  2. #include "ui.h"

  3. /** Sequence process running each \c SEQUENCE_PERIOD ms */
  4. #define SEQUENCE_PERIOD 150

  5. /** Wakeup, ignore button change until button is back to default state */
  6. static bool btn_wakeup = false;

  7. static struct {
  8.         bool b_modifier;
  9.         bool b_down;
  10.         uint8_t value;
  11. } ui_sequence[] = {
  12.         /* Display windows menu */
  13.         {true,true,HID_MODIFIER_LEFT_UI},
  14.         /* Launch Windows Command line */
  15.         {false,true,HID_R},
  16.         {false,false,HID_R},
  17.         /* Clear modifier */
  18.         {true,false,HID_MODIFIER_LEFT_UI},
  19.         /* Tape sequence "notepad" + return */
  20.         {false,true,HID_N},
  21.         {false,false,HID_N},
  22.         {false,true,HID_O},
  23.         {false,false,HID_O},
  24.         {false,true,HID_T},
  25.         {false,false,HID_T},
  26.         {false,true,HID_E},
  27.         {false,false,HID_E},
  28.         {false,true,HID_P},
  29.         {false,false,HID_P},
  30.         {false,true,HID_A},
  31.         {false,false,HID_A},
  32.         {false,true,HID_D},
  33.         {false,false,HID_D},
  34.         {false,true,HID_ENTER},
  35.         {false,false,HID_ENTER},
  36.         /* Delay to wait "notepad" focus */
  37.         {false,false,0}, /* No key (= SEQUENCE_PERIOD delay) */
  38.         {false,false,0}, /* No key (= SEQUENCE_PERIOD delay) */
  39.         {false,false,0}, /* No key (= SEQUENCE_PERIOD delay) */
  40.         {false,false,0}, /* No key (= SEQUENCE_PERIOD delay) */
  41.         {false,false,0}, /* No key (= SEQUENCE_PERIOD delay) */
  42.         {false,false,0}, /* No key (= SEQUENCE_PERIOD delay) */
  43.         {false,false,0}, /* No key (= SEQUENCE_PERIOD delay) */
  44.         /* Display "Atmel " */
  45.         {true,true,HID_MODIFIER_RIGHT_SHIFT}, /* Enable Maj */
  46.         {false,true,HID_A},
  47.         {false,false,HID_A},
  48.         {true,false,HID_MODIFIER_RIGHT_SHIFT}, /* Disable Maj */
  49.         {false,true,HID_T},
  50.         {false,false,HID_T},
  51.         {false,true,HID_M},
  52.         {false,false,HID_M},
  53.         {false,true,HID_E},
  54.         {false,false,HID_E},
  55.         {false,true,HID_L},
  56.         {false,false,HID_L},
  57.         {false,true,HID_SPACEBAR},
  58.         {false,false,HID_SPACEBAR},
  59.         /* Display "ARM " */
  60.         {false,true,HID_CAPS_LOCK}, /* Enable caps lock */
  61.         {false,false,HID_CAPS_LOCK},
  62.         {false,true,HID_A},
  63.         {false,false,HID_A},
  64.         {false,true,HID_R},
  65.         {false,false,HID_R},
  66.         {false,true,HID_M},
  67.         {false,false,HID_M},
  68.         {false,true,HID_CAPS_LOCK}, /* Disable caps lock */
  69.         {false,false,HID_CAPS_LOCK},
  70. };

  71. /* Wakeup pin is push button (BP3, fast wakeup 10) */
  72. #define  WAKEUP_PMC_FSTT (PUSHBUTTON_2_WKUP_FSTT)
  73. #define  WAKEUP_PIN      (GPIO_PUSH_BUTTON_2)
  74. #define  WAKEUP_PIO      (PIN_PUSHBUTTON_2_PIO)
  75. #define  WAKEUP_PIO_ID   (PIN_PUSHBUTTON_2_ID)
  76. #define  WAKEUP_PIO_MASK (PIN_PUSHBUTTON_2_MASK)
  77. #define  WAKEUP_PIO_ATTR \
  78.         (PIO_INPUT | PIO_PULLUP | PIO_DEBOUNCE | PIO_IT_LOW_LEVEL)

  79. /* Interrupt on "pin change" from push button to do wakeup on USB
  80. * Note:
  81. * This interrupt is enable when the USB host enable remotewakeup feature
  82. * This interrupt wakeup the CPU if this one is in idle mode
  83. */
  84. static void ui_wakeup_handler(uint32_t id, uint32_t mask)
  85. {
  86.         if (WAKEUP_PIO_ID == id && WAKEUP_PIO_MASK == mask) {
  87.                 /* It is a wakeup then send wakeup USB */
  88.                 udc_remotewakeup();
  89.                 /* Wakeup, ignore button change until button is back to default state */
  90.                 btn_wakeup = true;
  91.                 LED_On(LED0);
  92.         }
  93. }

  94. void ui_init(void)
  95. {
  96.         /* Set handler for push button (BP3) */
  97.         pio_handler_set(WAKEUP_PIO, WAKEUP_PIO_ID, WAKEUP_PIO_MASK,
  98.                 WAKEUP_PIO_ATTR, ui_wakeup_handler);
  99.         /* Enable IRQ for button (PIOA) */
  100.         NVIC_EnableIRQ((IRQn_Type) WAKEUP_PIO_ID);
  101.         /* Initialize LEDs */
  102.         LED_Off(LED0);
  103.         LED_Off(LED1);
  104. }

  105. void ui_powerdown(void)
  106. {
  107.         LED_Off(LED0);
  108.         LED_Off(LED1);
  109. }


  110. void ui_wakeup_enable(void)
  111. {
  112.         /* Configure BP3 as PIO input */
  113.         pio_configure_pin(WAKEUP_PIN, WAKEUP_PIO_ATTR);
  114.         /* Enable interrupt for BP3 */
  115.         pio_enable_pin_interrupt(WAKEUP_PIN);
  116.         /* Enable fast wakeup for button pin (WKUP10 for PA20) */
  117.         pmc_set_fast_startup_input(WAKEUP_PMC_FSTT);
  118. }

  119. void ui_wakeup_disable(void)
  120. {
  121.         /* Disable interrupt for button pin */
  122.         pio_disable_pin_interrupt(WAKEUP_PIN);
  123.         /* Disable fast wakeup for button pin (WKUP10 for BP3) */
  124.         pmc_clr_fast_startup_input(WAKEUP_PMC_FSTT);
  125. }

  126. void ui_wakeup(void)
  127. {
  128.         LED_On(LED0);
  129. }

  130. void ui_process(uint16_t framenumber)
  131. {
  132.         bool b_btn_state, success;
  133.         static bool btn_last_state = false;
  134.         static bool sequence_running = false;
  135.         static uint8_t sequence_pos = 0;
  136.         uint8_t value;
  137.         static uint16_t cpt_sof = 0;

  138.         if ((framenumber % 1000) == 0) {
  139.                 LED_On(LED1);
  140.         }
  141.         if ((framenumber % 1000) == 500) {
  142.                 LED_Off(LED1);
  143.         }
  144.         /* Scan process running each 2ms */
  145.         cpt_sof++;
  146.         if ((cpt_sof % 2) == 0) {
  147.                 return;
  148.         }

  149.         /* Scan buttons on push button 2 (BP3) to send keys sequence */
  150.         b_btn_state = !ioport_get_pin_level(GPIO_PUSH_BUTTON_2);
  151.         if (b_btn_state != btn_last_state) {
  152.                 btn_last_state = b_btn_state;
  153.                 if (btn_wakeup) {
  154.                         if (!b_btn_state) {
  155.                                 btn_wakeup = false;
  156.                         }
  157.                 } else {
  158.                         sequence_running = true;
  159.                 }
  160.         }

  161.         /* Sequence process running each period */
  162.         if (SEQUENCE_PERIOD > cpt_sof) {
  163.                 return;
  164.         }
  165.         cpt_sof = 0;

  166.         if (sequence_running) {
  167.                 /* Send next key */
  168.                 value = ui_sequence[sequence_pos].value;
  169.                 if (value!=0) {
  170.                         if (ui_sequence[sequence_pos].b_modifier) {
  171.                                 if (ui_sequence[sequence_pos].b_down) {
  172.                                         success = udi_hid_kbd_modifier_down(value);
  173.                                 } else {
  174.                                         success = udi_hid_kbd_modifier_up(value);
  175.                                 }
  176.                         } else {
  177.                                 if (ui_sequence[sequence_pos].b_down) {
  178.                                         success = udi_hid_kbd_down(value);
  179.                                 } else {
  180.                                         success = udi_hid_kbd_up(value);
  181.                                 }
  182.                         }
  183.                         if (!success) {
  184.                                 return; /* Retry it on next schedule */
  185.                         }
  186.                 }
  187.                 /* Valid sequence position */
  188.                 sequence_pos++;
  189.                 if (sequence_pos >=
  190.                         sizeof(ui_sequence) / sizeof(ui_sequence[0])) {
  191.                         sequence_pos = 0;
  192.                         sequence_running = false;
  193.                 }
  194.         }
  195. }

  196. void ui_kbd_led(uint8_t value)
  197. {
  198.         if (value & HID_LED_CAPS_LOCK) {
  199.                 LED_On(LED2);
  200.         } else {
  201.                 LED_Off(LED2);
  202.         }
  203. }

  204. /**
  205. * \defgroup UI User Interface
  206. *
  207. * Human interface on SAM4E-EK:
  208. * - Led 0 (D2) is on when USB is wakeup
  209. * - Led 1 (D3) blinks when USB host has checked and enabled HID Mouse interface
  210. * - Led 2 (D4) displays caps lock status.
  211. * - The push button 2 (BP3) opens a notepad application on Windows O.S.
  212. *   and sends key sequence "Atmel ARM"
  213. * - Only a low level on push button 2 (BP3) will generate a wakeup to USB Host
  214. *   in remote wakeup mode.
  215. *
  216. */
程序运行结果如下:

当我下载程序后重启系统后,第一次则提示按装驱动,这是WINDOWS自动完成的。


驱动完成后,我按下K4键,则windows自动执行,notpad调出笔记本然后在笔记本上打出一行字:






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:http://shop34182318.taobao.com/ http://shop562064536.taobao.com

2404

主题

7001

帖子

68

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