66 lines
1.6 KiB
C
66 lines
1.6 KiB
C
|
#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 */
|