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 = next_page(virtual, STAGE2_PAGESIZE), 37 physical = next_page(physical, STAGE2_PAGESIZE)) 38 { 39 init_page_table(STAGE2_PAGE_TABLE_BASE, virtual, physical, 40 STAGE2_PAGESIZE, TLB_UNCACHED | TLB_DIRTY | TLB_VALID, task); 41 } 42 } 43 44 void task_gpio_as_input(uint8_t pin) 45 { 46 void *gpio_port_base = jz4740_gpio_get_port((void *) TASK_GPIO_BASE, pin / 32); 47 jz4740_gpio_as_input(gpio_port_base, pin % 32); 48 } 49 50 void task_gpio_as_output(uint8_t pin) 51 { 52 void *gpio_port_base = jz4740_gpio_get_port((void *) TASK_GPIO_BASE, pin / 32); 53 jz4740_gpio_as_output(gpio_port_base, pin % 32); 54 } 55 56 void task_gpio_enable_pull(uint8_t pin) 57 { 58 void *gpio_port_base = jz4740_gpio_get_port((void *) TASK_GPIO_BASE, pin / 32); 59 jz4740_gpio_enable_pull(gpio_port_base, pin % 32); 60 } 61 62 void task_gpio_disable_pull(uint8_t pin) 63 { 64 void *gpio_port_base = jz4740_gpio_get_port((void *) TASK_GPIO_BASE, pin / 32); 65 jz4740_gpio_disable_pull(gpio_port_base, pin % 32); 66 } 67 68 int task_gpio_get_pin(uint8_t pin) 69 { 70 void *gpio_port_base = jz4740_gpio_get_port((void *) TASK_GPIO_BASE, pin / 32); 71 return jz4740_gpio_get_pin(gpio_port_base, pin % 32); 72 } 73 74 void task_gpio_set_pin(uint8_t pin) 75 { 76 void *gpio_port_base = jz4740_gpio_get_port((void *) TASK_GPIO_BASE, pin / 32); 77 jz4740_gpio_set_pin(gpio_port_base, pin % 32); 78 } 79 80 void task_gpio_clear_pin(uint8_t pin) 81 { 82 void *gpio_port_base = jz4740_gpio_get_port((void *) TASK_GPIO_BASE, pin / 32); 83 jz4740_gpio_clear_pin(gpio_port_base, pin % 32); 84 } 85 86 void task_gpio_mask_irq(uint8_t pin) 87 { 88 void *gpio_port_base = jz4740_gpio_get_port((void *) TASK_GPIO_BASE, pin / 32); 89 jz4740_gpio_mask_irq(gpio_port_base, pin % 32); 90 } 91 92 void task_gpio_unmask_irq(uint8_t pin) 93 { 94 void *gpio_port_base = jz4740_gpio_get_port((void *) TASK_GPIO_BASE, pin / 32); 95 jz4740_gpio_unmask_irq(gpio_port_base, pin % 32); 96 }