ret = gpiod_get_value(core->done); if (ret < 0)
dev_err(&mgr->dev, "Error reading DONE (%d)\n", ret);
return ret;
}
staticenum fpga_mgr_states xilinx_core_state(struct fpga_manager *mgr)
{ if (!get_done_gpio(mgr)) return FPGA_MGR_STATE_RESET;
return FPGA_MGR_STATE_UNKNOWN;
}
/** * wait_for_init_b - wait for the INIT_B pin to have a given state, or wait * a given delay if the pin is unavailable * * @mgr: The FPGA manager object * @value: Value INIT_B to wait for (1 = asserted = low) * @alt_udelay: Delay to wait if the INIT_B GPIO is not available * * Returns 0 when the INIT_B GPIO reached the given state or -ETIMEDOUT if * too much time passed waiting for that. If no INIT_B GPIO is available * then always return 0.
*/ staticint wait_for_init_b(struct fpga_manager *mgr, int value, unsignedlong alt_udelay)
{ struct xilinx_fpga_core *core = mgr->priv; unsignedlong timeout = jiffies + msecs_to_jiffies(1000);
if (core->init_b) { while (time_before(jiffies, timeout)) { int ret = gpiod_get_value(core->init_b);
/* * This loop is carefully written such that if the driver is * scheduled out for more than 'timeout', we still check for DONE * before giving up and we apply 8 extra CCLK cycles in all cases.
*/ while (!expired) {
expired = time_after(jiffies, timeout);
done = get_done_gpio(mgr); if (done < 0) return done;
ret = core->write(core, padding, sizeof(padding)); if (ret) return ret;
if (done) return 0;
}
if (core->init_b) {
ret = gpiod_get_value(core->init_b);
dev_err(&mgr->dev,
ret ? "CRC error or invalid device\n" : "Missing sync word or incomplete bitstream\n");
} else {
dev_err(&mgr->dev, "Timeout after config data transfer\n");
}
int xilinx_core_probe(struct xilinx_fpga_core *core)
{ struct fpga_manager *mgr;
if (!core || !core->dev || !core->write) return -EINVAL;
/* PROGRAM_B is active low */
core->prog_b = xilinx_core_devm_gpiod_get(core->dev, "prog", "prog_b",
GPIOD_OUT_LOW); if (IS_ERR(core->prog_b)) return dev_err_probe(core->dev, PTR_ERR(core->prog_b), "Failed to get PROGRAM_B gpio\n");
core->init_b = xilinx_core_devm_gpiod_get(core->dev, "init", "init-b",
GPIOD_IN); if (IS_ERR(core->init_b)) return dev_err_probe(core->dev, PTR_ERR(core->init_b), "Failed to get INIT_B gpio\n");
core->done = devm_gpiod_get(core->dev, "done", GPIOD_IN); if (IS_ERR(core->done)) return dev_err_probe(core->dev, PTR_ERR(core->done), "Failed to get DONE gpio\n");
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.