Разобрался с altera-stapl - это модуль переводящий Compressed JAM файл(*.jbc) в "виртуальное" дерганье JTAG ножек. Для прошивки ПЛИС нужно просто реализовать функцию переводящую "виртуальное" дерганье ног в физическое.
int (*jtag_io) (void *dev, int tms, int tdi, int tdo);
Прошивка осуществляется вызовом единственной экспортируемой функцией, данного модуля, altera_init. Она принимает в качестве параметров файл прошивки(struct firmware), и указатель на нашу функцию (struct altera_config, поле jtag_io).
Вырезка из кода драйвера, для примера:
Код
static char *firmware_name = "fpga_firmware.jbc";
module_param( firmware_name, charp, S_IRUGO );
MODULE_PARM_DESC(firmware_name, "Name of FPGA firmware file in /lib/firmware (if not specified defaults to 'fpga_firmware.jbc')");
static int fpgaup_jtag_io(void *device, int tms, int tdi, int read_tdo)
{
int tdo = 0;
// Устанавливаем TMS
gpio_set_value(TMS_PIN, tms);
// Устанавливаем TDI
gpio_set_value(TDI_PIN, tdi);
// Считываем TDO, если нужно
if (read_tdo) {
tdo = gpio_get_value(TDO_PIN);
}
// Формируем строб сигнала TCK
gpio_set_value(TCK_PIN, 1);
gpio_set_value(TCK_PIN, 0);
return tdo;
}
/**
* fpgacii_fw_load() - configure a FPGA
*
* Returns 0 on success, and an appropriate error value otherwise.
*/
static int fpgacii_fw_load(struct device *dev)
{
const struct firmware *fw;
int ret;
char *action = "configure";// Выполняемое действие - конфигурирование
struct altera_config fpgaup_config = {
.dev = dev,
.action = action,
.jtag_io = fpgaup_jtag_io,
};
// load firmware
ret = request_firmware(&fw, firmware_name, dev);
if (ret < 0) {
dev_err(dev, "%s: request_firmware failed: %d\n", __func__, ret);
return ret;
}
// configure FPGA
ret = altera_init(&fpgaup_config, fw);
release_firmware(fw);
return ret;
}