/*
 * prucomm.h - structure definitions for communication
 *
 */
#pragma once

#include "pru_defs.h"

struct pwm_config {
	u32 hi_cycles;
	u32 hi_err;
	u32 lo_cycles;
	u32 lo_err;
};

/* maximum (PRU0 + PRU1) */
#define MAX_PWMS	12

/* mask of the possibly enabled PWMs (due to h/w) */
/* 14, 15 are not routed out for PRU1 */
#define PWM_EN_MASK	( \
	BIT( 0)|BIT( 1)|BIT( 2)|BIT( 3)|BIT( 4)|BIT( 5)|BIT( 6)|BIT( 7)| \
	BIT( 8)|BIT( 9)|BIT(10)|BIT(11)|BIT(12) \
	)

#define MIN_PWM_PULSE	PRU_us(4)

struct pwm_multi_config {
	u32 enmask;	/* enable mask */
	u32 offmsk;	/* state when pwm is off */
	u32 hilo[MAX_PWMS][2];
};

#define PWM_CMD_MAGIC	0xf00fbaaf
#define PWM_REPLY_MAGIC	0xbaaff00f
#define PWM_CMD_CONFIG	0	/* full configuration in one go */
#define PWM_CMD_ENABLE	1	/* enable a pwm */
#define PWM_CMD_DISABLE	2	/* disable a pwm */
#define PWM_CMD_MODIFY	3	/* modify a pwm */
#define PWM_CMD_SET	4	/* set a pwm output explicitly */
#define PWM_CMD_CLR	5	/* clr a pwm output explicitly */ 
#define PWM_CMD_TEST	6	/* various crap */

struct pwm_cmd {
        u32 magic;
	u32 enmask;	/* enable mask */
	u32 offmsk;	/* state when pwm is off */
	u32 periodhi[MAX_PWMS][2];
        u32 hilo_read[MAX_PWMS][2];
        u32 enmask_read;
};
struct pwm_cmd_l{
    u32 enmask;
    u32 offmsk;
    u32 hilo[MAX_PWMS][2];
};


struct cxt {
        u32 cnt;
        u32 next;
        u32 enmask;
        u32 stmask;
        u32 setmsk;
        u32 clrmsk;
        u32 deltamin;
        u32 *next_hi_lo;
};


/* the command is at the start of shared DPRAM */
#define PWM_CMD		((volatile struct pwm_cmd *)DPRAM_SHARED)