GadgetSeed  0.9.6
gpio_keyboard.c
[詳解]
1 /** @file
2  @brief STM32F769I-Dicsovery 簡易キードライバ
3 
4  @date 2017.02.04
5  @author Takashi SHUDO
6 
7  @note
8 
9  PJ3 KEY3
10  PF7 KEY2
11  PC8 KEY1
12  PJ0 KEY0
13 */
14 
15 #include "interrupt.h"
16 #include "device.h"
17 #include "sysevent.h"
18 #include "key.h"
19 #include "tkprintf.h"
20 #include "timer.h"
21 
22 #include "stm32f7xx_hal.h"
23 
24 //#define DEBUGKBITS 0x03
25 #include "dkprintf.h"
26 
27 
28 #define SCANINTTIME 20 //!< スキャン間隔(20ms)
29 
30 #define KEYLINEBITS 4
31 static unsigned short key_stat; // キー状態
32 
33 static const unsigned char key_map[KEYLINEBITS] = {
34  KEY_GB_UP,
35  KEY_GB_ENTER,
36  KEY_GB_DOWN,
37  KEY_GB_ESC,
38 };
39 
40 static void MX_GPIO_Init(void)
41 {
42  GPIO_InitTypeDef GPIO_InitStruct;
43 
44  /* GPIO Ports Clock Enable */
45  __GPIOJ_CLK_ENABLE();
46  __GPIOF_CLK_ENABLE();
47  __GPIOC_CLK_ENABLE();
48 
49  /*Configure GPIO pins : PJ3 PJ0 */
50  GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_0;
51  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
52  GPIO_InitStruct.Pull = GPIO_PULLUP;
53  GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
54  HAL_GPIO_Init(GPIOJ, &GPIO_InitStruct);
55 
56  /*Configure GPIO pins : PF7 */
57  GPIO_InitStruct.Pin = GPIO_PIN_7;
58  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
59  GPIO_InitStruct.Pull = GPIO_PULLUP;
60  GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
61  HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
62 
63  /*Configure GPIO pins : PC8 */
64  GPIO_InitStruct.Pin = GPIO_PIN_8;
65  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
66  GPIO_InitStruct.Pull = GPIO_PULLUP;
67  GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
68  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
69 }
70 
71 static void init_gpio(void)
72 {
73  MX_GPIO_Init();
74 }
75 
76 static unsigned short scan_gpio(void)
77 {
78  unsigned short rt;
79 
80  /*
81  ポート状態が0ならばOn、1ならばOff
82  関数は1のビットがOn
83  */
84  rt = ~((HAL_GPIO_ReadPin(GPIOJ, GPIO_PIN_3) << 3) |
85  (HAL_GPIO_ReadPin(GPIOF, GPIO_PIN_7) << 2) |
86  (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_8) << 1) |
87  (HAL_GPIO_ReadPin(GPIOJ, GPIO_PIN_0) << 0));
88 
89  DKPRINTF(0x02, "PORT=%04X\n", (int)rt);
90 
91  return rt;
92 }
93 
94 static void scan_key(void *sp)
95 {
96  int i;
97  unsigned short mask;
98  unsigned short bit;
99  struct st_sysevent event;
100  int flg_evt = 0;
101 
102  mask = 0x0001;
103  bit = scan_gpio();
104 
105  for(i=0; i<KEYLINEBITS; i++) {
106  if(bit & mask) {
107  // 押されている
108  if((key_stat & mask) == 0) {
109  // 前は押されていなかった
110  event.what = EVT_KEYDOWN;
111  event.arg = key_map[i];
112  DKPRINTF(0x01, "EVT_KEYDOWN(%d)\n",
113  event.arg);
114  key_stat |= mask;
115  push_event_interrupt(sp, &event);
116  flg_evt = 1;
117  }
118  } else {
119  // いまは押されていなくて
120  if(key_stat & mask) {
121  // 前は押されていた
122  event.what = EVT_KEYUP;
123  event.arg = key_map[i];
124  DKPRINTF(0x01, "EVT_KEYUP(%d)\n",
125  event.arg);
126  key_stat &= ~mask;
127  push_event_interrupt(sp, &event);
128  flg_evt = 1;
129  }
130  }
131  mask <<= 1;
132  }
133 
134  // push したイベント分、カウンタを進める必要がある
135  if(flg_evt) {
137  }
138 }
139 
140 static void key_timer(void *sp, unsigned long long stime)
141 {
142  scan_key(sp);
143 }
144 
145 static int gpio_keyboard_register(struct st_device *dev, char *param)
146 {
147  key_stat = 0;
148 
149  init_gpio();
150 
151  register_timer_func(key_timer, SCANINTTIME);
152 
153  return 0;
154 }
155 
156 const struct st_device gpio_keyboard_device = {
157  .name = "keyboard",
158  .explan = "STM32F7 GPIO Keyboard x4",
159  .register_dev = gpio_keyboard_register,
160 };
#define EVT_KEYDOWN
キーを押した
Definition: sysevent.h:27
unsigned short arg
イベント引数
Definition: sysevent.h:14
int register_timer_func(timer_func func, unsigned long interval)
周期処理を追加する
Definition: timer.c:274
void set_event_interrupt(void *sp)
割り込みハンドラからシステムイベント待ちタスクを起床する
Definition: sysevent.c:158
カーネルタイマ
#define EVT_KEYUP
キーを離した
Definition: sysevent.h:28
void push_event_interrupt(void *sp, struct st_sysevent *event)
割り込みハンドラからシステムイベントを登録する
Definition: sysevent.c:146
カーネル用機能限定printf
システムイベント
割り込みハンドラ
#define SCANINTTIME
スキャン間隔(20ms)
Definition: gpio_keyboard.c:28
システムイベント
Definition: sysevent.h:12
デバイスドライバAPI
デバイスドライバ構造体
Definition: device.h:25
カーネル、ドライバ(非タスク)デバッグ用マクロ
DADG109Aキーコード定義
char name[MAX_DEVNAMELRN]
デバイス名文字列
Definition: device.h:26