summaryrefslogtreecommitdiffstats
path: root/src/include/gpxe/threewire.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/include/gpxe/threewire.h')
-rw-r--r--src/include/gpxe/threewire.h65
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 */