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 #include "gpio.h" 27 28 void task_gpio_init(uint8_t task) 29 { 30 uint32_t virtual, physical; 31 32 /* Map the I/O region to the task. */ 33 34 for (virtual = TASK_GPIO_BASE, physical = GPIO_BASE_PHYSICAL; 35 virtual < (uint32_t) TASK_GPIO_BASE + (uint32_t) GPIO_REGION_SIZE; 36 virtual += page_size(STAGE2_PAGESIZE), physical += page_size(STAGE2_PAGESIZE)) 37 { 38 init_page_table(STAGE2_PAGE_TABLE_BASE, virtual, physical, 39 page_size(STAGE2_PAGESIZE), TLB_UNCACHED | TLB_DIRTY | TLB_VALID, task); 40 } 41 } 42 43 void task_gpio_as_input(uint8_t pin) 44 { 45 void *gpio_port_base = jz4740_gpio_get_port((void *) TASK_GPIO_BASE, pin / 32); 46 jz4740_gpio_as_input(gpio_port_base, pin % 32); 47 } 48 49 void task_gpio_as_output(uint8_t pin) 50 { 51 void *gpio_port_base = jz4740_gpio_get_port((void *) TASK_GPIO_BASE, pin / 32); 52 jz4740_gpio_as_output(gpio_port_base, pin % 32); 53 } 54 55 void task_gpio_enable_pull(uint8_t pin) 56 { 57 void *gpio_port_base = jz4740_gpio_get_port((void *) TASK_GPIO_BASE, pin / 32); 58 jz4740_gpio_enable_pull(gpio_port_base, pin % 32); 59 } 60 61 void task_gpio_disable_pull(uint8_t pin) 62 { 63 void *gpio_port_base = jz4740_gpio_get_port((void *) TASK_GPIO_BASE, pin / 32); 64 jz4740_gpio_disable_pull(gpio_port_base, pin % 32); 65 } 66 67 int task_gpio_get_pin(uint8_t pin) 68 { 69 void *gpio_port_base = jz4740_gpio_get_port((void *) TASK_GPIO_BASE, pin / 32); 70 return jz4740_gpio_get_pin(gpio_port_base, pin % 32); 71 } 72 73 void task_gpio_set_pin(uint8_t pin) 74 { 75 void *gpio_port_base = jz4740_gpio_get_port((void *) TASK_GPIO_BASE, pin / 32); 76 jz4740_gpio_set_pin(gpio_port_base, pin % 32); 77 } 78 79 void task_gpio_clear_pin(uint8_t pin) 80 { 81 void *gpio_port_base = jz4740_gpio_get_port((void *) TASK_GPIO_BASE, pin / 32); 82 jz4740_gpio_clear_pin(gpio_port_base, pin % 32); 83 } 84 85 void task_gpio_mask_irq(uint8_t pin) 86 { 87 void *gpio_port_base = jz4740_gpio_get_port((void *) TASK_GPIO_BASE, pin / 32); 88 jz4740_gpio_mask_irq(gpio_port_base, pin % 32); 89 } 90 91 void task_gpio_unmask_irq(uint8_t pin) 92 { 93 void *gpio_port_base = jz4740_gpio_get_port((void *) TASK_GPIO_BASE, pin / 32); 94 jz4740_gpio_unmask_irq(gpio_port_base, pin % 32); 95 }