//[*]--------------------------------------------------------------------------------------------------[*] //[*]--------------------------------------------------------------------------------------------------[*] static ssize_t store_fw_status (struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct touch *ts = dev_get_drvdata(dev); int err; unsigned long val; if ((err = strict_strtoul(buf, 10, &val))) return err; switch(val) { case STATUS_BOOT_MODE: ts->fw_status |= (touch_set_mode(ts, TOUCH_BOOT_MODE) == 0) ? STATUS_BOOT_MODE : err_status(STATUS_BOOT_MODE); if(!err_mask(ts->fw_status)) { ts->fw_size = 0; if(ts->fw_buf != NULL) memset(ts->fw_buf, 0x00, MAX_FW_SIZE); else ts->fw_buf = (unsigned char *)kzalloc(MAX_FW_SIZE, GFP_KERNEL); if(ts->fw_buf == NULL) ts->fw_status |= err_status(STATUS_NO_MEMORY); } break; case STATUS_FW_CHECK: if(ts->fw_status & STATUS_BOOT_MODE) { ts->fw_status &= (~STATUS_FW_CHECK); ts->fw_status |= (ts->fw_size <= MAX_FW_SIZE) ? STATUS_FW_CHECK : err_status(STATUS_FW_CHECK); } break; case STATUS_FW_ERASE: if(ts->fw_status & STATUS_BOOT_MODE) { ts->fw_status &= (~STATUS_FW_ERASE); ts->fw_status |= (touch_flash_erase(ts, ts->fw_size) == 0) ? STATUS_FW_ERASE : err_status(STATUS_FW_ERASE); } break; case STATUS_FW_WRITE: if(ts->fw_status & STATUS_BOOT_MODE) { ts->fw_status &= (~STATUS_FW_WRITE); ts->fw_status |= (touch_flash_write(ts, ts->fw_size, ts->fw_buf) == 0) ? STATUS_FW_WRITE : err_status(STATUS_FW_WRITE); } break; case STATUS_FW_VERIFY: if(ts->fw_status & STATUS_BOOT_MODE) { ts->fw_status &= (~STATUS_FW_VERIFY); ts->fw_status |= (touch_flash_verify(ts, ts->fw_size, ts->fw_buf) == 0) ? STATUS_FW_VERIFY : err_status(STATUS_FW_VERIFY); } break; case STATUS_USER_MODE: if(ts->fw_buf != NULL) { kfree(ts->fw_buf); ts->fw_buf = NULL; ts->fw_size = 0; } ts->fw_status = (touch_set_mode(ts, TOUCH_USER_MODE) == 0) ? STATUS_USER_MODE : (err_status(STATUS_USER_MODE) | STATUS_BOOT_MODE); break; default : ts->fw_status |= err_status(STATUS_NO_COMMAND); break; } return count; }
//[*]--------------------------------------------------------------------------------------------------[*] // firmware version display //[*]--------------------------------------------------------------------------------------------------[*] static ssize_t show_fw_version (struct device *dev, struct device_attribute *attr, char *buf) { struct touch *ts = dev_get_drvdata(dev); if(!err_mask(ts->fw_status) && !(ts->fw_status & STATUS_BOOT_MODE)) { touch_disable(ts); touch_wake_control(ts); touch_i2c_read(ts->client, REG_TS_FIRMWARE_ID, 1, &ts->fw_version); touch_enable(ts); } return sprintf(buf, "%d\n", ts->fw_version); }
static void report_extlog_mem_event(struct ras_events *ras, struct pevent_record *record, struct trace_seq *s, struct ras_extlog_event *ev) { trace_seq_printf(s, "%d %s error: %s physical addr: 0x%llx mask: 0x%llx%s %s %s", ev->error_seq, err_severity(ev->severity), err_type(ev->etype), ev->address, err_mask(ev->pa_mask_lsb), err_cper_data(ev->cper_data), ev->fru_text, uuid_le(ev->fru_id)); }
//[*]--------------------------------------------------------------------------------------------------[*] // calibration (1 -> update calibration, 0 -> nothing), show -> NULL //[*]--------------------------------------------------------------------------------------------------[*] static ssize_t store_calibration (struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct touch *ts = dev_get_drvdata(dev); unsigned long val; int err; if ((err = strict_strtoul(buf, 10, &val))) return err; if (val == 1) { if(!err_mask(ts->fw_status) && !(ts->fw_status & STATUS_BOOT_MODE)) { touch_calibration(ts); } } return count; }
//[*]--------------------------------------------------------------------------------------------------[*] //[*]--------------------------------------------------------------------------------------------------[*] // disablel (1 -> disable irq, cancel work, 0 -> enable irq), show irq state //[*]--------------------------------------------------------------------------------------------------[*] static ssize_t show_idle (struct device *dev, struct device_attribute *attr, char *buf) { struct touch *ts = dev_get_drvdata(dev); unsigned char idle = 0; if(!err_mask(ts->fw_status) && !(ts->fw_status & STATUS_BOOT_MODE)) { touch_disable(ts); touch_wake_control(ts); if(touch_i2c_read(ts->client, REG_TS_IDLE_RD, 1, &idle) == 1) { touch_enable(ts); return sprintf(buf, "%d\n", idle); } touch_enable(ts); } return sprintf(buf, "%d\n", -1); }
//[*]--------------------------------------------------------------------------------------------------[*] static ssize_t store_idle (struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct touch *ts = dev_get_drvdata(dev); unsigned long val = 0; unsigned char idle = 0; int err; if ((err = strict_strtoul(buf, 10, &val))) return err; if (val > 255 && val < 0) idle = 0; else { idle = (unsigned char)val; if(!err_mask(ts->fw_status) && !(ts->fw_status & STATUS_BOOT_MODE)) { touch_disable(ts); touch_wake_control(ts); touch_i2c_write(ts->client, REG_TS_IDLE_WR, 1, &idle); touch_enable(ts); } } return count; }