| /** |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| #ifndef __LP5523_H__ |
| #define __LP5523_H__ |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| #include <led/led_itf.h> |
| |
| #define LP5523_MAX_PAYLOAD (10) |
| |
| #if MYNEWT_VAL(LED_ENABLE_ABSTRACTION) |
| #include <led/led.h> |
| #endif |
| |
| #define LP5523_MAX_PAYLOAD (10) |
| |
| #define LP5523_I2C_BASE_ADDR (0x32) |
| |
| /* Engine control mask */ |
| #define LP5523_ENGINE3_MASK (0x03) |
| #define LP5523_ENGINE2_MASK (0x0c) |
| #define LP5523_ENGINE1_MASK (0x30) |
| |
| /* Engine IDs */ |
| #define LP5523_ENGINE3 (3) |
| #define LP5523_ENGINE2 (2) |
| #define LP5523_ENGINE1 (1) |
| |
| /* LED IDs */ |
| #define LP5523_LED9 (9) |
| #define LP5523_LED8 (8) |
| #define LP5523_LED7 (7) |
| #define LP5523_LED6 (6) |
| #define LP5523_LED5 (5) |
| #define LP5523_LED4 (4) |
| #define LP5523_LED3 (3) |
| #define LP5523_LED2 (2) |
| #define LP5523_LED1 (1) |
| |
| struct per_led_cfg { |
| /* Mapping */ |
| uint8_t mapping:2; |
| /* Enable Log dimming */ |
| uint8_t log_dim_en:1; |
| /* Enable temperature compensation */ |
| uint8_t temp_comp:5; |
| /* Output On/Off */ |
| uint8_t output_on:1; |
| /* In steps of 100 microamps */ |
| uint8_t current_ctrl; |
| }; |
| |
| struct lp5523_cfg { |
| /* The 2 LSBs of this represent ASEL1 and ASEL0 */ |
| uint8_t asel:2; |
| /* Enable clock detect enable */ |
| uint8_t clk_det_en:1; |
| /* Enable Int clock */ |
| uint8_t int_clk_en:1; |
| /* Select CP Mode */ |
| uint8_t cp_mode:2; |
| /* Enable VAR_D_SEL */ |
| uint8_t var_d_sel:1; |
| /* Enable Power Save */ |
| uint8_t ps_en:1; |
| /* Enable PWM power save */ |
| uint8_t pwm_ps_en:1; |
| /* Enable auto increment */ |
| uint8_t auto_inc_en:1; |
| /* INT conf */ |
| uint8_t int_conf:1; |
| /* INT GPO */ |
| |
| /****** Gain change control settings ******/ |
| uint8_t int_gpo:1; |
| /* Threshold Voltage */ |
| uint8_t thresh_volt:2; |
| /* Enable adaptive threshold */ |
| uint8_t adapt_thresh_en:1; |
| /* Timer value */ |
| uint8_t timer:2; |
| /* Force_1x enbale */ |
| uint8_t force_1x:1; |
| /* Optional reset */ |
| bool prereset; |
| /* All per LED configs go here - 0: D1 8: D9 */ |
| struct per_led_cfg per_led_cfg[MYNEWT_VAL(LP5523_LEDS_PER_DRIVER)]; |
| }; |
| |
| struct lp5523 { |
| struct os_dev dev; |
| struct lp5523_cfg cfg; |
| }; |
| |
| /**** Config Values ****/ |
| #define LP5523_ASEL00_ADDR_32h 0x00 |
| #define LP5523_ASEL01_ADDR_33h 0x01 |
| #define LP5523_ASEL10_ADDR_34h 0x02 |
| #define LP5523_ASEL11_ADDR_35h 0x03 |
| |
| #define LP5523_CP_MODE_OFF 0x00 |
| #define LP5523_CP_MODE_FORCE_TO_BYPASS 0x01 |
| #define LP5523_CP_MODE_FORCE_TO_1_5X 0x02 |
| #define LP5523_CP_MODE_AUTO 0x03 |
| |
| #define LP5523_THRESH_VOLT_400MV 0x00 |
| #define LP5523_THRESH_VOLT_300MV 0x01 |
| #define LP5523_THRESH_VOLT_200MV 0x02 |
| #define LP5523_THRESH_VOLT_100MV 0x03 |
| |
| #define LP5523_TIMER_5MS 0x00 |
| #define LP5523_TIMER_10MS 0x01 |
| #define LP5523_TIMER_50MS 0x02 |
| #define LP5523_TIMER_INF 0x03 |
| |
| /* register addresses */ |
| |
| enum lp5523_bitfield_registers { |
| LP5523_OUTPUT_RATIOMETRIC = 0x02, |
| LP5523_OUTPUT_CTRL_MSB = 0x04, |
| LP5523_ENG_MAPPING = 0x70 |
| }; |
| |
| enum lp5523_output_registers { |
| LP5523_CONTROL = 0x06, |
| LP5523_PWM = 0x16, |
| LP5523_CURRENT_CONTROL = 0x26 |
| }; |
| |
| enum lp5523_engine_registers { |
| LP5523_ENGINE_PC = 0x37, |
| LP5523_ENGINE_VARIABLE_A = 0x45, |
| LP5523_MASTER_FADER = 0x48, |
| LP5523_ENG_PROG_START_ADDR = 0x4c |
| }; |
| |
| enum lp5523_engine_control_registers { |
| LP5523_ENGINE_CNTRL1 = 0x00, |
| LP5523_ENGINE_CNTRL2 = 0x01 |
| }; |
| |
| enum lp5523_registers { |
| LP5523_ENABLE = 0x00, |
| LP5523_OUTPUT_CTRL_LSB = 0x05, |
| LP5523_LED_CONTROL_BASE = 0x06, |
| LP5523_PWM_BASE = 0x16, |
| LP5523_MISC = 0x36, |
| LP5523_STATUS = 0x3a, |
| LP5523_INTERRUPT = 0x3a, |
| LP5523_INT = 0x3b, |
| LP5523_VARIABLE = 0x3c, |
| LP5523_RESET = 0x3d, |
| LP5523_TEMP_ADC_CONTROL = 0x3e, |
| LP5523_TEMPERATURE_READ = 0x3f, |
| LP5523_TEMPERATURE_WRITE = 0x40, |
| LP5523_LED_TEST_CONTROL = 0x41, |
| LP5523_LED_TEST_ADC = 0x42, |
| LP5523_ENG1_PROG_START_ADDR = 0x4c, |
| LP5523_ENG2_PROG_START_ADDR = 0x4d, |
| LP5523_ENG3_PROG_START_ADDR = 0x4e, |
| LP5523_PROG_MEM_PAGE_SEL = 0x4f, |
| LP5523_LED_MASTER_FADER1 = 0x48, |
| LP5523_LED_MASTER_FADER2 = 0x49, |
| LP5523_LED_MASTER_FADER3 = 0x4A, |
| LP5523_PROGRAM_MEMORY = 0x50, |
| LP5523_ENG1_MAPPING_MSB = 0X70, |
| LP5523_ENG2_MAPPING_MSB = 0X72, |
| LP5523_ENG3_MAPPING_MSB = 0X74, |
| LP5523_GAIN_CHANGE_CTRL = 0x76 |
| }; |
| |
| /* registers */ |
| struct lp5523_register_value { |
| uint8_t reg; |
| uint8_t pos; |
| uint8_t mask; |
| }; |
| |
| #define LP5523_REGISTER_VALUE(r, n, p, m) \ |
| static const struct lp5523_register_value n = { .reg = r, .pos = p, .mask = m } |
| |
| /* control1 */ |
| LP5523_REGISTER_VALUE(LP5523_ENABLE, LP5523_CHIP_EN, 6, 0x40); |
| |
| #define LP5523_ENGINES_HOLD (0x00) |
| #define LP5523_ENGINES_STEP (0x15) |
| #define LP5523_ENGINES_FREE_RUN (0x2a) |
| #define LP5523_ENGINES_EXECUTE_ONCE (0x3f) |
| |
| /* control2 */ |
| #define LP5523_ENGINES_DISABLED (0x00) |
| #define LP5523_ENGINES_LOAD_PROGRAM (0x15) |
| #define LP5523_ENGINES_RUN_PROGRAM (0x2a) |
| #define LP5523_ENGINES_HALT (0x3f) |
| |
| /* output control */ |
| LP5523_REGISTER_VALUE(LP5523_CONTROL, LP5523_OUTPUT_MAPPING, 6, 0xc0); |
| LP5523_REGISTER_VALUE(LP5523_CONTROL, LP5523_OUTPUT_LOG_EN, 5, 0x20); |
| LP5523_REGISTER_VALUE(LP5523_CONTROL, LP5523_OUTPUT_TEMP_COMP, 0, 0x1f); |
| |
| /* misc */ |
| LP5523_REGISTER_VALUE(LP5523_MISC, LP5523_VARIABLE_D_SEL, 7, 0x80); |
| LP5523_REGISTER_VALUE(LP5523_MISC, LP5523_EN_AUTO_INCR, 6, 0x40); |
| LP5523_REGISTER_VALUE(LP5523_MISC, LP5523_POWERSAVE_EN, 5, 0x20); |
| LP5523_REGISTER_VALUE(LP5523_MISC, LP5523_CP_MODE, 3, 0x18); |
| |
| #define LP5523_CP_OFF (0x00) |
| #define LP5523_CP_FORCED_BYPASS (0x01) |
| #define LP5523_CP_FORCED_BOOST (0x02) |
| #define LP5523_CP_AUTOMATIC (0x03) |
| |
| LP5523_REGISTER_VALUE(LP5523_MISC, LP5523_PWM_PS_EN, 2, 0x04); |
| LP5523_REGISTER_VALUE(LP5523_MISC, LP5523_CLK_DET_EN, 1, 0x02); |
| LP5523_REGISTER_VALUE(LP5523_MISC, LP5523_INT_CLK_EN, 0, 0x01); |
| |
| /* status */ |
| LP5523_REGISTER_VALUE(LP5523_STATUS, LP5523_MEAS_DONE, 7, 0x80); |
| LP5523_REGISTER_VALUE(LP5523_STATUS, LP5523_MASK_BUSY, 6, 0x40); |
| LP5523_REGISTER_VALUE(LP5523_STATUS, LP5523_STARTUP_BUSY, 5, 0x20); |
| LP5523_REGISTER_VALUE(LP5523_STATUS, LP5523_ENGINE_BUSY, 4, 0x10); |
| LP5523_REGISTER_VALUE(LP5523_STATUS, LP5523_EXT_CLK_USED, 3, 0x08); |
| LP5523_REGISTER_VALUE(LP5523_STATUS, LP5523_ENG1_INT, 2, 0x04); |
| LP5523_REGISTER_VALUE(LP5523_STATUS, LP5523_ENG2_INT, 1, 0x02); |
| LP5523_REGISTER_VALUE(LP5523_STATUS, LP5523_ENG3_INT, 0, 0x01); |
| |
| /* INT */ |
| LP5523_REGISTER_VALUE(LP5523_INT, LP5523_INT_CONF, 2, 0x04); |
| LP5523_REGISTER_VALUE(LP5523_INT, LP5523_INT_GPO, 0, 0x01); |
| |
| /* temp ADC control */ |
| LP5523_REGISTER_VALUE(LP5523_TEMP_ADC_CONTROL, LP5523_TEMP_MEAS_BUSY, 7, 0x80); |
| LP5523_REGISTER_VALUE(LP5523_TEMP_ADC_CONTROL, LP5523_EN_TEMP_SENSOR, 2, 0x04); |
| LP5523_REGISTER_VALUE(LP5523_TEMP_ADC_CONTROL, LP5523_TEMP_CONTINUOUS_CONV, 1, |
| 0x02); |
| LP5523_REGISTER_VALUE(LP5523_TEMP_ADC_CONTROL, LP5523_SEL_EXT_TEMP, 0, 0x01); |
| |
| /* LED test control */ |
| LP5523_REGISTER_VALUE(LP5523_LED_TEST_CONTROL, LP5523_EN_LED_TEST_ADC, 7, 0x80); |
| LP5523_REGISTER_VALUE(LP5523_LED_TEST_CONTROL, LP5523_EN_LED_TEST_INT, 6, 0x40); |
| LP5523_REGISTER_VALUE(LP5523_LED_TEST_CONTROL, LP5523_LED_CONTINUOUS_CONV, 5, |
| 0x20); |
| LP5523_REGISTER_VALUE(LP5523_LED_TEST_CONTROL, LP5523_LED_LED_TEST, 0, 0x1f); |
| |
| #define LP5523_LED_TEST_D1 (0x00) |
| #define LP5523_LED_TEST_D2 (0x01) |
| #define LP5523_LED_TEST_D3 (0x02) |
| #define LP5523_LED_TEST_D4 (0x03) |
| #define LP5523_LED_TEST_D5 (0x04) |
| #define LP5523_LED_TEST_D6 (0x05) |
| #define LP5523_LED_TEST_D7 (0x06) |
| #define LP5523_LED_TEST_D8 (0x07) |
| #define LP5523_LED_TEST_D9 (0x08) |
| #define LP5523_LED_TEST_VOUT (0x0f) |
| #define LP5523_LED_TEST_VDD (0x10) |
| #define LP5523_LED_TEST_INT (0x11) |
| |
| #define LP5523_LED_TEST_SC_LIM (80) |
| |
| /* program memory */ |
| #define LP5523_PAGE_SIZE (0x10) |
| #define LP5523_MEMORY_SIZE (LP5523_PAGE_SIZE * 6) |
| |
| /* gain change ctrl */ |
| LP5523_REGISTER_VALUE(LP5523_GAIN_CHANGE_CTRL, LP5523_THRESHOLD_MASK, 6, 0xc0); |
| LP5523_REGISTER_VALUE(LP5523_GAIN_CHANGE_CTRL, LP5523_ADAPTIVE_THRESH_EN, 5, |
| 0x20); |
| LP5523_REGISTER_VALUE(LP5523_GAIN_CHANGE_CTRL, LP5523_TIMER, 3, 0x18); |
| LP5523_REGISTER_VALUE(LP5523_GAIN_CHANGE_CTRL, LP5523_FORCE_1X, 2, 0x04); |
| |
| /** |
| * Writes a single byte to the specified register. |
| * |
| * @param The sensor interface. |
| * @param The register address to write to. |
| * @param The value to write. |
| * |
| * @return 0 on success, non-zero error on failure. |
| */ |
| int lp5523_set_reg(struct led_itf *itf, enum lp5523_registers addr, |
| uint8_t value); |
| |
| /** |
| * Reads a single byte from the specified register. |
| * |
| * @param The sensor interface. |
| * @param The register address to read from. |
| * @param Pointer to where the register value should be written. |
| * |
| * @return 0 on success, non-zero error on failure. |
| */ |
| int lp5523_get_reg(struct led_itf *itf, enum lp5523_registers addr, |
| uint8_t *value); |
| |
| /** |
| * Applies a value to a position in a local register value. |
| * |
| * @param A struct containing the position and mask to use for the write. |
| * @param The value to write. |
| * @param Pointer to register to be modified. |
| * |
| * @return 0 on success, non-zero error on failure. |
| */ |
| int lp5523_apply_value(struct lp5523_register_value addr, uint8_t value, |
| uint8_t *reg); |
| |
| /** |
| * Writes a section of the specified register. |
| * |
| * @param The sensor interface. |
| * @param The register address to write to. |
| * @param The mask. |
| * @param Value to write. |
| * |
| * @return 0 on success, non-zero error on failure. |
| */ |
| int lp5523_set_value(struct led_itf *itf, struct lp5523_register_value addr, |
| uint8_t value); |
| |
| /** |
| * Reads a section from the specified register. |
| * |
| * @param The sensor interface. |
| * @param The register address to read from. |
| * @param The mask. |
| * @param Pointer to where the value should be written. |
| * |
| * @return 0 on success, non-zero error on failure. |
| */ |
| int lp5523_get_value(struct led_itf *itf, struct lp5523_register_value addr, |
| uint8_t *value); |
| |
| /** |
| * Writes 9 bits to 2 registers. |
| * To write to: |
| * LP5523_BF_OUTPUT_RATIOMETRIC |
| * LP5523_BF_OUTPUT_CONTROL |
| * LP5523_BF_ENG_MAPPING (see lp5523_set_engine_mapping()) |
| * |
| * @param The sensor interface. |
| * @param The register address to write to (the MSB register). |
| * @param The values to write, only the least significant 9 bits are |
| * significant. |
| * |
| * @return 0 on success, non-zero error on failure. |
| */ |
| int lp5523_set_bitfield(struct led_itf *itf, |
| enum lp5523_bitfield_registers addr, uint16_t outputs); |
| |
| /** |
| * Writes 9 bits to 2 registers. |
| * To read from: |
| * LP5523_BF_OUTPUT_RATIOMETRIC |
| * LP5523_BF_OUTPUT_CONTROL |
| * LP5523_BF_ENG_MAPPING (see lp5523_set_engine_mapping()) |
| * |
| * @param The sensor interface. |
| * @param The register address to read from (the MSB register). |
| * @param Pointer to where the register values should be written. |
| * |
| * @return 0 on success, non-zero error on failure. |
| */ |
| int lp5523_get_bitfield(struct led_itf *itf, |
| enum lp5523_bitfield_registers addr, uint16_t* outputs); |
| |
| /** |
| * Writes to a register with an output-based address offset. |
| * To write to: |
| * LP5523_CONTROL |
| * LP5523_PWM |
| * LP5523_CURRENT_CONTROL |
| * |
| * @param The LED interface. |
| * @param The register address to write to (the MSB register). |
| * @param Output ID 1-9. |
| * @param Value to write. |
| * |
| * @return 0 on success, non-zero error on failure. |
| */ |
| int lp5523_set_output_reg(struct led_itf *itf, |
| enum lp5523_output_registers addr, uint8_t output, uint8_t value); |
| |
| /** |
| * Reads from a register with an output-based address offset. |
| * To read from: |
| * LP5523_CONTROL |
| * LP5523_PWM |
| * LP5523_CURRENT_CONTROL |
| * |
| * @param The sensor interface. |
| * @param The register address to read from (the MSB register). |
| * @param Output ID 1-9. |
| * @param Pointer to where the register values should be written. |
| * |
| * @return 0 on success, non-zero error on failure. |
| */ |
| int lp5523_get_output_reg(struct led_itf *itf, |
| enum lp5523_output_registers addr, uint8_t output, uint8_t *value); |
| |
| /** |
| * Writes to a register with an engine-based address offset. |
| * To write to: |
| * LP5523_ENGINE_PC |
| * LP5523_ENG_PROG_START_ADDR |
| * LP5523_MASTER_FADER |
| * |
| * @param The sensor interface. |
| * @param The register address to write to (the MSB register). |
| * @param Engine ID 1-3. |
| * @param Value to write. |
| * |
| * @return 0 on success, non-zero error on failure. |
| */ |
| int lp5523_set_engine_reg(struct led_itf *itf, |
| enum lp5523_engine_registers addr, uint8_t engine, uint8_t value); |
| |
| /** |
| * Reads from a register with an engine-based address offset. |
| * To read from: |
| * LP5523_ENGINE_PC |
| * LP5523_ENG_PROG_START_ADDR |
| * LP5523_MASTER_FADER |
| * |
| * @param The sensor interface. |
| * @param The register address to read from (the MSB register). |
| * @param Engine ID 1-3. |
| * @param Pointer to where the register values should be written. |
| * |
| * @return 0 on success, non-zero error on failure. |
| */ |
| int lp5523_get_engine_reg(struct led_itf *itf, |
| enum lp5523_engine_registers addr, uint8_t engine, uint8_t *value); |
| |
| /** |
| * Sets the CHIP_EN bit in the ENABLE register. |
| * |
| * @param The sensor interface. |
| * @param Non 0 to enable the device, 0 to disable it. |
| * |
| * @return 0 on success, non-zero error on failure. |
| */ |
| int lp5523_set_enable(struct led_itf *itf, uint8_t enable); |
| |
| /** |
| * Sets the ENGINEX_MODE and ENGINEX_EXEC bits in the ENGINE CNTRLX registers. |
| * |
| * @param The sensor interface struct. |
| * @param Control register to update: LP5523_ENGINE_CNTRL1 or |
| * LP5523_ENGINE_CNTRL2. |
| * @param Engines to update, a combination of LP5523_ENGINE3_MASK, |
| * LP5523_ENGINE2_MASK or LP5523_ENGINE1_MASK. |
| * @param Values to write, the lower 6 bits are relavant, 2 per engine. |
| * |
| * @return 0 on success, non-zero error on failure. |
| */ |
| int lp5523_set_engine_control(struct led_itf *itf, |
| enum lp5523_engine_control_registers addr, uint8_t engine_mask, |
| uint8_t values); |
| |
| /** |
| * Sets the MAPPING bits in the relevant DX CONTROL register. |
| * |
| * @param The sensor interface struct. |
| * @param Output number 1-9. |
| * @param Mapping 0-3. |
| * |
| * @return 0 on success, non-zero error on failure. |
| */ |
| int lp5523_set_output_mapping(struct led_itf *itf, uint8_t output, |
| uint8_t mapping); |
| |
| /** |
| * Gets the MAPPING bits from the relevant DX CONTROL register. |
| * |
| * @param The sensor interface struct. |
| * @param Output number 1-9. |
| * @param Pointer to where the output mapping (0-3) should be written. |
| * |
| * @return 0 on success, non-zero error on failure. |
| */ |
| int lp5523_get_output_mapping(struct led_itf *itf, uint8_t output, |
| uint8_t *mapping); |
| |
| /** |
| * Sets the LOG_EN bit in the relevant DX CONTROL register. |
| * |
| * @param The sensor interface struct. |
| * @param Output number 1-9. |
| * @param Non 0 to enable logarithmic dimming, 0 to disable it. |
| * |
| * @return 0 on success, non-zero error on failure. |
| */ |
| int lp5523_set_output_log_dim(struct led_itf *itf, uint8_t output, |
| uint8_t enable); |
| |
| /** |
| * Gets the LOG_EN bit grom the relevant DX CONTROL register. |
| * |
| * @param The sensor interface struct. |
| * @param Output number 1-9. |
| * @param Written to 1 if logarithmic dimming is enabled, 0 if it is disabled. |
| * |
| * @return 0 on success, non-zero error on failure. |
| */ |
| int lp5523_get_output_log_dim(struct led_itf *itf, uint8_t output, |
| uint8_t *enable); |
| |
| /** |
| * Sets the TEMP_COMP bits in the relevant DX CONTROL register. |
| * |
| * @param The sensor interface struct. |
| * @param Output number 1-9. |
| * @param Temperature compensation value. |
| * |
| * @return 0 on success, non-zero error on failure. |
| */ |
| int lp5523_set_output_temp_comp(struct led_itf *itf, uint8_t output, |
| uint8_t value); |
| |
| /** |
| * Gets the TEMP_COMP bits from the relevant DX CONTROL register. |
| * |
| * @param The sensor interface struct. |
| * @param Output number 1-9. |
| * @param Pointer to where the temperature compensation value should be written. |
| * |
| * @return 0 on success, non-zero error on failure. |
| */ |
| int lp5523_get_output_temp_comp(struct led_itf *itf, uint8_t output, |
| uint8_t *value); |
| |
| /** |
| * Gets the relevant ENGX_INT bit from the status register. |
| * |
| * @param The sensor interface struct. |
| * @param Engine number 1-3. |
| * @param Written to the value of the bit. |
| * |
| * @return 0 on success, non-zero error on failure. |
| */ |
| int lp5523_get_engine_int(struct led_itf *itf, uint8_t engine, |
| uint8_t *flag); |
| |
| /** |
| * Resets the device. |
| * |
| * @param The sensor interface. |
| * |
| * @return 0 on success, non-zero error on failure. |
| */ |
| int lp5523_reset(struct led_itf *itf); |
| |
| /** |
| * Sets the page used for program memory reads and writes. |
| * |
| * @param The sensor interface struct. |
| * @param The page 0-5. |
| * |
| * @return 0 on success, non-zero error on failure. |
| */ |
| int lp5523_set_page_sel(struct led_itf *itf, uint8_t page); |
| |
| /** |
| * Sets or clears the relevant DX bit in the ENGX MAPPING registers. |
| * |
| * @param The sensor interface. |
| * @param ID of the engine 1-3. |
| * @param Output number 1-9. |
| * @param Non 0 to map the output to the specified engine, 0 to unmap it. |
| * |
| * @return 0 on success, non-zero error on failure. |
| */ |
| int lp5523_set_engine_mapping(struct led_itf *itf, uint8_t engine, |
| uint16_t output); |
| |
| /** |
| * Gets the relevant DX bit from the ENGX MAPPING registers. |
| * |
| * @param The sensor interface. |
| * @param ID of the engine 1-3. |
| * @param Output number 1-9. |
| * @param Written to 1 if the output is mapped to the specified engine, 0 if it |
| * is not mapped to that engine. |
| * |
| * @return 0 on success, non-zero error on failure. |
| */ |
| int lp5523_get_engine_mapping(struct led_itf *itf, uint8_t engine, |
| uint16_t *output); |
| |
| /** |
| * Sets an instruction in program memory. |
| * |
| * @param The sensor interface struct. |
| * @param Address to write to. |
| * @param Instruction to write. |
| * |
| * @return 0 on success, non-zero error on failure. |
| */ |
| int lp5523_set_instruction(struct led_itf *itf, uint8_t addr, uint16_t ins); |
| |
| /** |
| * gets an instruction from program memory. |
| * |
| * @param The sensor interface struct. |
| * @param Address to read from. |
| * @param Written to the instruction. |
| * |
| * @return 0 on success, non-zero error on failure. |
| */ |
| int lp5523_get_instruction(struct led_itf *itf, uint8_t addr, uint16_t *ins); |
| |
| /** |
| * Writes a program to memory. |
| * |
| * @param The sensor interface struct. |
| * @param Engines to reset, a combination of LP5523_ENGINE3, LP5523_ENGINE2 |
| * or LP5523_ENGINE1. |
| * @param Program to write. |
| * @param Address to start writing the program. |
| * @param Write size. |
| * |
| * @return 0 on success, non-zero error on failure. |
| */ |
| int lp5523_set_program(struct led_itf *itf, uint8_t engines, uint16_t *pgm, |
| uint8_t start, uint8_t size); |
| |
| /** |
| * Reads a program from memory. |
| * |
| * @param The sensor interface struct. |
| * @param Buffer to read into. |
| * @param Address to start reading the program. |
| * @param read size. |
| * |
| * @return 0 on success, non-zero error on failure. |
| */ |
| int lp5523_get_program(struct led_itf *itf, uint16_t *pgm, uint8_t start, |
| uint8_t size); |
| |
| /** |
| * Reads a program from memory and compares it to one passed in as an arg. |
| * |
| * @param The sensor interface struct. |
| * @param Program to verify against. |
| * @param Address to start reading the program. |
| * @param read size. |
| * |
| * @return 0 on success, 1 on verify failure, other non-zero error on other |
| * failure. |
| */ |
| int lp5523_verify_program(struct led_itf *itf, uint16_t *pgm, uint8_t start, |
| uint8_t size); |
| |
| /** |
| * Sets the specified engines to execute their respective programs. |
| * |
| * @param The sensor interface struct. |
| * @param Engines to run, a combination of LP5523_ENGINE3, LP5523_ENGINE2 |
| * or LP5523_ENGINE1. |
| * |
| * @return 0 on success, non-zero error on failure. |
| */ |
| int lp5523_engines_run(struct led_itf *itf, uint8_t engines); |
| |
| /** |
| * Sets the specified engines to hold execution of their respective programs. |
| * |
| * @param The sensor interface struct. |
| * @param Engines to run, a combination of LP5523_ENGINE3, LP5523_ENGINE2 |
| * or LP5523_ENGINE1. |
| * |
| * @return 0 on success, non-zero error on failure. |
| */ |
| int lp5523_engines_hold(struct led_itf *itf, uint8_t engines); |
| |
| /** |
| * Sets the specified engines to execute the next instruction of their |
| * respective programs and increment their PCs. |
| * |
| * @param The sensor interface struct. |
| * @param Engines to run, a combination of LP5523_ENGINE3, LP5523_ENGINE2 |
| * or LP5523_ENGINE1. |
| * |
| * @return 0 on success, non-zero error on failure. |
| */ |
| int lp5523_engines_step(struct led_itf *itf, uint8_t engines); |
| |
| /** |
| * Disables the specified engines. |
| * |
| * @param The sensor interface struct. |
| * @param Engines to run, a combination of LP5523_ENGINE3, LP5523_ENGINE2 |
| * or LP5523_ENGINE1. |
| * |
| * @return 0 on success, non-zero error on failure. |
| */ |
| int lp5523_engines_disable(struct led_itf *itf, uint8_t engines); |
| |
| /** |
| * Reads the ADC on a pin. |
| * |
| * @param The sensor interface struct. |
| * @param Pin to read. |
| * @param Written to the voltage. |
| * |
| * @return 0 on success, non-zero error on failure. |
| */ |
| int lp5523_read_adc(struct led_itf *itf, uint8_t pin, uint8_t *v); |
| |
| /** |
| * Tests the Device, checks for a clock if necessary and checks the ADC values |
| * for each LED pin are reasonable. |
| * |
| * @param The sensor interface struct. |
| * |
| * @return 0 on success, non-zero error on failure. |
| */ |
| int lp5523_self_test(struct led_itf *itf); |
| |
| /** |
| * Expects to be called back through os_dev_create(). |
| * |
| * @param The device object associated with this LED driver. |
| * @param Argument passed to OS device init, unused. |
| * |
| * @return 0 on success, non-zero error on failure. |
| */ |
| int lp5523_init(struct os_dev *dev, void *arg); |
| int lp5523_config(struct led_itf *itf, struct lp5523_cfg *cfg); |
| |
| /** |
| * Calculate Temp comp bits from correction factor |
| * |
| * @param corr_factor Correction factor -1.5 < corr_factor < +1.5 |
| * @param temp_comp Temperature compensation bits 5 bits 11111 - 01111 |
| * |
| * @return 0 on success, non-zero on failure |
| */ |
| int |
| lp5523_calc_temp_comp(float corr_factor, uint8_t *temp_comp); |
| |
| /** |
| * Set output ON for particular output |
| * |
| * @param itf Ptr to LED itf |
| * @param output Number of the output |
| * @param on Output 1-ON/0-OFF |
| * |
| * @return 0 on success, non-zero on failure |
| */ |
| int |
| lp5523_set_output_on(struct led_itf *itf, uint8_t output, uint8_t on); |
| |
| /** |
| * Get output ON for particular output |
| * |
| * @param itf Ptr to LED itf |
| * @param output Number of the output |
| * @param on Ptr to output variable Output 1-ON/0-OFF |
| * |
| * @return 0 on success, non-zero on failure |
| */ |
| int |
| lp5523_get_output_on(struct led_itf *itf, uint8_t output, uint8_t *on); |
| |
| /** |
| * |
| * Get status |
| * |
| * @param LED interface |
| * @param Ptr to status |
| * |
| * @return 0 on success, non-zero on failure |
| */ |
| int |
| lp5523_get_status(struct led_itf *itf, uint8_t *status); |
| |
| /** |
| * Get Output Current control |
| * |
| * @param itf LED interface |
| * @param output Number of the output |
| * @param curr_ctrl Ptr to Current control |
| * |
| * @return 0 on success, non-zero on failure |
| */ |
| int |
| lp5523_get_output_curr_ctrl(struct led_itf *itf, uint8_t output, uint8_t *curr_ctrl); |
| |
| /** |
| * |
| * Set output Current control |
| * |
| * @param itf LED interface |
| * @param output Number of the output |
| * @param curr_ctrl Current control value to set |
| */ |
| int |
| lp5523_set_output_curr_ctrl(struct led_itf *itf, uint8_t output, uint8_t curr_ctrl); |
| |
| /** |
| * Calculate Temp comp bits from correction factor |
| * |
| * @param corr_factor Correction factor -1.5 < corr_factor < +1.5 |
| * @param temp_comp Temperature compensation bits 5 bits 11111 - 01111 |
| * |
| * @return 0 on success, non-zero on failure |
| */ |
| int |
| lp5523_calc_temp_comp(float corr_factor, uint8_t *temp_comp); |
| |
| /** |
| * Set output ON for particular output |
| * |
| * @param itf Ptr to LED itf |
| * @param output Number of the output |
| * @param on Output 1-ON/0-OFF |
| * |
| * @return 0 on success, non-zero on failure |
| */ |
| int |
| lp5523_set_output_on(struct led_itf *itf, uint8_t output, uint8_t on); |
| |
| /** |
| * Get output ON for particular output |
| * |
| * @param itf Ptr to LED itf |
| * @param output Number of the output |
| * @param on Ptr to output variable Output 1-ON/0-OFF |
| * |
| * @return 0 on success, non-zero on failure |
| */ |
| int |
| lp5523_get_output_on(struct led_itf *itf, uint8_t output, uint8_t *on); |
| |
| /** |
| * |
| * Get status |
| * |
| * @param LED interface |
| * @param Ptr to status |
| * |
| * @return 0 on success, non-zero on failure |
| */ |
| int |
| lp5523_get_status(struct led_itf *itf, uint8_t *status); |
| |
| /** |
| * Get Output Current control |
| * |
| * @param itf LED interface |
| * @param output Number of the output |
| * @param curr_ctrl Ptr to Current control |
| * |
| * @return 0 on success, non-zero on failure |
| */ |
| int |
| lp5523_get_output_curr_ctrl(struct led_itf *itf, uint8_t output, uint8_t *curr_ctrl); |
| |
| /** |
| * |
| * Set output Current control |
| * |
| * @param itf LED interface |
| * @param output Number of the output |
| * @param curr_ctrl Current control value to set |
| */ |
| int |
| lp5523_set_output_curr_ctrl(struct led_itf *itf, uint8_t output, uint8_t curr_ctrl); |
| |
| #if MYNEWT_VAL(LP5523_CLI) |
| int lp5523_shell_init(void); |
| #endif |
| |
| /* instructions |
| * |
| * programs look like: |
| * |
| * uint16_t pgm[] = { |
| * LP5523_INS_RAMP_IM(1, 1, 0, 100), |
| * LP5523_INS_SET_PWM_IM(50), |
| * ... |
| * LP5523_INS_MUX_MAP_ADDR(24) |
| * }; |
| * |
| * loaded with: |
| * |
| * lp5523_program_load(sensor, engine, pgm, sizeof(pgm)/sizeof(*pgm)); |
| */ |
| |
| /* sign */ |
| |
| #define LP5523_POS (0) |
| #define LP5523_NEG (1) |
| |
| /* prescaler */ |
| |
| #define LP5523_PS (1) |
| #define LP5523_NPS (0) |
| |
| /* mux LEDs */ |
| |
| #define LP5523_MUX_LED1 (1) |
| #define LP5523_MUX_LED2 (2) |
| #define LP5523_MUX_LED3 (3) |
| #define LP5523_MUX_LED4 (4) |
| #define LP5523_MUX_LED5 (5) |
| #define LP5523_MUX_LED6 (6) |
| #define LP5523_MUX_LED7 (7) |
| #define LP5523_MUX_LED8 (8) |
| #define LP5523_MUX_LED9 (9) |
| #define LP5523_MUX_GPO (16) |
| |
| /* map LEDs */ |
| |
| #define LP5523_MAP_LED1 (0x0001) |
| #define LP5523_MAP_LED2 (0x0002) |
| #define LP5523_MAP_LED3 (0x0004) |
| #define LP5523_MAP_LED4 (0x0008) |
| #define LP5523_MAP_LED5 (0x0010) |
| #define LP5523_MAP_LED6 (0x0020) |
| #define LP5523_MAP_LED7 (0x0040) |
| #define LP5523_MAP_LED8 (0x0080) |
| #define LP5523_MAP_LED9 (0x0100) |
| #define LP5523_MAP_GPO (0x8000) |
| |
| #define LP5523_INS_PARAM(ins, name, param) \ |
| ((param << LP5523_INS_ ## ins ## _ ## name ## _POS) & \ |
| LP5523_INS_ ## ins ## _ ## name ## _MASK) |
| |
| /* |
| * Generates a PWM ramp starting at the current value. At each step the output |
| * is incremented or decremented. |
| * |
| * prescale: |
| * 0 = 0.488ms cycle time. |
| * 1 = 15.625ms cycle time. |
| * |
| * step_time: Number of cycles per increment (1-31). |
| * |
| * sign: |
| * 0 = Increment. |
| * 1 = Decrement. |
| * |
| * noi: Number of increments (0-255). |
| */ |
| |
| #define LP5523_INS_RAMP_IM_PRESCALE_POS (14) |
| #define LP5523_INS_RAMP_IM_PRESCALE_MASK (0x4000) |
| #define LP5523_INS_RAMP_IM_STEP_TIME_POS (9) |
| #define LP5523_INS_RAMP_IM_STEP_TIME_MASK (0x3e00) |
| #define LP5523_INS_RAMP_IM_SIGN_POS (8) |
| #define LP5523_INS_RAMP_IM_SIGN_MASK (0x0100) |
| #define LP5523_INS_RAMP_IM_NOI_POS (0) |
| #define LP5523_INS_RAMP_IM_NOI_MASK (0x00ff) |
| |
| #define LP5523_INS_RAMP_IM(prescale, step_time, sign, noi) \ |
| (0x0000 | \ |
| LP5523_INS_PARAM(RAMP_IM, PRESCALE, prescale) | \ |
| LP5523_INS_PARAM(RAMP_IM, STEP_TIME, step_time) | \ |
| LP5523_INS_PARAM(RAMP_IM, SIGN, sign) | \ |
| LP5523_INS_PARAM(RAMP_IM, NOI, noi)) |
| |
| /* |
| * Generates a PWM ramp starting at the current value. At each step the output |
| * is incremented or decremented. |
| * |
| * prescale: |
| * 0 = 0.488ms cycle time. |
| * 1 = 15.625ms cycle time. |
| * |
| * sign: |
| * 0 = Increment. |
| * 1 = Decrement. |
| * |
| * step_time: Pointer to a variable containing the number of cycles per |
| * increment. |
| * 0 = local varible A. |
| * 1 = local variable B. |
| * 2 = global variable C. |
| * 3 = register address 0x3C variable D value or register address 0x42 |
| * value. |
| * The registers value should be in the range 1-31 |
| * |
| * noi: Pointer to a variable containing the number of increments. |
| * 0 = local varible A. |
| * 1 = local variable B. |
| * 2 = global variable C. |
| * 3 = register address 0x3C variable D value or register address 0x42 |
| * value. |
| */ |
| |
| #define LP5523_INS_RAMP_PRESCALE_POS (5) |
| #define LP5523_INS_RAMP_PRESCALE_MASK (0x0020) |
| #define LP5523_INS_RAMP_SIGN_POS (4) |
| #define LP5523_INS_RAMP_SIGN_MASK (0x0010) |
| #define LP5523_INS_RAMP_STEP_TIME_POS (2) |
| #define LP5523_INS_RAMP_STEP_TIME_MASK (0x000c) |
| #define LP5523_INS_RAMP_NOI_POS (0) |
| #define LP5523_INS_RAMP_NOI_MASK (0x0003) |
| |
| #define LP5523_INS_RAMP(prescale, sign, step_time, noi) \ |
| (0x8400 | \ |
| LP5523_INS_PARAM(RAMP, PRESCALE, prescale) | \ |
| LP5523_INS_PARAM(RAMP, SIGN, sign) | \ |
| LP5523_INS_PARAM(RAMP, STEP_TIME, step_time) | \ |
| LP5523_INS_PARAM(RAMP, NOI, noi)) |
| |
| /* |
| * Sets the PWM value for an output. |
| * |
| * pwm: The PWM value (0-255). |
| */ |
| |
| #define LP5523_INS_SET_PWM_IM_PWM_POS (0) |
| #define LP5523_INS_SET_PWM_IM_PWM_MASK (0x00ff) |
| |
| #define LP5523_INS_SET_PWM_IM(pwm) \ |
| (0x4000 | \ |
| LP5523_INS_PARAM(SET_PWM_IM, PWM, pwm)) |
| |
| /* |
| * Sets the PWM value for an output. |
| * |
| * pwm: Pointer to a variable containing the PWM value. |
| * 0 = local varible A. |
| * 1 = local variable B. |
| * 2 = global variable C. |
| * 3 = register address 0x3C variable D value or register address 0x42 |
| * value. |
| */ |
| |
| #define LP5523_INS_SET_PWM_PWM_POS (0) |
| #define LP5523_INS_SET_PWM_PWM_MASK (0x0003) |
| |
| #define LP5523_INS_SET_PWM(pwm) \ |
| (0x8460 | \ |
| LP5523_INS_PARAM(SET_PWM, PWM, pwm)) |
| |
| /* |
| * Waits a given number of steps. |
| * |
| * prescale: |
| * 0 = 0.488ms cycle time. |
| * 1 = 15.625ms cycle time. |
| * |
| * step_time: Number of cycles per increment (1-31). |
| */ |
| |
| #define LP5523_INS_WAIT(prescale, step_time) \ |
| LP5523_INS_RAMP_IM(prescale, step_time, 0, 0) |
| |
| #define LP5523_INS_MUX_PAR_POS (0) |
| #define LP5523_INS_MUX_PAR_MASK (0x007f) |
| |
| #define LP5523_INS_MUX(opcode, par) \ |
| (opcode | \ |
| LP5523_INS_PARAM(MUX, PAR, par)) |
| |
| /* |
| * Defines the address of the start of the mapping table. |
| * |
| * addr: The address of the start of the mapping table (0-95). |
| */ |
| #define LP5523_INS_MUX_LD_START(addr) \ |
| LP5523_INS_MUX(0x9e00, addr) |
| |
| /* |
| * Defines the address of the start of the mapping table and activates the first |
| * row. |
| * |
| * addr: The address of the start of the mapping table (0-95). |
| */ |
| #define LP5523_INS_MUX_MAP_START(addr) \ |
| LP5523_INS_MUX(0x9c00, addr) |
| |
| /* |
| * Defines the address of the end of the mapping table. |
| * |
| * addr: The address of the end of the mapping table (0-95). |
| */ |
| #define LP5523_INS_MUX_LD_END(addr) \ |
| LP5523_INS_MUX(0x9c80, addr) |
| |
| /* |
| * Connects one LED driver to the execution engine. |
| * |
| * sel: The LED to connect (0-16). |
| * 0 = no drivers |
| * 1-9 = LEDs. |
| * 16 = GPO. |
| */ |
| #define LP5523_INS_MUX_SEL(sel) \ |
| LP5523_INS_MUX(0x9d00, sel) |
| |
| /* |
| * Clears engine to driver mapping. |
| */ |
| #define LP5523_INS_MUX_CLR() \ |
| LP5523_INS_MUX_SEL(0) |
| |
| /* |
| * Increments the index pointer and sets that row active. Wraps to the start |
| * of the table if the end of the table is reached. |
| */ |
| #define LP5523_INS_MUX_MAP_NEXT() \ |
| (0x9d80) |
| |
| /* |
| * Decrements the index pointer and sets that row active. Wraps to the end |
| * of the table if the start of the table is reached. |
| */ |
| #define LP5523_INS_MUX_MAP_PREV() \ |
| (0x9dc0) |
| |
| /* |
| * Increments the index pointer. Wraps to the start of the table if the end |
| * of the table is reached. |
| */ |
| #define LP5523_INS_MUX_LD_NEXT() \ |
| (0x9d81) |
| |
| /* |
| * Decrements the index pointer. Wraps to the end of the table if the start |
| * of the table is reached. |
| */ |
| #define LP5523_INS_MUX_LD_PREV() \ |
| (0x9dc1) |
| |
| /* |
| * Sets the index pointer to point to a table row. |
| * |
| * addr: The absolute address of the table row (0-95). |
| */ |
| #define LP5523_INS_MUX_LD_ADDR(addr) \ |
| LP5523_INS_MUX(0x9f00, addr) |
| |
| /* |
| * Sets the index pointer to point to a table row and sets that row active. |
| * |
| * addr: The absolute address of the table row (0-95). |
| */ |
| #define LP5523_INS_MUX_MAP_ADDR(addr) \ |
| LP5523_INS_MUX(0x9f80, addr) |
| |
| /* |
| * Reset |
| */ |
| #define LP5523_INS_RST() \ |
| (0x0000) |
| |
| /* |
| * Branches to an absolute address. |
| * |
| * step_number: The absolute address to branch to (0-95). |
| * |
| * loop_count: The number of times to branch, 0 indicates infintity. |
| */ |
| #define LP5523_INS_BRANCH_IM_LOOP_COUNT_POS (7) |
| #define LP5523_INS_BRANCH_IM_LOOP_COUNT_MASK (0x01f80) |
| #define LP5523_INS_BRANCH_IM_STEP_NUMBER_POS (0) |
| #define LP5523_INS_BRANCH_IM_STEP_NUMBER_MASK (0x007f) |
| |
| #define LP5523_INS_BRANCH_IM(loop_count, step_number) \ |
| (0xa000 | \ |
| LP5523_INS_PARAM(BRANCH_IM, LOOP_COUNT, loop_count) | \ |
| LP5523_INS_PARAM(BRANCH_IM, STEP_NUMBER, step_number)) |
| |
| /* |
| * Branches to an absolute address. |
| * |
| * step_number: The absolute address to branch to (0-95). |
| * |
| * loop_count: Pointer to a variable containing the number of loops. |
| * 0 = local varible A. |
| * 1 = local variable B. |
| * 2 = global variable C. |
| * 3 = register address 0x3C variable D value or register address 0x42 |
| * value. |
| */ |
| #define LP5523_INS_BRANCH_STEP_NUMBER_POS (2) |
| #define LP5523_INS_BRANCH_STEP_NUMBER_MASK (0x01fc) |
| #define LP5523_INS_BRANCH_LOOP_COUNT_POS (0) |
| #define LP5523_INS_BRANCH_LOOP_COUNT_MASK (0x0003) |
| |
| #define LP5523_INS_BRANCH(step_number, loop_count) \ |
| (0x8600 | \ |
| LP5523_INS_PARAM(BRANCH, STEP_NUMBER, step_number) | \ |
| LP5523_INS_PARAM(BRANCH, LOOP_COUNT, loop_count)) |
| |
| #define LP5523_INS_INT() \ |
| (0xc400) |
| |
| /* |
| * Ends the program execution. |
| */ |
| #define LP5523_INS_END_INTERRUPT_POS (12) |
| #define LP5523_INS_END_INTERRUPT_MASK (0x1000) |
| #define LP5523_INS_END_RESET_POS (11) |
| #define LP5523_INS_END_RESET_MASK (0x0800) |
| |
| #define LP5523_INS_END(interrupt, reset) \ |
| (0xc000 | \ |
| LP5523_INS_PARAM(END, INTERRUPT, interrupt) | \ |
| LP5523_INS_PARAM(END, RESET, reset)) |
| |
| /* |
| * Wait on, or send triggers that can be waited on by or sent from other |
| * engines. |
| * |
| * wait_external: Wait for an external trigger. |
| * |
| * wait_engines: Wait for a trigger from one of these engines (3 bit value, |
| * each bit representing an engine the LSB being engine 1). |
| * |
| * send_external: Send an external trigger. |
| * |
| * send_engines: Send a trigger to all of these engines (3 bit value, |
| * each bit representing an engine the LSB being engine 1). |
| */ |
| #define LP5523_INS_TRIGGER_WAIT_EXTERNAL_POS (12) |
| #define LP5523_INS_TRIGGER_WAIT_EXTERNAL_MASK (0x1000) |
| #define LP5523_INS_TRIGGER_WAIT_ENGINES_POS (7) |
| #define LP5523_INS_TRIGGER_WAIT_ENGINES_MASK (0x0310) |
| #define LP5523_INS_TRIGGER_SEND_EXTERNAL_POS (6) |
| #define LP5523_INS_TRIGGER_SEND_EXTERNAL_MASK (0x0040) |
| #define LP5523_INS_TRIGGER_SEND_ENGINES_POS (1) |
| #define LP5523_INS_TRIGGER_SEND_ENGINES_MASK (0x000e) |
| |
| #define LP5523_INS_TRIGGER(wait_external, wait_engines, send_external, \ |
| send_engines) \ |
| (0xe000 | \ |
| LP5523_INS_PARAM(TRIGGER, WAIT_EXTERNAL, wait_external) | \ |
| LP5523_INS_PARAM(TRIGGER, WAIT_ENGINES, wait_engines) | \ |
| LP5523_INS_PARAM(TRIGGER, SEND_EXTERNAL, send_external) | \ |
| LP5523_INS_PARAM(TRIGGER, SEND_ENGINES, send_engines)) |
| |
| #define LP5523_INS_J_SKIP_POS (4) |
| #define LP5523_INS_J_SKIP_MASK (0x01f0) |
| #define LP5523_INS_J_VARIABLE1_POS (2) |
| #define LP5523_INS_J_VARIABLE1_MASK (0x000c) |
| #define LP5523_INS_J_VARIABLE2_POS (0) |
| #define LP5523_INS_J_VARIABLE2_MASK (0x0003) |
| |
| #define LP5523_INS_J(opcode, skip, variable1, variable2) \ |
| (opcode | \ |
| LP5523_INS_PARAM(J, SKIP, skip) | \ |
| LP5523_INS_PARAM(J, VARIABLE1, variable1) | \ |
| LP5523_INS_PARAM(J, VARIABLE2, variable2)) |
| |
| /* |
| * Skip if not equal. |
| * |
| * skip: Number of operations to be skipped if not equal (0-31). |
| * |
| * variable1: Compared to variable2 (0-3). |
| * 0 = local varible A. |
| * 1 = local variable B. |
| * 2 = global variable C. |
| * 3 = register address 0x3C variable D value or register address 0x42 |
| * value. |
| * |
| * variable2: Compared to variable1 (0-3). |
| * 0 = local varible A. |
| * 1 = local variable B. |
| * 2 = global variable C. |
| * 3 = register address 0x3C variable D value or register address 0x42 |
| * value. |
| */ |
| #define LP5523_INS_JNE(skip, variable1, variable2) \ |
| LP5523_INS_J(0x8800, skip, variable1, variable2) |
| |
| /* |
| * Skip if less than. |
| * |
| * skip: Number of operations to be skipped if less (0-31). |
| * |
| * variable1: Compared to variable2 (0-3). |
| * 0 = local varible A. |
| * 1 = local variable B. |
| * 2 = global variable C. |
| * 3 = register address 0x3C variable D value or register address 0x42 |
| * value. |
| * |
| * variable2: Compared to variable1 (0-3). |
| * 0 = local varible A. |
| * 1 = local variable B. |
| * 2 = global variable C. |
| * 3 = register address 0x3C variable D value or register address 0x42 |
| * value. |
| */ |
| #define LP5523_INS_JL(skip, variable1, variable2) \ |
| LP5523_INS_J(0x8a00, skip, variable1, variable2) |
| |
| /* |
| * Skip if greater or equal than. |
| * |
| * skip: Number of operations to be skipped if greater or equal (0-31). |
| * |
| * variable1: Compared to variable2 (0-3). |
| * 0 = local varible A. |
| * 1 = local variable B. |
| * 2 = global variable C. |
| * 3 = register address 0x3C variable D value or register address 0x42 |
| * value. |
| * |
| * variable2: Compared to variable1 (0-3). |
| * 0 = local varible A. |
| * 1 = local variable B. |
| * 2 = global variable C. |
| * 3 = register address 0x3C variable D value or register address 0x42 |
| * value. |
| */ |
| #define LP5523_INS_JGE(skip, variable1, variable2) \ |
| LP5523_INS_J(0x8c00, skip, variable1, variable2) |
| |
| /* |
| * Skip if equal. |
| * |
| * skip: Number of operations to be skipped if equal (0-31). |
| * |
| * variable1: Compared to variable2 (0-3). |
| * 0 = local varible A. |
| * 1 = local variable B. |
| * 2 = global variable C. |
| * 3 = register address 0x3C variable D value or register address 0x42 |
| * value. |
| * |
| * variable2: Compared to variable1 (0-3). |
| * 0 = local varible A. |
| * 1 = local variable B. |
| * 2 = global variable C. |
| * 3 = register address 0x3C variable D value or register address 0x42 |
| * value. |
| */ |
| |
| #define LP5523_INS_JE(skip, variable1, variable2) \ |
| LP5523_INS_J(0x8e00, skip, variable1, variable2) |
| |
| #define LP5523_INS_ARITH_TARGET_VARIABLE_POS (10) |
| #define LP5523_INS_ARITH_TARGET_VARIABLE_MASK (0x0c00) |
| |
| #define LP5523_INS_ARITH_IM_VALUE_POS (0) |
| #define LP5523_INS_ARITH_IM_VALUE_MASK (0x00ff) |
| |
| #define LP5523_INS_ARITH_IM(opcode, target_variable, value) \ |
| (opcode | \ |
| LP5523_INS_PARAM(ARITH, TARGET_VARIABLE, target_variable) | \ |
| LP5523_INS_PARAM(ARITH_IM, VALUE, value)) |
| |
| #define LP5523_INS_ARITH_VARIABLE1_POS (2) |
| #define LP5523_INS_ARITH_VARIABLE1_MASK (0x000c) |
| #define LP5523_INS_ARITH_VARIABLE2_POS (0) |
| #define LP5523_INS_ARITH_VARIABLE2_MASK (0x0003) |
| |
| #define LP5523_INS_ARITH(opcode, target_variable, variable1, variable2) \ |
| (opcode | \ |
| LP5523_INS_PARAM(ARITH, TARGET_VARIABLE, target_variable) | \ |
| LP5523_INS_PARAM(ARITH, VARIABLE1, variable1) | \ |
| LP5523_INS_PARAM(ARITH, VARIABLE2, variable2)) |
| |
| /* |
| * Load a value into a variable. |
| * |
| * target_variable: (0-2) |
| * 0 = local varible A. |
| * 1 = local variable B. |
| * 2 = global variable C. |
| * |
| * value: |
| */ |
| #define LP5523_INS_LD(target_variable, value) \ |
| LP5523_INS_ARITH_IM(0x9000, target_variable, value) |
| |
| /* |
| * Add an immediate value to a variable, place the result back in the |
| * varible. |
| * |
| * target_variable: (0-2) |
| * 0 = local varible A. |
| * 1 = local variable B. |
| * 2 = global variable C. |
| * |
| * value: |
| */ |
| #define LP5523_INS_ADD_IM(target_variable, value) \ |
| LP5523_INS_ARITH_IM(0x9100, target_variable, value) |
| |
| /* |
| * Add one variable to another, place the result in a third target variable. |
| * |
| * target_variable: (0-2) |
| * 0 = local varible A. |
| * 1 = local variable B. |
| * 2 = global variable C. |
| * |
| * variable1: Variable containing the augend (0-3). |
| * 0 = local varible A. |
| * 1 = local variable B. |
| * 2 = global variable C. |
| * 3 = register address 0x3C variable D value or register address 0x42 |
| * value. |
| * |
| * variable2: Variable containing the addend (0-3). |
| * 0 = local varible A. |
| * 1 = local variable B. |
| * 2 = global variable C. |
| * 3 = register address 0x3C variable D value or register address 0x42 |
| * value. |
| */ |
| #define LP5523_INS_ADD(target_variable, variable1, variable2) \ |
| LP5523_INS_ARITH(0x9300, target_variable, variable1, variable2) |
| |
| /* |
| * Subtract an immediate value from a variable, place the result back in the |
| * varible. |
| * |
| * target_variable: (0-2) |
| * 0 = local varible A. |
| * 1 = local variable B. |
| * 2 = global variable C. |
| * |
| * value: |
| */ |
| #define LP5523_INS_SUB_IM(target_variable, value) \ |
| LP5523_INS_ARITH_IM(0x9200, target_variable, value) |
| |
| /* |
| * Subtract one variable from another, place the result in a third target |
| * variable. |
| * |
| * target_variable: (0-2) |
| * 0 = local varible A. |
| * 1 = local variable B. |
| * 2 = global variable C. |
| * |
| * variable1: Variable containing the minuend (0-3). |
| * 0 = local varible A. |
| * 1 = local variable B. |
| * 2 = global variable C. |
| * 3 = register address 0x3C variable D value or register address 0x42 |
| * value. |
| * |
| * variable2: Variable containing the subtrahend (0-3). |
| * 0 = local varible A. |
| * 1 = local variable B. |
| * 2 = global variable C. |
| * 3 = register address 0x3C variable D value or register address 0x42 |
| * value. |
| */ |
| #define LP5523_INS_SUB(target_variable, variable1, variable2) \ |
| LP5523_INS_ARITH(0x9310, target_variable, variable1, variable2) |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| #endif |