XINU
gpiocontrol.c
Go to the documentation of this file.
1 
8 #include <xinu.h>
9 
10 /*------------------------------------------------------------------------
11  * gpiocontrol - Control a gpio device pin settings
12  *------------------------------------------------------------------------
13  */
15  struct dentry *devptr, /* Entry in device switch table */
16  int32 func, /* Function to perform */
17  int32 arg1, /* Argument 1 for request */
18  int32 arg2 /* Argument 2 for request */
19 )
20 {
21  struct gpio_csreg *csrptr; /* Pointer ot the CSR for GPIO */
22  struct gpiocblk *gpioptr; /* Pointer to the control block */
23 
24  csrptr = (struct gpio_csreg *)(devptr->dvcsr);
25  gpioptr = &gpiotab[devptr->dvminor];
26 
27  /* Process the request */
28 
29  switch (func)
30  {
31 
32  /* Enable output capability for pins in arg1 */
33 
34  case GPIO_OUTPUT_ENABLE:
35  csrptr->oe &= (~arg1);
36  return (devcall)OK;
37 
38  /* Disable output capability for pins in arg1 */
39 
41  csrptr->oe |= arg1;
42  return (devcall)OK;
43 
44  /* Register arg1 function pointer to be called from interrupt */
45 
47  gpioptr->gphookfn = (gpiointhook)arg1;
48  return (devcall)OK;
49 
50  /* Configure debounce capability for pins in arg2 */
51 
52  case GPIO_DEB_SET_TIME:
53  if (arg1 > 0)
54  {
55  csrptr->deb_time = (arg1 - 1) & 0xFF;
56  csrptr->deb_ena |= arg2;
57  }
58  else
59  {
60  csrptr->deb_ena &= (~arg2);
61  }
62  return (devcall)OK;
63 
64  /* Configure interrupt capability for pins in arg2 */
65 
66  case GPIO_INTERRUPT_CTL:
67 
68  /* No lines affected */
69 
70  if ((arg1 & GPIO_INT_ALL_LINES) == 0)
71  {
72  return (devcall)SYSERR;
73  }
74 
75  /* Disable lines and triggers */
76 
77  if ((arg1 & GPIO_INT_ALL_TRIG) == 0)
78  {
79 
80  /* Flags affect line 0 */
81 
82  if ((arg1 & GPIO_INT_LINE0_EN) != 0)
83  {
84  csrptr->irqclear0 = arg2;
85  }
86 
87  /* Flags affect line 1 */
88 
89  if ((arg1 & GPIO_INT_LINE1_EN) != 0)
90  {
91  csrptr->irqclear1 = arg2;
92  }
93 
94  /* Disable all triggers */
95 
96  csrptr->rising &= (~arg2);
97  csrptr->falling &= (~arg2);
98  csrptr->level0 &= (~arg2);
99  csrptr->level1 &= (~arg2);
100 
101  return (devcall)OK;
102  }
103 
104  /* Enable lines and triggers */
105 
106  if ((arg1 & GPIO_INT_LINE0_EN) != 0)
107  {
108  csrptr->irqset0 = arg2;
109  }
110  if ((arg1 & GPIO_INT_LINE1_EN) != 0)
111  {
112  csrptr->irqset1 = arg2;
113  }
114  if ((arg1 & GPIO_INT_RISE_TRIG) != 0)
115  {
116  csrptr->rising |= arg2;
117  }
118  if ((arg1 & GPIO_INT_FALL_TRIG) != 0)
119  {
120  csrptr->falling |= arg2;
121  }
122  if ((arg1 & GPIO_INT_LVL0_TRIG) != 0)
123  {
124  csrptr->level0 |= arg2;
125  }
126  if ((arg1 & GPIO_INT_LVL1_TRIG) != 0)
127  {
128  csrptr->level1 |= arg2;
129  }
130 
131  return (devcall)OK;
132 
133  /* Read input from a single pin arg1 */
134 
135  case GPIO_READ_PIN:
136  arg2 = csrptr->datain & PIN_MASK(arg1);
137  return (arg2 > 0);
138 
139  /* Write value arg2 to a single output pin arg1 */
140 
141  case GPIO_WRITE_PIN:
142  if (arg2)
143  {
144  csrptr->set_data = PIN_MASK(arg1);
145  }
146  else
147  {
148  csrptr->clear_data = PIN_MASK(arg1);
149  }
150  return (devcall)OK;
151 
152  default:
153  return (devcall)SYSERR;
154  }
155 }
#define GPIO_INT_LINE1_EN
Definition: gpio.h:106
#define GPIO_OUTPUT_ENABLE
Definition: gpio.h:96
#define GPIO_INT_LINE0_EN
Definition: gpio.h:105
#define GPIO_DEB_SET_TIME
Definition: gpio.h:99
#define GPIO_INTERRUPT_CTL
Definition: gpio.h:98
struct gpiocblk gpiotab[]
Definition: gpioinit.c:5
devcall gpiocontrol(struct dentry *devptr, int32 func, int32 arg1, int32 arg2)
Definition: gpiocontrol.c:14
volatile uint32 irqset1
Definition: gpio.h:23
int32 dvminor
Definition: conf.h:8
全てのシステムヘッダファイルをインクルードする。
#define SYSERR
処理が失敗した場合
Definition: kernel.h:79
#define GPIO_INT_RISE_TRIG
Definition: gpio.h:107
#define OK
処理が成功した場合
Definition: kernel.h:77
#define GPIO_INT_LVL1_TRIG
Definition: gpio.h:110
volatile uint32 deb_ena
Definition: gpio.h:39
volatile uint32 oe
Definition: gpio.h:32
volatile uint32 level1
Definition: gpio.h:36
gpiointhook gphookfn
Definition: gpio.h:49
#define GPIO_OUTPUT_DISABLE
Definition: gpio.h:95
#define GPIO_INT_FALL_TRIG
Definition: gpio.h:108
Definition: conf.h:6
#define GPIO_REG_INT_HANDLER
Definition: gpio.h:97
volatile uint32 rising
Definition: gpio.h:37
volatile uint32 set_data
Definition: gpio.h:43
volatile uint32 clear_data
Definition: gpio.h:42
Definition: gpio.h:48
void(* gpiointhook)(uint32, uint32)
Definition: gpio.h:46
int int32
符号あり32ビット整数(int)
Definition: kernel.h:11
volatile uint32 irqset0
Definition: gpio.h:22
#define GPIO_INT_ALL_TRIG
Definition: gpio.h:112
volatile uint32 falling
Definition: gpio.h:38
volatile uint32 irqclear0
Definition: gpio.h:24
volatile uint32 datain
Definition: gpio.h:33
#define GPIO_READ_PIN
Definition: gpio.h:100
#define GPIO_WRITE_PIN
Definition: gpio.h:101
#define GPIO_INT_ALL_LINES
Definition: gpio.h:111
volatile uint32 deb_time
Definition: gpio.h:40
volatile uint32 irqclear1
Definition: gpio.h:25
int32 devcall
デバイスコール関数 返り値の型
Definition: kernel.h:49
#define PIN_MASK(pin)
Definition: gpio.h:55
void * dvcsr
Definition: conf.h:19
#define GPIO_INT_LVL0_TRIG
Definition: gpio.h:109
volatile uint32 level0
Definition: gpio.h:35