david/ipxe
Archived
1
0
This repository has been archived on 2020-12-06. You can view files and clone it, but cannot push or open issues or pull requests.
ipxe/src/include/gpxe/threewire.h

66 lines
1.6 KiB
C
Raw Normal View History

#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 */