340 lines
7.5 KiB
C
340 lines
7.5 KiB
C
#include "chsc6x_platform.h"
|
|
#include "fr30xx.h"
|
|
|
|
void touchpad_reset_set(void);
|
|
void touchpad_reset_clear(void);
|
|
void touchpad_delay_ms(uint32_t counter);
|
|
|
|
extern I2C_HandleTypeDef i2c_touchpad_handle;
|
|
|
|
/************************************************************************************
|
|
* @fn i2c_memory_read
|
|
*
|
|
* @brief i2c memory read.
|
|
*/
|
|
bool i2c_memory_chsc6x_read_only(I2C_HandleTypeDef *hi2c, uint16_t fu16_DevAddress, uint8_t *fp_Data, uint32_t fu32_Size)
|
|
{
|
|
uint32_t lu32_RxCount = fu32_Size;
|
|
|
|
if (fu32_Size == 0)
|
|
goto _exit_i2c_read;
|
|
|
|
__I2C_DISABLE(hi2c->I2Cx);
|
|
|
|
hi2c->I2Cx->TAR.TAR = fu16_DevAddress >> 1;
|
|
|
|
__I2C_ENABLE(hi2c->I2Cx);
|
|
|
|
hi2c->I2Cx->DATA_CMD = (0 >> 8) & 0xFF;
|
|
hi2c->I2Cx->DATA_CMD = 0 & 0xFF;
|
|
|
|
while (!__I2C_IS_TxFIFO_EMPTY(hi2c->I2Cx));
|
|
|
|
/* DevAddress NACK */
|
|
if (i2c_get_int_status(hi2c, INT_TX_ABRT))
|
|
{
|
|
i2c_clear_int_status(hi2c, INT_TX_ABRT);
|
|
|
|
__I2C_DISABLE(hi2c->I2Cx);
|
|
|
|
goto _exit_i2c_read;
|
|
}
|
|
|
|
if (fu32_Size > 1)
|
|
{
|
|
hi2c->I2Cx->DATA_CMD = CMD_RESTART | CMD_READ;
|
|
|
|
while (fu32_Size - 2)
|
|
{
|
|
if (!__I2C_IS_TxFIFO_FULL(hi2c->I2Cx))
|
|
{
|
|
hi2c->I2Cx->DATA_CMD = CMD_READ;
|
|
|
|
fu32_Size--;
|
|
}
|
|
|
|
while (!__I2C_IS_RxFIFO_EMPTY(hi2c->I2Cx))
|
|
{
|
|
*fp_Data++ = hi2c->I2Cx->DATA_CMD & 0xFF;
|
|
|
|
lu32_RxCount--;
|
|
}
|
|
|
|
if (i2c_get_int_status(hi2c, INT_TX_ABRT))
|
|
{
|
|
i2c_clear_int_status(hi2c, INT_TX_ABRT);
|
|
|
|
__I2C_DISABLE(hi2c->I2Cx);
|
|
|
|
goto _exit_i2c_read;
|
|
}
|
|
}
|
|
|
|
/* Last byte with stop */
|
|
while (__I2C_IS_TxFIFO_FULL(hi2c->I2Cx));
|
|
hi2c->I2Cx->DATA_CMD = CMD_READ | CMD_STOP;
|
|
}
|
|
else
|
|
{
|
|
hi2c->I2Cx->DATA_CMD = CMD_RESTART | CMD_READ | CMD_STOP;
|
|
}
|
|
|
|
uint8_t to_counter = 100;
|
|
while (lu32_RxCount)
|
|
{
|
|
if (!__I2C_IS_RxFIFO_EMPTY(hi2c->I2Cx))
|
|
{
|
|
*fp_Data++ = hi2c->I2Cx->DATA_CMD & 0xFF;
|
|
|
|
lu32_RxCount--;
|
|
}
|
|
|
|
if (i2c_get_int_status(hi2c, INT_TX_ABRT))
|
|
{
|
|
i2c_clear_int_status(hi2c, INT_TX_ABRT);
|
|
|
|
__I2C_DISABLE(hi2c->I2Cx);
|
|
|
|
goto _exit_i2c_read;
|
|
}
|
|
|
|
system_delay_us(10);
|
|
to_counter--;
|
|
if (to_counter == 0) {
|
|
break;
|
|
}
|
|
}
|
|
|
|
while(__I2C_IS_BUSY(hi2c->I2Cx));
|
|
|
|
if (lu32_RxCount == 0) {
|
|
return true;
|
|
}
|
|
else {
|
|
return false;
|
|
}
|
|
|
|
_exit_i2c_read:
|
|
|
|
__NOP();
|
|
|
|
return false;
|
|
}
|
|
|
|
/************************************************************************************
|
|
* @fn i2c_memory_read
|
|
*
|
|
* @brief i2c memory read.
|
|
*/
|
|
bool i2c_memory_chsc6x_read(I2C_HandleTypeDef *hi2c, uint16_t fu16_DevAddress, uint16_t fu16_MemAddress, uint8_t *fp_Data, uint32_t fu32_Size)
|
|
{
|
|
uint32_t lu32_RxCount = fu32_Size;
|
|
|
|
if (fu32_Size == 0)
|
|
goto _exit_i2c_read;
|
|
|
|
__I2C_DISABLE(hi2c->I2Cx);
|
|
|
|
hi2c->I2Cx->TAR.TAR = fu16_DevAddress >> 1;
|
|
|
|
__I2C_ENABLE(hi2c->I2Cx);
|
|
|
|
hi2c->I2Cx->DATA_CMD = (fu16_MemAddress >> 8) & 0xFF;
|
|
hi2c->I2Cx->DATA_CMD = fu16_MemAddress & 0xFF;
|
|
|
|
while (!__I2C_IS_TxFIFO_EMPTY(hi2c->I2Cx));
|
|
|
|
/* DevAddress NACK */
|
|
if (i2c_get_int_status(hi2c, INT_TX_ABRT))
|
|
{
|
|
i2c_clear_int_status(hi2c, INT_TX_ABRT);
|
|
|
|
__I2C_DISABLE(hi2c->I2Cx);
|
|
|
|
goto _exit_i2c_read;
|
|
}
|
|
|
|
if (fu32_Size > 1)
|
|
{
|
|
hi2c->I2Cx->DATA_CMD = CMD_RESTART | CMD_READ;
|
|
|
|
while (fu32_Size - 2)
|
|
{
|
|
if (!__I2C_IS_TxFIFO_FULL(hi2c->I2Cx))
|
|
{
|
|
hi2c->I2Cx->DATA_CMD = CMD_READ;
|
|
|
|
fu32_Size--;
|
|
}
|
|
|
|
while (!__I2C_IS_RxFIFO_EMPTY(hi2c->I2Cx))
|
|
{
|
|
*fp_Data++ = hi2c->I2Cx->DATA_CMD & 0xFF;
|
|
|
|
lu32_RxCount--;
|
|
}
|
|
|
|
if (i2c_get_int_status(hi2c, INT_TX_ABRT))
|
|
{
|
|
i2c_clear_int_status(hi2c, INT_TX_ABRT);
|
|
|
|
__I2C_DISABLE(hi2c->I2Cx);
|
|
|
|
goto _exit_i2c_read;
|
|
}
|
|
}
|
|
|
|
/* Last byte with stop */
|
|
while (__I2C_IS_TxFIFO_FULL(hi2c->I2Cx));
|
|
hi2c->I2Cx->DATA_CMD = CMD_READ | CMD_STOP;
|
|
}
|
|
else
|
|
{
|
|
hi2c->I2Cx->DATA_CMD = CMD_RESTART | CMD_READ | CMD_STOP;
|
|
}
|
|
|
|
while (lu32_RxCount)
|
|
{
|
|
if (!__I2C_IS_RxFIFO_EMPTY(hi2c->I2Cx))
|
|
{
|
|
*fp_Data++ = hi2c->I2Cx->DATA_CMD & 0xFF;
|
|
|
|
lu32_RxCount--;
|
|
}
|
|
}
|
|
|
|
while(__I2C_IS_BUSY(hi2c->I2Cx));
|
|
|
|
return true;
|
|
|
|
_exit_i2c_read:
|
|
|
|
__NOP();
|
|
|
|
return false;
|
|
}
|
|
|
|
/************************************************************************************
|
|
* @fn i2c_memory_write
|
|
*
|
|
* @brief i2c memory write.
|
|
*/
|
|
bool i2c_memory_chsc6x_write(I2C_HandleTypeDef *hi2c, uint16_t fu16_DevAddress, uint16_t fu16_MemAddress, uint8_t *fp_Data, uint32_t fu32_Size)
|
|
{
|
|
__I2C_DISABLE(hi2c->I2Cx);
|
|
|
|
hi2c->I2Cx->TAR.TAR = fu16_DevAddress >> 1;
|
|
|
|
__I2C_ENABLE(hi2c->I2Cx);
|
|
|
|
hi2c->I2Cx->DATA_CMD = (fu16_MemAddress >> 8) & 0xFF;
|
|
hi2c->I2Cx->DATA_CMD = fu16_MemAddress & 0xFF;
|
|
|
|
while (!__I2C_IS_TxFIFO_EMPTY(hi2c->I2Cx));
|
|
|
|
/* DevAddress NACK */
|
|
if (i2c_get_int_status(hi2c, INT_TX_ABRT))
|
|
{
|
|
i2c_clear_int_status(hi2c, INT_TX_ABRT);
|
|
|
|
__I2C_DISABLE(hi2c->I2Cx);
|
|
|
|
goto _exit_i2c_write;
|
|
}
|
|
|
|
while (fu32_Size - 1 > 0)
|
|
{
|
|
if (!__I2C_IS_TxFIFO_FULL(hi2c->I2Cx))
|
|
{
|
|
hi2c->I2Cx->DATA_CMD = *fp_Data++;
|
|
|
|
fu32_Size--;
|
|
}
|
|
|
|
if (i2c_get_int_status(hi2c, INT_TX_ABRT))
|
|
{
|
|
i2c_clear_int_status(hi2c, INT_TX_ABRT);
|
|
|
|
__I2C_DISABLE(hi2c->I2Cx);
|
|
|
|
goto _exit_i2c_write;
|
|
}
|
|
}
|
|
|
|
/* Last byte with stop */
|
|
while (__I2C_IS_TxFIFO_FULL(hi2c->I2Cx));
|
|
hi2c->I2Cx->DATA_CMD = *fp_Data | CMD_STOP;
|
|
|
|
while(__I2C_IS_BUSY(hi2c->I2Cx));
|
|
|
|
//while(i2c_memory_is_busy(hi2c, fu16_DevAddress));
|
|
|
|
return true;
|
|
|
|
_exit_i2c_write:
|
|
|
|
__NOP();
|
|
|
|
return false;
|
|
}
|
|
|
|
/* return: =read lenth succeed; <0 failed
|
|
read reg addr not need
|
|
just used for reading xy cord info*/
|
|
int chsc6x_i2c_read(unsigned char id, unsigned char *p_data, unsigned short lenth)
|
|
{
|
|
bool ret = i2c_memory_chsc6x_read_only(&i2c_touchpad_handle, id, p_data, lenth);
|
|
// bool ret = i2c_memory_chsc6x_read(&i2c_touchpad_handle, id, 0, p_data, lenth);
|
|
if (ret) {
|
|
return lenth;
|
|
}else{
|
|
return -1;
|
|
}
|
|
|
|
// return i2cRead(id, lenth, p_data);
|
|
}
|
|
|
|
/* RETURN:0->pass else->fail */
|
|
int chsc6x_read_bytes_u16addr_sub(unsigned char id, unsigned short adr, unsigned char *rxbuf, unsigned short lenth)
|
|
{
|
|
bool ret = i2c_memory_chsc6x_read(&i2c_touchpad_handle, id, adr, rxbuf, lenth);
|
|
if (ret) {
|
|
return 0;
|
|
}else{
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
/* RETURN:0->pass else->fail */
|
|
int chsc6x_write_bytes_u16addr_sub(unsigned char id, unsigned short adr, unsigned char *txbuf, unsigned short lenth)
|
|
{
|
|
bool ret = i2c_memory_chsc6x_write(&i2c_touchpad_handle, id, adr, txbuf, lenth);
|
|
if(ret) {
|
|
return 0;
|
|
}else{
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
void chsc6x_msleep(int ms)
|
|
{
|
|
touchpad_delay_ms(ms);
|
|
}
|
|
|
|
void chsc6x_tp_reset(void)
|
|
{
|
|
touchpad_reset_clear();
|
|
touchpad_delay_ms(30);//30ms
|
|
touchpad_reset_set();
|
|
touchpad_delay_ms(30);//30ms
|
|
}
|
|
|
|
void chsc6x_tp_reset_active(void)
|
|
{
|
|
touchpad_reset_clear();
|
|
touchpad_delay_ms(30);//30ms
|
|
touchpad_reset_set();
|
|
touchpad_delay_ms(30);//30ms
|
|
}
|
|
|