diff options
Diffstat (limited to 'usrp2/firmware/lib/hal_io.c')
-rw-r--r-- | usrp2/firmware/lib/hal_io.c | 323 |
1 files changed, 0 insertions, 323 deletions
diff --git a/usrp2/firmware/lib/hal_io.c b/usrp2/firmware/lib/hal_io.c deleted file mode 100644 index 1a370687ed..0000000000 --- a/usrp2/firmware/lib/hal_io.c +++ /dev/null @@ -1,323 +0,0 @@ -/* -*- c -*- */ -/* - * Copyright 2007,2008 Free Software Foundation, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -// conditionalized on HAL_IO_USES_DBOARD_PINS && HAL_IO_USES_UART - -#include "hal_io.h" -#include "memory_map.h" -#include "hal_uart.h" -#include "bool.h" -#include <stdio.h> -#include <string.h> -//#include <assert.h> - -/* - * ======================================================================== - * GPIOS - * ======================================================================== - */ -void -hal_gpio_set_ddr(int bank, int value, int mask) -{ - bank &= 0x1; - - if (bank == GPIO_TX_BANK){ // tx in top half - value <<= 16; - mask <<= 16; - } - else { - value &= 0xffff; - mask &= 0xffff; - } - - int ei = hal_disable_ints(); - gpio_base->ddr = (gpio_base->ddr & ~mask) | (value & mask); - hal_restore_ints(ei); -} - -static bool -code_to_int(char code, int *val) -{ - switch(code){ - case 's': *val = GPIO_SEL_SW; return true; - case 'a': *val = GPIO_SEL_ATR; return true; - case '0': *val = GPIO_SEL_DEBUG_0; return true; - case '1': *val = GPIO_SEL_DEBUG_1; return true; - case '.': - default: - return false; - } -} - -void -hal_gpio_set_sel(int bank, int bitno, char code) -{ - bank &= 0x1; - int t; - - if (!code_to_int(code, &t)) - return; - - int val = t << (2 * bitno); - int mask = 0x3 << (2 * bitno); - - volatile uint32_t *sel = bank == GPIO_TX_BANK ? &gpio_base->tx_sel : &gpio_base->rx_sel; - int ei = hal_disable_ints(); - int v = (*sel & ~mask) | (val & mask); - *sel = v; - hal_restore_ints(ei); - - if (0) - printf("hal_gpio_set_sel(bank=%d, bitno=%d, code=%c) *sel = 0x%x\n", - bank, bitno, code, v); -} - -void -hal_gpio_set_sels(int bank, char *codes) -{ - //assert(strlen(codes) == 16); - - int val = 0; - int mask = 0; - int i; - - for (i = 15; i >= 0; i--){ - val <<= 2; - mask <<= 2; - int t; - if (code_to_int(codes[i], &t)){ - val |= t; - mask |= 0x3; - } - } - - volatile uint32_t *sel = bank == GPIO_TX_BANK ? &gpio_base->tx_sel : &gpio_base->rx_sel; - int ei = hal_disable_ints(); - *sel = (*sel & ~mask) | (val & mask); - hal_restore_ints(ei); -} - - -/*! - * \brief write \p value to gpio pins specified by \p mask. - */ -void -hal_gpio_write(int bank, int value, int mask) -{ - static uint32_t _gpio_io_shadow; - - bank &= 0x1; - - if (bank == GPIO_TX_BANK){ // tx in top half - value <<= 16; - mask <<= 16; - } - else { - value &= 0xffff; - mask &= 0xffff; - } - - //int ei = hal_disable_ints(); - _gpio_io_shadow = (_gpio_io_shadow & ~mask) | (value & mask); - gpio_base->io = _gpio_io_shadow; - //hal_restore_ints(ei); -} - - -/*! - * \brief read GPIO bits - */ -int -hal_gpio_read(int bank) -{ - bank &= 0x1; - int r = gpio_base->io; - if (bank == GPIO_TX_BANK) - r >>= 16; - - return r & 0xffff; -} - -/* - * ======================================================================== - * leds - * ======================================================================== - */ - -static unsigned long leds_shadow = 0; -static unsigned long led_src_shadow = 0; - -void -hal_set_leds(int value, int mask) -{ - int ei = hal_disable_ints(); - leds_shadow = (leds_shadow & ~mask) | (value & mask); - output_regs->leds = leds_shadow; - hal_restore_ints(ei); -} - -// Allow hardware control over leds. 1 = hardware, 0 = software -void -hal_set_led_src(int value, int mask) -{ - int ei = hal_disable_ints(); - led_src_shadow = (led_src_shadow & ~mask) | (value & mask); - output_regs->led_src = led_src_shadow; - hal_restore_ints(ei); -} - -void -hal_toggle_leds(int mask) -{ - int ei = hal_disable_ints(); - leds_shadow ^= mask; - output_regs->leds = leds_shadow; - hal_restore_ints(ei); -} - - -// ================================================================ -// primitives -// ================================================================ - -#if defined(HAL_IO_USES_DBOARD_PINS) -// -// Does i/o using high 9-bits of rx daughterboard pins. -// -// 1 1 1 1 1 1 -// 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 -// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -// | char |W| | -// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -// -// -// Asserts W when writing char -// - -#define W 0x0080 - -void -hal_io_init(void) -{ - // make high 9 bits of tx daughterboard outputs - hal_gpio_set_rx_mode(15, 7, GPIOM_OUTPUT); - - // and set them to zero - hal_gpio_set_rx(0x0000, 0xff80); -} - -void -hal_finish(void) -{ - volatile unsigned long *p = (unsigned long *) 0xC2F0; - *p = 0; -} - -// %c -inline int -putchar(int ch) -{ - hal_gpio_set_rx((s << 8) | W, 0xff80); - hal_gpio_set_rx(0, 0xff80); - return ch; -} - -#elif defined(HAL_IO_USES_UART) - -void -hal_io_init(void) -{ - hal_uart_init(); -} - -void -hal_finish(void) -{ -} - -// %c -inline int -putchar(int ch) -{ - hal_uart_putc(ch); - return ch; -} - -int -getchar(void) -{ - return hal_uart_getc(); -} - -#else // nop all i/o - -void -hal_io_init(void) -{ -} - -void -hal_finish(void) -{ -} - -// %c -inline int -putchar(int ch) -{ - return ch; -} - -int -getchar(void) -{ - return EOF; -} - -#endif - -// ================================================================ -// (slightly) higher level functions -// -// These are here so we can inline the calls to putchar. -// The rest of the stuff was moved to nonstdio.c -// ================================================================ - -// \n -inline void -newline(void) -{ - putchar('\n'); -} - -int -putstr(const char *s) -{ - while (*s) - putchar(*s++); - - return 0; -} - -int -puts(const char *s) -{ - putstr(s); - putchar('\n'); - return 0; -} |