GadgetSeed  0.9.6
gpio.c
[詳解]
1 /** @file
2  @brief STM32F411 Nucreo 汎用GPIOドライバ
3 
4  @date 2015.10.17
5  @author Takashi SHUDO
6 
7  @note
8 
9  PH1 D0
10 */
11 
12 #include "device.h"
13 #include "device/gpio_ioctl.h"
14 #include "tkprintf.h"
15 
16 #include "stm32f4xx_hal.h"
17 
18 static void MX_GPIO_Init(GPIO_TypeDef *gpio, unsigned int pin, unsigned int mode)
19 {
20  GPIO_InitTypeDef GPIO_InitStruct;
21 
22  __GPIOH_CLK_ENABLE();
23 
24  GPIO_InitStruct.Pin = pin;
25  GPIO_InitStruct.Mode = mode;
26 // GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
27  GPIO_InitStruct.Pull = GPIO_PULLUP;
28  GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
29  HAL_GPIO_Init(gpio, &GPIO_InitStruct);
30 }
31 
32 static int gpio_register(struct st_device *dev, char *param)
33 {
34  MX_GPIO_Init(GPIOH, GPIO_PIN_1, GPIO_MODE_INPUT); // デフォルトは入力
35 
36  return 0;
37 }
38 
39 static int gpio_getc(struct st_device *dev, unsigned char *rd)
40 {
41  int rtn = 0;
42 
43  return rtn;
44 }
45 
46 static int gpio_putc(struct st_device *dev, unsigned char data)
47 {
48  if((data & 0x01) != 0) {
49  HAL_GPIO_WritePin(GPIOH, GPIO_PIN_1, GPIO_PIN_SET);
50  } else {
51  HAL_GPIO_WritePin(GPIOH, GPIO_PIN_1, GPIO_PIN_RESET);
52  }
53 
54  return 1;
55 }
56 
57 static int gpio_ioctl(struct st_device *dev, unsigned int com, unsigned int arg, void *param)
58 {
59  switch(com) {
61  switch(arg) {
62  case IOARG_GPIO_INPUT:
63  MX_GPIO_Init(GPIOH, GPIO_PIN_1, GPIO_MODE_INPUT);
64  break;
65 
66  case IOARG_GPIO_OUTPUT:
67  MX_GPIO_Init(GPIOH, GPIO_PIN_1, GPIO_MODE_OUTPUT_PP);
68  break;
69 
70  default:
71  SYSERR_PRINT("Unknow command %08lX arg %08lX\n", com, arg);
72  break;
73  }
74  break;
75 
77  HAL_GPIO_WritePin(GPIOH, GPIO_PIN_1, GPIO_PIN_SET);
78  break;
79 
81  HAL_GPIO_WritePin(GPIOH, GPIO_PIN_1, GPIO_PIN_RESET);
82  break;
83 
84  default:
85  SYSERR_PRINT("Unknow command %08lX arg %08lX\n", com, arg);
86  return -1;
87  }
88 
89  return 0;
90 }
91 
92 const struct st_device gpio_device = {
94  .explan = "STM32F4 GPIO",
95  .register_dev = gpio_register,
96  .getc = gpio_getc,
97  .putc = gpio_putc,
98  .ioctl = gpio_ioctl,
99 };
#define IOARG_GPIO_OUTPUT
GPIO出力設定(arg設定値)
Definition: gpio_ioctl.h:19
#define IOCMD_GPIO_DIRECTION
GPIO入出力設定
Definition: gpio_ioctl.h:17
#define DEF_DEV_NAME_GPIO
標準GPIOデバイス名
Definition: gpio_ioctl.h:15
GPIOドライバ ioctl 用マクロ定義
#define IOCMD_GPIO_SET_BITS
GPIO High(1)出力
Definition: gpio_ioctl.h:20
カーネル用機能限定printf
#define IOCMD_GPIO_CLEAR_BITS
GPIO Low(0)出力
Definition: gpio_ioctl.h:21
#define IOARG_GPIO_INPUT
GPIO入力設定(arg設定値)
Definition: gpio_ioctl.h:18
デバイスドライバAPI
デバイスドライバ構造体
Definition: device.h:25
char name[MAX_DEVNAMELRN]
デバイス名文字列
Definition: device.h:26