1
1
Files
zyxel-vmg8825_b50b-cfw/package/boot/uboot-zyxel/files/lib_zloader/rt2880_gpio.c
T
2026-04-17 18:33:03 +02:00

124 lines
3.5 KiB
C

/*
***************************************************************************
* Ralink Tech Inc.
* 4F, No. 2 Technology 5th Rd.
* Science-based Industrial Park
* Hsin-chu, Taiwan, R.O.C.
*
* (c) Copyright, Ralink Technology, 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 2 of the License, or (at your
* option) any later version.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
* NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 675 Mass Ave, Cambridge, MA 02139, USA.
*
*
***************************************************************************
*/
#include <common.h>
#include <command.h>
#ifdef CONFIG_RT2880_GPIO
#include "rt2880_gpio.h"
#include <zgpio.h>
#define MAX_GPIO_NUM 31
/*----------------------------------------------
* GPIO export functions
*/
int configure_pio(int pio, int dir)
{
unsigned long tmpCtrl, tmpOE;
volatile unsigned long *gpioctrl;
int gpioctrl_bits;
if ( pio<0 || pio >MAX_GPIO_NUM ) {
return -1;
}
gpioctrl_bits = pio;
if ( pio > 15 ) {
gpioctrl_bits -= 16;
gpioctrl = (volatile unsigned long *)RALINK_REG_PIO3116DIR;
} else {
gpioctrl = (volatile unsigned long *)RALINK_REG_PIODIR;
}
/* clear: default to set GPIO as input pin */
tmpCtrl = le32_to_cpu(*gpioctrl)&(~(0x3<<(gpioctrl_bits*2)));
tmpOE = le32_to_cpu(*(volatile unsigned long *)(RALINK_REG_GPIOOE))&(~(0x1<<pio));
switch ( dir ) {
case ZGPIO_CONFIG_OUTPUT:
tmpCtrl |= 0x1<<(gpioctrl_bits*2);
tmpOE |= 0x1<<pio;
break;
case ZGPIO_CONFIG_INPUT:
/* nothing need to do */
break;
default:
return -2;
}
*gpioctrl = cpu_to_le32(tmpCtrl);
*(volatile u32 *)(RALINK_REG_GPIOOE) = cpu_to_le32(tmpOE);
return 0;
}
int set_pio(int pio, int level)
{
unsigned long tmp;
if ( pio<0 || pio >MAX_GPIO_NUM ) {
return -1;
}
tmp = le32_to_cpu(*(volatile u32 *)(RALINK_REG_PIODATA));
switch (level) {
case ZGPIO_LEVEL_LOW:
tmp &= (~(1<<pio));
break;
case ZGPIO_LEVEL_HIGH:
tmp |= (1<<pio);
break;
default:
return -2;
}
*(volatile u32 *)(RALINK_REG_PIODATA) = cpu_to_le32(tmp);
return 0;
}
int get_pio(int pio, int *level)
{
if ( pio<0 || pio >MAX_GPIO_NUM ) {
return -1;
}
*level = (le32_to_cpu(*(volatile u32 *)(RALINK_REG_PIODATA))&(1<<pio))?ZGPIO_LEVEL_HIGH:ZGPIO_LEVEL_LOW;
return 0;
}
int max_pio_num(void)
{
return MAX_GPIO_NUM;
}
#ifdef CONFIG_ZGPIO_CMD
void dump_pio_regs(void)
{
puts("Not support!");
}
#endif
#endif