Skip to content

Commit

Permalink
[update][gpio] support output with input mode, support user pupd in i…
Browse files Browse the repository at this point in the history
…nt mode
  • Loading branch information
sakumisue committed Nov 3, 2023
1 parent 0bb2bbc commit ff68f62
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 54 deletions.
20 changes: 10 additions & 10 deletions drivers/lhal/include/bflb_gpio.h
Original file line number Diff line number Diff line change
Expand Up @@ -163,25 +163,25 @@
#define GPIO_FUNC_CLKOUT (31 << GPIO_FUNC_SHIFT)
#endif

#define GPIO_MODE_SHIFT (5) /* Bits 5-6: Port Mode */
#define GPIO_MODE_MASK (3 << GPIO_MODE_SHIFT)
#define GPIO_INPUT (0 << GPIO_MODE_SHIFT) /* Input Enable */
#define GPIO_OUTPUT (1 << GPIO_MODE_SHIFT) /* Output Enable */
#define GPIO_ANALOG (2 << GPIO_MODE_SHIFT) /* Analog Enable */
#define GPIO_ALTERNATE (3 << GPIO_MODE_SHIFT) /* Alternate Enable */

#define GPIO_PUPD_SHIFT (7) /* Bits 7-8: Pull-up/down */
#define GPIO_MODE_SHIFT (5) /* Bits 5-8: Port Mode */
#define GPIO_MODE_MASK (0xf << GPIO_MODE_SHIFT)
#define GPIO_INPUT (1 << 5) /* Input Enable */
#define GPIO_OUTPUT (1 << 6) /* Output Enable */
#define GPIO_ANALOG (1 << 7) /* Analog Enable */
#define GPIO_ALTERNATE (1 << 8) /* Alternate Enable */

#define GPIO_PUPD_SHIFT (9) /* Bits 9-10: Pull-up/down */
#define GPIO_PUPD_MASK (3 << GPIO_PUPD_SHIFT)
#define GPIO_FLOAT (0 << GPIO_PUPD_SHIFT) /* No pull-up, pull-down */
#define GPIO_PULLUP (1 << GPIO_PUPD_SHIFT) /* Pull-up */
#define GPIO_PULLDOWN (2 << GPIO_PUPD_SHIFT) /* Pull-down */

#define GPIO_SMT_SHIFT (9) /* Bits 9: SMT Enable */
#define GPIO_SMT_SHIFT (11) /* Bits 11: SMT Enable */
#define GPIO_SMT_MASK (1 << GPIO_SMT_SHIFT)
#define GPIO_SMT_DIS (0 << GPIO_SMT_SHIFT)
#define GPIO_SMT_EN (1 << GPIO_SMT_SHIFT)

#define GPIO_DRV_SHIFT (10) /* Bits 10-11: Drive */
#define GPIO_DRV_SHIFT (12) /* Bits 12-13: Drive */
#define GPIO_DRV_MASK (3 << GPIO_DRV_SHIFT)
#define GPIO_DRV_0 (0 << GPIO_DRV_SHIFT)
#define GPIO_DRV_1 (1 << GPIO_DRV_SHIFT)
Expand Down
71 changes: 33 additions & 38 deletions drivers/lhal/src/bflb_gpio.c
Original file line number Diff line number Diff line change
Expand Up @@ -64,31 +64,30 @@ void bflb_gpio_init(struct bflb_device_s *dev, uint8_t pin, uint32_t cfgset)
cfg &= ~(0xffff << (16 * is_odd));

regval = getreg32(reg_base + GLB_GPIO_CFGCTL34_OFFSET + ((pin >> 5) << 2));
if (mode == GPIO_INPUT) {
cfg |= (1 << (is_odd * 16 + 0));
regval &= ~(1 << (pin & 0x1f));
function = 11;
} else if (mode == GPIO_OUTPUT) {
regval |= (1 << (pin & 0x1f));
function = 11;
#if defined(BL702L)
if (function == 22) {
regval &= ~(1 << (pin & 0x1f));
}
#endif
} else if (mode == GPIO_ANALOG) {

if (mode & GPIO_ANALOG) {
regval &= ~(1 << (pin & 0x1f));
function = 10;
} else if (mode == GPIO_ALTERNATE) {
} else if (mode & GPIO_ALTERNATE) {
cfg |= (1 << (is_odd * 16 + 0));
regval &= ~(1 << (pin & 0x1f));
#if defined(BL702L)
if (function == 22) {
cfg &= ~(1 << (is_odd * 16 + 0));
}
#endif
regval &= ~(1 << (pin & 0x1f));
} else {
function = 11;

if (mode & GPIO_INPUT) {
cfg |= (1 << (is_odd * 16 + 0));
}

if (mode & GPIO_OUTPUT) {
regval |= (1 << (pin & 0x1f));
}
}

putreg32(regval, reg_base + GLB_GPIO_CFGCTL34_OFFSET + ((pin >> 5) << 2));

if (cfgset & GPIO_PULLUP) {
Expand All @@ -112,33 +111,28 @@ void bflb_gpio_init(struct bflb_device_s *dev, uint8_t pin, uint32_t cfgset)
#endif

#if defined(BL702)
#define HBN_BASE_ ((uint32_t)0x4000F000)
#define HBN_BASE ((uint32_t)0x4000F000)
#define HBN_IRQ_MODE_OFFSET (0x14)
#define HBN_REG_AON_PAD_IE_SMT_SHIFT (8U)
#define HBN_REG_AON_PAD_IE_SMT_MASK (0x1f << HBN_REG_AON_PAD_IE_SMT_SHIFT)
/* always on pads IE control (in HBN) */
if (pin >= 9 && pin <= 13) {
regval = getreg32(HBN_BASE_ + HBN_IRQ_MODE_OFFSET);
regval = getreg32(HBN_BASE + HBN_IRQ_MODE_OFFSET);
uint32_t aon_pad_ie_smt = (regval & HBN_REG_AON_PAD_IE_SMT_MASK) >> HBN_REG_AON_PAD_IE_SMT_SHIFT;

if (mode != GPIO_ANALOG) {
if (mode & GPIO_ANALOG) {
/* clear AON pad IE */
aon_pad_ie_smt &= ~(1 << (pin - 9));
} else {
/* not analog mode */

if (mode == GPIO_OUTPUT) {
aon_pad_ie_smt &= ~(1 << (pin - 9));
} else {
if (mode & GPIO_INPUT) {
aon_pad_ie_smt |= (1 << (pin - 9));
}
} else {
/* analog mode */

/* clear AON pad IE */
aon_pad_ie_smt &= ~(1 << (pin - 9));
}

regval &= ~HBN_REG_AON_PAD_IE_SMT_MASK;
regval |= (aon_pad_ie_smt << HBN_REG_AON_PAD_IE_SMT_SHIFT);
putreg32(regval, HBN_BASE_ + HBN_IRQ_MODE_OFFSET);
putreg32(regval, HBN_BASE + HBN_IRQ_MODE_OFFSET);
}

/* Pins 23...28: SF pad use exclusive IE/PD/PU/DRIVE/SMTCTRL */
Expand All @@ -156,17 +150,20 @@ void bflb_gpio_init(struct bflb_device_s *dev, uint8_t pin, uint32_t cfgset)
cfg = 0;
cfg |= GLB_REG_GPIO_0_INT_MASK;

if (mode == GPIO_INPUT) {
cfg |= GLB_REG_GPIO_0_IE;
function = 11;
} else if (mode == GPIO_OUTPUT) {
cfg |= GLB_REG_GPIO_0_OE;
function = 11;
} else if (mode == GPIO_ANALOG) {
if (mode & GPIO_ANALOG) {
function = 10;
} else if (mode == GPIO_ALTERNATE) {
} else if (mode & GPIO_ALTERNATE) {
cfg |= GLB_REG_GPIO_0_IE;
} else {
function = 11;

if (mode & GPIO_INPUT) {
cfg |= GLB_REG_GPIO_0_IE;
}

if (mode & GPIO_OUTPUT) {
cfg |= GLB_REG_GPIO_0_OE;
}
}

if (cfgset & GPIO_PULLUP) {
Expand Down Expand Up @@ -271,8 +268,6 @@ void bflb_gpio_int_init(struct bflb_device_s *dev, uint8_t pin, uint8_t trig_mod

reg_base = dev->reg_base;

bflb_gpio_init(dev, pin, GPIO_INPUT | GPIO_FLOAT);

bflb_gpio_int_mask(dev, pin, true);
bflb_gpio_int_clear(dev, pin);

Expand Down
9 changes: 3 additions & 6 deletions examples/peripherals/gpio/gpio_interrupt/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,11 @@ int set_int_mode(int argc, char **argv)
printf("Set gpio interrupt triggle mode to %d\r\n", atoi(argv[1]));
}

bflb_irq_disable(gpio->irq_num);
bflb_gpio_init(gpio, GPIO_PIN_0, GPIO_INPUT | GPIO_FLOAT | GPIO_SMT_EN);
bflb_gpio_int_init(gpio, GPIO_PIN_0, atoi(argv[1]));
bflb_gpio_int_mask(gpio, GPIO_PIN_0, false);
bflb_irq_attach(gpio->irq_num, gpio_isr, NULL);
bflb_irq_enable(gpio->irq_num);

return 0;
Expand All @@ -48,14 +51,8 @@ int main(void)
uart0 = bflb_device_get_by_name("uart0");
printf("gpio interrupt\r\n");

bflb_gpio_int_init(gpio, GPIO_PIN_0, GPIO_INT_TRIG_MODE_SYNC_LOW_LEVEL);
bflb_gpio_int_mask(gpio, GPIO_PIN_0, false);

shell_init();

bflb_irq_attach(gpio->irq_num, gpio_isr, gpio);
bflb_irq_enable(gpio->irq_num);

while (1) {
while ((ch = bflb_uart_getchar(uart0)) != -1) {
shell_handler(ch);
Expand Down

0 comments on commit ff68f62

Please sign in to comment.