Skip to content

Commit 04cbae4

Browse files
authored
Merge pull request #3711 from bigmagic123/fix_ls2k_irq
Fix ls2k irq
2 parents a572799 + 1ec681a commit 04cbae4

File tree

11 files changed

+473
-61
lines changed

11 files changed

+473
-61
lines changed

bsp/ls2kdev/.config

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,18 @@ CONFIG_FINSH_ARG_MAX=10
104104
#
105105
# Device virtual file system
106106
#
107-
# CONFIG_RT_USING_DFS is not set
107+
CONFIG_RT_USING_DFS=y
108+
CONFIG_DFS_USING_WORKDIR=y
109+
CONFIG_DFS_FILESYSTEMS_MAX=2
110+
CONFIG_DFS_FILESYSTEM_TYPES_MAX=2
111+
CONFIG_DFS_FD_MAX=16
112+
# CONFIG_RT_USING_DFS_MNTTABLE is not set
113+
# CONFIG_RT_USING_DFS_ELMFAT is not set
114+
CONFIG_RT_USING_DFS_DEVFS=y
115+
# CONFIG_RT_USING_DFS_ROMFS is not set
116+
# CONFIG_RT_USING_DFS_RAMFS is not set
117+
# CONFIG_RT_USING_DFS_UFFS is not set
118+
# CONFIG_RT_USING_DFS_JFFS2 is not set
108119

109120
#
110121
# Device Drivers
@@ -148,6 +159,10 @@ CONFIG_RT_USING_PIN=y
148159
#
149160
CONFIG_RT_USING_LIBC=y
150161
# CONFIG_RT_USING_PTHREADS is not set
162+
CONFIG_RT_USING_POSIX=y
163+
# CONFIG_RT_USING_POSIX_MMAP is not set
164+
# CONFIG_RT_USING_POSIX_TERMIOS is not set
165+
# CONFIG_RT_USING_POSIX_AIO is not set
151166
# CONFIG_RT_USING_MODULE is not set
152167

153168
#

bsp/ls2kdev/drivers/drv_gpio.c

Lines changed: 132 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,25 +8,14 @@
88
* 2017-10-20 ZYH add mode open drain and input pull down
99
* 2020-06-01 Du Huanpeng GPIO driver based on <components/drivers/include/drivers/pin.h>
1010
*/
11-
12-
1311
#include <rtthread.h>
1412
#include <drivers/pin.h>
15-
#include <rthw.h>
1613
#include <ls2k1000.h>
17-
18-
struct loongson_gpio {
19-
rt_uint64_t GPIO0_OEN;
20-
rt_uint64_t GPIO1_OEN; /* Reserved */
21-
rt_uint64_t GPIO0_O;
22-
rt_uint64_t GPIO1_O; /* Reserved */
23-
rt_uint64_t GPIO0_I;
24-
rt_uint64_t GPIO1_I; /* Reserved */
25-
rt_uint64_t GPIO0_INTEN;
26-
rt_uint64_t GPIO1_INTEN; /* Reserved */
27-
};
14+
#include "drv_gpio.h"
2815

2916
#ifdef RT_USING_PIN
17+
#define GPIO_IRQ_NUM (64)
18+
static struct gpio_irq_def _g_gpio_irq_tbl[GPIO_IRQ_NUM];
3019

3120
static void loongson_pin_mode(struct rt_device *device, rt_base_t pin, rt_base_t mode)
3221
{
@@ -92,13 +81,36 @@ static int loongson_pin_read(struct rt_device *device, rt_base_t pin)
9281
return rc;
9382
}
9483

95-
/* TODO: add GPIO interrupt */
84+
/* TODO: add GPIO interrupt */
9685
static rt_err_t loongson_pin_attach_irq(struct rt_device *device, rt_int32_t pin, rt_uint32_t mode, void (*hdr)(void *args), void *args)
9786
{
87+
rt_uint8_t index;
88+
rt_uint64_t m;
9889
struct loongson_gpio *gpio;
9990

10091
gpio = (void *)device->user_data;
10192

93+
if(pin < 4)
94+
{
95+
index = pin;
96+
}
97+
else if(pin < 32)
98+
{
99+
index = 5;
100+
}
101+
else
102+
{
103+
index = 6;
104+
}
105+
106+
_g_gpio_irq_tbl[index].irq_cb[pin] = hdr;
107+
_g_gpio_irq_tbl[index].irq_arg[pin] = args;
108+
_g_gpio_irq_tbl[index].irq_type[pin] = mode;
109+
110+
liointc_set_irq_mode(index, mode);
111+
m = (rt_uint64_t)1 << pin;
112+
gpio->GPIO0_INTEN |= m;
113+
102114
return RT_EOK;
103115
}
104116
static rt_err_t loongson_pin_detach_irq(struct rt_device *device, rt_int32_t pin)
@@ -107,6 +119,24 @@ static rt_err_t loongson_pin_detach_irq(struct rt_device *device, rt_int32_t pin
107119

108120
gpio = (void *)device->user_data;
109121

122+
rt_uint8_t index;
123+
if(pin < 4)
124+
{
125+
index = pin;
126+
}
127+
else if(pin < 32)
128+
{
129+
index = 5;
130+
}
131+
else
132+
{
133+
index = 6;
134+
}
135+
_g_gpio_irq_tbl[index].irq_cb[pin] = RT_NULL;
136+
_g_gpio_irq_tbl[index].irq_arg[pin] = RT_NULL;
137+
_g_gpio_irq_tbl[index].irq_type[pin] = RT_NULL;
138+
_g_gpio_irq_tbl[index].state[pin] = RT_NULL;
139+
110140
return RT_EOK;
111141
}
112142
static rt_err_t loongson_pin_irq_enable(struct rt_device *device, rt_base_t pin, rt_uint32_t enabled)
@@ -115,9 +145,72 @@ static rt_err_t loongson_pin_irq_enable(struct rt_device *device, rt_base_t pin,
115145

116146
gpio = (void *)device->user_data;
117147

148+
rt_uint8_t index;
149+
if(pin < 4)
150+
{
151+
index = pin;
152+
}
153+
else if(pin < 32)
154+
{
155+
index = 5;
156+
}
157+
else
158+
{
159+
index = 6;
160+
}
161+
162+
if (enabled)
163+
_g_gpio_irq_tbl[index].state[pin] = 1;
164+
else
165+
_g_gpio_irq_tbl[index].state[pin] = 0;
118166
return RT_EOK;
119167
}
120168

169+
static void gpio_irq_handler(int irq, void *param)
170+
{
171+
struct gpio_irq_def *irq_def = (struct gpio_irq_def *)param;
172+
rt_uint32_t pin;
173+
rt_uint32_t value;
174+
rt_uint32_t tmpvalue;
175+
176+
if(irq == LS2K_GPIO0_INT_IRQ)
177+
{
178+
pin = 0;
179+
}
180+
else if(irq == LS2K_GPIO1_INT_IRQ)
181+
{
182+
pin = 1;
183+
}
184+
else if(irq == LS2K_GPIO2_INT_IRQ)
185+
{
186+
pin = 2;
187+
}
188+
else if(irq == LS2K_GPIO3_INT_IRQ)
189+
{
190+
pin = 3;
191+
}
192+
else if(irq == LS2K_GPIO_INTLO_IRQ)
193+
{
194+
pin = 4;
195+
}
196+
else
197+
{
198+
pin = 32;
199+
}
200+
201+
while (value)
202+
{
203+
if ((value & 0x1) && (irq_def->irq_cb[pin] != RT_NULL))
204+
{
205+
if(irq_def->state[pin])
206+
{
207+
irq_def->irq_cb[pin](irq_def->irq_arg[pin]);
208+
}
209+
}
210+
pin++;
211+
value = value >> 1;
212+
}
213+
}
121214

122215
static struct rt_pin_ops loongson_pin_ops = {
123216
.pin_mode = loongson_pin_mode,
@@ -139,6 +232,30 @@ int loongson_pin_init(void)
139232
loongson_gpio_priv = (void *)GPIO_BASE;
140233
rc = rt_device_pin_register("pin", &loongson_pin_ops, loongson_gpio_priv);
141234

235+
//gpio0
236+
rt_hw_interrupt_install(LS2K_GPIO0_INT_IRQ, gpio_irq_handler, &_g_gpio_irq_tbl[0], "gpio0_irq");
237+
rt_hw_interrupt_umask(LS2K_GPIO0_INT_IRQ);
238+
239+
//gpio1
240+
rt_hw_interrupt_install(LS2K_GPIO1_INT_IRQ, gpio_irq_handler, &_g_gpio_irq_tbl[1], "gpio1_irq");
241+
rt_hw_interrupt_umask(LS2K_GPIO1_INT_IRQ);
242+
243+
//gpio2
244+
rt_hw_interrupt_install(LS2K_GPIO2_INT_IRQ, gpio_irq_handler, &_g_gpio_irq_tbl[2], "gpio2_irq");
245+
rt_hw_interrupt_umask(LS2K_GPIO2_INT_IRQ);
246+
247+
//gpio3
248+
rt_hw_interrupt_install(LS2K_GPIO3_INT_IRQ, gpio_irq_handler, &_g_gpio_irq_tbl[3], "gpio3_irq");
249+
rt_hw_interrupt_umask(LS2K_GPIO3_INT_IRQ);
250+
251+
//gpio4~gpio31
252+
rt_hw_interrupt_install(LS2K_GPIO_INTLO_IRQ, gpio_irq_handler, &_g_gpio_irq_tbl[4], "gpio4_irq");
253+
rt_hw_interrupt_umask(LS2K_GPIO_INTLO_IRQ);
254+
255+
//gpio32~gpio63
256+
rt_hw_interrupt_install(LS2K_GPIO_INTHI_IRQ, gpio_irq_handler, &_g_gpio_irq_tbl[5], "gpio5_irq");
257+
rt_hw_interrupt_umask(LS2K_GPIO_INTHI_IRQ);
258+
142259
return rc;
143260
}
144261
INIT_BOARD_EXPORT(loongson_pin_init);

bsp/ls2kdev/drivers/drv_gpio.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,26 @@
1313
#ifndef __DRV_GPIO_H__
1414
#define __DRV_GPIO_H__
1515

16+
#include <rthw.h>
17+
18+
struct gpio_irq_def
19+
{
20+
void *irq_arg[32];
21+
void (*irq_cb[32])(void *param);
22+
rt_uint8_t irq_type[32];
23+
rt_uint8_t state[32];
24+
};
25+
26+
struct loongson_gpio {
27+
rt_uint64_t GPIO0_OEN;
28+
rt_uint64_t GPIO1_OEN; /* Reserved */
29+
rt_uint64_t GPIO0_O;
30+
rt_uint64_t GPIO1_O; /* Reserved */
31+
rt_uint64_t GPIO0_I;
32+
rt_uint64_t GPIO1_I; /* Reserved */
33+
rt_uint64_t GPIO0_INTEN;
34+
rt_uint64_t GPIO1_INTEN; /* Reserved */
35+
};
1636

1737
int loongson_pin_init(void);
1838

bsp/ls2kdev/drivers/drv_uart.c

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ struct rt_uart_ls2k
2828
rt_uint32_t IRQ;
2929
};
3030

31-
static rt_err_t mipssim_uart_configure(struct rt_serial_device *serial, struct serial_configure *cfg)
31+
static rt_err_t ls2k_uart_configure(struct rt_serial_device *serial, struct serial_configure *cfg)
3232
{
3333
struct rt_uart_ls2k *uart_dev = RT_NULL;
3434

@@ -48,7 +48,7 @@ static rt_err_t mipssim_uart_configure(struct rt_serial_device *serial, struct s
4848
return RT_EOK;
4949
}
5050

51-
static rt_err_t mipssim_uart_control(struct rt_serial_device *serial, int cmd, void *arg)
51+
static rt_err_t ls2k_uart_control(struct rt_serial_device *serial, int cmd, void *arg)
5252
{
5353
struct rt_uart_ls2k *uart_dev = RT_NULL;
5454

@@ -88,7 +88,7 @@ static rt_bool_t uart_is_transmit_empty(struct rt_uart_ls2k *uart_dev)
8888
}
8989
}
9090

91-
static int mipssim_uart_putc(struct rt_serial_device *serial, char c)
91+
static int ls2k_uart_putc(struct rt_serial_device *serial, char c)
9292
{
9393
struct rt_uart_ls2k *uart_dev = RT_NULL;
9494

@@ -104,7 +104,7 @@ static int mipssim_uart_putc(struct rt_serial_device *serial, char c)
104104
return 1;
105105
}
106106

107-
static int mipssim_uart_getc(struct rt_serial_device *serial)
107+
static int ls2k_uart_getc(struct rt_serial_device *serial)
108108
{
109109
struct rt_uart_ls2k *uart_dev = RT_NULL;
110110

@@ -141,18 +141,18 @@ static void uart_irq_handler(int vector, void *param)
141141

142142
}
143143

144-
static const struct rt_uart_ops mipssim_uart_ops =
144+
static const struct rt_uart_ops ls2k_uart_ops =
145145
{
146-
mipssim_uart_configure,
147-
mipssim_uart_control,
148-
mipssim_uart_putc,
149-
mipssim_uart_getc,
146+
ls2k_uart_configure,
147+
ls2k_uart_control,
148+
ls2k_uart_putc,
149+
ls2k_uart_getc,
150150
};
151151

152152
struct rt_uart_ls2k uart_dev0 =
153153
{
154-
(void *)UART0_BASE,
155-
4,
154+
(void *)UARTx_BASE(0),
155+
LS2K_UART_0_1_2_3_IRQ,
156156
};
157157
struct rt_serial_device serial;
158158

@@ -164,7 +164,7 @@ void rt_hw_uart_init(void)
164164

165165
uart = &uart_dev0;
166166

167-
serial.ops = &mipssim_uart_ops;
167+
serial.ops = &ls2k_uart_ops;
168168
serial.config = config;
169169

170170
rt_hw_interrupt_install(uart->IRQ, uart_irq_handler, &serial, "UART");

bsp/ls2kdev/drivers/drv_uart.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
*
66
* Change Logs:
77
* Date Author Notes
8-
* 2019-04-05 bigmagic Initial version
8+
* 2020-04-05 bigmagic Initial version
99
*/
1010

1111
#ifndef _DRV_UART_H__

0 commit comments

Comments
 (0)