blob: 4b53be9519deaeb60d7bd52c5ea55769853b0701 [file] [log] [blame]
/*
* Hardware abstraction layer for GPIO's and PWMs.
*/
#ifndef BRCM_PLATFORM_
#define BRCM_PLATFORM_
/*
* Defines the category that a given GPIO falls under.
*/
enum GpioType {
STANDARD,
AON,
};
struct Gpio {
int is_present;
unsigned int pinmux_offset;
unsigned int pinmux_mask;
unsigned int pinmux_value;
unsigned int offset_direction;
unsigned int offset_data;
/* for offset_direction and offset_data */
unsigned int mask; // eg, (*reg & mask) >> shift == on_value
unsigned int shift;
unsigned int off_value;
unsigned int on_value;
unsigned int direction_value; // 0 is output
unsigned int pin; // gpio #
enum GpioType type; // 'type' of gpio (aon/standard)
int old_val;
};
struct PwmControl {
int is_present;
int open_drain;
unsigned int offset_data;
unsigned int pwm_index; // index of this pwm.
unsigned int channel;
int old_percent;
int period;
};
struct Temp {
int is_present;
unsigned int offset_data;
double (*get_temp)(struct Temp* t);
};
struct Voltage {
int is_present;
unsigned int offset_data;
double (*get_voltage)(struct Voltage* v);
};
struct Leds {
struct Gpio led_red;
struct Gpio led_blue;
struct Gpio led_activity;
struct Gpio led_standby;
struct PwmControl led_brightness;
};
struct platform_info {
const char *name;
off_t mmap_base;
size_t mmap_size;
void (*init)(struct platform_info* p);
struct Leds leds;
struct Gpio reset_button;
struct Gpio fan_tick;
struct PwmControl fan_control;
struct Temp temp_monitor;
struct Voltage voltage_monitor;
};
/* This value, from old code, controls the pwm period. The duty cycle
is defined as on/(period + 1) and on is defined as (on/Fv). Fv is
the frequency of the variable rate PWM.*/
extern const int PWM_CYCLE_PERIOD;
/* Return the master platform_info struct for the provided platforn_name.
If no platform matches, returns NULL */
extern struct platform_info *get_platform_info(const char *);
/* Initialize the platform! */
extern int platform_init(struct platform_info *);
/* Cleanup the platform! */
extern void platform_cleanup();
/* Set the gpio represented by to the provided level.
Level is restricted to [0, 1] */
extern void set_gpio(struct Gpio *, int);
/* Get the value of the gpio provided. */
extern int get_gpio(struct Gpio *);
/* Set the provided PWM to the given duty cycle percent */
extern void set_pwm(struct PwmControl *, int);
/* Init GPIO to input or output. */
extern void set_direction(struct Gpio *);
/* Set the pinmux (init pin to LED, GPIO, etc) */
extern void set_pinmux(struct Gpio *);
#endif