diff options
Diffstat (limited to 'src/include/gpxe/threewire.h')
| -rw-r--r-- | src/include/gpxe/threewire.h | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/src/include/gpxe/threewire.h b/src/include/gpxe/threewire.h new file mode 100644 index 000000000..d9d885671 --- /dev/null +++ b/src/include/gpxe/threewire.h @@ -0,0 +1,65 @@ +#ifndef _GPXE_THREEWIRE_H +#define _GPXE_THREEWIRE_H + +/** @file + * + * Three-wire serial interface + * + * The Atmel three-wire interface is a subset of the (newer) SPI + * interface, and is implemented here as a layer on top of the SPI + * support. + */ + +struct spi_interface; + +/** A three-wire device */ +struct threewire_device { + /** SPI interface to which device is attached */ + struct spi_interface *spi; + /** SPI slave number */ + unsigned int slave; + /** Address size (in bits) */ + unsigned int adrsize; + /** Data size (in bits) */ + unsigned int datasize; +}; + +/** + * Calculate read command for a specified address + * + * @v three Three-wire interface + * @v address Address + * @ret cmd Command + */ +static inline __attribute__ (( always_inline )) unsigned long +threewire_cmd_read ( struct threewire_device *three, unsigned long address ) { + return ( ( 0x6 << three->adrsize ) | address ); +} + +/** + * Calculate command length + * + * @v three Three-wire interface + * @ret len Command length, in bits + */ +static inline __attribute__ (( always_inline )) unsigned int +threewire_cmd_len ( struct threewire_device *three ) { + return ( three->adrsize + 3 ); +} + +/* Constants for some standard parts */ +#define AT93C46_ORG8_ADRSIZE 7 +#define AT93C46_ORG8_DATASIZE 8 +#define AT93C46_ORG16_ADRSIZE 6 +#define AT93C46_ORG16_DATASIZE 16 +#define AT93C46_UDELAY 1 +#define AT93C56_ORG8_ADRSIZE 9 +#define AT93C56_ORG8_DATASIZE 8 +#define AT93C56_ORG16_ADRSIZE 8 +#define AT93C56_ORG16_DATASIZE 16 +#define AT93C56_UDELAY 1 + +extern unsigned long threewire_read ( struct threewire_device *three, + unsigned long address ); + +#endif /* _GPXE_THREEWIRE_H */ |
