mirror of https://github.com/ARMmbed/mbed-os.git
Changes to make port api work.
parent
79bb66bab5
commit
af5bc356ca
|
@ -28,6 +28,7 @@ typedef struct {
|
||||||
__IO uint16_t *reg_set;
|
__IO uint16_t *reg_set;
|
||||||
__IO uint16_t *reg_clr;
|
__IO uint16_t *reg_clr;
|
||||||
__I uint32_t *reg_in;
|
__I uint32_t *reg_in;
|
||||||
|
__O uint32_t *reg_out;
|
||||||
} gpio_t;
|
} gpio_t;
|
||||||
|
|
||||||
static inline void gpio_write(gpio_t *obj, int value) {
|
static inline void gpio_write(gpio_t *obj, int value) {
|
||||||
|
|
|
@ -39,6 +39,7 @@ struct port_s {
|
||||||
__IO uint16_t *reg_clr;
|
__IO uint16_t *reg_clr;
|
||||||
PortName port;
|
PortName port;
|
||||||
uint32_t mask;
|
uint32_t mask;
|
||||||
|
PinDirection direction;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct pwmout_s {
|
struct pwmout_s {
|
||||||
|
|
|
@ -30,12 +30,14 @@ void port_init(port_t *obj, PortName port, int mask, PinDirection dir) {
|
||||||
uint32_t port_index = (uint32_t) port;
|
uint32_t port_index = (uint32_t) port;
|
||||||
|
|
||||||
GPIO_TypeDef *port_reg = (GPIO_TypeDef *)(GPIOA_BASE + (port_index << 10));
|
GPIO_TypeDef *port_reg = (GPIO_TypeDef *)(GPIOA_BASE + (port_index << 10));
|
||||||
|
// Enable GPIO peripheral clock
|
||||||
|
RCC->AHB1ENR |= 1 << port_index;
|
||||||
|
|
||||||
obj->reg_mode = &port_reg->MODER;
|
obj->reg_mode = &port_reg->MODER;
|
||||||
obj->reg_set = &port_reg->BSRRH;
|
obj->reg_set = &port_reg->BSRRH;
|
||||||
obj->reg_clr = &port_reg->BSRRL;
|
obj->reg_clr = &port_reg->BSRRL;
|
||||||
obj->reg_in = &port_reg->IDR;
|
obj->reg_in = &port_reg->IDR;
|
||||||
obj->reg_in = &port_reg->ODR;
|
obj->reg_out = &port_reg->ODR;
|
||||||
|
|
||||||
port_dir(obj, dir);
|
port_dir(obj, dir);
|
||||||
}
|
}
|
||||||
|
@ -51,18 +53,30 @@ void port_mode(port_t *obj, PinMode mode) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void port_dir(port_t *obj, PinDirection dir) {
|
void port_dir(port_t *obj, PinDirection dir) {
|
||||||
switch (dir) {
|
obj->direction = dir;
|
||||||
case PIN_INPUT : *obj->reg_mode &= ~obj->mask; break;
|
uint32_t tmp = *obj->reg_mode;
|
||||||
case PIN_OUTPUT: *obj->reg_mode |= obj->mask; break;
|
for (int i=0; i<16; i++) {
|
||||||
|
if (obj->mask & (1 << i)) {
|
||||||
|
// Clear the mode bits (i.e. set to input)
|
||||||
|
tmp &= ~(0x3 << (i << 1));
|
||||||
|
if (dir == PIN_OUTPUT) {
|
||||||
|
// Set to output
|
||||||
|
tmp |= 0x1 << (i << 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
*obj->reg_mode = tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
void port_write(port_t *obj, int value) {
|
void port_write(port_t *obj, int value) {
|
||||||
*obj->reg_out = (*obj->reg_in & ~obj->mask) | (value & obj->mask);
|
*obj->reg_out = (*obj->reg_out & ~obj->mask) | (value & obj->mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
int port_read(port_t *obj) {
|
int port_read(port_t *obj) {
|
||||||
return (*obj->reg_in & obj->mask);
|
switch (obj->direction) {
|
||||||
|
case PIN_OUTPUT: return *obj->reg_out & obj->mask;
|
||||||
|
case PIN_INPUT: return *obj->reg_in & obj->mask;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue