Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
e3da-public
contiki-ng
Commits
095a89d9
Commit
095a89d9
authored
Dec 17, 2017
by
George Oikonomou
Browse files
Adjust CC2538 CPU drivers to use the GPIO HAL
parent
10c2bcde
Changes
3
Hide whitespace changes
Inline
Side-by-side
arch/cpu/cc2538/dev/gpio.c
View file @
095a89d9
...
...
@@ -37,46 +37,13 @@
*/
#include "contiki.h"
#include "dev/leds.h"
#include "dev/gpio-hal.h"
#include "dev/gpio.h"
#include "dev/nvic.h"
#include "reg.h"
#include "lpm.h"
#include <string.h>
/**
* \brief Pointer to a function to be called when a GPIO interrupt is detected.
* Callbacks for Port A, Pins[0:7] are stored in positions [0:7] of this
* buffer, Port B callbacks in [8:15] and so on
*/
static
gpio_callback_t
gpio_callbacks
[
32
];
/*---------------------------------------------------------------------------*/
void
gpio_register_callback
(
gpio_callback_t
f
,
uint8_t
port
,
uint8_t
pin
)
{
gpio_callbacks
[(
port
<<
3
)
+
pin
]
=
f
;
}
/*---------------------------------------------------------------------------*/
/** \brief Run through all registered GPIO callbacks and invoke those
* associated with the \a port and the pins specified by \a mask
* \param mask Search callbacks associated with pins specified by this mask
* \param port Search callbacks associated with this port. Here, port is
* specified as a number between 0 and 3. Port A: 0, Port B: 1 etc */
void
notify
(
uint8_t
mask
,
uint8_t
port
)
{
uint8_t
i
;
gpio_callback_t
*
f
=
&
gpio_callbacks
[
port
<<
3
];
for
(
i
=
0
;
i
<
8
;
i
++
)
{
if
(
mask
&
(
1
<<
i
))
{
if
((
*
f
)
!=
NULL
)
{
(
*
f
)(
port
,
i
);
}
}
f
++
;
}
}
/*---------------------------------------------------------------------------*/
/** \brief Interrupt service routine for Port \a port
* \param port Number between 0 and 3. Port A: 0, Port B: 1, etc.
...
...
@@ -93,7 +60,7 @@ gpio_port_isr(uint8_t port)
int_status
=
GPIO_GET_MASKED_INT_STATUS
(
base
);
power_up_int_status
=
GPIO_GET_POWER_UP_INT_STATUS
(
port
);
notify
(
int_status
|
power_up_int_status
,
port
);
gpio_hal_event_handler
(
(
int_status
|
power_up_int_status
)
<<
(
port
<<
3
)
);
GPIO_CLEAR_INTERRUPT
(
base
,
int_status
);
GPIO_CLEAR_POWER_UP_INTERRUPT
(
port
,
power_up_int_status
);
...
...
@@ -110,9 +77,4 @@ GPIO_PORT_ISR(b, B)
GPIO_PORT_ISR
(
c
,
C
)
GPIO_PORT_ISR
(
d
,
D
)
/*---------------------------------------------------------------------------*/
void
gpio_init
()
{
memset
(
gpio_callbacks
,
0
,
sizeof
(
gpio_callbacks
));
}
/** @} */
arch/cpu/cc2538/dev/gpio.h
View file @
095a89d9
...
...
@@ -42,27 +42,12 @@
*/
#ifndef GPIO_H_
#define GPIO_H_
/*---------------------------------------------------------------------------*/
#include "contiki.h"
#include "dev/gpio-hal.h"
#include "reg.h"
#include <stdint.h>
/**
* \brief Type definition for callbacks invoked by the GPIO ISRs
* \param port The port that triggered the GPIO interrupt. \e port is passed
* by its numeric representation (Port A:0, B:1 etc). Defines for
* these numeric representations are GPIO_x_NUM
* \param pin The pin that triggered the interrupt, specified by number
* (0, 1, ..., 7)
*
* This is the prototype of a function pointer passed to
* gpio_register_callback(). These callbacks are registered on a port/pin
* basis. When a GPIO port generates an interrupt, if a callback has been
* registered for the port/pin combination, the ISR will invoke it. The ISR
* will pass the port/pin as arguments in that call, so that a developer can
* re-use the same callback for multiple port/pin combinations
*/
typedef
void
(
*
gpio_callback_t
)(
uint8_t
port
,
uint8_t
pin
);
/*---------------------------------------------------------------------------*/
/** \name Base addresses for the GPIO register instances
* @{
...
...
@@ -612,21 +597,6 @@ typedef void (* gpio_callback_t)(uint8_t port, uint8_t pin);
#define GPIO_IRQ_DETECT_UNMASK_PAIACK0 0x00000001
/**< Port A bit 0 */
/** @} */
/*---------------------------------------------------------------------------*/
/** \brief Initialise the GPIO module */
void
gpio_init
();
/**
* \brief Register GPIO callback
* \param f Pointer to a function to be called when \a pin of \a port
* generates an interrupt
* \param port Associate \a f with this port. \e port must be specified with
* its numeric representation (Port A:0, B:1 etc). Defines for these
* numeric representations are GPIO_x_NUM
* \param pin Associate \a f with this pin, which is specified by number
* (0, 1, ..., 7)
*/
void
gpio_register_callback
(
gpio_callback_t
f
,
uint8_t
port
,
uint8_t
pin
);
#endif
/* GPIO_H_ */
/**
...
...
arch/cpu/cc2538/soc.c
View file @
095a89d9
...
...
@@ -41,6 +41,7 @@
#include "dev/ioc.h"
#include "dev/nvic.h"
#include "dev/sys-ctrl.h"
#include "dev/gpio-hal.h"
#include "lpm.h"
#include "reg.h"
#include "soc.h"
...
...
@@ -123,7 +124,7 @@ soc_init()
clock_init
();
lpm_init
();
rtimer_init
();
gpio_init
();
gpio_
hal_
init
();
}
/*----------------------------------------------------------------------------*/
/** @} */
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment