int fc8101_ext_init(HANDLE hDevice) { u8 intMask; u8 intStatusEn; bbm_ext_word_write(hDevice, BBM_BUF_THR, INT_THR_SIZE-1); // taew00k.kang test 2011-08-26 bbm_ext_word_write(hDevice, BBM_BUF_END, (188 * 64)-1); intMask = BBM_MF_INT; intStatusEn = BBM_MF_INT; bbm_ext_write(hDevice, BBM_COM_INT_MASK, intMask); bbm_ext_write(hDevice, BBM_COM_STATUS_ENABLE, intStatusEn); fc8101_reset(hDevice); return BBM_OK; }
int fci_i2c_init (HANDLE hDevice, int speed, int slaveaddr) { u16 pr, rpr =0; pr = (u16)((6400/speed) -1); bbm_ext_word_write(hDevice, BBM_I2C_PR, pr); bbm_ext_word_read(hDevice, BBM_I2C_PR, &rpr); if(pr != rpr) { return BBM_NOK; } bbm_ext_write(hDevice, BBM_I2C_CTR, 0xC0); return BBM_OK; }
static int fci_i2c_transfer (HANDLE hDevice, u8 cmd_type, u8 chip, u8 addr[], u8 addr_len, u8 data[], u8 data_len) { int i; int result = I2C_OK; u16 cmd; switch (cmd_type) { case I2C_BB_WRITE: #ifdef FEATURE_INTERFACE_TEST cmd = (I2C_CR_STA | I2C_CR_WR); cmd = (cmd<<8) | (chip | I2C_WRITE); bbm_ext_word_write(hDevice, BBM_I2C_TXR, cmd); #else bbm_ext_write(hDevice, BBM_I2C_TXR, chip | I2C_WRITE); bbm_ext_write(hDevice, BBM_I2C_CR, I2C_CR_STA | I2C_CR_WR /*0x90*/); #endif result = WaitForXfer(hDevice); if(result != I2C_OK) return result; if (addr && addr_len) { i = 0; while ((i < addr_len) && (result == I2C_OK)) { #ifdef FEATURE_INTERFACE_TEST cmd = (I2C_CR_WR); cmd = (cmd<<8) | (addr[i]); bbm_ext_word_write(hDevice, BBM_I2C_TXR, cmd); #else bbm_ext_write(hDevice, BBM_I2C_TXR, addr[i]); bbm_ext_write(hDevice, BBM_I2C_CR, I2C_CR_WR /*0x10*/); #endif result = WaitForXfer(hDevice); if(result != I2C_OK) return result; i++; } } i = 0; while ((i < data_len) && (result == I2C_OK)) { #ifdef FEATURE_INTERFACE_TEST cmd = (I2C_CR_WR); cmd = (cmd<<8) | (data[i]); bbm_ext_word_write(hDevice, BBM_I2C_TXR, cmd); #else bbm_ext_write(hDevice, BBM_I2C_TXR, data[i]); bbm_ext_write(hDevice, BBM_I2C_CR, I2C_CR_WR /*0x10*/); #endif result = WaitForXfer(hDevice); if(result != I2C_OK) return result; i++; } bbm_ext_write(hDevice, BBM_I2C_CR, I2C_CR_STO /*0x40*/); result = WaitForXfer(hDevice); if(result != I2C_OK) return result; break; case I2C_BB_READ: if (addr && addr_len) { #ifdef FEATURE_INTERFACE_TEST cmd = (I2C_CR_STA | I2C_CR_WR); cmd = (cmd<<8) | (chip | I2C_WRITE); bbm_ext_word_write(hDevice, BBM_I2C_TXR, cmd); #else bbm_ext_write(hDevice, BBM_I2C_TXR, chip | I2C_WRITE); bbm_ext_write(hDevice, BBM_I2C_CR, I2C_CR_STA | I2C_CR_WR /*0x90*/); // send start #endif result = WaitForXfer(hDevice); if(result != I2C_OK) { return result; } i = 0; while ((i < addr_len) && (result == I2C_OK)) { #ifdef FEATURE_INTERFACE_TEST cmd = (I2C_CR_WR); cmd = (cmd<<8) | (addr[i]); bbm_ext_word_write(hDevice, BBM_I2C_TXR, cmd); #else bbm_ext_write(hDevice, BBM_I2C_TXR, addr[i]); bbm_ext_write(hDevice, BBM_I2C_CR, I2C_CR_WR /*0x10*/); #endif result = WaitForXfer(hDevice); if(result != I2C_OK) { return result; } i++; } } #ifdef FEATURE_INTERFACE_TEST cmd = (I2C_CR_STA | I2C_CR_WR); cmd = (cmd<<8) | (chip | I2C_READ); bbm_ext_word_write(hDevice, BBM_I2C_TXR, cmd); #else bbm_ext_write(hDevice, BBM_I2C_TXR, chip | I2C_READ); bbm_ext_write(hDevice, BBM_I2C_CR, I2C_CR_STA | I2C_CR_WR /*0x90*/); // resend start #endif result = WaitForXfer(hDevice); if(result != I2C_OK) { return result; } i = 0; while ((i < data_len) && (result == I2C_OK)) { if (i == data_len - 1) { bbm_ext_write(hDevice, BBM_I2C_CR, I2C_CR_RD|I2C_CR_NACK/*0x28*/); // No Ack Read result = WaitForXfer(hDevice); if((result != I2C_NACK) && (result != I2C_OK)){ PRINTF(hDevice, "NACK4-0[%02x]\n", result); return result; } } else { bbm_ext_write(hDevice, BBM_I2C_CR, I2C_CR_RD /*0x20*/); // Ack Read result = WaitForXfer(hDevice); if(result != I2C_OK){ PRINTF(hDevice, "NACK4-1[%02x]\n", result); return result; } } bbm_ext_read(hDevice, BBM_I2C_RXR, &data[i]); i++; } bbm_ext_write(hDevice, BBM_I2C_CR, I2C_CR_STO /*0x40*/); // send stop result = WaitForXfer(hDevice); if((result != I2C_NACK) && (result != I2C_OK)) { PRINTF(hDevice, "NACK5[%02X]\n", result); return result; } break; case I2C_RF_WRITE: #ifdef FEATURE_INTERFACE_TEST cmd = (I2C_CR_STA | I2C_CR_WR); cmd = (cmd<<8) | (chip | I2C_WRITE); bbm_ext_word_write(hDevice, BBM_I2C_TXR, cmd); #else bbm_ext_write(hDevice, BBM_I2C_TXR, chip | I2C_WRITE); bbm_ext_write(hDevice, BBM_I2C_CR, I2C_CR_STA | I2C_CR_WR /*0x90*/); #endif result = WaitForXfer(hDevice); if(result != I2C_OK) return result; #ifdef FEATURE_INTERFACE_TEST cmd = (I2C_CR_WR); cmd = (cmd<<8) | (0x02); bbm_ext_word_write(hDevice, BBM_I2C_TXR, cmd); #else bbm_ext_write(hDevice, BBM_I2C_TXR, 0x02); bbm_ext_write(hDevice, BBM_I2C_CR, I2C_CR_WR /*0x10*/); #endif result = WaitForXfer(hDevice); if(result != I2C_OK) return result; #ifdef FEATURE_INTERFACE_TEST cmd = (I2C_CR_WR); cmd = (cmd<<8) | (0x01); bbm_ext_word_write(hDevice, BBM_I2C_TXR, cmd); #else bbm_ext_write(hDevice, BBM_I2C_TXR, 0x01); bbm_ext_write(hDevice, BBM_I2C_CR, I2C_CR_WR /*0x10*/); #endif result = WaitForXfer(hDevice); if(result != I2C_OK) return result; #ifdef FEATURE_INTERFACE_TEST cmd = (I2C_CR_STA | I2C_CR_WR); cmd = (cmd<<8) | (chip | I2C_WRITE); bbm_ext_word_write(hDevice, BBM_I2C_TXR, cmd); #else bbm_ext_write(hDevice, BBM_I2C_TXR, chip | I2C_WRITE); bbm_ext_write(hDevice, BBM_I2C_CR, I2C_CR_STA | I2C_CR_WR /*0x90*/); #endif result = WaitForXfer(hDevice); if(result != I2C_OK) return result; if (addr && addr_len) { i = 0; while ((i < addr_len) && (result == I2C_OK)) { #ifdef FEATURE_INTERFACE_TEST cmd = (I2C_CR_WR); cmd = (cmd<<8) | (addr[i]); bbm_ext_word_write(hDevice, BBM_I2C_TXR, cmd); #else bbm_ext_write(hDevice, BBM_I2C_TXR, addr[i]); bbm_ext_write(hDevice, BBM_I2C_CR, I2C_CR_WR /*0x10*/); #endif result = WaitForXfer(hDevice); if(result != I2C_OK) return result; i++; } } i = 0; while ((i < data_len) && (result == I2C_OK)) { #ifdef FEATURE_INTERFACE_TEST cmd = (I2C_CR_WR); cmd = (cmd<<8) | (data[i]); bbm_ext_word_write(hDevice, BBM_I2C_TXR, cmd); #else bbm_ext_write(hDevice, BBM_I2C_TXR, data[i]); bbm_ext_write(hDevice, BBM_I2C_CR, I2C_CR_WR /*0x10*/); #endif result = WaitForXfer(hDevice); if(result != I2C_OK) return result; i++; } bbm_ext_write(hDevice, BBM_I2C_CR, I2C_CR_STO /*0x40*/); result = WaitForXfer(hDevice); if(result != I2C_OK) return result; break; case I2C_RF_READ: if (addr && addr_len) { #ifdef FEATURE_INTERFACE_TEST cmd = (I2C_CR_STA | I2C_CR_WR); cmd = (cmd<<8) | (chip | I2C_WRITE); bbm_ext_word_write(hDevice, BBM_I2C_TXR, cmd); #else bbm_ext_write(hDevice, BBM_I2C_TXR, chip | I2C_WRITE); bbm_ext_write(hDevice, BBM_I2C_CR, I2C_CR_STA | I2C_CR_WR /*0x90*/); // send start #endif result = WaitForXfer(hDevice); if(result != I2C_OK) { return result; } #ifdef FEATURE_INTERFACE_TEST cmd = (I2C_CR_WR); cmd = (cmd<<8) | ( 0x02); bbm_ext_word_write(hDevice, BBM_I2C_TXR, cmd); #else bbm_ext_write(hDevice, BBM_I2C_TXR, 0x02); bbm_ext_write(hDevice, BBM_I2C_CR, I2C_CR_WR /*0x10*/); #endif result = WaitForXfer(hDevice); if(result != I2C_OK) return result; #ifdef FEATURE_INTERFACE_TEST cmd = (I2C_CR_WR); cmd = (cmd<<8) | (0x01); bbm_ext_word_write(hDevice, BBM_I2C_TXR, cmd); #else bbm_ext_write(hDevice, BBM_I2C_TXR, 0x01); bbm_ext_write(hDevice, BBM_I2C_CR, I2C_CR_WR /*0x10*/); #endif result = WaitForXfer(hDevice); if(result != I2C_OK) return result; #ifdef FEATURE_INTERFACE_TEST cmd = (I2C_CR_STA | I2C_CR_WR); cmd = (cmd<<8) | (chip | I2C_WRITE); bbm_ext_word_write(hDevice, BBM_I2C_TXR, cmd); #else bbm_ext_write(hDevice, BBM_I2C_TXR, chip | I2C_WRITE); bbm_ext_write(hDevice, BBM_I2C_CR, I2C_CR_STA | I2C_CR_WR /*0x90*/); #endif result = WaitForXfer(hDevice); if(result != I2C_OK) return result; i = 0; while ((i < addr_len) && (result == I2C_OK)) { #ifdef FEATURE_INTERFACE_TEST cmd = (I2C_CR_WR); cmd = (cmd<<8) | (addr[i]); bbm_ext_word_write(hDevice, BBM_I2C_TXR, cmd); #else bbm_ext_write(hDevice, BBM_I2C_TXR, addr[i]); bbm_ext_write(hDevice, BBM_I2C_CR, I2C_CR_WR /*0x10*/); #endif result = WaitForXfer(hDevice); if(result != I2C_OK) { return result; } i++; } } #ifdef FEATURE_INTERFACE_TEST cmd = (I2C_CR_STA | I2C_CR_WR); cmd = (cmd<<8) | (chip | I2C_READ); bbm_ext_word_write(hDevice, BBM_I2C_TXR, cmd); #else bbm_ext_write(hDevice, BBM_I2C_TXR, chip | I2C_READ); bbm_ext_write(hDevice, BBM_I2C_CR, I2C_CR_STA | I2C_CR_WR /*0x90*/); // resend start #endif result = WaitForXfer(hDevice); if(result != I2C_OK) { return result; } i = 0; while ((i < data_len) && (result == I2C_OK)) { if (i == data_len - 1) { bbm_ext_write(hDevice, BBM_I2C_CR, I2C_CR_RD|I2C_CR_NACK/*0x28*/); // No Ack Read result = WaitForXfer(hDevice); if((result != I2C_NACK) && (result != I2C_OK)){ PRINTF(hDevice, "NACK4-0[%02x]\n", result); return result; } } else { bbm_ext_write(hDevice, BBM_I2C_CR, I2C_CR_RD /*0x20*/); // Ack Read result = WaitForXfer(hDevice); if(result != I2C_OK){ PRINTF(hDevice, "NACK4-1[%02x]\n", result); return result; } } bbm_ext_read(hDevice, BBM_I2C_RXR, &data[i]); i++; } bbm_ext_write(hDevice, BBM_I2C_CR, I2C_CR_STO /*0x40*/); // send stop result = WaitForXfer(hDevice); if((result != I2C_NACK) && (result != I2C_OK)) { PRINTF(hDevice, "NACK5[%02X]\n", result); return result; } break; default: return I2C_NOK; } return I2C_OK; }