diff options
| author | fishsoupisgood <github@madingley.org> | 2019-04-29 01:17:54 +0100 | 
|---|---|---|
| committer | fishsoupisgood <github@madingley.org> | 2019-05-27 03:43:43 +0100 | 
| commit | 3f2546b2ef55b661fd8dd69682b38992225e86f6 (patch) | |
| tree | 65ca85f13617aee1dce474596800950f266a456c /roms/u-boot/board/altera/common | |
| download | qemu-master.tar.gz qemu-master.tar.bz2 qemu-master.zip  | |
Diffstat (limited to 'roms/u-boot/board/altera/common')
| -rw-r--r-- | roms/u-boot/board/altera/common/cfide.c | 33 | ||||
| -rw-r--r-- | roms/u-boot/board/altera/common/epled.c | 46 | ||||
| -rw-r--r-- | roms/u-boot/board/altera/common/sevenseg.c | 204 | ||||
| -rw-r--r-- | roms/u-boot/board/altera/common/sevenseg.h | 126 | 
4 files changed, 409 insertions, 0 deletions
diff --git a/roms/u-boot/board/altera/common/cfide.c b/roms/u-boot/board/altera/common/cfide.c new file mode 100644 index 00000000..40d6a12b --- /dev/null +++ b/roms/u-boot/board/altera/common/cfide.c @@ -0,0 +1,33 @@ +/* + * Altera CF drvier + * + * (C) Copyright 2010, Thomas Chou <thomas@wytron.com.tw> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#include <common.h> +#include <asm/io.h> + +#if defined(CONFIG_IDE_RESET) && defined(CONFIG_SYS_CF_CTL_BASE) +/* ide_set_reset for Altera CF interface */ +#define ALTERA_CF_CTL_STATUS			0 +#define ALTERA_CF_IDE_CTL			4 +#define ALTERA_CF_CTL_STATUS_PRESENT_MSK	(0x1) +#define ALTERA_CF_CTL_STATUS_POWER_MSK		(0x2) +#define ALTERA_CF_CTL_STATUS_RESET_MSK		(0x4) +#define ALTERA_CF_CTL_STATUS_IRQ_EN_MSK	(0x8) +#define ALTERA_CF_IDE_CTL_IRQ_EN_MSK		(0x1) + +void ide_set_reset(int idereset) +{ +	int i; +	writel(idereset ? ALTERA_CF_CTL_STATUS_RESET_MSK : +	       ALTERA_CF_CTL_STATUS_POWER_MSK, +	       CONFIG_SYS_CF_CTL_BASE + ALTERA_CF_CTL_STATUS); +	/* wait 500 ms for power to stabilize */ +	for (i = 0; i < 500; i++) +		udelay(1000); +} +#endif diff --git a/roms/u-boot/board/altera/common/epled.c b/roms/u-boot/board/altera/common/epled.c new file mode 100644 index 00000000..580d590f --- /dev/null +++ b/roms/u-boot/board/altera/common/epled.c @@ -0,0 +1,46 @@ +/* + * (C) Copyright 2004, Psyent Corporation <www.psyent.com> + * Scott McNutt <smcnutt@psyent.com> + * + * SPDX-License-Identifier:	GPL-2.0+ + */ + +#include <common.h> +#include <asm/io.h> +#include <nios2-io.h> +#include <status_led.h> + +/* The LED port is configured as output only, so we + * must track the state manually. + */ +static led_id_t val = 0; + +void __led_init (led_id_t mask, int state) +{ +	nios_pio_t *pio = (nios_pio_t *)CONFIG_SYS_LEDPIO_ADDR; + +	if (state == STATUS_LED_ON) +		val &= ~mask; +	else +		val |= mask; +	writel (val, &pio->data); +} + +void __led_set (led_id_t mask, int state) +{ +	nios_pio_t *pio = (nios_pio_t *)CONFIG_SYS_LEDPIO_ADDR; + +	if (state == STATUS_LED_ON) +		val &= ~mask; +	else +		val |= mask; +	writel (val, &pio->data); +} + +void __led_toggle (led_id_t mask) +{ +	nios_pio_t *pio = (nios_pio_t *)CONFIG_SYS_LEDPIO_ADDR; + +	val ^= mask; +	writel (val, &pio->data); +} diff --git a/roms/u-boot/board/altera/common/sevenseg.c b/roms/u-boot/board/altera/common/sevenseg.c new file mode 100644 index 00000000..1f22c852 --- /dev/null +++ b/roms/u-boot/board/altera/common/sevenseg.c @@ -0,0 +1,204 @@ +/* + * (C) Copyright 2003, Li-Pro.Net <www.li-pro.net> + * Stephan Linz <linz@li-pro.net> + * + * SPDX-License-Identifier:	GPL-2.0+ + * + * common/sevenseg.c + * + * NIOS PIO based seven segment led support functions + */ + +#include <common.h> +#include <nios-io.h> + +#ifdef	CONFIG_SEVENSEG + +#define SEVENDEG_MASK_DP	((SEVENSEG_DIGIT_DP << 8) | SEVENSEG_DIGIT_DP) + +#ifdef	SEVENSEG_WRONLY	/* emulate read access */ +#if (SEVENSEG_ACTIVE == 0) +static unsigned int sevenseg_portval = ~0; +#else +static unsigned int sevenseg_portval = 0; +#endif +#endif + +static int sevenseg_init_done = 0; + +static inline void __sevenseg_set_masked (unsigned int mask, int value) +{ +	nios_pio_t *piop __attribute__((unused)) = (nios_pio_t*)SEVENSEG_BASE; + +#ifdef	SEVENSEG_WRONLY	/* emulate read access */ + +#if (SEVENSEG_ACTIVE == 0) +	if (value) +		sevenseg_portval &= ~mask; +	else +		sevenseg_portval |= mask; +#else +	if (value) +		sevenseg_portval |= mask; +	else +		sevenseg_portval &= ~mask; +#endif + +	piop->data = sevenseg_portval; + +#else	/* !SEVENSEG_WRONLY */ + +#if (SEVENSEG_ACTIVE == 0) +	if (value) +		piop->data &= ~mask; +	else +		piop->data |= mask; +#else +	if (value) +		piop->data |= mask; +	else +		piop->data &= ~mask; +#endif + +#endif	/* SEVENSEG_WRONLY */ +} + +static inline void __sevenseg_toggle_masked (unsigned int mask) +{ +	nios_pio_t *piop = (nios_pio_t*)SEVENSEG_BASE; + +#ifdef	SEVENSEG_WRONLY	/* emulate read access */ + +	sevenseg_portval ^= mask; +	piop->data = sevenseg_portval; + +#else	/* !SEVENSEG_WRONLY */ + +	piop->data ^= mask; + +#endif	/* SEVENSEG_WRONLY */ +} + +static inline void __sevenseg_set (unsigned int value) +{ +	nios_pio_t *piop __attribute__((unused)) = (nios_pio_t*)SEVENSEG_BASE; + +#ifdef	SEVENSEG_WRONLY	/* emulate read access */ + +#if (SEVENSEG_ACTIVE == 0) +	sevenseg_portval = (sevenseg_portval &   SEVENDEG_MASK_DP) +			 | ((~value)         & (~SEVENDEG_MASK_DP)); +#else +	sevenseg_portval = (sevenseg_portval & SEVENDEG_MASK_DP) +			 | (value); +#endif + +	piop->data = sevenseg_portval; + +#else	/* !SEVENSEG_WRONLY */ + +#if (SEVENSEG_ACTIVE == 0) +	piop->data = (piop->data &   SEVENDEG_MASK_DP) +		   | ((~value)   & (~SEVENDEG_MASK_DP)); +#else +	piop->data = (piop->data & SEVENDEG_MASK_DP) +		   | (value); +#endif + +#endif	/* SEVENSEG_WRONLY */ +} + +static inline void __sevenseg_init (void) +{ +	nios_pio_t *piop __attribute__((unused)) = (nios_pio_t*)SEVENSEG_BASE; + +	__sevenseg_set(0); + +#ifndef	SEVENSEG_WRONLY	/* setup direction */ + +	piop->direction |= mask; + +#endif	/* SEVENSEG_WRONLY */ +} + + +void sevenseg_set(int value) +{ +	unsigned char	digits[] = { +		SEVENSEG_DIGITS_0, +		SEVENSEG_DIGITS_1, +		SEVENSEG_DIGITS_2, +		SEVENSEG_DIGITS_3, +		SEVENSEG_DIGITS_4, +		SEVENSEG_DIGITS_5, +		SEVENSEG_DIGITS_6, +		SEVENSEG_DIGITS_7, +		SEVENSEG_DIGITS_8, +		SEVENSEG_DIGITS_9, +		SEVENSEG_DIGITS_A, +		SEVENSEG_DIGITS_B, +		SEVENSEG_DIGITS_C, +		SEVENSEG_DIGITS_D, +		SEVENSEG_DIGITS_E, +		SEVENSEG_DIGITS_F +	}; + +	if (!sevenseg_init_done) { +		__sevenseg_init(); +		sevenseg_init_done++; +	} + +	switch (value & SEVENSEG_MASK_CTRL) { + +		case SEVENSEG_RAW: +			__sevenseg_set( ( +				(digits[((value & SEVENSEG_MASK_VAL) >>  4)] << 8) | +				digits[((value & SEVENSEG_MASK_VAL) & 0xf)] ) ); +			return; +			break;	/* paranoia */ + +		case SEVENSEG_OFF: +			__sevenseg_set(0); +			__sevenseg_set_masked(SEVENDEG_MASK_DP, 0); +			return; +			break;	/* paranoia */ + +		case SEVENSEG_SET_DPL: +			__sevenseg_set_masked(SEVENSEG_DIGIT_DP, 1); +			return; +			break;	/* paranoia */ + +		case SEVENSEG_SET_DPH: +			__sevenseg_set_masked((SEVENSEG_DIGIT_DP << 8), 1); +			return; +			break;	/* paranoia */ + +		case SEVENSEG_RES_DPL: +			__sevenseg_set_masked(SEVENSEG_DIGIT_DP, 0); +			return; +			break;	/* paranoia */ + +		case SEVENSEG_RES_DPH: +			__sevenseg_set_masked((SEVENSEG_DIGIT_DP << 8), 0); +			return; +			break;	/* paranoia */ + +		case SEVENSEG_TOG_DPL: +			__sevenseg_toggle_masked(SEVENSEG_DIGIT_DP); +			return; +			break;	/* paranoia */ + +		case SEVENSEG_TOG_DPH: +			__sevenseg_toggle_masked((SEVENSEG_DIGIT_DP << 8)); +			return; +			break;	/* paranoia */ + +		case SEVENSEG_LO: +		case SEVENSEG_HI: +		case SEVENSEG_STR: +		default: +			break; +	} +} + +#endif	/* CONFIG_SEVENSEG */ diff --git a/roms/u-boot/board/altera/common/sevenseg.h b/roms/u-boot/board/altera/common/sevenseg.h new file mode 100644 index 00000000..34348329 --- /dev/null +++ b/roms/u-boot/board/altera/common/sevenseg.h @@ -0,0 +1,126 @@ +/* + * (C) Copyright 2003, Li-Pro.Net <www.li-pro.net> + * Stephan Linz <linz@li-pro.net> + * + * SPDX-License-Identifier:	GPL-2.0+ + * + * common/sevenseg.h + * + * NIOS PIO based seven segment led support functions + */ + +#ifndef __DK1S10_SEVENSEG_H__ +#define __DK1S10_SEVENSEG_H__ + +#ifdef	CONFIG_SEVENSEG + +/* + *  15                    8 7      0 + * |-----------------------|--------| + * |   controll value      |  value | + * ---------------------------------- + */ +#define	SEVENSEG_RAW		(int)(0)	/* write out byte value (hex) */ +#define	SEVENSEG_OFF		(int)( 1 << 8)	/* display switch off */ +#define	SEVENSEG_SET_DPL	(int)( 2 << 8)	/* set dp low  nibble */ +#define	SEVENSEG_SET_DPH	(int)( 3 << 8)	/* set dp high nibble */ +#define	SEVENSEG_RES_DPL	(int)( 4 << 8)	/* reset dp low  nibble */ +#define	SEVENSEG_RES_DPH	(int)( 5 << 8)	/* reset dp high nibble */ +#define	SEVENSEG_TOG_DPL	(int)( 6 << 8)	/* toggle dp low  nibble */ +#define	SEVENSEG_TOG_DPH	(int)( 7 << 8)	/* toggle dp high nibble */ +#define	SEVENSEG_LO		(int)( 8 << 8)	/* write out low nibble only */ +#define	SEVENSEG_HI		(int)( 9 << 8)	/* write out high nibble only */ +#define	SEVENSEG_STR		(int)(10 << 8)	/* write out a string */ + +#define	SEVENSEG_MASK_VAL	(0xff)		/* only used by SEVENSEG_RAW */ +#define	SEVENSEG_MASK_CTRL	(~SEVENSEG_MASK_VAL) + +#ifdef	SEVENSEG_DIGIT_HI_LO_EQUAL + +#define	SEVENSEG_DIGITS_0	(	SEVENSEG_DIGIT_A	\ +				|	SEVENSEG_DIGIT_B	\ +				|	SEVENSEG_DIGIT_C	\ +				|	SEVENSEG_DIGIT_D	\ +				|	SEVENSEG_DIGIT_E	\ +				|	SEVENSEG_DIGIT_F	) +#define	SEVENSEG_DIGITS_1	(	SEVENSEG_DIGIT_B	\ +				|	SEVENSEG_DIGIT_C	) +#define	SEVENSEG_DIGITS_2	(	SEVENSEG_DIGIT_A	\ +				|	SEVENSEG_DIGIT_B	\ +				|	SEVENSEG_DIGIT_D	\ +				|	SEVENSEG_DIGIT_E	\ +				|	SEVENSEG_DIGIT_G	) +#define	SEVENSEG_DIGITS_3	(	SEVENSEG_DIGIT_A	\ +				|	SEVENSEG_DIGIT_B	\ +				|	SEVENSEG_DIGIT_C	\ +				|	SEVENSEG_DIGIT_D	\ +				|	SEVENSEG_DIGIT_G	) +#define	SEVENSEG_DIGITS_4	(	SEVENSEG_DIGIT_B	\ +				|	SEVENSEG_DIGIT_C	\ +				|	SEVENSEG_DIGIT_F	\ +				|	SEVENSEG_DIGIT_G	) +#define	SEVENSEG_DIGITS_5	(	SEVENSEG_DIGIT_A	\ +				|	SEVENSEG_DIGIT_C	\ +				|	SEVENSEG_DIGIT_D	\ +				|	SEVENSEG_DIGIT_F	\ +				|	SEVENSEG_DIGIT_G	) +#define	SEVENSEG_DIGITS_6	(	SEVENSEG_DIGIT_A	\ +				|	SEVENSEG_DIGIT_C	\ +				|	SEVENSEG_DIGIT_D	\ +				|	SEVENSEG_DIGIT_E	\ +				|	SEVENSEG_DIGIT_F	\ +				|	SEVENSEG_DIGIT_G	) +#define	SEVENSEG_DIGITS_7	(	SEVENSEG_DIGIT_A	\ +				|	SEVENSEG_DIGIT_B	\ +				|	SEVENSEG_DIGIT_C	) +#define	SEVENSEG_DIGITS_8	(	SEVENSEG_DIGIT_A	\ +				|	SEVENSEG_DIGIT_B	\ +				|	SEVENSEG_DIGIT_C	\ +				|	SEVENSEG_DIGIT_D	\ +				|	SEVENSEG_DIGIT_E	\ +				|	SEVENSEG_DIGIT_F	\ +				|	SEVENSEG_DIGIT_G	) +#define	SEVENSEG_DIGITS_9	(	SEVENSEG_DIGIT_A	\ +				|	SEVENSEG_DIGIT_B	\ +				|	SEVENSEG_DIGIT_C	\ +				|	SEVENSEG_DIGIT_D	\ +				|	SEVENSEG_DIGIT_F	\ +				|	SEVENSEG_DIGIT_G	) +#define	SEVENSEG_DIGITS_A	(	SEVENSEG_DIGIT_A	\ +				|	SEVENSEG_DIGIT_B	\ +				|	SEVENSEG_DIGIT_C	\ +				|	SEVENSEG_DIGIT_E	\ +				|	SEVENSEG_DIGIT_F	\ +				|	SEVENSEG_DIGIT_G	) +#define	SEVENSEG_DIGITS_B	(	SEVENSEG_DIGIT_C	\ +				|	SEVENSEG_DIGIT_D	\ +				|	SEVENSEG_DIGIT_E	\ +				|	SEVENSEG_DIGIT_F	\ +				|	SEVENSEG_DIGIT_G	) +#define	SEVENSEG_DIGITS_C	(	SEVENSEG_DIGIT_D	\ +				|	SEVENSEG_DIGIT_E	\ +				|	SEVENSEG_DIGIT_G	) +#define	SEVENSEG_DIGITS_D	(	SEVENSEG_DIGIT_B	\ +				|	SEVENSEG_DIGIT_C	\ +				|	SEVENSEG_DIGIT_D	\ +				|	SEVENSEG_DIGIT_E	\ +				|	SEVENSEG_DIGIT_G	) +#define	SEVENSEG_DIGITS_E	(	SEVENSEG_DIGIT_A	\ +				|	SEVENSEG_DIGIT_D	\ +				|	SEVENSEG_DIGIT_E	\ +				|	SEVENSEG_DIGIT_F	\ +				|	SEVENSEG_DIGIT_G	) +#define	SEVENSEG_DIGITS_F	(	SEVENSEG_DIGIT_A	\ +				|	SEVENSEG_DIGIT_E	\ +				|	SEVENSEG_DIGIT_F	\ +				|	SEVENSEG_DIGIT_G	) + +#else	/* !SEVENSEG_DIGIT_HI_LO_EQUAL */ +#error SEVENSEG: different pin asssignments not supported +#endif + +void sevenseg_set(int value); + +#endif	/* CONFIG_SEVENSEG */ + +#endif	/* __DK1S10_SEVENSEG_H__ */  | 
