/*
 * Copyright © 2012 Keith Packard <keithp@keithp.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
 */

#ifndef _AO_PINS_H_
#define _AO_PINS_H_

/* 16MHz crystal */

#define AO_HSE		1
#define AO_HSE_BYPASS	0

#define AO_SYSCLK	72000000
#define AO_HCLK		72000000
#define AO_APB1CLK	36000000
#define AO_APB2CLK	72000000
#define AO_ADCCLK	12000000

/* PLLMUL is 9, PLLXTPRE (pre divider) is 2, so the
 * overall PLLCLK is 16 * 9/2 = 72MHz (used as SYSCLK)
 *
 * HCLK is SYSCLK / 1 (HPRE_DIV) = 72MHz (72MHz max)
 * USB is PLLCLK / 1.5 (USBPRE)= 48MHz (must be 48MHz)
 * APB2 is HCLK / 1 (PPRE2_DIV) = 72MHz (72MHz max)
 * APB1 is HCLK / 2 (PPRE1_DIV) = 36MHz (36MHz max)
 * ADC is APB2 / 6 (ADCPRE) = 12MHz (14MHz max)
 */

#define AO_RCC_CFGR_USBPRE	STM_RCC_CFGR_USBPRE_1_5
#define AO_RCC_CFGR_PLLMUL	STM_RCC_CFGR_PLLMUL_9
#define AO_RCC_CFGR_PLLXTPRE	STM_RCC_CFGR_PLLXTPRE_2
#define AO_RCC_CFGR_PPRE2_DIV	STM_RCC_CFGR_PPRE2_DIV_1
#define AO_RCC_CFGR_PPRE1_DIV	STM_RCC_CFGR_PPRE1_DIV_2
#define AO_RCC_CFGR_HPRE_DIV	STM_RCC_CFGR_HPRE_DIV_1
#define AO_RCC_CFGR_ADCPRE	STM_RCC_CFGR_ADCPRE_6


#define AO_CC1200_FOSC		40000000

#define HAS_EEPROM		1
#define USE_INTERNAL_FLASH	1
#define USE_EEPROM_CONFIG	1
#define USE_STORAGE_CONFIG	0
#define HAS_USB			1
#define HAS_BEEP		1
#define BEEPER_TIMER		3
#define BEEPER_CHANNEL		1
#define BEEPER_PORT		(&stm_gpioc)
#define BEEPER_PIN		6
#define AO_BEEP_MID_DEFAULT	179	/* 2100 Hz */
#define HAS_RADIO		1
#define HAS_RADIO_RATE		1
#define HAS_TELEMETRY		0
#define HAS_AES			1
#define HAS_STATIC_TEST		0

#define HAS_USB_PULLUP		1
#define AO_USB_PULLUP_PORT	(&stm_gpioa)
#define AO_USB_PULLUP_PIN	10

#define HAS_SPI_1		1	/* NHD-C12864LZ LCD Module */
#define SPI_1_PA5_PA6_PA7	1
#define SPI_1_PA6_DISABLE	1
#define SPI_1_MODE_OUTPUT	STM_GPIO_CR_MODE_OUTPUT_50MHZ
#define SPI_1_PB3_PB4_PB5	0
#define SPI_1_PE13_PE14_PE15	0

#define HAS_SPI_2		1	/* CC1200 */
#define SPI_2_PB13_PB14_PB15	1
#define SPI_2_PD1_PD3_PD4	0
#define SPI_2_GPIO		(&stm_gpiod)
#define SPI_2_SCK		1
#define SPI_2_MISO		3
#define SPI_2_MOSI		4
#define SPI_2_MODE_OUTPUT	STM_GPIO_CR_MODE_OUTPUT_10MHZ

#define HAS_I2C_1		0

#define HAS_I2C_2		0

#define PACKET_HAS_SLAVE	0
#define PACKET_HAS_MASTER	0

#define AO_FAST_TIMER		4
#define FAST_TIMER_FREQ		10000	/* .1ms for debouncing */

/* LCD module */
#define AO_ST7565_CS_PORT	(&stm_gpioc)	/* pin 1 */
#define AO_ST7565_CS_PIN	4
#define AO_ST7565_RESET_PORT	(&stm_gpioc)	/* pin 2 */
#define AO_ST7565_RESET_PIN	5
#define AO_ST7565_A0_PORT	(&stm_gpioa)	/* pin 3 */
#define AO_ST7565_A0_PIN	3
#define AO_ST7565_SPI_BUS	(AO_SPI_1_PA5_PA6_PA7 | AO_SPI_MODE_3)
#define AO_ST7565_WIDTH		128
#define AO_ST7565_HEIGHT	64
#define AO_ST7565_BIAS		ST7565_LCD_BIAS_1_9

/*
 * Radio is a cc1200 connected via SPI
 */

#define AO_RADIO_CAL_DEFAULT 	5695733

#define AO_CC1200_SPI_CS_PORT	(&stm_gpiob)
#define AO_CC1200_SPI_CS_PIN	8
#define AO_CC1200_SPI_BUS	AO_SPI_2_PB13_PB14_PB15
#define AO_CC1200_SPI		stm_spi2

#define AO_CC1200_INT_PORT	(&stm_gpiob)
#define AO_CC1200_INT_PIN	(9)

#define AO_CC1200_INT_GPIO	2
#define AO_CC1200_INT_GPIO_IOCFG	CC1200_IOCFG2

#define LOW_LEVEL_DEBUG		0

#define HAS_LED			1

#define AO_LED_RED		AO_LED_0	/* PC7 */
#define LED_0_PORT		(&stm_gpioc)
#define LED_0_PIN		7

#define AO_LED_AMBER		AO_LED_1	/* PC8 */
#define LED_1_PORT		(&stm_gpioc)
#define LED_1_PIN		8

#define AO_LED_GREEN		AO_LED_2	/* PC9 */
#define LED_2_PORT		(&stm_gpioc)
#define LED_2_PIN		9

#define AO_LED_BOX		AO_LED_3	/* PA9 */
#define LED_3_PORT		(&stm_gpioa)
#define LED_3_PIN		9

#define AO_LED_PAD		AO_LED_4	/* PA15 */
#define LED_4_PORT		(&stm_gpioa)
#define LED_4_PIN		15

#define AO_LED_DRAG		AO_LED_5	/* PC12 */
#define LED_5_PORT		(&stm_gpioc)
#define LED_5_PIN		12

#define AO_LED_CONTINUITY_7	AO_LED_6	/* PC13 */
#define LED_6_PORT		(&stm_gpioc)
#define LED_6_PIN		13

#define AO_LED_CONTINUITY_6	AO_LED_7	/* PC14 */
#define LED_7_PORT		(&stm_gpioc)
#define LED_7_PIN		14

#define AO_LED_CONTINUITY_5	AO_LED_8	/* PC15 */
#define LED_8_PORT		(&stm_gpioc)
#define LED_8_PIN		15

#define AO_LED_CONTINUITY_4	AO_LED_9	/* PC2 */
#define LED_9_PORT		(&stm_gpioc)
#define LED_9_PIN		2

#define AO_LED_CONTINUITY_3	AO_LED_10	/* PC3 */
#define LED_10_PORT		(&stm_gpioc)
#define LED_10_PIN		3

#define AO_LED_CONTINUITY_2	AO_LED_11	/* PA0 */
#define LED_11_PORT		(&stm_gpioa)
#define LED_11_PIN		0

#define AO_LED_CONTINUITY_1	AO_LED_12	/* PA6 */
#define LED_12_PORT		(&stm_gpioa)
#define LED_12_PIN		6

#define AO_LED_CONTINUITY_0	AO_LED_13	/* PB1 */
#define LED_13_PORT		(&stm_gpiob)
#define LED_13_PIN		1

#define AO_LED_CONTINUITY_NUM	8

#define AO_LED_REMOTE_ARM	AO_LED_14	/* PB3 */
#define LED_14_PORT		(&stm_gpiob)
#define LED_14_PIN		3

#define AO_LED_FIRE		AO_LED_15	/* PB0 */
#define LED_15_PORT		(&stm_gpiob)
#define LED_15_PIN		0

/*
 * Use event queue for input devices
 */

#define AO_EVENT		1

/*
 * Knobs
 */

#define AO_QUADRATURE_COUNT	1
#define AO_QUADRATURE_DEBOUNCE	0
#define AO_QUADRATURE_SINGLE_CODE	1

#define AO_QUADRATURE_0_PORT	&stm_gpiob
#define AO_QUADRATURE_0_A	12
#define AO_QUADRATURE_0_B	11

#define AO_QUADRATURE_SELECT	0

/*
 * Buttons
 */

#define AO_BUTTON_COUNT		9
#define AO_BUTTON_MODE		AO_EXTI_MODE_PULL_UP

#define AO_BUTTON_DRAG_MODE	0
#define AO_BUTTON_0_PORT	&stm_gpioc
#define AO_BUTTON_0		1

#define AO_BUTTON_DRAG_SELECT	1
#define AO_BUTTON_1_PORT	&stm_gpiod
#define AO_BUTTON_1		2

#define AO_BUTTON_SPARE1       	2
#define AO_BUTTON_2_PORT	&stm_gpiob
#define AO_BUTTON_2		4

#define AO_BUTTON_SPARE2      	3
#define AO_BUTTON_3_PORT	&stm_gpiob
#define AO_BUTTON_3		5

#define AO_BUTTON_SPARE3       	4
#define AO_BUTTON_4_PORT	&stm_gpiob
#define AO_BUTTON_4		6

#define AO_BUTTON_ARM		5
#define AO_BUTTON_5_PORT	&stm_gpioa
#define AO_BUTTON_5		8

#define AO_BUTTON_FIRE		6
#define AO_BUTTON_6_PORT	&stm_gpioa
#define AO_BUTTON_6		4

#define AO_BUTTON_SPARE4	7
#define AO_BUTTON_7_PORT	&stm_gpiob
#define AO_BUTTON_7		7

#define AO_BUTTON_ENCODER_SELECT	8
#define AO_BUTTON_8_PORT	&stm_gpiob
#define AO_BUTTON_8		10

/* ADC */

#define AO_DATA_RING		8

#define HAS_ADC			1
#define HAS_ADC_TEMP		0
#define HAS_BATTERY_REPORT	1

#define AO_ADC_V_BATT		2
#define AO_ADC_V_BATT_PORT	(&stm_gpioa)
#define AO_ADC_V_BATT_PIN	2

#define AO_ADC_V_ALS		10
#define AO_ADC_V_ALS_PORT	(&stm_gpioc)
#define AO_ADC_V_ALS_PIN	0

#define AO_ADC_PIN0_PORT	AO_ADC_V_BATT_PORT
#define AO_ADC_PIN0_PIN		AO_ADC_V_BATT_PIN

#define AO_ADC_PIN1_PORT	AO_ADC_V_ALS_PORT
#define AO_ADC_PIN1_PIN		AO_ADC_V_ALS_PIN

#define AO_ADC_SQ1		AO_ADC_V_BATT
#define AO_ADC_SQ2		AO_ADC_V_ALS

#define AO_NUM_ADC		2

struct ao_adc {
	union {
		struct {
			int16_t		v_batt;
			int16_t		v_als;
		};
		int16_t	v_vals[AO_NUM_ADC];
	};
};

#define AO_ADC_DUMP(p) \
	printf("batt: %5d als %5d\n", (p)->adc.v_batt, (p)->adc.v_als)

/*
 * Voltage divider on ADC battery sampler
 */
#define AO_BATTERY_DIV_PLUS	15	/* 15k */
#define AO_BATTERY_DIV_MINUS	27	/* 27k */

/*
 * ADC reference in decivolts
 */
#define AO_ADC_REFERENCE_DV	33

#define AO_LCO_SEARCH_API

//#define AO_LCO_HAS_CONTRAST	1
//#define AO_LCO_MIN_CONTRAST	0
//#define AO_LCO_MAX_CONTRAST	63
//#define AO_LCO_CONTRAST_STEP	1

#define AO_LCO_HAS_BACKLIGHT	1
#define AO_LCO_MIN_BACKLIGHT	0
#define AO_LCO_MAX_BACKLIGHT	65535
#define AO_LCO_BACKLIGHT_STEP	771

#define AO_LCO_HAS_LCO_INFO	1
#define AO_LCO_MIN_INFO_PAGE	0
#define AO_LCO_MAX_INFO_PAGE	0

#define AO_LCO_HAS_PAD_INFO	1

/*
 * LCD Backlight via PWM.
 *
 * Pin PA1, TIM2_CH2
 */

#define NUM_PWM			1
#define PWM_MAX			65535
#define AO_PWM_TIMER		stm_tim2
#define AO_LCD_BL_PWM_CHAN	1
#define AO_PWM_0_GPIO		(&stm_gpioa)
#define AO_PWM_0_PIN		1
#define AO_PWM_TIMER_ENABLE	STM_RCC_APB1ENR_TIM2EN
#define AO_PWM_TIMER_SCALE	1

#define AO_AFIO_PWM_REMAP	STM_AFIO_MAPR_TIM2_REMAP
#define AO_AFIO_PWM_REMAP_VAL	STM_AFIO_MAPR_TIM2_REMAP_PA0_PA1_PA2_PA3
#define AO_AFIO_PWM_REMAP_MASK	STM_AFIO_MAPR_TIM2_REMAP_MASK


#endif /* _AO_PINS_H_ */
