static int request_image_block_ex (pixma_t * s, unsigned *size, uint8_t * info, unsigned flag) { mp750_t *mp = (mp750_t *) s->subdriver; int error; memset (mp->cb.buf, 0, 10); pixma_set_be16 (cmd_read_image, mp->cb.buf); mp->cb.buf[7] = *size >> 8; mp->cb.buf[8] = 4 | flag; mp->cb.reslen = pixma_cmd_transaction (s, mp->cb.buf, 10, mp->cb.buf, 6); mp->cb.expected_reslen = 0; error = pixma_check_result (&mp->cb); if (error >= 0) { if (mp->cb.reslen == 6) { *info = mp->cb.buf[2]; *size = pixma_get_be16 (mp->cb.buf + 4); } else { error = PIXMA_EPROTO; } } return error; }
/* checksumming is sometimes different than pixmas */ static int iclass_exec (pixma_t * s, pixma_cmdbuf_t * cb, char invcksum) { if (cb->cmdlen > cb->cmd_header_len) pixma_fill_checksum (cb->buf + cb->cmd_header_len, cb->buf + cb->cmdlen - 2); cb->buf[cb->cmdlen - 1] = invcksum ? -cb->buf[cb->cmdlen - 2] : 0; cb->reslen = pixma_cmd_transaction (s, cb->buf, cb->cmdlen, cb->buf, cb->expected_reslen); return pixma_check_result (cb); }
static int request_image_block (pixma_t * s, unsigned flag, uint8_t * info, unsigned * size, uint8_t * data, unsigned * datalen) { iclass_t *mf = (iclass_t *) s->subdriver; int error; unsigned expected_len; const int hlen = 2 + 6; memset (mf->cb.buf, 0, 11); pixma_set_be16 (((s->cfg->pid == MF3010_PID || s->cfg->pid == MF4410_PID || s->cfg->pid == MF4770_PID || s->cfg->pid == MF4550_PID) ? cmd_read_image2 : cmd_read_image), mf->cb.buf); mf->cb.buf[8] = flag; mf->cb.buf[10] = 0x06; expected_len = (s->cfg->pid == MF3010_PID || s->cfg->pid == MF4410_PID || s->cfg->pid == MF4770_PID || s->cfg->pid == MF4550_PID || s->cfg->pid == MF4600_PID || s->cfg->pid == MF6500_PID || s->cfg->pid == MF8030_PID) ? 512 : hlen; mf->cb.reslen = pixma_cmd_transaction (s, mf->cb.buf, 11, mf->cb.buf, expected_len); if (mf->cb.reslen >= hlen) { *info = mf->cb.buf[2]; *size = pixma_get_be16 (mf->cb.buf + 6); /* 16bit size */ error = 0; if (s->cfg->pid == MF3010_PID || s->cfg->pid == MF4410_PID || s->cfg->pid == MF4770_PID || s->cfg->pid == MF4550_PID || s->cfg->pid == MF4600_PID || s->cfg->pid == MF6500_PID || s->cfg->pid == MF8030_PID) { /* 32bit size */ *datalen = mf->cb.reslen - hlen; *size = (*datalen + hlen == 512) ? pixma_get_be32 (mf->cb.buf + 4) - *datalen : 0; memcpy (data, mf->cb.buf + hlen, *datalen); } } else { error = PIXMA_EPROTO; } return error; }
static int read_image_block (pixma_t * s, uint8_t * header, uint8_t * data) { static const uint8_t cmd[10] = /* 0xd420 cmd */ { 0xd4, 0x20, 0, 0, 0, 0, 0, IMAGE_BLOCK_SIZE / 256, 4, 0 }; mp730_t *mp = (mp730_t *) s->subdriver; const int hlen = 2 + 4; int error, datalen; mp->state = state_transfering; mp->cb.reslen = pixma_cmd_transaction (s, cmd, sizeof (cmd), mp->cb.buf, 512); datalen = mp->cb.reslen; if (datalen < 0) return datalen; memcpy (header, mp->cb.buf, hlen); if (datalen >= hlen) { datalen -= hlen; memcpy (data, mp->cb.buf + hlen, datalen); data += datalen; if (mp->cb.reslen == 512) { error = pixma_read (s->io, data, IMAGE_BLOCK_SIZE - 512 + hlen); if (error < 0) return error; datalen += error; } } mp->state = state_scanning; mp->cb.expected_reslen = 0; error = pixma_check_result (&mp->cb); if (error < 0) return error; if (mp->cb.reslen < hlen) return PIXMA_EPROTO; return datalen; }