lbp16: move FPGA reset and reload to common place as now both ethernet and serial hm2 boards use them
Signed-off-by: Michael Geszkiewicz <micges@wp.pl>
This commit is contained in:
parent
a7e29560dd
commit
9a208d9c96
4 changed files with 69 additions and 61 deletions
73
eth_boards.c
73
eth_boards.c
|
|
@ -34,7 +34,6 @@
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stddef.h>
|
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "bitfile.h"
|
#include "bitfile.h"
|
||||||
|
|
@ -134,54 +133,6 @@ static int eth_board_close(board_t *board) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int eth_board_reset(llio_t *self) {
|
|
||||||
int send;
|
|
||||||
lbp16_cmd_addr_data16 packet;
|
|
||||||
|
|
||||||
LBP16_INIT_PACKET6(packet, CMD_WRITE_COMM_CTRL_ADDR16(1), 0x1C, 0x0001); // reset if != 0
|
|
||||||
send = lbp16_send_packet(&packet, sizeof(packet));
|
|
||||||
}
|
|
||||||
|
|
||||||
static int eth_board_reload(llio_t *self, int fallback_flag) {
|
|
||||||
int send;
|
|
||||||
u32 boot_addr;
|
|
||||||
u16 fw_ver;
|
|
||||||
lbp16_cmd_addr_data16 packet[14];
|
|
||||||
lbp16_cmd_addr fw_packet;
|
|
||||||
|
|
||||||
LBP16_INIT_PACKET4(fw_packet, CMD_READ_BOARD_INFO_ADDR16(1), offsetof(lbp_info_area, firmware_version));
|
|
||||||
lbp16_send_packet(&fw_packet, sizeof(fw_packet));
|
|
||||||
lbp16_recv_packet(&fw_ver, sizeof(fw_ver));
|
|
||||||
|
|
||||||
if (fw_ver < 15) {
|
|
||||||
printf("ERROR: FPGA reload only supported by ethernet card firmware > 14.\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fallback_flag == 1) {
|
|
||||||
boot_addr = 0x10000;
|
|
||||||
} else {
|
|
||||||
boot_addr = 0x0;
|
|
||||||
}
|
|
||||||
boot_addr |= 0x0B000000; // plus read command in high byte
|
|
||||||
|
|
||||||
LBP16_INIT_PACKET6(packet[0], CMD_WRITE_COMM_CTRL_ADDR16(1), 0x1E, 0xFFFF); // dummy
|
|
||||||
LBP16_INIT_PACKET6(packet[1], CMD_WRITE_COMM_CTRL_ADDR16(1), 0x1E, 0xFFFF); // dummy
|
|
||||||
LBP16_INIT_PACKET6(packet[2], CMD_WRITE_COMM_CTRL_ADDR16(1), 0x1E, 0xAA99); // sync
|
|
||||||
LBP16_INIT_PACKET6(packet[3], CMD_WRITE_COMM_CTRL_ADDR16(1), 0x1E, 0x5566); // sync
|
|
||||||
LBP16_INIT_PACKET6(packet[4], CMD_WRITE_COMM_CTRL_ADDR16(1), 0x1E, 0x3261); // load low flash start address
|
|
||||||
LBP16_INIT_PACKET6(packet[5], CMD_WRITE_COMM_CTRL_ADDR16(1), 0x1E, boot_addr & 0xFFFF); // start addr
|
|
||||||
LBP16_INIT_PACKET6(packet[6], CMD_WRITE_COMM_CTRL_ADDR16(1), 0x1E, 0x3281); // load high start address + read command
|
|
||||||
LBP16_INIT_PACKET6(packet[7], CMD_WRITE_COMM_CTRL_ADDR16(1), 0x1E, boot_addr >> 16); // start addr (plus read command in high byte)
|
|
||||||
LBP16_INIT_PACKET6(packet[8], CMD_WRITE_COMM_CTRL_ADDR16(1), 0x1E, 0x30A1); // load command register
|
|
||||||
LBP16_INIT_PACKET6(packet[9], CMD_WRITE_COMM_CTRL_ADDR16(1), 0x1E, 0x000E); // IPROG command
|
|
||||||
LBP16_INIT_PACKET6(packet[10], CMD_WRITE_COMM_CTRL_ADDR16(1), 0x1E, 0x2000); // NOP
|
|
||||||
LBP16_INIT_PACKET6(packet[11], CMD_WRITE_COMM_CTRL_ADDR16(1), 0x1E, 0x2000); // NOP
|
|
||||||
LBP16_INIT_PACKET6(packet[12], CMD_WRITE_COMM_CTRL_ADDR16(1), 0x1E, 0x2000); // NOP
|
|
||||||
LBP16_INIT_PACKET6(packet[13], CMD_WRITE_COMM_CTRL_ADDR16(1), 0x1E, 0x2000); // NOP
|
|
||||||
send = lbp16_send_packet(&packet, sizeof(packet));
|
|
||||||
}
|
|
||||||
|
|
||||||
static int eth_scan_one_addr(board_access_t *access) {
|
static int eth_scan_one_addr(board_access_t *access) {
|
||||||
lbp16_cmd_addr packet, packet2;
|
lbp16_cmd_addr packet, packet2;
|
||||||
int send = 0, recv = 0, ret = 0;
|
int send = 0, recv = 0, ret = 0;
|
||||||
|
|
@ -218,8 +169,8 @@ static int eth_scan_one_addr(board_access_t *access) {
|
||||||
board->llio.write = ð_write;
|
board->llio.write = ð_write;
|
||||||
board->llio.write_flash = &remote_write_flash;
|
board->llio.write_flash = &remote_write_flash;
|
||||||
board->llio.verify_flash = &remote_verify_flash;
|
board->llio.verify_flash = &remote_verify_flash;
|
||||||
board->llio.reset = ð_board_reset;
|
board->llio.reset = &lbp16_board_reset;
|
||||||
board->llio.reload = ð_board_reload;
|
board->llio.reload = &lbp16_board_reload;
|
||||||
board->llio.private = board;
|
board->llio.private = board;
|
||||||
|
|
||||||
board->open = ð_board_open;
|
board->open = ð_board_open;
|
||||||
|
|
@ -244,8 +195,8 @@ static int eth_scan_one_addr(board_access_t *access) {
|
||||||
board->llio.write = ð_write;
|
board->llio.write = ð_write;
|
||||||
board->llio.write_flash = &remote_write_flash;
|
board->llio.write_flash = &remote_write_flash;
|
||||||
board->llio.verify_flash = &remote_verify_flash;
|
board->llio.verify_flash = &remote_verify_flash;
|
||||||
board->llio.reset = ð_board_reset;
|
board->llio.reset = &lbp16_board_reset;
|
||||||
board->llio.reload = ð_board_reload;
|
board->llio.reload = &lbp16_board_reload;
|
||||||
board->llio.private = board;
|
board->llio.private = board;
|
||||||
|
|
||||||
board->open = ð_board_open;
|
board->open = ð_board_open;
|
||||||
|
|
@ -269,8 +220,8 @@ static int eth_scan_one_addr(board_access_t *access) {
|
||||||
board->llio.write = ð_write;
|
board->llio.write = ð_write;
|
||||||
board->llio.write_flash = &remote_write_flash;
|
board->llio.write_flash = &remote_write_flash;
|
||||||
board->llio.verify_flash = &remote_verify_flash;
|
board->llio.verify_flash = &remote_verify_flash;
|
||||||
board->llio.reset = ð_board_reset;
|
board->llio.reset = &lbp16_board_reset;
|
||||||
board->llio.reload = ð_board_reload;
|
board->llio.reload = &lbp16_board_reload;
|
||||||
board->llio.private = board;
|
board->llio.private = board;
|
||||||
|
|
||||||
board->open = ð_board_open;
|
board->open = ð_board_open;
|
||||||
|
|
@ -294,8 +245,8 @@ static int eth_scan_one_addr(board_access_t *access) {
|
||||||
board->llio.write = ð_write;
|
board->llio.write = ð_write;
|
||||||
board->llio.write_flash = &remote_write_flash;
|
board->llio.write_flash = &remote_write_flash;
|
||||||
board->llio.verify_flash = &remote_verify_flash;
|
board->llio.verify_flash = &remote_verify_flash;
|
||||||
board->llio.reset = ð_board_reset;
|
board->llio.reset = &lbp16_board_reset;
|
||||||
board->llio.reload = ð_board_reload;
|
board->llio.reload = &lbp16_board_reload;
|
||||||
board->llio.private = board;
|
board->llio.private = board;
|
||||||
|
|
||||||
board->open = ð_board_open;
|
board->open = ð_board_open;
|
||||||
|
|
@ -319,8 +270,8 @@ static int eth_scan_one_addr(board_access_t *access) {
|
||||||
board->llio.write = ð_write;
|
board->llio.write = ð_write;
|
||||||
board->llio.write_flash = &remote_write_flash;
|
board->llio.write_flash = &remote_write_flash;
|
||||||
board->llio.verify_flash = &remote_verify_flash;
|
board->llio.verify_flash = &remote_verify_flash;
|
||||||
board->llio.reset = ð_board_reset;
|
board->llio.reset = &lbp16_board_reset;
|
||||||
board->llio.reload = ð_board_reload;
|
board->llio.reload = &lbp16_board_reload;
|
||||||
board->llio.private = board;
|
board->llio.private = board;
|
||||||
|
|
||||||
board->open = ð_board_open;
|
board->open = ð_board_open;
|
||||||
|
|
@ -343,8 +294,8 @@ static int eth_scan_one_addr(board_access_t *access) {
|
||||||
board->llio.write = ð_write;
|
board->llio.write = ð_write;
|
||||||
board->llio.write_flash = &remote_write_flash;
|
board->llio.write_flash = &remote_write_flash;
|
||||||
board->llio.verify_flash = &remote_verify_flash;
|
board->llio.verify_flash = &remote_verify_flash;
|
||||||
board->llio.reset = ð_board_reset;
|
board->llio.reset = &lbp16_board_reset;
|
||||||
board->llio.reload = ð_board_reload;
|
board->llio.reload = &lbp16_board_reload;
|
||||||
board->llio.private = board;
|
board->llio.private = board;
|
||||||
|
|
||||||
board->open = ð_board_open;
|
board->open = ð_board_open;
|
||||||
|
|
|
||||||
53
lbp16.c
53
lbp16.c
|
|
@ -18,6 +18,7 @@
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <stddef.h>
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
#include "lbp16.h"
|
#include "lbp16.h"
|
||||||
#include "eth_boards.h"
|
#include "eth_boards.h"
|
||||||
|
|
@ -70,6 +71,58 @@ int lbp16_write(u16 cmd, u32 addr, void *buffer, int size) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int lbp16_board_reset(llio_t *self) {
|
||||||
|
int send;
|
||||||
|
lbp16_cmd_addr_data16 packet;
|
||||||
|
|
||||||
|
LBP16_INIT_PACKET6(packet, CMD_WRITE_COMM_CTRL_ADDR16(1), 0x1C, 0x0001); // reset if != 0
|
||||||
|
send = lbp16_send_packet(&packet, sizeof(packet));
|
||||||
|
}
|
||||||
|
|
||||||
|
int lbp16_board_reload(llio_t *self, int fallback_flag) {
|
||||||
|
board_t *board = self->private;
|
||||||
|
int send;
|
||||||
|
u32 boot_addr;
|
||||||
|
u16 fw_ver;
|
||||||
|
lbp16_cmd_addr_data16 packet[14];
|
||||||
|
lbp16_cmd_addr fw_packet;
|
||||||
|
|
||||||
|
LBP16_INIT_PACKET4(fw_packet, CMD_READ_BOARD_INFO_ADDR16(1), offsetof(lbp_info_area, firmware_version));
|
||||||
|
lbp16_send_packet(&fw_packet, sizeof(fw_packet));
|
||||||
|
lbp16_recv_packet(&fw_ver, sizeof(fw_ver));
|
||||||
|
|
||||||
|
if ((board->type & BOARD_ETH) && (fw_ver < 15)) {
|
||||||
|
printf("ERROR: FPGA reload only supported by ethernet card firmware > 14.\n");
|
||||||
|
return -1;
|
||||||
|
} else if ((board->type & BOARD_SER) && (fw_ver < 2)) {
|
||||||
|
printf("ERROR: FPGA reload only supported by serial card firmware > 2.\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fallback_flag == 1) {
|
||||||
|
boot_addr = 0x10000;
|
||||||
|
} else {
|
||||||
|
boot_addr = 0x0;
|
||||||
|
}
|
||||||
|
boot_addr |= 0x0B000000; // plus read command in high byte
|
||||||
|
|
||||||
|
LBP16_INIT_PACKET6(packet[0], CMD_WRITE_COMM_CTRL_ADDR16(1), 0x1E, 0xFFFF); // dummy
|
||||||
|
LBP16_INIT_PACKET6(packet[1], CMD_WRITE_COMM_CTRL_ADDR16(1), 0x1E, 0xFFFF); // dummy
|
||||||
|
LBP16_INIT_PACKET6(packet[2], CMD_WRITE_COMM_CTRL_ADDR16(1), 0x1E, 0xAA99); // sync
|
||||||
|
LBP16_INIT_PACKET6(packet[3], CMD_WRITE_COMM_CTRL_ADDR16(1), 0x1E, 0x5566); // sync
|
||||||
|
LBP16_INIT_PACKET6(packet[4], CMD_WRITE_COMM_CTRL_ADDR16(1), 0x1E, 0x3261); // load low flash start address
|
||||||
|
LBP16_INIT_PACKET6(packet[5], CMD_WRITE_COMM_CTRL_ADDR16(1), 0x1E, boot_addr & 0xFFFF); // start addr
|
||||||
|
LBP16_INIT_PACKET6(packet[6], CMD_WRITE_COMM_CTRL_ADDR16(1), 0x1E, 0x3281); // load high start address + read command
|
||||||
|
LBP16_INIT_PACKET6(packet[7], CMD_WRITE_COMM_CTRL_ADDR16(1), 0x1E, boot_addr >> 16); // start addr (plus read command in high byte)
|
||||||
|
LBP16_INIT_PACKET6(packet[8], CMD_WRITE_COMM_CTRL_ADDR16(1), 0x1E, 0x30A1); // load command register
|
||||||
|
LBP16_INIT_PACKET6(packet[9], CMD_WRITE_COMM_CTRL_ADDR16(1), 0x1E, 0x000E); // IPROG command
|
||||||
|
LBP16_INIT_PACKET6(packet[10], CMD_WRITE_COMM_CTRL_ADDR16(1), 0x1E, 0x2000); // NOP
|
||||||
|
LBP16_INIT_PACKET6(packet[11], CMD_WRITE_COMM_CTRL_ADDR16(1), 0x1E, 0x2000); // NOP
|
||||||
|
LBP16_INIT_PACKET6(packet[12], CMD_WRITE_COMM_CTRL_ADDR16(1), 0x1E, 0x2000); // NOP
|
||||||
|
LBP16_INIT_PACKET6(packet[13], CMD_WRITE_COMM_CTRL_ADDR16(1), 0x1E, 0x2000); // NOP
|
||||||
|
send = lbp16_send_packet(&packet, sizeof(packet));
|
||||||
|
}
|
||||||
|
|
||||||
void lbp16_init(int board_type) {
|
void lbp16_init(int board_type) {
|
||||||
switch (board_type) {
|
switch (board_type) {
|
||||||
case BOARD_ETH:
|
case BOARD_ETH:
|
||||||
|
|
|
||||||
2
lbp16.h
2
lbp16.h
|
|
@ -254,6 +254,8 @@ void lbp16_init(int board_type);
|
||||||
void lbp16_cleanup(int board_type);
|
void lbp16_cleanup(int board_type);
|
||||||
int lbp16_read(u16 cmd, u32 addr, void *buffer, int size);
|
int lbp16_read(u16 cmd, u32 addr, void *buffer, int size);
|
||||||
int lbp16_write(u16 cmd, u32 addr, void *buffer, int size);
|
int lbp16_write(u16 cmd, u32 addr, void *buffer, int size);
|
||||||
|
int lbp16_board_reset(llio_t *self);
|
||||||
|
int lbp16_board_reload(llio_t *self, int fallback_flag);
|
||||||
int lbp16_send_packet(void *packet, int size);
|
int lbp16_send_packet(void *packet, int size);
|
||||||
int lbp16_recv_packet(void *packet, int size);
|
int lbp16_recv_packet(void *packet, int size);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -148,6 +148,8 @@ void serial_boards_scan(board_access_t *access) {
|
||||||
board->llio.num_leds = 2;
|
board->llio.num_leds = 2;
|
||||||
board->llio.read = &serial_read;
|
board->llio.read = &serial_read;
|
||||||
board->llio.write = &serial_write;
|
board->llio.write = &serial_write;
|
||||||
|
board->llio.reset = &lbp16_board_reset;
|
||||||
|
board->llio.reload = &lbp16_board_reload;
|
||||||
board->llio.private = board;
|
board->llio.private = board;
|
||||||
|
|
||||||
board->open = &serial_board_open;
|
board->open = &serial_board_open;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue