Skip to content

Commit e7fbe0d

Browse files
committed
Adding dual booting fx2 firmware.
* HDMI2USB now boots into HDMI2USB mode! * Base boots into usbjtag mode.
1 parent e2fa72d commit e7fbe0d

File tree

7 files changed

+89
-26
lines changed

7 files changed

+89
-26
lines changed

Makefile.lm32

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,13 @@ help-lm32:
3535
gateware-lm32: firmware-lm32
3636
@true
3737

38-
firmware-lm32: third_party/misoc/.git
38+
ifeq ($(TARGET),hdmi2usb)
39+
EXTRA_DEPS = embed-fx2
40+
else
41+
EXTRA_DEPS =
42+
endif
43+
44+
firmware-lm32: third_party/misoc/.git $(EXTRA_DEPS)
3945
cd $(MSCDIR) && $(CMD) build-headers
4046
$(MAKE) -C firmware/lm32 all
4147

firmware/lm32/ci.c

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ static void help_debug(void)
8787
puts("debug tofe_eeprom - dump TOFE Board Info EEPROM");
8888
#endif
8989
#ifdef CSR_FX2_RESET_OUT_ADDR
90-
puts("debug fx2_reboot - reboot the FX2 USB IC");
90+
puts("debug fx2_reboot firmware - reboot the FX2 USB IC into firmware");
9191
#endif
9292
}
9393

@@ -624,7 +624,18 @@ void ci_service(void)
624624
#endif
625625
#ifdef CSR_FX2_RESET_OUT_ADDR
626626
else if(strcmp(token, "fx2_reboot") == 0) {
627-
fx2_reboot();
627+
token = get_token(&str);
628+
if(strcmp(token, "") || strcmp(token, "usbjtag") == 0) {
629+
fx2_reboot(FX2FW_USBJTAG);
630+
}
631+
#ifdef ENCODER_BASE
632+
else if (strcmp(token, "hdmi2usb") == 0) {
633+
fx2_reboot(FX2FW_HDMI2USB);
634+
}
635+
#endif
636+
else {
637+
printf("Unknown firmware\n");
638+
}
628639
}
629640
#endif
630641
else if(strcmp(token, "edid") == 0) {

firmware/lm32/fx2.c

Lines changed: 50 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,39 +10,67 @@
1010
#define FX2_HACK_SHIFT_REG_EMPTY 2
1111
#define FX2_HACK_STATUS_READY 0
1212

13-
#define FX2_FIRMWARE fx2_mbfw_usbjtag
1413
#include "fx2_fw_usbjtag.c"
14+
#ifdef ENCODER_BASE
15+
#include "fx2_fw_hdmi2usb.c"
16+
#endif
1517

1618
static void fx2_wait(void) {
1719
unsigned int i;
1820
for(i=0;i<1000;i++) __asm__("nop");
1921
}
2022

23+
enum fx2_fw_version fx2_fw_active;
24+
25+
26+
static size_t next_read_addr;
27+
static size_t end_addr;
28+
2129
inline uint8_t fx2_fw_get_value(size_t addr) {
2230
uint8_t r = 0xff;
23-
if (addr < sizeof(FX2_FIRMWARE)) {
24-
r = FX2_FIRMWARE.bytes[addr];
31+
if (addr < end_addr) {
32+
switch(fx2_fw_active) {
33+
case FX2FW_USBJTAG:
34+
r = fx2_mbfw_usbjtag.bytes[addr];
35+
break;
36+
#ifdef ENCODER_BASE
37+
case FX2FW_HDMI2USB:
38+
r = fx2_mbfw_hdmi2usb.bytes[addr];
39+
break;
40+
41+
#endif
42+
}
2543
} else {
26-
printf("fx2: Read from invalid address %02X\n", addr);
44+
printf("fx2: Read from invalid address for USB-JTAG firmware %02X\n", addr);
2745
}
2846
return r;
2947
}
3048

3149
#define FX2_REPORT_PERIOD (1 << 22)
3250
#define FX2_WAIT_PERIOD FX2_REPORT_PERIOD*10
3351

34-
static size_t next_read_addr;
35-
static void fx2_init(void)
52+
static void fx2_load_init(void)
3653
{
3754
next_read_addr = 0;
55+
switch(fx2_fw_active) {
56+
case FX2FW_USBJTAG:
57+
end_addr = FX2_MBFW_USBJTAG_END;
58+
break;
59+
#ifdef ENCODER_BASE
60+
case FX2FW_HDMI2USB:
61+
end_addr = FX2_MBFW_HDMI2USB_END;
62+
break;
63+
#endif
64+
}
65+
3866
fx2_hack_slave_addr_write(FX2_HACK_SLAVE_ADDRESS);
3967
fx2_hack_shift_reg_write(fx2_fw_get_value(0));
4068
fx2_hack_status_write(FX2_HACK_STATUS_READY);
4169
}
4270

4371
static void fx2_load(void)
4472
{
45-
fx2_init();
73+
fx2_load_init();
4674
printf("fx2: Waiting for FX2 to load firmware.\n");
4775

4876
uint64_t i = 0;
@@ -54,7 +82,7 @@ static void fx2_load(void)
5482
break;
5583
}
5684
} else if ((i % FX2_REPORT_PERIOD) == 0) {
57-
printf("fx2: Waiting at %02X (end: %02X)\n", next_read_addr, FX2_FIRMWARE_END);
85+
printf("fx2: Waiting at %02X (end: %02X)\n", next_read_addr, end_addr);
5886
}
5987
}
6088
if (i > 0) {
@@ -69,16 +97,16 @@ bool fx2_service(bool verbose)
6997
unsigned char status = fx2_hack_status_read();
7098
if(status == FX2_HACK_SHIFT_REG_EMPTY) { // there's been a master READ
7199
if (verbose) {
72-
printf("fx2: read %02X (end: %02X)\n", next_read_addr, FX2_FIRMWARE_END);
100+
printf("fx2: read %02X (end: %02X)\n", next_read_addr, end_addr);
73101
}
74-
if (next_read_addr < FX2_FIRMWARE_END) {
102+
if (next_read_addr < end_addr) {
75103
// Load next value into the system
76104
fx2_hack_shift_reg_write(fx2_fw_get_value(next_read_addr+1));
77105
fx2_hack_status_write(FX2_HACK_STATUS_READY);
78106
next_read_addr++;
79107
} else {
80108
printf("fx2: Finished loading firmware.\n");
81-
fx2_init();
109+
fx2_load_init();
82110
}
83111
return true;
84112
} else if (status != 0) {
@@ -87,8 +115,9 @@ bool fx2_service(bool verbose)
87115
return false;
88116
}
89117

90-
void fx2_reboot(void)
118+
void fx2_reboot(enum fx2_fw_version fw)
91119
{
120+
fx2_fw_active = fw;
92121
printf("fx2: Turning off.\n");
93122
fx2_reset_out_write(0);
94123
fx2_wait();
@@ -97,4 +126,13 @@ void fx2_reboot(void)
97126
fx2_load();
98127
}
99128

129+
void fx2_init(void)
130+
{
131+
#ifdef ENCODER_BASE
132+
fx2_reboot(FX2FW_HDMI2USB);
133+
#else
134+
fx2_reboot(FX2FW_USBJTAG);
135+
#endif
136+
}
137+
100138
#endif

firmware/lm32/fx2.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,15 @@
33

44
#include <stdbool.h>
55

6+
enum fx2_fw_version {
7+
FX2FW_USBJTAG,
8+
#ifdef ENCODER_BASE
9+
FX2FW_HDMI2USB,
10+
#endif
11+
};
12+
13+
void fx2_init(void);
614
bool fx2_service(bool verbose);
7-
void fx2_reboot(void);
15+
void fx2_reboot(enum fx2_fw_version fw);
816

917
#endif

firmware/lm32/main.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ int main(void)
5555

5656
// Reboot the FX2 chip into HDMI2USB mode
5757
#ifdef CSR_FX2_RESET_OUT_ADDR
58-
fx2_reboot();
58+
fx2_init();
5959
#endif
6060

6161
ci_prompt();

targets/opsis_base.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ class BaseSoC(SDRAMSoC):
160160
mem_map.update(SDRAMSoC.mem_map)
161161

162162
def __init__(self, platform,
163-
firmware_ram_size=0xa000,
163+
firmware_ram_size=0x10000,
164164
firmware_filename=None,
165165
**kwargs):
166166
clk_freq = 50*1000000

targets/opsis_hdmi2usb.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@
88

99
class VideomixerSoC(BaseSoC):
1010
csr_map = {
11-
"hdmi_out0": 20,
12-
"hdmi_out1": 21,
13-
"hdmi_in0": 22,
14-
"hdmi_in0_edid_mem": 23,
15-
"hdmi_in1": 24,
16-
"hdmi_in1_edid_mem": 25,
11+
"hdmi_out0": 21,
12+
"hdmi_out1": 22,
13+
"hdmi_in0": 23,
14+
"hdmi_in0_edid_mem": 24,
15+
"hdmi_in1": 25,
16+
"hdmi_in1_edid_mem": 26,
1717
}
1818
csr_map.update(BaseSoC.csr_map)
1919

@@ -57,8 +57,8 @@ def __init__(self, platform, **kwargs):
5757

5858
class HDMI2USBSoC(VideomixerSoC):
5959
csr_map = {
60-
"encoder_reader": 26,
61-
"encoder": 27
60+
"encoder_reader": 27,
61+
"encoder": 28,
6262
}
6363
csr_map.update(VideomixerSoC.csr_map)
6464
mem_map = {

0 commit comments

Comments
 (0)