blob: c05bfa2e34e3a005181c00792cd685d50b0b1959 [file] [log] [blame]
/*
* Copyright (c) 2018 Intel Corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/drivers/i2c.h>
#include <zephyr/kernel.h>
#include <zephyr/ztest.h>
/*
* For ADV7513 Programming details, please
* refer to the following link.
* https://ez.analog.com/docs/DOC-1986
*/
#define ADV7513_HDMI_I2C_SLAVE_ADDR 0x39
#define ADV7513_CHIP_REVISION_REG 0x0
#define CHIP_REVISION_VAL 0x13
#define ADV7513_MAIN_POWER_REG 0x41
#define POWER_ON_VAL 0x10
#define ADV7513_HPD_CTRL_REG 0xD6
#define HPD_CTRL_VAL 0xC0
#define ADV7513_WRITE_TEST_REG 0x2
#define WRITE_TEST_VAL 0x66
static int powerup_adv7513(const struct device *i2c_dev)
{
uint8_t data;
TC_PRINT("Powering up ADV7513\n");
/* write to HPD control registers */
if (i2c_reg_write_byte(i2c_dev, ADV7513_HDMI_I2C_SLAVE_ADDR,
ADV7513_HPD_CTRL_REG, HPD_CTRL_VAL)) {
TC_PRINT("i2c write fail\n");
return TC_FAIL;
}
if (i2c_reg_read_byte(i2c_dev, ADV7513_HDMI_I2C_SLAVE_ADDR,
0xD6, &data)) {
TC_PRINT("failed to read HPD control\n");
return TC_FAIL;
}
TC_PRINT("HPD control 0x%x\n", data);
/* write to power control registers */
if (i2c_reg_write_byte(i2c_dev, ADV7513_HDMI_I2C_SLAVE_ADDR,
ADV7513_MAIN_POWER_REG, POWER_ON_VAL)) {
TC_PRINT("i2c write fail\n");
return TC_FAIL;
}
if (i2c_reg_read_byte(i2c_dev, ADV7513_HDMI_I2C_SLAVE_ADDR,
0x41, &data)) {
TC_PRINT("failed to read Power state\n");
return TC_FAIL;
}
TC_PRINT("Power state 0x%x\n", data);
return TC_PASS;
}
static int test_i2c_adv7513(void)
{
const struct device *const i2c_dev = DEVICE_DT_GET_ONE(altr_nios2_i2c);
uint32_t i2c_cfg = I2C_SPEED_SET(I2C_SPEED_STANDARD) | I2C_MODE_CONTROLLER;
uint8_t data;
if (!device_is_ready(i2c_dev)) {
TC_PRINT("i2c device is not ready\n");
return TC_FAIL;
}
/* Test i2c_configure() */
if (i2c_configure(i2c_dev, i2c_cfg)) {
TC_PRINT("i2c config failed\n");
return TC_FAIL;
}
/* Power up ADV7513 */
zassert_true(powerup_adv7513(i2c_dev) == TC_PASS,
"ADV7513 power up failed");
TC_PRINT("*** Running i2c read/write tests ***\n");
/* Test i2c byte read */
data = 0x0;
if (i2c_reg_read_byte(i2c_dev, ADV7513_HDMI_I2C_SLAVE_ADDR,
ADV7513_CHIP_REVISION_REG, &data)) {
TC_PRINT("failed to read chip revision\n");
return TC_FAIL;
}
if (data != CHIP_REVISION_VAL) {
TC_PRINT("chip revision does not match 0x%x\n", data);
return TC_FAIL;
}
TC_PRINT("i2c read test passed\n");
/* Test i2c byte write */
data = WRITE_TEST_VAL;
if (i2c_reg_write_byte(i2c_dev, ADV7513_HDMI_I2C_SLAVE_ADDR,
ADV7513_WRITE_TEST_REG, data)) {
TC_PRINT("i2c write fail\n");
return TC_FAIL;
}
data = 0x0;
if (i2c_reg_read_byte(i2c_dev, ADV7513_HDMI_I2C_SLAVE_ADDR,
ADV7513_WRITE_TEST_REG, &data)) {
TC_PRINT("i2c read fail\n");
return TC_FAIL;
}
if (data != WRITE_TEST_VAL) {
TC_PRINT("i2c write test failed 0x%x\n", data);
return TC_FAIL;
}
TC_PRINT("i2c write & verify test passed\n");
return TC_PASS;
}
ZTEST(nios2_i2c_master, test_i2c_master)
{
zassert_true(test_i2c_adv7513() == TC_PASS);
}
ZTEST_SUITE(nios2_i2c_master, NULL, NULL, NULL, NULL, NULL);