/* ** Called to disable amp (disable output force) */ IMMVIBESPIAPI VibeStatus ImmVibeSPI_ForceOut_AmpDisable(VibeUInt8 nActuatorIndex) { int cnt = 0; unsigned char I2C_data[1]; int ret = VIBE_S_SUCCESS; if (g_bAmpEnabled) { DbgOut((KERN_DEBUG "ImmVibeSPI_ForceOut_AmpDisable.\n")); g_bAmpEnabled = false; #ifdef ISA1200_HEN_ENABLE SYS_API_HEN_LOW; #endif I2C_data[0] = 0x08; // Haptic drive disable do { ret = SYS_API__I2C__Write(HCTRL0, I2C_data[0]); cnt++; }while(VIBE_S_SUCCESS != ret && cnt < RETRY_CNT); if( VIBE_S_SUCCESS != ret) DEBUG_MSG("[ImmVibeSPI_ForceOut_AmpDisable] I2C_Write Error, Slave Address = [%d], ret = [%d]\n", HCTRL0, ret); PWM_CLK_DISABLE; } return VIBE_S_SUCCESS; }
/* ** Called at initialization time to set PWM frequencies, disable amp, etc... */ IMMVIBESPIAPI VibeStatus ImmVibeSPI_ForceOut_Initialize(void) { int cnt = 0; unsigned char I2C_data[1]; int ret = VIBE_S_SUCCESS; DbgOut((KERN_DEBUG "ImmVibeSPI_ForceOut_Initialize.\n")); SYS_API_VDDP_ON; SYS_API_LEN_HIGH; SLEEP(20 /*ms*/); I2C_data[0] = g_nLDO_Voltage; // LDO Voltage do { ret = SYS_API__I2C__Write(SCTRL, I2C_data[0]); cnt++; }while(VIBE_S_SUCCESS != ret && cnt < RETRY_CNT); if( VIBE_S_SUCCESS != ret) DEBUG_MSG("[ImmVibeSPI_ForceOut_Initialize] I2C_Write Error, Slave Address = [%d], ret = [%d]\n", I2C_data[0], ret); I2C_data[0] = 0x08; // Haptic Drive Disable + PWM Input mode do { ret = SYS_API__I2C__Write(HCTRL0, I2C_data[0]); cnt++; }while(VIBE_S_SUCCESS != ret && cnt < RETRY_CNT); if( VIBE_S_SUCCESS != ret) DEBUG_MSG("[ImmVibeSPI_ForceOut_Initialize] I2C_Write Error, Slave Address = [%d], ret = [%d]\n", I2C_data[0], ret); I2C_data[0] = 0x40; // EXT clock + DAC inversion + LRA do { ret = SYS_API__I2C__Write(HCTRL1, I2C_data[0]); cnt++; }while(VIBE_S_SUCCESS != ret && cnt < RETRY_CNT); if( VIBE_S_SUCCESS != ret) DEBUG_MSG("[ImmVibeSPI_ForceOut_Initialize] I2C_Write Error, Slave Address = [%d], ret = [%d]\n", I2C_data[0], ret); I2C_data[0] = 0x00; // Disable Software Reset do { ret = SYS_API__I2C__Write(HCTRL2, I2C_data[0]); cnt++; }while(VIBE_S_SUCCESS != ret && cnt < RETRY_CNT); if( VIBE_S_SUCCESS != ret) DEBUG_MSG("[ImmVibeSPI_ForceOut_Initialize] I2C_Write Error, Slave Address = [%d], ret = [%d]\n", I2C_data[0], ret); I2C_data[0] = 0x13; // Disable Software Reset do { ret = SYS_API__I2C__Write(HCTRL3, I2C_data[0]); cnt++; }while(VIBE_S_SUCCESS != ret && cnt < RETRY_CNT); if( VIBE_S_SUCCESS != ret) DEBUG_MSG("[ImmVibeSPI_ForceOut_Initialize] I2C_Write Error, Slave Address = [%d], ret = [%d]\n", I2C_data[0], ret); I2C_data[0] = 0x93; //20.3KHz -> 229.xHz do { ret = SYS_API__I2C__Write(HCTRL4, I2C_data[0]); cnt++; }while(VIBE_S_SUCCESS != ret && cnt < RETRY_CNT); if( VIBE_S_SUCCESS != ret) DEBUG_MSG("[ImmVibeSPI_ForceOut_Initialize] I2C_Write Error, Slave Address = [%d], ret = [%d]\n", I2C_data[0], ret); I2C_data[0] = 0x00; do { ret = SYS_API__I2C__Write(HCTRL5, I2C_data[0]); cnt++; }while(VIBE_S_SUCCESS != ret && cnt < RETRY_CNT); if( VIBE_S_SUCCESS != ret) DEBUG_MSG("[ImmVibeSPI_ForceOut_Initialize] I2C_Write Error, Slave Address = [%d], ret = [%d]\n", I2C_data[0], ret); I2C_data[0] = 0x00; do { ret = SYS_API__I2C__Write(HCTRL6, I2C_data[0]); cnt++; }while(VIBE_S_SUCCESS != ret && cnt < RETRY_CNT); if( VIBE_S_SUCCESS != ret) DEBUG_MSG("[ImmVibeSPI_ForceOut_Initialize] I2C_Write Error, Slave Address = [%d], ret = [%d]\n", I2C_data[0], ret); return VIBE_S_SUCCESS; }
/* ** Called to enable amp (enable output force0) */ IMMVIBESPIAPI VibeStatus ImmVibeSPI_ForceOut_AmpEnable(VibeUInt8 nActuatorIndex) { int cnt = 0; unsigned char I2C_data[1]; int ret = VIBE_S_SUCCESS; int fd = 0; mm_segment_t oldfs = get_fs(); set_fs(KERNEL_DS); fd = sys_open("/sdcard/vib.txt", O_RDONLY , 0755); if (!g_bAmpEnabled) { DbgOut((KERN_DEBUG "ImmVibeSPI_ForceOut_AmpEnable.\n")); g_bAmpEnabled = true; PWM_CLK_ENABLE; #ifdef ISA1200_HEN_ENABLE SYS_API_HEN_HIGH; #endif if(fd >= 0) //ELT Test Mode { printk("[ImmVibeSPI_ForceOut_AmpEnable] Case : ELT Test Vibration\n"); if(status == 0){ printk("[ImmVibeSPI_ForceOut_AmpEnable] ELT : Register Setting \n"); I2C_data[0] = LDO_VOLTAGE_30V; // LDO Voltage : 3.0V do { ret = SYS_API__I2C__Write(SCTRL, I2C_data[0]); cnt++; }while(VIBE_S_SUCCESS != ret && cnt < RETRY_CNT); if( VIBE_S_SUCCESS != ret) DEBUG_MSG("[ImmVibeSPI_ForceOut_Initialize] I2C_Write Error, Slave Address = [%d], ret = [%d]\n", I2C_data[0], ret); I2C_data[0] = 0x93; //224Hz do{ ret = SYS_API__I2C__Write(HCTRL4, I2C_data[0]); cnt++; }while(VIBE_S_SUCCESS != ret && cnt < RETRY_CNT); if( VIBE_S_SUCCESS != ret) DEBUG_MSG("[ImmVibeSPI_ForceOut_Initialize] I2C_Write Error, Slave Address = [%d], ret = [%d]\n", I2C_data[0], ret); I2C_data[0] = tspdrv_i2c_read_byte_data(SCTRL); printk("[ImmVibeSPI_ForceOut_AmpEnable] ELT HCTRL0 written data : 0x%x\n", I2C_data[0]); I2C_data[0] = tspdrv_i2c_read_byte_data(HCTRL4); printk("[ImmVibeSPI_ForceOut_AmpEnable] ELT HCTRL1 written data : 0x%x\n", I2C_data[0]); status = 1; } else{ //Normal Mode printk("[ImmVibeSPI_ForceOut_AmpEnable] ELT : just vibrate \n"); } } else{ printk("[ImmVibeSPI_ForceOut_AmpEnable] Case : Normal Vibration\n"); if(status == 1){ printk("[ImmVibeSPI_ForceOut_AmpEnable] Normal : Register Setting \n"); I2C_data[0] = g_nLDO_Voltage; // LDO Voltage : 2.7V do { ret = SYS_API__I2C__Write(SCTRL, I2C_data[0]); cnt++; }while(VIBE_S_SUCCESS != ret && cnt < RETRY_CNT); if( VIBE_S_SUCCESS != ret) DEBUG_MSG("[ImmVibeSPI_ForceOut_Initialize] I2C_Write Error, Slave Address = [%d], ret = [%d]\n", I2C_data[0], ret); I2C_data[0] = 0x94; //230Hz do{ ret = SYS_API__I2C__Write(HCTRL4, I2C_data[0]); cnt++; }while(VIBE_S_SUCCESS != ret && cnt < RETRY_CNT); if( VIBE_S_SUCCESS != ret) DEBUG_MSG("[ImmVibeSPI_ForceOut_Initialize] I2C_Write Error, Slave Address = [%d], ret = [%d]\n", I2C_data[0], ret); I2C_data[0] = tspdrv_i2c_read_byte_data(SCTRL); printk("[ImmVibeSPI_ForceOut_AmpEnable] Normal HCTRL0 written data : 0x%x\n", I2C_data[0]); I2C_data[0] = tspdrv_i2c_read_byte_data(HCTRL4); printk("[ImmVibeSPI_ForceOut_AmpEnable] Normal HCTRL1 written data : 0x%x\n", I2C_data[0]); status =0; } else{ printk("[ImmVibeSPI_ForceOut_AmpEnable] Normal : just vibrate \n"); } } I2C_data[0] = 0x88; // Haptic Drive Enable + PWM Input mode do { ret = SYS_API__I2C__Write(HCTRL0, I2C_data[0]); cnt++; }while(VIBE_S_SUCCESS != ret && cnt < RETRY_CNT); if( VIBE_S_SUCCESS != ret) DEBUG_MSG("[ImmVibeSPI_ForceOut_AmpEnable] I2C_Write Error, Slave Address = [%d], ret = [%d]\n", I2C_data[0], ret); #if 0 I2C_data[0] = tspdrv_i2c_read_byte_data(HCTRL0); printk("HCTRL0 written data : 0x%x\n", I2C_data[0]); I2C_data[0] = tspdrv_i2c_read_byte_data(HCTRL1); printk("HCTRL1 written data : 0x%x\n", I2C_data[0]); I2C_data[0] = tspdrv_i2c_read_byte_data(HCTRL2); printk("HCTRL2 written data : 0x%x\n", I2C_data[0]); I2C_data[0] = tspdrv_i2c_read_byte_data(HCTRL3); printk("HCTRL3 written data : 0x%x\n", I2C_data[0]); I2C_data[0] = tspdrv_i2c_read_byte_data(HCTRL4); printk("HCTRL4 written data : 0x%x\n", I2C_data[0]); #endif } sys_close(fd); set_fs(oldfs); return VIBE_S_SUCCESS; }
/* ** Called by the real-time loop to set PWM_MAG duty cycle */ IMMVIBESPIAPI VibeStatus ImmVibeSPI_ForceOut_SetSamples(VibeUInt8 nActuatorIndex, VibeUInt16 nOutputSignalBitDepth, VibeUInt16 nBufferSizeInBytes, VibeInt8* pForceOutputBuffer) { VibeInt8 nForce; int cnt = 0; unsigned char I2C_data[2]; int ret = VIBE_S_SUCCESS; switch (nOutputSignalBitDepth) { case 8: /* pForceOutputBuffer is expected to contain 1 byte */ if (nBufferSizeInBytes != 1) { DbgOut((KERN_ERR "[ImmVibeSPI] ImmVibeSPI_ForceOut_SetSamples nBufferSizeInBytes = %d \n", nBufferSizeInBytes )); return VIBE_E_FAIL; } nForce = pForceOutputBuffer[0]; break; case 16: /* pForceOutputBuffer is expected to contain 2 byte */ if (nBufferSizeInBytes != 2) return VIBE_E_FAIL; /* Map 16-bit value to 8-bit */ nForce = ((VibeInt16*)pForceOutputBuffer)[0] >> 8; break; default: /* Unexpected bit depth */ return VIBE_E_FAIL; } pr_info("[VIB] nForce :%d", nForce); if(nForce == 0) { #ifdef ISA1200_GEN_MODE I2C_data[1] = g_nPWM_Duty; // PWM High Duty 50% I2C_data[0]= HCTRL5; do { ret = SYS_API__I2C__Write(ISA1200_I2C_ADDRESS, 2 /* data length*/, I2C_data); cnt++; }while(VIBE_S_SUCCESS != ret && cnt < RETRY_CNT); if( VIBE_S_SUCCESS != ret) DEBUG_MSG("[ImmVibeSPI_ForceOut_Set] I2C_Write Error, Slave Address = [%d], ret = [%d]\n", I2C_data[0], ret); #else SYS_API_SET_PWM_DUTY(500); //50% #endif if (g_bAmpEnabled == true) { ImmVibeSPI_ForceOut_AmpDisable(0); } } else { if (g_bAmpEnabled != true) { ImmVibeSPI_ForceOut_AmpEnable(0); } #ifdef ISA1200_GEN_MODE I2C_data[1] = g_nPWM_Duty + ((g_nPWM_Duty-1)*nForce)/127; I2C_data[0]= HCTRL5; do { ret = SYS_API__I2C__Write(ISA1200_I2C_ADDRESS, 2 /* data length*/, I2C_data); cnt++; }while(VIBE_S_SUCCESS != ret && cnt < RETRY_CNT); if( VIBE_S_SUCCESS != ret) DEBUG_MSG("[ImmVibeSPI_ForceOut_Set] I2C_Write Error, Slave Address = [%d], ret = [%d]\n", I2C_data[0], ret); #else SYS_API_SET_PWM_DUTY(500 - (490 * nForce)/127); #endif } return VIBE_S_SUCCESS; }
/* ** Called at initialization time to set PWM frequencies, disable amp, etc... */ IMMVIBESPIAPI VibeStatus ImmVibeSPI_ForceOut_Initialize(void) { int cnt = 0; unsigned char I2C_data[2]; int ret = VIBE_S_SUCCESS; DbgOut((KERN_DEBUG "ImmVibeSPI_ForceOut_Initialize.\n")); SYS_API_VDDP_ON; SYS_API_LEN_HIGH; SLEEP(200 /*us*/); I2C_data[1] = g_nLDO_Voltage; // LDO Voltage I2C_data[0]= SCTRL; do { ret = SYS_API__I2C__Write(ISA1200_I2C_ADDRESS, 2 /* data length*/, I2C_data); cnt++; }while(VIBE_S_SUCCESS != ret && cnt < RETRY_CNT); if( VIBE_S_SUCCESS != ret) DEBUG_MSG("[ImmVibeSPI_ForceOut_Initialize] I2C_Write Error, Slave Address = [%d], ret = [%d]\n", I2C_data[0], ret); #ifdef ISA1200_GEN_MODE I2C_data[1] = 0x11; //Haptic Drive Disable + PWM generation mode + 44.8Khz mode I2C_data[0]= HCTRL0; do { ret = SYS_API__I2C__Write(ISA1200_I2C_ADDRESS, 2 /* data length*/, I2C_data); cnt++; }while(VIBE_S_SUCCESS != ret && cnt < RETRY_CNT); if( VIBE_S_SUCCESS != ret) DEBUG_MSG("[ImmVibeSPI_ForceOut_Initialize] I2C_Write Error, Slave Address = [%d], ret = [%d]\n", I2C_data[0], ret); #ifdef MOTOR_TYPE_LRA I2C_data[1] = 0xC0 ; // EXT clock + DAC inversion + LRA #else I2C_data[1] = 0xE0; // EXT clock + DAC inversion + ERM #endif I2C_data[0]= HCTRL1; do { ret = SYS_API__I2C__Write(ISA1200_I2C_ADDRESS, 2 /* data length*/, I2C_data); cnt++; }while(VIBE_S_SUCCESS != ret && cnt < RETRY_CNT); if( VIBE_S_SUCCESS != ret) DEBUG_MSG("[ImmVibeSPI_ForceOut_Initialize] I2C_Write Error, Slave Address = [%d], ret = [%d]\n", I2C_data[0], ret); I2C_data[1] = 0x00 ; // Disable Software Reset I2C_data[0]= HCTRL2; do { ret = SYS_API__I2C__Write(ISA1200_I2C_ADDRESS, 2 /* data length*/, I2C_data); cnt++; }while(VIBE_S_SUCCESS != ret && cnt < RETRY_CNT); if( VIBE_S_SUCCESS != ret) DEBUG_MSG("[ImmVibeSPI_ForceOut_Initialize] I2C_Write Error, Slave Address = [%d], ret = [%d]\n", I2C_data[0], ret); I2C_data[1] = 0x03 + ( g_nPWM_PLLDiv<<4); // PLLLDIV I2C_data[0]= HCTRL3; do { ret = SYS_API__I2C__Write(ISA1200_I2C_ADDRESS, 2 /* data length*/, I2C_data); cnt++; }while(VIBE_S_SUCCESS != ret && cnt < RETRY_CNT); if( VIBE_S_SUCCESS != ret) DEBUG_MSG("[ImmVibeSPI_ForceOut_Initialize] I2C_Write Error, Slave Address = [%d], ret = [%d]\n", I2C_data[0], ret); I2C_data[1] = g_nPWM_Freq; // PWM control I2C_data[0]= HCTRL4; do { ret = SYS_API__I2C__Write(ISA1200_I2C_ADDRESS, 2 /* data length*/, I2C_data); cnt++; }while(VIBE_S_SUCCESS != ret && cnt < RETRY_CNT); if( VIBE_S_SUCCESS != ret) DEBUG_MSG("[ImmVibeSPI_ForceOut_Initialize] I2C_Write Error, Slave Address = [%d], ret = [%d]\n", I2C_data[0], ret); I2C_data[1] = g_nPWM_Duty; // PWM High Duty I2C_data[0]= HCTRL5; do { ret = SYS_API__I2C__Write(ISA1200_I2C_ADDRESS, 2 /* data length*/, I2C_data); cnt++; }while(VIBE_S_SUCCESS != ret && cnt < RETRY_CNT); if( VIBE_S_SUCCESS != ret) DEBUG_MSG("[ImmVibeSPI_ForceOut_Initialize] I2C_Write Error, Slave Address = [%d], ret = [%d]\n", I2C_data[0], ret); I2C_data[1] = g_nPWM_Period; // PWM Period I2C_data[0]= HCTRL6; do { ret = SYS_API__I2C__Write(ISA1200_I2C_ADDRESS, 2 /* data length*/, I2C_data); cnt++; }while(VIBE_S_SUCCESS != ret && cnt < RETRY_CNT); if( VIBE_S_SUCCESS != ret) DEBUG_MSG("[ImmVibeSPI_ForceOut_Initialize] I2C_Write Error, Slave Address = [%d], ret = [%d]\n", I2C_data[0], ret); #else // PWM Input Mode #ifdef ISA1200_PWM_256DIV_MODE I2C_data[1] = 0x09; // Haptic Drive Disable + PWM Input mode + 44.8Khz mode #else I2C_data[1] = 0x08; // Haptic Drive Disable + PWM Input mode + 22.4Khz mode #endif I2C_data[0]= HCTRL0; do { ret = SYS_API__I2C__Write(ISA1200_I2C_ADDRESS, 2 /* data length*/, I2C_data); cnt++; }while(VIBE_S_SUCCESS != ret && cnt < RETRY_CNT); if( VIBE_S_SUCCESS != ret) DEBUG_MSG("[ImmVibeSPI_ForceOut_Initialize] I2C_Write Error, Slave Address = [%d], ret = [%d]\n", I2C_data[0], ret); #ifdef MOTOR_TYPE_LRA I2C_data[1] = 0x43; // EXT clock + DAC inversion + LRA #else I2C_data[1] = 0x63; // EXT clock + DAC inversion + ERM #endif I2C_data[0]= HCTRL1; do { ret = SYS_API__I2C__Write(ISA1200_I2C_ADDRESS, 2 /* data length*/, I2C_data); cnt++; }while(VIBE_S_SUCCESS != ret && cnt < RETRY_CNT); if( VIBE_S_SUCCESS != ret) DEBUG_MSG("[ImmVibeSPI_ForceOut_Initialize] I2C_Write Error, Slave Address = [%d], ret = [%d]\n", I2C_data[0], ret); I2C_data[1] = 0x00; // Disable Software Reset I2C_data[0]= HCTRL2; do { ret = SYS_API__I2C__Write(ISA1200_I2C_ADDRESS, 2 /* data length*/, I2C_data); cnt++; }while(VIBE_S_SUCCESS != ret && cnt < RETRY_CNT); if( VIBE_S_SUCCESS != ret) DEBUG_MSG("[ImmVibeSPI_ForceOut_Initialize] I2C_Write Error, Slave Address = [%d], ret = [%d]\n", I2C_data[0], ret); I2C_data[1] = 0x00; // Default I2C_data[0]= HCTRL4; do { ret = SYS_API__I2C__Write(ISA1200_I2C_ADDRESS, 2 /* data length*/, I2C_data); cnt++; }while(VIBE_S_SUCCESS != ret && cnt < RETRY_CNT); if( VIBE_S_SUCCESS != ret) DEBUG_MSG("[ImmVibeSPI_ForceOut_Initialize] I2C_Write Error, Slave Address = [%d], ret = [%d]\n", I2C_data[0], ret); #endif return VIBE_S_SUCCESS; }
/* ** Called to enable amp (enable output force) */ IMMVIBESPIAPI VibeStatus ImmVibeSPI_ForceOut_AmpEnable(VibeUInt8 nActuatorIndex) { int cnt = 0; unsigned char I2C_data[2]; int ret = VIBE_S_SUCCESS; #ifdef VIBETONZ_TUNING VibeUInt32 nPWM_PLLDiv_KernelParam = 0; VibeUInt32 nPWM_Freq_KernelParam = 0; VibeUInt32 nPWM_Period_KernelParam = 0; VibeUInt32 nPWM_Duty_KernelParam = 0; VibeUInt32 nPWM_Update_KernelParam = 0; #endif if (!g_bAmpEnabled) { DbgOut((KERN_DEBUG "ImmVibeSPI_ForceOut_AmpEnable.\n")); g_bAmpEnabled = true; #ifdef VIBETONZ_TUNING /* For Resonant Frequency Test */ ImmVibeGetDeviceKernelParameter(0, 85, &nPWM_PLLDiv_KernelParam); /* use for PLL variable */ ImmVibeGetDeviceKernelParameter(0, 86, &nPWM_Freq_KernelParam); /* use for Freq variable */ ImmVibeGetDeviceKernelParameter(0, 87, &nPWM_Period_KernelParam); /* use for Period variable */ ImmVibeGetDeviceKernelParameter(0, 88, &nPWM_Duty_KernelParam); /* use for Duty variable */ ImmVibeGetDeviceKernelParameter(0, 89, &nPWM_Update_KernelParam); /* use for Update variable */ /* Update current Period and Duty values if those from the Kernel Parameters table are acceptables (value != 0) */ #ifdef ISA1200_GEN_MODE if(nPWM_Update_KernelParam) { g_nPWM_PLLDiv = nPWM_PLLDiv_KernelParam; g_nPWM_Freq = nPWM_Freq_KernelParam; g_nPWM_Period = nPWM_Period_KernelParam; g_nPWM_Duty = nPWM_Duty_KernelParam; #ifdef MOTOR_TYPE_LRA I2C_data[1] = 0xC0 ; // EXT clock + DAC inversion + LRA #else I2C_data[1] = 0xE0; // EXT clock + DAC inversion + ERM #endif I2C_data[0]= HCTRL1; do { ret = SYS_API__I2C__Write(ISA1200_I2C_ADDRESS, 2 /* data length*/, I2C_data); cnt++; }while(VIBE_S_SUCCESS != ret && cnt < RETRY_CNT); if( VIBE_S_SUCCESS != ret) DEBUG_MSG("[ImmVibeSPI_ForceOut_AmpEnable] I2C_Write Error, Slave Address = [%d], ret = [%d]\n", I2C_data[0], ret); I2C_data[1] = 0x00 ; // Disable Software Reset I2C_data[0]= HCTRL2; do { ret = SYS_API__I2C__Write(ISA1200_I2C_ADDRESS, 2 /* data length*/, I2C_data); cnt++; }while(VIBE_S_SUCCESS != ret && cnt < RETRY_CNT); if( VIBE_S_SUCCESS != ret) DEBUG_MSG("[ImmVibeSPI_ForceOut_AmpEnable] I2C_Write Error, Slave Address = [%d], ret = [%d]\n", I2C_data[0], ret); I2C_data[1] = 0x03 + ( g_nPWM_PLLDiv<<4); // PLLLDIV I2C_data[0]= HCTRL3; do { ret = SYS_API__I2C__Write(ISA1200_I2C_ADDRESS, 2 /* data length*/, I2C_data); cnt++; }while(VIBE_S_SUCCESS != ret && cnt < RETRY_CNT); if( VIBE_S_SUCCESS != ret) DEBUG_MSG("[ImmVibeSPI_ForceOut_AmpEnable] I2C_Write Error, Slave Address = [%d], ret = [%d]\n", I2C_data[0], ret); I2C_data[1] = g_nPWM_Freq; // PWM control I2C_data[0]= HCTRL4; do { ret = SYS_API__I2C__Write(ISA1200_I2C_ADDRESS, 2 /* data length*/, I2C_data); cnt++; }while(VIBE_S_SUCCESS != ret && cnt < RETRY_CNT); if( VIBE_S_SUCCESS != ret) DEBUG_MSG("[ImmVibeSPI_ForceOut_AmpEnable] I2C_Write Error, Slave Address = [%d], ret = [%d]\n", I2C_data[0], ret); I2C_data[1] = g_nPWM_Duty; // PWM High Duty I2C_data[0]= HCTRL5; do { ret = SYS_API__I2C__Write(ISA1200_I2C_ADDRESS, 2 /* data length*/, I2C_data); cnt++; }while(VIBE_S_SUCCESS != ret && cnt < RETRY_CNT); if( VIBE_S_SUCCESS != ret) DEBUG_MSG("[ImmVibeSPI_ForceOut_AmpEnable] I2C_Write Error, Slave Address = [%d], ret = [%d]\n", I2C_data[0], ret); I2C_data[1] = g_nPWM_Period; // PWM Period I2C_data[0]= HCTRL6; do { ret = SYS_API__I2C__Write(ISA1200_I2C_ADDRESS, 2 /* data length*/, I2C_data); cnt++; }while(VIBE_S_SUCCESS != ret && cnt < RETRY_CNT); if( VIBE_S_SUCCESS != ret) DEBUG_MSG("[ImmVibeSPI_ForceOut_AmpEnable] I2C_Write Error, Slave Address = [%d], ret = [%d]\n", I2C_data[0], ret); } #else if(nPWM_Update_KernelParam) { g_nPWM_Freq = nPWM_Freq_KernelParam; } SYS_API_SET_PWM_FREQ(g_nPWM_Freq); // 22.4Khz SYS_API_SET_PWM_DUTY(500); // 50% Duty Cycle, 1000 ~ 0 #endif #endif /* VIBETONZ_TUNING */ PWM_CLK_ENABLE; #ifdef ISA1200_HEN_ENABLE SYS_API_HEN_HIGH; #endif #ifdef ISA1200_GEN_MODE I2C_data[1] = 0x91; //Haptic Enable + PWM generation mode #else #ifdef ISA1200_PWM_256DIV_MODE I2C_data[1] = 0x89; // Haptic Drive Disable + PWM Input mode + 44.8Khz mode #else I2C_data[1] = 0x88; // Haptic Drive Disable + PWM Input mode + 22.4Khz mode #endif #endif I2C_data[0]= HCTRL0; do { ret = SYS_API__I2C__Write(ISA1200_I2C_ADDRESS, 2 /* data length*/, I2C_data); cnt++; }while(VIBE_S_SUCCESS != ret && cnt < RETRY_CNT); if( VIBE_S_SUCCESS != ret) DEBUG_MSG("[ImmVibeSPI_ForceOut_AmpEnable] I2C_Write Error, Slave Address = [%d], ret = [%d]\n", I2C_data[0], ret); } return VIBE_S_SUCCESS; }