/* address is bus-endian; data passed through from user as-is */
buf[0] = address;
memcpy(&buf[1], &data[4], sizeof(u32));
memcpy(&buf[2], data, sizeof(u32));
do { /* set sram address for response */
rc = p8_i2c_occ_putscom_u32(client, OCB_ADDR,
OCC_SRAM_ADDR_RESP, 0); if (rc) return rc;
rc = p8_i2c_occ_getscom(client, OCB_DATA3, (u8 *)resp); if (rc) return rc;
/* wait for OCC */ if (or->return_status == OCC_RESP_CMD_IN_PRG) {
rc = -EALREADY;
if (time_after(jiffies, start + timeout)) break;
set_current_state(TASK_INTERRUPTIBLE);
schedule_timeout(wait_time);
}
} while (rc);
/* check the OCC response */ switch (or->return_status) { case OCC_RESP_CMD_IN_PRG:
rc = -ETIMEDOUT; break; case OCC_RESP_SUCCESS:
rc = 0; break; case OCC_RESP_CMD_INVAL: case OCC_RESP_CMD_LEN_INVAL: case OCC_RESP_DATA_INVAL: case OCC_RESP_CHKSUM_ERR:
rc = -EINVAL; break; case OCC_RESP_INT_ERR: case OCC_RESP_BAD_STATE: case OCC_RESP_CRIT_EXCEPT: case OCC_RESP_CRIT_INIT: case OCC_RESP_CRIT_WATCHDOG: case OCC_RESP_CRIT_OCB: case OCC_RESP_CRIT_HW:
rc = -EREMOTEIO; break; default:
rc = -EPROTO;
}
/* fetch the rest of the response data */ for (i = 8; i < data_length + 7; i += 8) {
rc = p8_i2c_occ_getscom(client, OCB_DATA3, ((u8 *)resp) + i); if (rc) return rc;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.