NanoPayload

stage2/task_gpio.c

216:95be7694d999
2017-06-28 Paul Boddie Employ structure member names to make initialisation clearer.
     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 }