1
0
mirror of https://github.com/elua/elua.git synced 2025-01-08 20:56:17 +08:00
elua/inc/platform.h

239 lines
7.3 KiB
C
Raw Normal View History

2008-07-29 11:08:54 +00:00
// Platform-specific functions
#ifndef __PLATFORM_H__
#define __PLATFORM_H__
#include "devman.h"
#include "type.h"
- Buffer refactored to handle multibyte data. Code which was previously using buffer has been updated to work with the changes. API has also changed in accordance: int buf_set(unsigned resid, unsigned resnum, u8 logsize, size_t dsize); int buf_is_enabled( unsigned resid, unsigned resnum ); unsigned buf_get_size( unsigned resid, unsigned resnum ); unsigned buf_get_count( unsigned resid, unsigned resnum ); int buf_write( unsigned resid, unsigned resnum, t_buf_data *data, size_t dsize ); int buf_read( unsigned resid, unsigned resnum, t_buf_data *data, size_t dsize ); Essentially buf_rx_cb and buf_get_char have been renamed to buf_write and buf_read. For these, one now passes a pointer to where the data is coming from or going to, and a dsize parameter indicating how many bytes should be copied. Also, buf_set takes this same dsize parameter, and keeps it in the struct. This allows us to ensure that when data is read or written the number of bytes matches the buffer element size. I thought about maintaining compatibility functions to provide the original buf_rx_cb and buf_get_byte API calls, however there weren't a large number of uses of buf, so it wasn't hard to convert things. One caveat: BUF_MOD_INCR assumes that byte counts for alternate type sizes will be powers of 2. Also, BUF_SIZE_xx's are assumed to refer to element counts. - UART buffering enabled on LM3S This doesn't include switching the ADC code over to using these buffers quite yet. I'm open to comments on these modifications if theres a better or simpler approach. I've checked to make sure buffers work on LM3S, but I don't own any other platforms to make sure there aren't unintended side-effects.
2009-02-09 03:43:47 +00:00
// Error / status codes
2008-07-29 11:08:54 +00:00
enum
{
PLATFORM_ERR,
- Buffer refactored to handle multibyte data. Code which was previously using buffer has been updated to work with the changes. API has also changed in accordance: int buf_set(unsigned resid, unsigned resnum, u8 logsize, size_t dsize); int buf_is_enabled( unsigned resid, unsigned resnum ); unsigned buf_get_size( unsigned resid, unsigned resnum ); unsigned buf_get_count( unsigned resid, unsigned resnum ); int buf_write( unsigned resid, unsigned resnum, t_buf_data *data, size_t dsize ); int buf_read( unsigned resid, unsigned resnum, t_buf_data *data, size_t dsize ); Essentially buf_rx_cb and buf_get_char have been renamed to buf_write and buf_read. For these, one now passes a pointer to where the data is coming from or going to, and a dsize parameter indicating how many bytes should be copied. Also, buf_set takes this same dsize parameter, and keeps it in the struct. This allows us to ensure that when data is read or written the number of bytes matches the buffer element size. I thought about maintaining compatibility functions to provide the original buf_rx_cb and buf_get_byte API calls, however there weren't a large number of uses of buf, so it wasn't hard to convert things. One caveat: BUF_MOD_INCR assumes that byte counts for alternate type sizes will be powers of 2. Also, BUF_SIZE_xx's are assumed to refer to element counts. - UART buffering enabled on LM3S This doesn't include switching the ADC code over to using these buffers quite yet. I'm open to comments on these modifications if theres a better or simpler approach. I've checked to make sure buffers work on LM3S, but I don't own any other platforms to make sure there aren't unintended side-effects.
2009-02-09 03:43:47 +00:00
PLATFORM_OK,
PLATFORM_UNDERFLOW = -1
2008-07-29 11:08:54 +00:00
};
// Platform initialization
int platform_init();
// *****************************************************************************
// PIO subsection
// "Virtual ports": 16 ports (PA...PF), 32-bits each for a total of 512 I/O pins.
// They are coded within a single integer, where the high part encodes the port
// number, while the lower part encodes the pin number
typedef u32 pio_type;
typedef u32 pio_code;
#define PLATFORM_IO_PORTS 16
#define PLATFORM_IO_PORTS_BITS 4
#define PLATFORM_IO_PINS 32
#define PLATFORM_IO_PINS_BITS 5
#define PLATFORM_IO_FULL_PORT_BIT 14
#define PLATFORM_IO_FULL_PORT_MASK ( 1 << PLATFORM_IO_FULL_PORT_BIT )
#define PLATFORM_IO_ENCODE( port, pin, full ) ( ( ( port ) << PLATFORM_IO_PINS_BITS ) | ( pin ) | ( ( full ) ? PLATFORM_IO_FULL_PORT_MASK : 0 ) )
#define PLATFORM_IO_GET_PORT( code ) ( ( ( code ) >> PLATFORM_IO_PINS_BITS ) & ( ( 1 << PLATFORM_IO_PORTS_BITS ) - 1 ) )
#define PLATFORM_IO_GET_PIN( code ) ( ( code ) & ( ( 1 << PLATFORM_IO_PINS_BITS ) - 1 ) )
2008-07-29 11:08:54 +00:00
#define PLATFORM_IO_IS_PORT( code ) ( ( ( code ) & PLATFORM_IO_FULL_PORT_MASK ) != 0 )
#define PLATFORM_IO_ALL_PINS 0xFFFFFFFFUL
#define PLATFORM_IO_ENC_PORT 1
#define PLATFORM_IO_ENC_PIN 0
enum
{
// Pin operations
PLATFORM_IO_PIN_SET,
PLATFORM_IO_PIN_CLEAR,
PLATFORM_IO_PIN_GET,
PLATFORM_IO_PIN_DIR_INPUT,
PLATFORM_IO_PIN_DIR_OUTPUT,
PLATFORM_IO_PIN_PULLUP,
PLATFORM_IO_PIN_PULLDOWN,
PLATFORM_IO_PIN_NOPULL,
2008-07-29 11:08:54 +00:00
// Port operations
PLATFORM_IO_PORT_SET_VALUE,
PLATFORM_IO_PORT_GET_VALUE,
PLATFORM_IO_PORT_DIR_INPUT,
PLATFORM_IO_PORT_DIR_OUTPUT
2008-07-29 11:08:54 +00:00
};
// The platform I/O functions
int platform_pio_has_port( unsigned port );
2008-08-02 18:01:01 +00:00
const char* platform_pio_get_prefix( unsigned port );
2008-07-29 11:08:54 +00:00
int platform_pio_has_pin( unsigned port, unsigned pin );
pio_type platform_pio_op( unsigned port, pio_type pinmask, int op );
// *****************************************************************************
// SPI subsection
// There are 4 "virtual" SPI ports (SPI0...SPI3).
#define PLATFORM_SPI_TOTAL 4
// SPI mode
#define PLATFORM_SPI_MASTER 1
#define PLATFORM_SPI_SLAVE 0
// SS values
#define PLATFORM_SPI_SELECT_ON 1
#define PLATFORM_SPI_SELECT_OFF 0
// SPI enable/disable
#define PLATFORM_SPI_ENABLE 1
#define PLATFORM_SPI_DISABLE 0
// Data types
typedef u32 spi_data_type;
// The platform SPI functions
int platform_spi_exists( unsigned id );
u32 platform_spi_setup( unsigned id, int mode, u32 clock, unsigned cpol, unsigned cpha, unsigned databits );
spi_data_type platform_spi_send_recv( unsigned id, spi_data_type data );
void platform_spi_select( unsigned id, int is_select );
// *****************************************************************************
// UART subsection
// There are 4 "virtual" UART ports (UART0...UART3).
#define PLATFORM_UART_TOTAL 4
// Parity
enum
{
PLATFORM_UART_PARITY_EVEN,
PLATFORM_UART_PARITY_ODD,
PLATFORM_UART_PARITY_NONE
};
// Stop bits
enum
{
PLATFORM_UART_STOPBITS_1,
PLATFORM_UART_STOPBITS_1_5,
PLATFORM_UART_STOPBITS_2
};
// "Infinite timeout" constant for recv
#define PLATFORM_UART_INFINITE_TIMEOUT (-1)
// The platform UART functions
int platform_uart_exists( unsigned id );
u32 platform_uart_setup( unsigned id, u32 baud, int databits, int parity, int stopbits );
void platform_uart_send( unsigned id, u8 data );
int platform_uart_recv( unsigned id, unsigned timer_id, s32 timeout );
int platform_s_uart_recv( unsigned id, s32 timeout );
2008-07-29 11:08:54 +00:00
// *****************************************************************************
// Timer subsection
// There are 16 "virtual" timers (TMR0...TMR15)
#define PLATFORM_TIMER_TOTAL 16
// Data types
typedef u32 timer_data_type;
// Timer operations
enum
{
PLATFORM_TIMER_OP_START,
PLATFORM_TIMER_OP_READ,
PLATFORM_TIMER_OP_SET_CLOCK,
PLATFORM_TIMER_OP_GET_CLOCK,
PLATFORM_TIMER_OP_GET_MAX_DELAY,
PLATFORM_TIMER_OP_GET_MIN_DELAY
};
// The platform timer functions
int platform_timer_exists( unsigned id );
void platform_timer_delay( unsigned id, u32 delay_us );
void platform_s_timer_delay( unsigned id, u32 delay_us );
2008-07-29 11:08:54 +00:00
u32 platform_timer_op( unsigned id, int op, u32 data );
u32 platform_s_timer_op( unsigned id, int op, u32 data );
2008-07-29 11:08:54 +00:00
u32 platform_timer_get_diff_us( unsigned id, timer_data_type end, timer_data_type start );
// *****************************************************************************
// PWM subsection
// There are 16 "virtual" PWM channels (PWM0...PWM15)
#define PLATFORM_PWM_TOTAL 16
// PWM operations
enum
{
PLATFORM_PWM_OP_START,
PLATFORM_PWM_OP_STOP,
PLATFORM_PWM_OP_SET_CLOCK,
PLATFORM_PWM_OP_GET_CLOCK
};
// The platform PWM functions
int platform_pwm_exists( unsigned id );
u32 platform_pwm_setup( unsigned id, u32 frequency, unsigned duty );
u32 platform_pwm_op( unsigned id, int op, u32 data );
// *****************************************************************************
// CPU specific functions
void platform_cpu_enable_interrupts();
void platform_cpu_disable_interrupts();
u32 platform_cpu_get_frequency();
2009-01-21 23:40:34 +00:00
// *****************************************************************************
// The platform ADC functions
2009-01-21 23:40:34 +00:00
int platform_adc_exists( unsigned id );
u32 platform_adc_op( unsigned id, int op, u32 data );
enum
{
PLATFORM_ADC_GET_MAXVAL,
PLATFORM_ADC_GET_SMOOTHING,
PLATFORM_ADC_SET_SMOOTHING
};
2009-01-21 23:40:34 +00:00
u16 platform_adc_sample( unsigned id );
int platform_adc_is_done( unsigned id );
enum
{
PLATFORM_ADC_BLOCKING,
PLATFORM_ADC_NONBLOCKING
};
// Platform ADC state
struct platform_adc_state
{
volatile u8 op_pending: 1, // Is there a pending conversion?
nonblocking: 1, // Are we in blocking or non-blocking mode? (0 - blocking, 1 - nonblocking)
burst: 1, // Acquiring in burst mode
data_ready: 1, // Is data ready for this channel
smooth_ready: 1; // Has smoothing filter warmed up (i.e. smoothlen samples collected)
unsigned id, timer_id;
u8 burstlen, burstidx;
u8 smoothlen, smoothidx;
unsigned long smoothavg, smoothsum;
u16 sample, *burstbuf, *smoothbuf;
};
2009-01-21 23:40:34 +00:00
void platform_adc_set_mode( unsigned id, int mode );
void platform_adc_burst( unsigned id, u16* buf, unsigned count, unsigned timer_id, u32 frequency );
2009-01-21 23:40:34 +00:00
// *****************************************************************************
// Ethernet specific functions
void platform_eth_send_packet( const void* src, u32 size );
u32 platform_eth_get_packet_nb( void* buf, u32 maxlen );
void platform_eth_force_interrupt();
u32 platform_eth_get_elapsed_time();
2008-07-29 11:08:54 +00:00
// *****************************************************************************
// Allocator support
void* platform_get_first_free_ram( unsigned id );
void* platform_get_last_free_ram( unsigned id );
2008-07-29 11:08:54 +00:00
// *****************************************************************************
// Misc support
unsigned int intlog2( unsigned int v );
2008-07-29 11:08:54 +00:00
#endif