1 /* 2 * GPIO access for tasks. 3 * 4 * Copyright (C) 2016, 2017 Paul Boddie <paul@boddie.org.uk> 5 * 6 * This program is free software: you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation, either version 3 of the License, or 9 * (at your option) any later version. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with this program. If not, see <http://www.gnu.org/licenses/>. 18 */ 19 20 #include "board.h" 21 #include "mips.h" 22 #include "cpu.h" 23 #include "paging.h" 24 #include "memory.h" 25 #include "task_gpio.h" 26 27 void task_gpio_init(uint8_t task) 28 { 29 uint32_t virtual, physical; 30 31 /* Map the I/O region to the task. */ 32 33 for (virtual = TASK_GPIO_BASE, physical = GPIO_BASE_PHYSICAL; 34 virtual < (uint32_t) TASK_GPIO_BASE + (uint32_t) GPIO_REGION_SIZE; 35 virtual += page_size(STAGE2_PAGESIZE), physical += page_size(STAGE2_PAGESIZE)) 36 { 37 init_page_table(STAGE2_PAGE_TABLE_BASE, virtual, physical, 38 page_size(STAGE2_PAGESIZE), TLB_UNCACHED | TLB_DIRTY | TLB_VALID, task); 39 } 40 } 41 42 void task_gpio_as_input(uint8_t pin) 43 { 44 TASK_REG_GPIO_PXFUNC(pin / 32) = (1 << (pin % 32)); 45 TASK_REG_GPIO_PXSELC(pin / 32) = (1 << (pin % 32)); 46 TASK_REG_GPIO_PXDIRC(pin / 32) = (1 << (pin % 32)); 47 } 48 49 void task_gpio_as_output(uint8_t pin) 50 { 51 TASK_REG_GPIO_PXFUNC(pin / 32) = (1 << (pin % 32)); 52 TASK_REG_GPIO_PXSELC(pin / 32) = (1 << (pin % 32)); 53 TASK_REG_GPIO_PXDIRS(pin / 32) = (1 << (pin % 32)); 54 } 55 56 void task_gpio_enable_pull(uint8_t pin) 57 { 58 TASK_REG_GPIO_PXPEC(pin / 32) = (1 << (pin % 32)); 59 } 60 61 void task_gpio_disable_pull(uint8_t pin) 62 { 63 TASK_REG_GPIO_PXPES(pin / 32) = (1 << (pin % 32)); 64 } 65 66 inline int task_gpio_get_pin(uint8_t pin) 67 { 68 return TASK_REG_GPIO_PXPIN(pin / 32) & (1 << (pin % 32)); 69 } 70 71 inline void task_gpio_set_pin(uint8_t pin) 72 { 73 TASK_REG_GPIO_PXDATS(pin / 32) = (1 << (pin % 32)); 74 } 75 76 inline void task_gpio_clear_pin(uint8_t pin) 77 { 78 TASK_REG_GPIO_PXDATC(pin / 32) = (1 << (pin % 32)); 79 } 80 81 inline void task_gpio_mask_irq(uint8_t pin) 82 { 83 TASK_REG_GPIO_PXIMS(pin / 32) = (1 << (pin % 32)); 84 } 85 86 inline void task_gpio_unmask_irq(uint8_t pin) 87 { 88 TASK_REG_GPIO_PXIMC(pin / 32) = (1 << (pin % 32)); 89 }