1 /* 2 * GPIO access for tasks. 3 * 4 * Copyright (C) 2016 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(unsigned short task) 28 { 29 u32 virtual, physical; 30 31 /* Map the I/O region to the task. */ 32 33 for (virtual = TASK_GPIO_BASE, physical = GPIO_BASE; 34 virtual < (u32) TASK_GPIO_BASE + (u32) 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(unsigned short pin) 43 { 44 TASK_REG_GPIO_PXDIRC(pin / 32) = (1 << (pin % 32)); 45 } 46 47 void task_gpio_as_output(unsigned short pin) 48 { 49 TASK_REG_GPIO_PXDIRS(pin / 32) = (1 << (pin % 32)); 50 } 51 52 inline void task_gpio_set_pin(unsigned short pin) 53 { 54 TASK_REG_GPIO_PXDATS(pin / 32) = (1 << (pin % 32)); 55 } 56 57 inline void task_gpio_clear_pin(unsigned short pin) 58 { 59 TASK_REG_GPIO_PXDATC(pin / 32) = (1 << (pin % 32)); 60 } 61 62 inline int task_gpio_get_pin(unsigned short pin) 63 { 64 return TASK_REG_GPIO_PXPIN(pin / 32) & (1 << (pin % 32)); 65 }