Generalise three-wire interface to generic SPI interface.
[gpxe.git] / src / include / gpxe / threewire.h
1 #ifndef _GPXE_THREEWIRE_H
2 #define _GPXE_THREEWIRE_H
3
4 /** @file
5  *
6  * Three-wire serial interface
7  *
8  * The Atmel three-wire interface is a subset of the (newer) SPI
9  * interface, and is implemented here as a layer on top of the SPI
10  * support.
11  */
12
13 struct spi_interface;
14
15 /** A three-wire device */
16 struct threewire_device {
17         /** SPI interface to which device is attached */
18         struct spi_interface *spi;
19         /** SPI slave number */
20         unsigned int slave;
21         /** Address size (in bits) */
22         unsigned int adrsize;
23         /** Data size (in bits) */
24         unsigned int datasize;
25 };
26
27 /**
28  * Calculate read command for a specified address
29  *
30  * @v three     Three-wire interface
31  * @v address   Address
32  * @ret cmd     Command
33  */
34 static inline __attribute__ (( always_inline )) unsigned long
35 threewire_cmd_read ( struct threewire_device *three, unsigned long address ) {
36         return ( ( 0x6 << three->adrsize ) | address );
37 }
38
39 /**
40  * Calculate command length
41  *
42  * @v three     Three-wire interface
43  * @ret len     Command length, in bits
44  */
45 static inline __attribute__ (( always_inline )) unsigned int
46 threewire_cmd_len ( struct threewire_device *three ) {
47         return ( three->adrsize + 3 );
48 }
49
50 /* Constants for some standard parts */
51 #define AT93C46_ORG8_ADRSIZE    7
52 #define AT93C46_ORG8_DATASIZE   8
53 #define AT93C46_ORG16_ADRSIZE   6
54 #define AT93C46_ORG16_DATASIZE  16
55 #define AT93C46_UDELAY          1
56 #define AT93C56_ORG8_ADRSIZE    9
57 #define AT93C56_ORG8_DATASIZE   8
58 #define AT93C56_ORG16_ADRSIZE   8
59 #define AT93C56_ORG16_DATASIZE  16
60 #define AT93C56_UDELAY          1
61
62 extern unsigned long threewire_read ( struct threewire_device *three,
63                                       unsigned long address );
64
65 #endif /* _GPXE_THREEWIRE_H */