diff options
-rw-r--r-- | src/Makefile | 1 | ||||
-rw-r--r-- | src/drivers/bitbash/bitbash.c | 55 | ||||
-rw-r--r-- | src/include/gpxe/bitbash.h | 44 |
3 files changed, 100 insertions, 0 deletions
diff --git a/src/Makefile b/src/Makefile index 989199c4..3130d8fc 100644 --- a/src/Makefile +++ b/src/Makefile @@ -140,6 +140,7 @@ SRCDIRS += drivers/block SRCDIRS += drivers/scsi SRCDIRS += drivers/ata SRCDIRS += drivers/nvs +SRCDIRS += drivers/bitbash SRCDIRS += interface/pxe SRCDIRS += tests diff --git a/src/drivers/bitbash/bitbash.c b/src/drivers/bitbash/bitbash.c new file mode 100644 index 00000000..270c1b92 --- /dev/null +++ b/src/drivers/bitbash/bitbash.c @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2006 Michael Brown <mbrown@fensystems.co.uk>. + * + * 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 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, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include <timer.h> +#include <gpxe/bitbash.h> + +/** @file + * + * Bit-bashing interfaces + * + */ + +/** + * Set/clear output bit + * + * @v basher Bit-bashing interface + * @v bit_id Bit number + * @v data Value to write + * + * If @c data is 0, a logic 0 will be written. If @c data is + * non-zero, a logic 1 will be written. + */ +void write_bit ( struct bit_basher *basher, unsigned int bit_id, + unsigned long data ) { + basher->write ( basher, bit_id, ( data ? -1UL : 0 ) ); + udelay ( basher->udelay ); +} + +/** + * Read input bit + * + * @v basher Bit-bashing interface + * @v bit_id Bit number + * @ret data Value read + * + * @c data will always be either 0 or 1. + */ +int read_bit ( struct bit_basher *basher, unsigned int bit_id ) { + return ( basher->read ( basher, bit_id ) ? 1 : 0 ); +} diff --git a/src/include/gpxe/bitbash.h b/src/include/gpxe/bitbash.h new file mode 100644 index 00000000..9bee3913 --- /dev/null +++ b/src/include/gpxe/bitbash.h @@ -0,0 +1,44 @@ +#ifndef _GPXE_BITBASH_H +#define _GPXE_BITBASH_H + +/** @file + * + * Bit-bashing interfaces + * + */ + +/** A bit-bashing interface */ +struct bit_basher { + /** + * Set/clear output bit + * + * @v basher Bit-bashing interface + * @v bit_id Bit number + * @v data Value to write + * + * @c data will be 0 if a logic 0 should be written (i.e. the + * bit should be cleared), or -1UL if a logic 1 should be + * written (i.e. the bit should be set). This is done so that + * the method may simply binary-AND @c data with the + * appropriate bit mask. + */ + void ( * write ) ( struct bit_basher *basher, unsigned int bit_id, + unsigned long data ); + /** + * Read input bit + * + * @v basher Bit-bashing interface + * @v bit_id Bit number + * @ret zero Input is a logic 0 + * @ret non-zero Input is a logic 1 + */ + int ( * read ) ( struct bit_basher *basher, unsigned int bit_id ); + /** Delay between subsequent calls to write(), in microseconds */ + unsigned int udelay; +}; + +extern void write_bit ( struct bit_basher *basher, unsigned int bit_id, + unsigned long data ); +extern int read_bit ( struct bit_basher *basher, unsigned int bit_id ); + +#endif /* _GPXE_BITBASH_H */ |