#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define lt8912_i2c_NAME "lt8912_i2c" #define lt8912_i2c_SPEED 100*1000 #define HTU_ADDR 0x80 #define HTU_ADDR_WR (HTU_ADDR & 0xfe) #define HTU_ADDR_RD (HTU_ADDR | 0x01) //zhuji #define HTU_TEMP1 0xe3 #define HTU_HUMi1 0Xe5 //非主机模式 #define HTU_TEMP2 0xf3 #define HTU_HUMI2 0Xf5 #define HTU_SOFTWARE_RESET 0xfe struct i2c_client *lt8912_i2c_client; //static struct gpio_desc *reset_gpio; static int lt8912_i2c_write_reg(struct i2c_client *client, int reg, int val) { int ret; ret = i2c_smbus_write_byte_data(client, reg, val); if (ret < 0) { printk("write reg 0x%x failed\n",reg); return ret; } return ret; } static int lt8912_i2c_read_reg(struct i2c_client *client, int reg, int *buf) { int ret; ret = i2c_smbus_read_byte_data(client, reg); if(ret < 0) { printk("read_reg: recv failed! ret = %d\n",ret); return ret; } *buf = ret; return 0; } static int lt8912_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) { int version[2]; int hactive, hfp, hsync, hbp, vfp, vsync, vbp, htotal, vtotal; int lanes; unsigned int reset_flag, reset_gpio; struct device_node *node; node = client->dev.of_node; printk("-------------lt8912_i2c probe"); lt8912_i2c_client = client; if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { printk("----------------i2c fail"); return -1; } else { printk("-----------------i2c success"); } reset_gpio = of_get_named_gpio_flags(node, "reset-gpios", 0, &reset_flag); /* reset_gpio = devm_gpiod_get_optional(&client->dev, "reset", GPIOD_ASIS); if (IS_ERR(reset_gpio)) { dev_err(&client->dev, "lt8912 failed to request reset GPIO\n"); } gpiod_direction_output(reset_gpio, 0); msleep(100); gpiod_direction_output(reset_gpio, 1); msleep(100); */ if(gpio_is_valid(reset_gpio)){ gpio_request(reset_gpio, "reset-gpio"); gpio_direction_output(reset_gpio, ~reset_flag); gpio_set_value(reset_gpio, ~reset_flag); msleep(100); gpio_set_value(reset_gpio, reset_flag); msleep(100); } hactive = 1920; hfp = 88; hsync = 44; hbp = 148; vfp = 4; vsync = 5; vbp = 36; htotal = 2200; vtotal = 1125; printk("******************************\n"); printk("hactive %d\n",hactive); printk("hfp %d\n",hfp); printk("hsync %d\n",hsync); printk("hbp %d\n",hbp); printk("vfp %d\n",vfp); printk("vsync %d\n",vsync); printk("vbp %d\n",vbp); printk("htotal %d\n",htotal); printk("vtotal %d\n",vtotal); printk("******************************\n"); lanes = 4; version[0] = 0; version[1] = 1; lt8912_i2c_read_reg(client, 0x00, &version[0]); lt8912_i2c_read_reg(client, 0x01, &version[1]); printk("LT8912 ID: %02x, %02x\n", version[0], version[1]); client->addr = 0x48; /* DigitalClockEn */ lt8912_i2c_write_reg(client, 0x08, 0xff); lt8912_i2c_write_reg(client, 0x09, 0x81); lt8912_i2c_write_reg(client, 0x0a, 0xff); lt8912_i2c_write_reg(client, 0x0b, 0x64); lt8912_i2c_write_reg(client, 0x0c, 0xff); lt8912_i2c_write_reg(client, 0x44, 0x31); lt8912_i2c_write_reg(client, 0x51, 0x1f); /* TxAnalog */ lt8912_i2c_write_reg(client, 0x31, 0xa1); lt8912_i2c_write_reg(client, 0x32, 0xa1); lt8912_i2c_write_reg(client, 0x33, 0x03); lt8912_i2c_write_reg(client, 0x37, 0x00); lt8912_i2c_write_reg(client, 0x38, 0x22); lt8912_i2c_write_reg(client, 0x60, 0x82); /* CbusAnalog */ lt8912_i2c_write_reg(client, 0x39, 0x45); lt8912_i2c_write_reg(client, 0x3b, 0x00); /* HDMIPllAnalog */ lt8912_i2c_write_reg(client, 0x44, 0x31); lt8912_i2c_write_reg(client, 0x55, 0x44); lt8912_i2c_write_reg(client, 0x57, 0x01); lt8912_i2c_write_reg(client, 0x5a, 0x02); client->addr = 0x49; /* MipiBasicSet */ lt8912_i2c_write_reg(client, 0x10, 0x01); lt8912_i2c_write_reg(client, 0x11, 0x08); lt8912_i2c_write_reg(client, 0x12, 0x04); lt8912_i2c_write_reg(client, 0x13, lanes % 4); lt8912_i2c_write_reg(client, 0x14, 0x00); lt8912_i2c_write_reg(client, 0x15, 0x00); lt8912_i2c_write_reg(client, 0x1a, 0x03); lt8912_i2c_write_reg(client, 0x1b, 0x03); /* MIPIDig */ lt8912_i2c_write_reg(client, 0x18, hsync); lt8912_i2c_write_reg(client, 0x19, vsync); lt8912_i2c_write_reg(client, 0x1c, hactive); lt8912_i2c_write_reg(client, 0x1d, hactive >> 8); lt8912_i2c_write_reg(client, 0x1e, 0x67); lt8912_i2c_write_reg(client, 0x2f, 0x0c); lt8912_i2c_write_reg(client, 0x34, htotal); lt8912_i2c_write_reg(client, 0x35, htotal >> 8); lt8912_i2c_write_reg(client, 0x36, vtotal); lt8912_i2c_write_reg(client, 0x37, vtotal >> 8); lt8912_i2c_write_reg(client, 0x38, vbp); lt8912_i2c_write_reg(client, 0x39, vbp >> 8); lt8912_i2c_write_reg(client, 0x3a, vfp); lt8912_i2c_write_reg(client, 0x3b, vfp >> 8); lt8912_i2c_write_reg(client, 0x3c, hbp); lt8912_i2c_write_reg(client, 0x3d, hbp >> 8); lt8912_i2c_write_reg(client, 0x3e, hfp); lt8912_i2c_write_reg(client, 0x3f, hfp >> 8); /* DDSConfig */ lt8912_i2c_write_reg(client, 0x4e, 0x52); lt8912_i2c_write_reg(client, 0x4f, 0xde); lt8912_i2c_write_reg(client, 0x50, 0xc0); lt8912_i2c_write_reg(client, 0x51, 0x80); lt8912_i2c_write_reg(client, 0x51, 0x00); lt8912_i2c_write_reg(client, 0x1f, 0x5e); lt8912_i2c_write_reg(client, 0x20, 0x01); lt8912_i2c_write_reg(client, 0x21, 0x2c); lt8912_i2c_write_reg(client, 0x22, 0x01); lt8912_i2c_write_reg(client, 0x23, 0xfa); lt8912_i2c_write_reg(client, 0x24, 0x00); lt8912_i2c_write_reg(client, 0x25, 0xc8); lt8912_i2c_write_reg(client, 0x26, 0x00); lt8912_i2c_write_reg(client, 0x27, 0x5e); lt8912_i2c_write_reg(client, 0x28, 0x01); lt8912_i2c_write_reg(client, 0x29, 0x2c); lt8912_i2c_write_reg(client, 0x2a, 0x01); lt8912_i2c_write_reg(client, 0x2b, 0xfa); lt8912_i2c_write_reg(client, 0x2c, 0x00); lt8912_i2c_write_reg(client, 0x2d, 0xc8); lt8912_i2c_write_reg(client, 0x2e, 0x00); client->addr = 0x48; lt8912_i2c_write_reg(client, 0x03, 0x7f); usleep_range(10000, 20000); lt8912_i2c_write_reg(client, 0x03, 0xff); client->addr = 0x49; lt8912_i2c_write_reg(client, 0x42, 0x64); lt8912_i2c_write_reg(client, 0x43, 0x00); lt8912_i2c_write_reg(client, 0x44, 0x04); lt8912_i2c_write_reg(client, 0x45, 0x00); lt8912_i2c_write_reg(client, 0x46, 0x59); lt8912_i2c_write_reg(client, 0x47, 0x00); lt8912_i2c_write_reg(client, 0x48, 0xf2); lt8912_i2c_write_reg(client, 0x49, 0x06); lt8912_i2c_write_reg(client, 0x4a, 0x00); lt8912_i2c_write_reg(client, 0x4b, 0x72); lt8912_i2c_write_reg(client, 0x4c, 0x45); lt8912_i2c_write_reg(client, 0x4d, 0x00); lt8912_i2c_write_reg(client, 0x52, 0x08); lt8912_i2c_write_reg(client, 0x53, 0x00); lt8912_i2c_write_reg(client, 0x54, 0xb2); lt8912_i2c_write_reg(client, 0x55, 0x00); lt8912_i2c_write_reg(client, 0x56, 0xe4); lt8912_i2c_write_reg(client, 0x57, 0x0d); lt8912_i2c_write_reg(client, 0x58, 0x00); lt8912_i2c_write_reg(client, 0x59, 0xe4); lt8912_i2c_write_reg(client, 0x5a, 0x8a); lt8912_i2c_write_reg(client, 0x5b, 0x00); lt8912_i2c_write_reg(client, 0x5c, 0x34); lt8912_i2c_write_reg(client, 0x1e, 0x4f); lt8912_i2c_write_reg(client, 0x51, 0x00); client->addr = 0x48; lt8912_i2c_write_reg(client, 0xb2, 0x01); client->addr = 0x4a; /* AudioIIsEn */ lt8912_i2c_write_reg(client, 0x06, 0x08); lt8912_i2c_write_reg(client, 0x07, 0xf0); lt8912_i2c_write_reg(client, 0x34, 0xd2); lt8912_i2c_write_reg(client, 0x3c, 0x41); client->addr = 0x48; /* MIPIRxLogicRes */ lt8912_i2c_write_reg(client, 0x03, 0x7f); usleep_range(10000, 20000); lt8912_i2c_write_reg(client, 0x03, 0xff); client->addr = 0x49; lt8912_i2c_write_reg(client, 0x51, 0x80); usleep_range(10000, 20000); lt8912_i2c_write_reg(client, 0x51, 0x00); return 0; } static int lt8912_i2c_remove(struct i2c_client *client) { return 0; } static const struct of_device_id lt8912_i2c_match_table[] = { {.compatible = "lt8912_i2c",}, { }, }; static const struct i2c_device_id lt8912_i2c_id[] = { { lt8912_i2c_NAME, 0 }, { } }; static struct i2c_driver lt8912_i2c_driver = { .probe = lt8912_i2c_probe, .remove = lt8912_i2c_remove, .id_table = lt8912_i2c_id, .driver = { .name = lt8912_i2c_NAME, .owner = THIS_MODULE, .of_match_table = lt8912_i2c_match_table, }, }; module_i2c_driver(lt8912_i2c_driver); MODULE_DESCRIPTION("lt8912_i2c Driver"); MODULE_LICENSE("GPL");