mirror of https://github.com/ARMmbed/mbed-os.git
Update port api driver to add missing ports
This patch updates port api driver to add missing ports. Signed-off-by: Marc Moreno <marc.morenoberengue@arm.com>pull/4557/head
parent
8de4c5323f
commit
6b04bb364f
|
|
@ -22,7 +22,9 @@ extern "C" {
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
Port0 = 0,
|
Port0 = 0,
|
||||||
Port1 = 1
|
Port1,
|
||||||
|
Port2,
|
||||||
|
Port3,
|
||||||
} PortName;
|
} PortName;
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
||||||
|
|
@ -17,26 +17,45 @@
|
||||||
#include "pinmap.h"
|
#include "pinmap.h"
|
||||||
#include "gpio_api.h"
|
#include "gpio_api.h"
|
||||||
|
|
||||||
|
#define MAX_GPIO_PINS 16
|
||||||
|
|
||||||
PinName port_pin(PortName port, int pin_n)
|
PinName port_pin(PortName port, int pin_n)
|
||||||
{
|
{
|
||||||
|
if (pin_n < 0 || pin_n > MAX_GPIO_PINS) {
|
||||||
|
error("Invalid GPIO pin number %d", pin_n);
|
||||||
|
}
|
||||||
|
|
||||||
return (PinName)((port << PORT_SHIFT) | pin_n);
|
return (PinName)((port << PORT_SHIFT) | pin_n);
|
||||||
}
|
}
|
||||||
|
|
||||||
void port_init(port_t *obj, PortName port, int mask, PinDirection dir)
|
void port_init(port_t *obj, PortName port, int mask, PinDirection dir)
|
||||||
{
|
{
|
||||||
|
uint32_t i;
|
||||||
|
CMSDK_GPIO_TypeDef *port_reg;
|
||||||
|
|
||||||
|
switch (port) {
|
||||||
|
case Port0:
|
||||||
|
port_reg = (CMSDK_GPIO_TypeDef *)(CMSDK_GPIO0_BASE);
|
||||||
|
break;
|
||||||
|
case Port1:
|
||||||
|
port_reg = (CMSDK_GPIO_TypeDef *)(CMSDK_GPIO1_BASE);
|
||||||
|
break;
|
||||||
|
case Port2:
|
||||||
|
port_reg = (CMSDK_GPIO_TypeDef *)(CMSDK_GPIO2_BASE);
|
||||||
|
break;
|
||||||
|
case Port3:
|
||||||
|
port_reg = (CMSDK_GPIO_TypeDef *)(CMSDK_GPIO3_BASE);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
obj->port = port;
|
obj->port = port;
|
||||||
obj->mask = mask;
|
obj->mask = mask;
|
||||||
|
|
||||||
CMSDK_GPIO_TypeDef *port_reg = (CMSDK_GPIO_TypeDef *)(CMSDK_GPIO0_BASE
|
|
||||||
+ ((int)port * 0x10));
|
|
||||||
|
|
||||||
obj->reg_in = &port_reg->DATAOUT;
|
obj->reg_in = &port_reg->DATAOUT;
|
||||||
obj->reg_dir = &port_reg->OUTENABLESET;
|
obj->reg_dir = &port_reg->OUTENABLESET;
|
||||||
obj->reg_dirclr = &port_reg->OUTENABLECLR;
|
obj->reg_dirclr = &port_reg->OUTENABLECLR;
|
||||||
|
|
||||||
uint32_t i;
|
/* The function is set per pin: reuse gpio logic */
|
||||||
// The function is set per pin: reuse gpio logic
|
for (i=0; i < MAX_GPIO_PINS; i++) {
|
||||||
for (i=0; i<16; i++) {
|
|
||||||
if (obj->mask & (1<<i)) {
|
if (obj->mask & (1<<i)) {
|
||||||
gpio_set(port_pin(obj->port, i));
|
gpio_set(port_pin(obj->port, i));
|
||||||
}
|
}
|
||||||
|
|
@ -48,8 +67,8 @@ void port_init(port_t *obj, PortName port, int mask, PinDirection dir)
|
||||||
void port_mode(port_t *obj, PinMode mode)
|
void port_mode(port_t *obj, PinMode mode)
|
||||||
{
|
{
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
// The mode is set per pin: reuse pinmap logic
|
/* The mode is set per pin: reuse pinmap logic */
|
||||||
for (i=0; i<32; i++) {
|
for (i=0; i < MAX_GPIO_PINS; i++) {
|
||||||
if (obj->mask & (1 << i)) {
|
if (obj->mask & (1 << i)) {
|
||||||
pin_mode(port_pin(obj->port, i), mode);
|
pin_mode(port_pin(obj->port, i), mode);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue