/*
 * Copyright (c) 2018 Phytec Messtechnik GmbH
 *
 * SPDX-License-Identifier: Apache-2.0
 */


#ifndef __SSD1306_REGS_H__
#define __SSD1306_REGS_H__

/* All following bytes will contain commands */
#define SSD1306_CONTROL_ALL_BYTES_CMD		0x00
/* All following bytes will contain data */
#define SSD1306_CONTROL_ALL_BYTES_DATA		0x40
/* The next byte will contain a command */
#define SSD1306_CONTROL_BYTE_CMD		0x80
/* The next byte will contain data */
#define SSD1306_CONTROL_BYTE_DATA		0xc0
#define SSD1306_READ_STATUS_MASK		0xc0
#define SSD1306_READ_STATUS_BUSY		0x80
#define SSD1306_READ_STATUS_ON			0x40

/*
 * Fundamental Command Table
 */
#define SSD1306_SET_CONTRAST_CTRL		0x81 /* double byte command */

#define SSD1306_SET_ENTIRE_DISPLAY_OFF		0xa4
#define SSD1306_SET_ENTIRE_DISPLAY_ON		0xa5

/* RAM data of 1 indicates an "ON" pixel */
#define SSD1306_SET_NORMAL_DISPLAY		0xa6
/* RAM data of 0 indicates an "ON" pixel */
#define SSD1306_SET_REVERSE_DISPLAY		0xa7

#define SSD1306_DISPLAY_OFF			0xae
#define SSD1306_DISPLAY_ON			0xaf

/*
 * Addressing Setting Command Table
 */
#define SSD1306_SET_LOWER_COL_ADDRESS		0x00
#define SSD1306_SET_LOWER_COL_ADDRESS_MASK	0x0f

#define SSD1306_SET_HIGHER_COL_ADDRESS		0x10
#define SSD1306_SET_HIGHER_COL_ADDRESS_MASK	0x0f

#define SSD1306_SET_MEM_ADDRESSING_MODE		0x20 /* double byte command */
#define SSD1306_SET_MEM_ADDRESSING_HORIZONTAL	0x00
#define SSD1306_SET_MEM_ADDRESSING_VERTICAL	0x01
#define SSD1306_SET_MEM_ADDRESSING_PAGE		0x02

#define SSD1306_SET_COLUMN_ADDRESS		0x21 /* triple byte command */

#define SSD1306_SET_PAGE_ADDRESS		0x22 /* triple byte command */

#define SSD1306_SET_PAGE_START_ADDRESS		0xb0
#define SSD1306_SET_PAGE_START_ADDRESS_MASK	0x07


/*
 * Hardware Configuration Command Table
 */
#define SSD1306_SET_START_LINE			0x40
#define SSD1306_SET_START_LINE_MASK		0x3f

#define SSD1306_SET_SEGMENT_MAP_NORMAL		0xa0
#define SSD1306_SET_SEGMENT_MAP_REMAPED		0xa1

#define SSD1306_SET_MULTIPLEX_RATIO		0xa8 /* double byte command */

#define SSD1306_SET_COM_OUTPUT_SCAN_NORMAL	0xc0
#define SSD1306_SET_COM_OUTPUT_SCAN_FLIPPED	0xc8

#define SSD1306_SET_DISPLAY_OFFSET		0xd3 /* double byte command */

#define SSD1306_SET_PADS_HW_CONFIG		0xda /* double byte command */
#define SSD1306_SET_PADS_HW_SEQUENTIAL		0x02
#define SSD1306_SET_PADS_HW_ALTERNATIVE         0x12

#define SSD1306_SET_IREF_MODE			0xad
#define SSD1306_SET_IREF_MODE_INTERNAL		0x30
#define SSD1306_SET_IREF_MODE_EXTERNAL		0x00


/*
 * Timing and Driving Scheme Setting Command Table
 */
#define SSD1306_SET_CLOCK_DIV_RATIO		0xd5 /* double byte command */

#define SSD1306_SET_CHARGE_PERIOD		0xd9 /* double byte command */

#define SSD1306_SET_VCOM_DESELECT_LEVEL		0xdb /* double byte command */

#define SSD1306_NOP				0xe3

/*
 * Charge Pump Command Table
 */
#define SSD1306_SET_CHARGE_PUMP_ON		0x8d /* double byte command */
#define SSD1306_SET_CHARGE_PUMP_ON_DISABLED	0x10
#define SSD1306_SET_CHARGE_PUMP_ON_ENABLED	0x14

#define SH1106_SET_DCDC_MODE			0xad /* double byte command */
#define SH1106_SET_DCDC_DISABLED		0x8a
#define SH1106_SET_DCDC_ENABLED			0x8b

#define SSD1306_SET_PUMP_VOLTAGE_64		0x30
#define SSD1306_SET_PUMP_VOLTAGE_74		0x31
#define SSD1306_SET_PUMP_VOLTAGE_80		0x32
#define SSD1306_SET_PUMP_VOLTAGE_90		0x33

/*
 * Read modify write
 */
#define SSD1306_READ_MODIFY_WRITE_START		0xe0
#define SSD1306_READ_MODIFY_WRITE_END		0xee

/* time constants in ms */
#define SSD1306_RESET_DELAY			1
#define SSD1306_SUPPLY_DELAY			20

#endif
