Other Parts Discussed in Thread: DS90UB935-Q1
Dear Sir,
936 mode pin is in mode#4, 935 mode pin is in mode#0
In the case that the above synchronization mode cannot be locked, customer changes the 0X58 register of 936 to 0X5A (936 works in non-synchronous mode). At this time 935 does not change, 935 and 936 can be LOCK, and LOCK is stable.
But we can't read/write front end SENSOR, we use in the STP mode, how to setting the 935/936 ?
The attached file is code and sensor.IMX327LQR-C_TechnicalDatasheet_E_Rev0.2.pdf
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/ioctl.h> #include <fcntl.h> #include <unistd.h> #define I2C_RETRIES 0x0701 /* number of times a device address should be polled when not acknowledging */ #define I2C_TIMEOUT 0x0702 /* set timeout in units of 10 ms */ /* NOTE: Slave address is 7 or 10 bits, but 10-bit addresses * are NOT supported! (due to code brokenness) */ #define I2C_SLAVE 0x0703 /* Use this slave address */ #define I2C_SLAVE_FORCE 0x0706 /* Use this slave address, even if it is already in use by a driver! */ #define I2C_TENBIT 0x0704 /* 0 for 7 bit addrs, != 0 for 10 bit */ #define I2C_FUNCS 0x0705 /* Get the adapter functionality mask */ #define I2C_RDWR 0x0707 /* Combined R/W transfer (one STOP only) */ #define I2C_PEC 0x0708 /* != 0 to use PEC with SMBus */ #define I2C_SMBUS 0x0720 /* SMBus transfer */ #define I2C_16BIT_REG 0x0709 /* 16BIT REG WIDTH */ #define I2C_16BIT_DATA 0x070a /* 16BIT DATA WIDTH */ const unsigned int imx327_addr_byte = 2; const unsigned int imx327_data_byte = 1; const unsigned char imx327_i2c_addr = 0x34; const unsigned char imx327_i2c_vir_addr = 0x36; const unsigned char Ti935_i2c_addr = 0x30; /* I2C Address of Ti935_i2c_addr */ const unsigned char Ti935_i2c_vir_addr = 0x32; /* I2C Address of Ti935_i2c_addr */ const unsigned char Ti936_i2c_addr = 0x60; /* I2C Address of Ti936_i2c_addr */ static int g_fd = 0; int imx327_write_register(int addr, int data) { if (0 > g_fd) { return 0; } int idx = 0; int ret; char buf[8]; if (imx327_addr_byte == 2) { buf[idx] = (addr >> 8) & 0xff; idx++; buf[idx] = addr & 0xff; idx++; } else { //buf[idx] = addr & 0xff; //idx++; } if (imx327_data_byte == 2) { //buf[idx] = (data >> 8) & 0xff; //idx++; //buf[idx] = data & 0xff; //idx++; } else { buf[idx] = data & 0xff; idx++; } ret = write(g_fd, buf, imx327_addr_byte + imx327_data_byte); if (ret < 0) { printf("I2C_WRITE error!\n"); return -1; } return 0; } int imx327_read_register(int addr, int data) { // TODO: int ret; int idx = 0; char buf[8]; char recbuf = 0; //buf[idx] = addr & 0xff; //idx++; if (imx327_addr_byte == 2) { buf[idx] = (addr >> 8) & 0xff; idx++; buf[idx] = addr & 0xff; idx++; } //send reg address ret = write(g_fd, buf, 2); if(ret<0) { printf("I2C_WRITE error!\n"); return -1; } //get data ret = read(g_fd, &recbuf, 1); if(ret<0) { printf("I2C_READ error!\n"); return -1; } printf("[imx327 Read] addr:%#x data:%#x\n",addr,recbuf); return 0; } int read_register_8bitAddr(int addr, int readlen) { // TODO: int ret; int idx = 0; char buf[8]; char recbuf = 0; buf[idx] = addr & 0xff; idx++; //send reg address ret = write(g_fd, buf, 1); if(ret<0) { printf("I2C_WRITE error!\n"); return -1; } //get data ret = read(g_fd, &recbuf, 1); if(ret<0) { printf("I2C_READ error!\n"); return -1; } printf("[Read] addr:%#x data:%#x\n",addr,recbuf); return 0; } int write_register_8bitAddr(int addr, int data) { if (0 > g_fd) { return 0; } int idx = 0; int ret; char buf[8]; buf[idx] = addr & 0xff; idx++; buf[idx] = data & 0xff; idx++; ret = write(g_fd, buf, 1 + 1); if (ret < 0) { printf("I2C_WRITE error!\n"); return -1; } printf("[Write] addr:%#x data:%#x\n",addr,data); return 0; } int i2c_init(unsigned char i2c_addr) { char acDevFile[16] = {0}; unsigned char u8DevNum; //if (g_fd >= 0) //{ // return 0; //} int ret; u8DevNum = 0;//g_aunImx327BusInfo[ViPipe].s8I2cDev; snprintf(acDevFile, sizeof(acDevFile), "/dev/i2c-%u", u8DevNum); g_fd = open(acDevFile, O_RDWR, S_IRUSR | S_IWUSR); if (g_fd < 0) { printf("Open /dev/hi_i2c_drv-%u error!\n", u8DevNum); return -1; } ret = ioctl(g_fd, I2C_SLAVE_FORCE, (i2c_addr >> 1)); //ret = ioctl(g_fd, I2C_SLAVE, (i2c_addr >> 1)); if (ret < 0) { printf("I2C_SLAVE_FORCE error!\n"); close(g_fd); g_fd= -1; return ret; } printf("[Init] acDevFile:%s slave:%#x\n",acDevFile,i2c_addr); return 0; } int i2c_exit() { if (g_fd >= 0) { close(g_fd); g_fd = -1; return 0; } return -1; } #if 0 int Ti_ub936() { printf("----------936\n"); i2c_init(Ti936_i2c_addr); read_register_8bitAddr(0x00,1);//936 i2c��ַ read_register_8bitAddr(0x6d,1); read_register_8bitAddr(0x58,1); //FPD3_PORT_SEL 0x4c read_register_8bitAddr(0x4c,1); write_register_8bitAddr(0x4c,0x01);//RxPort 0 enable //write_register_8bitAddr(0x4c,0x0f);//sample read_register_8bitAddr(0x4c,1); //Port_Config write_register_8bitAddr(0x6d,0x58); //BCC_CONFIG 0x58 //write_register_8bitAddr(0x58,0x58); write_register_8bitAddr(0x58,0x7a); //10Mbps non_sync //write_register_8bitAddr(0x58,0x7d); //25Mbps //write_register_8bitAddr(0x58,0x7e); //50Mbps sync //write_register_8bitAddr(0x58,0x7F); //100Mbps //write_register_8bitAddr(0x58,0xfa); //10Mbps non_sync //write_register_8bitAddr(0x58,0xfd); //25Mbps //write_register_8bitAddr(0x58,0xfe); //50Mbps sync //write_register_8bitAddr(0x58,0xfF); //100Mbps read_register_8bitAddr(0x58,1); //935 iic id write_register_8bitAddr(0x5c,0x31); read_register_8bitAddr(0x5c,1); //sensor iic id write_register_8bitAddr(0x5d, 0x34); //Slave_ID[0],Զ��iic�ĵ�ַ read_register_8bitAddr(0x5d,1); write_register_8bitAddr(0x65, 0x35); //Slave_Alias[0]��ӳ������iic��ַ read_register_8bitAddr(0x65,1); i2c_exit(); return 0; } int Ti_ub935() { #if 1 printf("----------935\n"); i2c_init(Ti935_i2c_vir_addr); read_register_8bitAddr(0x00,1);//935 i2c��ַ read_register_8bitAddr(0x02,1);//935 MODE_SEL read_register_8bitAddr(0x03,1);//935 MODE_SEL read_register_8bitAddr(0x0d,1);//935 LOCAL_GPIO_DATA read_register_8bitAddr(0x53,1);//935 GPIO_PIN_STS read_register_8bitAddr(0x0e,1);//935 //write_register_8bitAddr(0x32,0x69);//935 BCC_CONFIG pass auto_ack //write_register_8bitAddr(0x32,0xe9);//935 BCC_CONFIG pass auto_ack //write_register_8bitAddr(0x0d,0x10);//935 �ij�Զ��ӳ��936 ��GPIO0���� //write_register_8bitAddr(0x0e,0xF0);//935 GPIO_INPUT_CTRL //�ij����ģʽ read_register_8bitAddr(0x0e,1);//935 read_register_8bitAddr(0x0d,1);//935 read_register_8bitAddr(0x53,1);//935 GPIO_PIN_STS //write_register_8bitAddr(0x05,0x1b); //write_register_8bitAddr(0x06,0x29); //HS_CLK_DIV = 4 M = 9 //write_register_8bitAddr(0x07,0xf2); //N = 0xF2 //write_register_8bitAddr(0x03,0x5a); //��ͬ���ⲿʱ��ģʽ i2c_exit(); #endif return 0; } #endif int Ti_ub936() { printf("----------936\n"); i2c_init(Ti936_i2c_addr); write_register_8bitAddr(0x01, 0x03); //reset write_register_8bitAddr(0x33, 0x23); //Enable CSI, Line2-Line, Continue Clock write_register_8bitAddr(0x4c, 0x01); // Port Select 0 write_register_8bitAddr(0x20,0x08); // Forward Port Select 0 //write_register_8bitAddr(0x58,0x7a); //10mbps no_sync (can lock) write_register_8bitAddr(0x58,0x7e); //50mbps sync (can't lock!) write_register_8bitAddr(0x7c,0x81); //PORT_CONFIG2 write_register_8bitAddr(0x5b,Ti935_i2c_addr); //serid write_register_8bitAddr(0x5c,Ti935_i2c_vir_addr); //seraliasid //sensor iic id write_register_8bitAddr(0x5d, imx327_i2c_addr); //Slave_ID[0] read_register_8bitAddr(0x5d,1); write_register_8bitAddr(0x65, imx327_i2c_vir_addr); //Slave_Alias[0] read_register_8bitAddr(0x65,1); i2c_exit(); return 0; } int Ti_ub935() { #if 1 printf("----------935\n"); i2c_init(Ti935_i2c_vir_addr); read_register_8bitAddr(0x00,1);//935 i2c��ַ read_register_8bitAddr(0x02,1);//935 MODE_SEL read_register_8bitAddr(0x03,1);//935 MODE_SEL read_register_8bitAddr(0x0d,1);//935 LOCAL_GPIO_DATA read_register_8bitAddr(0x53,1);//935 GPIO_PIN_STS i2c_exit(); #endif return 0; } int IMX327_init() { printf("----------imx327\n"); i2c_init(imx327_i2c_vir_addr); //imx327_write_register (0x3000, 0x01); /* STANDBY */ imx327_read_register(0x3000, 0x01); /* STANDBY */ i2c_exit(); return 0; } int main(int argc, char * * argv) { Ti_ub936(); sleep(1); Ti_ub935(); sleep(1); IMX327_init(); #if 0 //test i2c_init(Ti936_i2c_addr); write_register_8bitAddr(0x33,0x01); write_register_8bitAddr(0xB0,0x00); write_register_8bitAddr(0xB1,0x01); write_register_8bitAddr(0xB2,0x01); write_register_8bitAddr(0xB1,0x02); write_register_8bitAddr(0xB2,0x33); write_register_8bitAddr(0xB1,0x03); write_register_8bitAddr(0xB2,0x24); write_register_8bitAddr(0xB1,0x04); write_register_8bitAddr(0xB2,0x0F); write_register_8bitAddr(0xB1,0x05); write_register_8bitAddr(0xB2,0x00); write_register_8bitAddr(0xB1,0x06); write_register_8bitAddr(0xB2,0x01); write_register_8bitAddr(0xB1,0x07); write_register_8bitAddr(0xB2,0xE0); write_register_8bitAddr(0xB1,0x08); write_register_8bitAddr(0xB2,0x02); write_register_8bitAddr(0xB1,0x09); write_register_8bitAddr(0xB2,0xD0); write_register_8bitAddr(0xB1,0x0a); write_register_8bitAddr(0xB2,0x04); write_register_8bitAddr(0xB1,0x0b); write_register_8bitAddr(0xB2,0x1a); write_register_8bitAddr(0xB1,0x0c); write_register_8bitAddr(0xB2,0x0c); write_register_8bitAddr(0xB1,0x0d); write_register_8bitAddr(0xB2,0x67); write_register_8bitAddr(0xB1,0x0e); write_register_8bitAddr(0xB2,0x21); write_register_8bitAddr(0xB1,0x0f); write_register_8bitAddr(0xB2,0x0a); #endif return 0; }