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;
}
Exemple #2
0
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;
}
Exemple #3
0
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;
	
}