/* ************************************************************************** ** STMicroelectronics ** ************************************************************************** ** marco.cali@st.com ** ************************************************************************** * * * FTS functions for getting frames * * * ************************************************************************** ************************************************************************** */ #include "ftsCrossCompile.h" #include "ftsCompensation.h" #include "ftsError.h" #include "ftsFrame.h" #include "ftsHardware.h" #include "ftsIO.h" #include "ftsSoftware.h" #include "ftsTool.h" #include "ftsTime.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* #include */ static char tag[8] = "[ FTS ]\0"; static int sense_len, force_len; /*int getOffsetFrame(u16 address, u16 *offset) { u8 data[2]; u8 cmd = { FTS_CMD_FRAMEBUFFER_R }; if (readCmdU16(cmd, address, data, OFFSET_LENGTH, DUMMY_FRAMEBUFFER) < 0) { logError(1, "%s getOffsetFrame: ERROR %02X\n", tag, ERROR_I2C_R); return ERROR_I2C_R; } else { u8ToU16(data, offset); logError(0, "%s %s", tag, printHex("Offest = ", data, OFFSET_LENGTH)); return OK; } }*/ int getChannelsLength(void) { int ret; u8 *data = (u8 *)kmalloc(2*sizeof(u8), GFP_KERNEL); if (data == NULL) { logError(1, "%s getChannelsLength: ERROR %02X\n", tag, ERROR_ALLOC); return ERROR_ALLOC; } ret = readB2(ADDR_SENSE_LEN, data, 2); if (ret < OK) { logError(1, "%s getChannelsLength: ERROR %02X\n", tag, ERROR_READ_B2); return (ret|ERROR_READ_B2); } sense_len = (int)data[0]; force_len = (int)data[1]; logError(0, "%s Force_len = %d Sense_Len = %d\n", tag, force_len, sense_len); kfree(data); return OK; } int getFrameData(u16 address, int size, short **frame) { int i, j, ret; u8 *data = (u8 *)kmalloc(size*sizeof(u8), GFP_KERNEL); if (data == NULL) { logError(1, "%s getFrameData: ERROR %02X\n", tag, ERROR_ALLOC); return ERROR_ALLOC; } ret = readCmdU16(FTS_CMD_FRAMEBUFFER_R, address, data, size, DUMMY_FRAMEBUFFER); if (ret < OK) { logError(1, "%s getFrameData: ERROR %02X\n", tag, ERROR_I2C_R); kfree(data); return ERROR_I2C_R; } j = 0; for (i = 0; i < size; i += 2) { (*frame)[j] = (short)((data[i + 1] << 8) + data[i]); j++; } kfree(data); return OK; } /*int getMSFrame(u16 type, short **frame, int keep_first_row) { u16 offset; int size, ret; if (getSenseLen() == 0 || getForceLen() == 0) { ret=getChannelsLength(); if (retdata.header.sense_node) size = data.header.force_node; else size = data.header.sense_node; *frame = (short*)kmalloc(size*sizeof(short), GFP_KERNEL); if (frame == NULL) { logError(1, "%s getMSKeyFrame: ERROR %02X\n", tag, ERROR_ALLOC); return ERROR_ALLOC; } ret = getFrameData(offset, size*BYTES_PER_NODE, frame); if (rettype = type; header->force_node = (int)data[4]; header->sense_node = (int)data[5]; return OK; } int getMSFrame2(u16 type, MutualSenseFrame *frame) { u16 offset = ADDR_FRAMEBUFFER_DATA+FRAME_DATA_HEADER; int size, ret; if (!(type == MS_TOUCH_ACTIVE || type == MS_TOUCH_LOW_POWER || type == MS_TOUCH_ULTRA_LOW_POWER || type == MS_KEY)) { logError(1, "%s getMSFrame: Choose a MS type of frame data ERROR %02X\n", tag, ERROR_OP_NOT_ALLOW); return ERROR_OP_NOT_ALLOW; } ret = requestFrame(type); if (ret < 0) { logError(1, "%s readMutualSenseCompensationData: ERROR %02X\n", tag, ERROR_REQU_COMP_DATA); return (ret | ERROR_REQU_COMP_DATA); } ret = readFrameDataHeader(type, &(frame->header)); if (ret < 0) { logError(1, "%s readMutualSenseCompensationData: ERROR %02X\n", tag, ERROR_COMP_DATA_HEADER); return (ret | ERROR_COMP_DATA_HEADER); } switch (type) { case MS_TOUCH_ACTIVE: case MS_TOUCH_LOW_POWER: case MS_TOUCH_ULTRA_LOW_POWER: size = frame->header.force_node*frame->header.sense_node; break; case MS_KEY: if (frame->header.force_node > frame->header.sense_node) /* or use directly the number in the ftsChip */ size = frame->header.force_node; else size = frame->header.sense_node; frame->header.force_node = 1; frame->header.sense_node = size; break; default: logError(1, "%s getMSFrame: ERROR % 02X\n", tag, ERROR_OP_NOT_ALLOW); return ERROR_OP_NOT_ALLOW; } frame->node_data = (short *)kmalloc(size*sizeof(short), GFP_KERNEL); if (frame->node_data == NULL) { logError(1, "%s getMSFrame: ERROR %02X\n", tag, ERROR_ALLOC); return ERROR_ALLOC; } ret = getFrameData(offset, size*BYTES_PER_NODE, &(frame->node_data)); if (ret < OK) { logError(1, "%s getMSFrame: ERROR %02X\n", tag, ERROR_GET_FRAME_DATA); return (ret | ERROR_GET_FRAME_DATA); } /* if you want to access one node i,j, you should compute the offset like: offset = i*columns + j = > frame[i, j] */ logError(0, "%s Frame acquired!\n", tag); frame->node_data_size = size; return size; /* return the number of data put inside frame */ } int getSSFrame2(u16 type, SelfSenseFrame *frame) { u16 offset = ADDR_FRAMEBUFFER_DATA + FRAME_DATA_HEADER; int size, ret; short *temp = NULL; if (!(type == SS_TOUCH || type == SS_KEY || type == SS_HOVER || type == SS_PROXIMITY)) { logError(1, "%s getSSFrame: Choose a SS type of frame data ERROR %02X\n", tag, ERROR_OP_NOT_ALLOW); return ERROR_OP_NOT_ALLOW; } ret = requestFrame(type); if (ret < 0) { logError(1, "%s getSSFrame: ERROR %02X\n", tag, ERROR_REQU_COMP_DATA); return (ret | ERROR_REQU_COMP_DATA); } ret = readFrameDataHeader(type, &(frame->header)); if (ret < 0) { logError(1, "%s getSSFrame: ERROR %02X\n", tag, ERROR_COMP_DATA_HEADER); return (ret | ERROR_COMP_DATA_HEADER); } switch (type) { case SS_TOUCH: case SS_HOVER: case SS_PROXIMITY: size = frame->header.force_node+frame->header.sense_node; break; default: logError(1, "%s getSSFrame: ERROR % 02X\n", tag, ERROR_OP_NOT_ALLOW); return ERROR_OP_NOT_ALLOW; } temp = (short *)kmalloc(size*sizeof(short), GFP_KERNEL); if (temp == NULL) { logError(1, "%s getSSFrame: ERROR %02X\n", tag, ERROR_ALLOC); return ERROR_ALLOC; } ret = getFrameData(offset, size*BYTES_PER_NODE, &temp); if (ret < OK) { logError(1, "%s getMSFrame: ERROR %02X\n", tag, ERROR_GET_FRAME_DATA); return (ret | ERROR_GET_FRAME_DATA); } frame->force_data = (short *)kmalloc(frame->header.force_node*sizeof(short), GFP_KERNEL); if (frame->force_data == NULL) { logError(1, "%s getSSFrame: ERROR %02X\n", tag, ERROR_ALLOC); return ERROR_ALLOC; } memcpy(frame->force_data, temp, frame->header.force_node*sizeof(short)); frame->sense_data = (short *)kmalloc(frame->header.sense_node*sizeof(short), GFP_KERNEL); if (frame->sense_data == NULL) { logError(1, "%s getSSFrame: ERROR %02X\n", tag, ERROR_ALLOC); return ERROR_ALLOC; } memcpy(frame->sense_data, &temp[frame->header.force_node], frame->header.sense_node*sizeof(short)); logError(0, "%s Frame acquired!\n", tag); kfree(temp); return size; /* return the number of data put inside frame */ }