unsigned char * i2c_read(u8 *val, u32 n, u16 addr) { if (!i2c_free()) return NULL; i2c_start(); i2c_sendbyte(ST24C512_ADDR & 0xfe); i2c_waitack(); i2c_sendbyte(addr >> 8); i2c_waitack(); i2c_sendbyte(addr & 0xff); i2c_waitack(); i2c_start(); i2c_sendbyte(ST24C512_ADDR | 1); i2c_waitack(); n--; while (n--) { *val = i2c_recvbyte(); i2c_sendack(); val++; } *val = i2c_recvbyte(); i2c_sendnack(); i2c_stop(); return val; }
bool i2c_write(u8 *val, u32 n, u16 addr) { if (!i2c_free()) return FALSE; i2c_start(); i2c_sendbyte(ST24C512_ADDR & 0xfe); i2c_waitack(); i2c_sendbyte(addr >> 8); i2c_waitack(); i2c_sendbyte(addr & 0xff); i2c_waitack(); while (n--) { i2c_sendbyte(*val); i2c_waitack(); val++; } i2c_stop(); return TRUE; }
i2c_ack i2c_write_2byte(int bus_id, char chip_addr, char *buf, unsigned int size) { #ifdef FLY_VIDEO_BOARD_V3 int ret_send = 0; ret_send = SOC_I2C_Send(3, chip_addr, buf, size); //lidbg("\n*************i2c_write_2byt ret_send=%d**************\n",ret_send); if(ret_send > 0) { return ACK; } else { return NACK; } #else u8 i; mutex_lock(&io_i2c_lock); i2c_init(); // start transmite i2c_begin();//msg 0>> i2c_write_chip_addr(chip_addr, hkj_WRITE) ; if (i2c_read_ack() == NACK) { i2c_stop(); i2c_free(); lidbg(" chip_addr devices is not ACK--in-i2c_write_chip_addr(%.2x)----w-----\r\n", chip_addr); mutex_unlock(&io_i2c_lock); return NACK; } // send message to mm_i2c device to transmite data i2c_write(buf[0]) ;//subaddr MSB if (i2c_read_ack () == NACK) { i2c_stop(); i2c_free(); lidbg(" chip_addr devices is not ACK--in-i2c_write(sub[%d])=%.2x-----w----\r\n", 0, buf[0]); mutex_unlock(&io_i2c_lock); return NACK; } i2c_write(buf[1]) ;//subaddr if (i2c_read_ack () == NACK) { i2c_stop(); i2c_free(); lidbg("chip_addr devices is not ACK--in-i2c_write(sub[%d])=%.2x--w", 1, buf[1]); mutex_unlock(&io_i2c_lock); return NACK; } // transmite data for(i = 2; i < size; i++) { i2c_write(buf[i]); if( i2c_read_ack() == NACK) { i2c_stop(); i2c_free(); lidbg(" chip_addr devices is not ACK--in-i2c_write(buf[%d])=%.2x--w----\r\n", (i - 2), buf[i]); mutex_unlock(&io_i2c_lock); return NACK; } } // stop transmite i2c_stop();//msg 0<< i2c_free(); mutex_unlock(&io_i2c_lock); return ACK; #endif }
i2c_ack i2c_read_2byte(int bus_id, char chip_addr, unsigned int sub_addr, char *buf, unsigned int size) { #ifdef FLY_VIDEO_BOARD_V3 int ret_rec = 0; ret_rec = SOC_I2C_Rec_2B_SubAddr(3, TC358746_I2C_ChipAdd, sub_addr, buf, size); //lidbg("\n************i2c_read_2byte ret_rec=%d *****************\n",ret_rec); if(ret_rec > 0) { return ACK; } else { return NACK; } #else u8 i; mutex_lock(&io_i2c_lock); i2c_init(); // start transmite i2c_begin();//msg 0>> i2c_write_chip_addr(chip_addr, hkj_WRITE) ; if (i2c_read_ack () == NACK) { i2c_stop(); i2c_free(); lidbg(" chip_addr devices is not ACK------i2c_write_chip_addr----r--\r\n"); mutex_unlock(&io_i2c_lock); return NACK; } //i2c_stop(); // restart transmite // send message to mm_i2c device to transmite data i2c_write(sub_addr >> 8) ; if (i2c_read_ack () == NACK) { i2c_stop(); i2c_free(); lidbg(" chip_addr devices is not ACK-----subadder1-------\r\n"); mutex_unlock(&io_i2c_lock); return NACK; } i2c_write(sub_addr) ; if (i2c_read_ack () == NACK) { i2c_stop(); i2c_free(); lidbg(" chip_addr devices is not ACK------subadder0------\r\n"); mutex_unlock(&io_i2c_lock); return NACK; } i2c_stop();//msg 0<< // start transmite i2c_begin();//msg 1>> i2c_write_chip_addr(chip_addr, hkj_READ) ; if (i2c_read_ack () == NACK) { i2c_stop(); i2c_free(); lidbg(" chip_addr devices is not ACK----- i2c_write_chip_addr-------\r\n"); mutex_unlock(&io_i2c_lock); return NACK; } // transmite data for(i = 0; i < size; i++) { buf[i] = i2c_read(); ( i == (size - 1) ) ? i2c_write_ask(NACK) : i2c_write_ask(ACK); } // stop transmite i2c_stop();//msg 1<< i2c_free(); mutex_unlock(&io_i2c_lock); return ACK; #endif }
i2c_ack i2c_write_byte(int bus_id, char chip_addr, char *buf, unsigned int size) { #ifdef FLY_VIDEO_BOARD_V3 int ret_send = 0; ret_send = SOC_I2C_Send(3, chip_addr, buf, size); // lidbg("\n************i2c_write_byte =%d*******\n",ret_send); if(ret_send > 0) { #ifdef DEBUG_ACK return NACK; #else return ACK; #endif } else { return NACK; } #else u8 i; mutex_lock(&io_i2c_lock); //lidbg("i2c:write byte:addr =0x%.2x value=0x%.2x ",buf[0],buf[1]); i2c_init(); // start transmite i2c_begin(); i2c_write_chip_addr(chip_addr, hkj_WRITE) ; if (i2c_read_ack() == NACK) { i2c_stop(); i2c_free(); lidbg(" at write funtion: i2c_write_chip_addr(%.2x, %d) ; is not ACK\n", chip_addr, hkj_WRITE); mutex_unlock(&io_i2c_lock); return NACK; } //i2c_stop(); // restart transmite //i2c_begin(); // send message to mm_i2c device to transmite data i2c_write(buf[0]) ; if (i2c_read_ack() == NACK) { i2c_stop(); i2c_free(); lidbg(" at write funtion:i2c_write(%.2x) ;is not ACK\n", buf[0]); mutex_unlock(&io_i2c_lock); return NACK; } // transmite data for(i = 1; i < size; i++) { i2c_write(buf[i]); if( i2c_read_ack() == NACK) { i2c_stop(); i2c_free(); lidbg(" at write funtion:i2c_write(%.2x) ;is not ACK\n", buf[i]); mutex_unlock(&io_i2c_lock); return NACK; } } // stop transmite i2c_stop(); i2c_free(); mutex_unlock(&io_i2c_lock); return ACK; #endif }
i2c_ack i2c_read_byte(int bus_id, char chip_addr, unsigned int sub_addr, char *buf, unsigned int size) { #ifdef FLY_VIDEO_BOARD_V3 int ret = 0; //ret=i2c_api_do_recv(3,chip_addr, sub_addr , buf, size); ret = SOC_I2C_Rec(3, chip_addr, sub_addr , buf, size); //lidbg("\n************ i2c_read_byte =%d*******\n",ret); //if(ret==size){ if(ret > 0) { #ifdef DEBUG_ACK return NACK; #else return ACK; #endif } else { return NACK; } #else u8 i; mutex_lock(&io_i2c_lock); i2c_init(); // start transmite i2c_begin(); i2c_write_chip_addr(chip_addr, hkj_WRITE) ; if (i2c_read_ack () == NACK) { i2c_stop(); i2c_free(); lidbg("at read funtion :i2c_write_chip_addr(%.2x, %d) ; is not ACK\n", chip_addr, hkj_WRITE); mutex_unlock(&io_i2c_lock); return NACK; } //i2c_stop(); // restart transmite //i2c_begin(); // send message to mm_i2c device to transmite data i2c_write(sub_addr) ; if (i2c_read_ack () == NACK) { i2c_stop(); i2c_free(); lidbg("at read funtion :i2c_write (%.2x) is not ACK\n", sub_addr & 0xff); mutex_unlock(&io_i2c_lock); return NACK; } i2c_stop(); // start transmite i2c_begin(); i2c_write_chip_addr(chip_addr, hkj_READ) ; if (i2c_read_ack() == NACK) { i2c_stop(); i2c_free(); lidbg("at read funtion :i2c_write_chip_addr(%.2x, %d) ; is not ACK\n", sub_addr, hkj_READ); mutex_unlock(&io_i2c_lock); return NACK; } // transmite data for(i = 0; i < size; i++) { buf[i] = i2c_read(); ( i == (size - 1) ) ? i2c_write_ask(NACK) : i2c_write_ask(ACK); } // stop transmite i2c_stop(); i2c_free(); mutex_unlock(&io_i2c_lock); return ACK; #endif }