Skip to content

Commit

Permalink
Cleanups and new features
Browse files Browse the repository at this point in the history
Logic:
* Make the autoconfig easier to read
* Add versioning as the serial to the autoconfig

CLI:
* Show board version number in information

GUI:
* Show board version number in "About"
* Fix block erase code
* Now erases a single ROM before flashing a new one
  • Loading branch information
LinuxJedi committed Mar 5, 2021
1 parent 1f177a9 commit 356c8e2
Show file tree
Hide file tree
Showing 9 changed files with 1,135 additions and 1,038 deletions.
1,764 changes: 882 additions & 882 deletions Logic/FLASH_KICKSTART.jed

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion Logic/FLASH_KICKSTART.ucf
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ NET "DATA<12>" LOC = "P23" ;
NET "DATA<13>" LOC = "P22" ;
NET "DATA<14>" LOC = "P21" ;
NET "DATA<15>" LOC = "P20" ;
NET "CLK" LOC = "P40" ;
NET "CLK" LOC = "P40" ;
NET "E_CLK" LOC = "P41" ;
NET "CPU_AS_n" LOC = "P27" ;
NET "MB_AS_n" LOC = "P28" ;
Expand Down
285 changes: 147 additions & 138 deletions Logic/FLASH_KICKSTART.v
Original file line number Diff line number Diff line change
Expand Up @@ -30,146 +30,155 @@
Revision 2.1 - 26.12.2020:
Switch power-on default to boot from motherboard ROM.
Revision 3.0 - 28.12.2029:
Revision 3.0 - 28.12.2020:
Hook up A19 and allow for a multi-rom switch if 1MB is installed
Revision 3.1 - 03.03.2021:
Tidy up firmware a bit
*/

module FLASH_KICKSTART(
input CLK,
input E_CLK,

input RESET_n,
input CPU_AS_n,
input LDS_n,
input UDS_n,
input RW,

output MB_AS_n,
output DTACK_n,

input [23:16] ADDRESS_HIGH,
input [7:1] ADDRESS_LOW,
inout [15:12] DATA,

output [1:0] FLASH_WR_n,
output [1:0] FLASH_RD_n,
output FLASH_A19,

input SIZE_512K
);

reg useMotherboardKickstart = 1'b1;
reg [19:0] switchCounter = 20'd0;
reg hasSwitched = 1'b0;

reg autoConfigComplete = 1'b0;
reg [3:0] flashBase = 4'h0;
reg flashBaseValid = 1'b0;

reg overlay_n = 1'b0;

reg [3:0] dataOut = 4'h0;

reg useLowRom = 1'b0;

wire ciaRange = ADDRESS_HIGH[23:16] == 8'hBF;
wire autoConfigRange = ADDRESS_HIGH[23:16] == 8'hE8;
wire kickstartRange = ADDRESS_HIGH[23:19] == 5'h1F;
wire kickstartOverlayRange = ADDRESS_HIGH[23:16] == 8'h00;
wire flashRange = ADDRESS_HIGH[23:20] == flashBase && flashBaseValid;

wire relocatorKickstartAccess = !useMotherboardKickstart && (kickstartRange || (!overlay_n && kickstartOverlayRange));
wire autoConfigAccess = useMotherboardKickstart && autoConfigRange && !autoConfigComplete;
wire flashAccess = useMotherboardKickstart && flashRange;

wire relocatorAccess = relocatorKickstartAccess || autoConfigAccess || flashAccess;

assign FLASH_A19 = SIZE_512K ? 0 : (ADDRESS_HIGH[19] & !useLowRom);

always @(posedge E_CLK or posedge RESET_n)
begin
if (RESET_n)
begin
switchCounter <= 20'd0;
hasSwitched <= 1'b0;
end
else
begin
switchCounter <= switchCounter + 20'd1;
if (!hasSwitched && (&switchCounter))
begin
hasSwitched <= 1'b1;
useMotherboardKickstart <= (!useLowRom || SIZE_512K) && !useMotherboardKickstart;
useLowRom <= !useLowRom && useMotherboardKickstart && !SIZE_512K;
end
end
end

always @(posedge CPU_AS_n or negedge RESET_n)
begin
if (!RESET_n)
overlay_n <= 1'b0;
else if (ciaRange)
overlay_n <= 1'b1;
end

always @(posedge CPU_AS_n or negedge RESET_n)
begin
if (!RESET_n)
begin
flashBase <= 4'h0;
flashBaseValid <= 1'b0;
autoConfigComplete <= 1'b0;
end
else if (autoConfigAccess && !RW)
begin
if (ADDRESS_LOW == 7'h24)
begin
flashBase <= DATA;
flashBaseValid <= 1'b1;
autoConfigComplete <= 1'b1;
end
else if (ADDRESS_LOW == 7'h26)
autoConfigComplete <= 1'b1;
end
end

assign DTACK_n = !CPU_AS_n && relocatorAccess ? 1'b0 : 1'bZ;
assign MB_AS_n = !(!CPU_AS_n && !relocatorAccess);

assign FLASH_RD_n = !CPU_AS_n && (relocatorKickstartAccess || flashAccess) && RW ? {UDS_n, LDS_n} : 2'b11;
assign FLASH_WR_n = !CPU_AS_n && flashAccess && !RW ? {UDS_n, LDS_n} : 2'b11;

assign DATA = !CPU_AS_n && autoConfigAccess && RW ? dataOut : 4'bZZZZ;

always @(negedge CPU_AS_n)
begin
if (ADDRESS_LOW[7:6] == 2'd0)
case (ADDRESS_LOW[5:1])
5'h00: dataOut <= 4'hC; // (00)
5'h01: dataOut <= SIZE_512K ? 4'h4 : 4'h5; // (02) 512K / 1M
5'h02: dataOut <= 4'h9; // (04)
5'h03: dataOut <= 4'h7; // (06)
5'h04: dataOut <= 4'h7; // (08/0A)
5'h05: dataOut <= 4'hF;
5'h06: dataOut <= 4'hF; // (0C/0E)
5'h07: dataOut <= 4'hF;
5'h08: dataOut <= 4'hF; // (10/12)
5'h09: dataOut <= 4'h8;
5'h0A: dataOut <= 4'h4; // (14/16)
5'h0B: dataOut <= 4'h6;
5'h0C: dataOut <= 4'hA; // (18/1A)
5'h0D: dataOut <= 4'hF;
5'h0E: dataOut <= 4'hB; // (1C/1E)
5'h0F: dataOut <= 4'hE;
5'h10: dataOut <= 4'hA; // (20/22)
5'h11: dataOut <= 4'hA;
5'h12: dataOut <= 4'hB; // (24/26)
5'h13: dataOut <= 4'h3;
default: dataOut <= 4'hF;
endcase
else
dataOut <= 4'hF;
end
endmodule
input CLK, //CLK is unused
input E_CLK,

input RESET_n,
input CPU_AS_n,
input LDS_n,
input UDS_n,
input RW,

output MB_AS_n,
output DTACK_n,

input [23:16] ADDRESS_HIGH,
input [7:1] ADDRESS_LOW,
inout [15:12] DATA,

output [1:0] FLASH_WR_n,
output [1:0] FLASH_RD_n,
output FLASH_A19,

input SIZE_512K
);

// Autoconfig params
localparam [15:0] manufacturer_id = 16'h07B9;
localparam [7:0] product_id = 8'd104;
localparam [31:0] serial = 32'h00000301; // Version number

// Change this to 0 to boot from the first flash ROM at power-on
reg useMotherboardKickstart = 1'b1;

reg [19:0] switchCounter = 20'd0;
reg hasSwitched = 1'b0;

reg autoConfigComplete = 1'b0;
reg [3:0] flashBase = 4'h0;
reg flashBaseValid = 1'b0;

reg overlay_n = 1'b0;

reg [3:0] dataOut = 4'h0;

reg useLowRom = 1'b0;

wire ciaRange = ADDRESS_HIGH[23:16] == 8'hBF;
wire autoConfigRange = ADDRESS_HIGH[23:16] == 8'hE8;
wire kickstartRange = ADDRESS_HIGH[23:19] == 5'h1F;
wire kickstartOverlayRange = ADDRESS_HIGH[23:16] == 8'h00;
wire flashRange = ADDRESS_HIGH[23:20] == flashBase && flashBaseValid;

wire relocatorKickstartAccess = !useMotherboardKickstart && (kickstartRange || (!overlay_n && kickstartOverlayRange));
wire autoConfigAccess = useMotherboardKickstart && autoConfigRange && !autoConfigComplete;
wire flashAccess = useMotherboardKickstart && flashRange;

wire relocatorAccess = relocatorKickstartAccess || autoConfigAccess || flashAccess;

assign FLASH_A19 = SIZE_512K ? 0 : (ADDRESS_HIGH[19] & !useLowRom);

always @(posedge E_CLK or posedge RESET_n)
begin
if (RESET_n)
begin
switchCounter <= 20'd0;
hasSwitched <= 1'b0;
end
else
begin
switchCounter <= switchCounter + 20'd1;
if (!hasSwitched && (&switchCounter))
begin
hasSwitched <= 1'b1;
useMotherboardKickstart <= (!useLowRom || SIZE_512K) && !useMotherboardKickstart;
useLowRom <= !useLowRom && useMotherboardKickstart && !SIZE_512K;
end
end
end

always @(posedge CPU_AS_n or negedge RESET_n)
begin
if (!RESET_n)
overlay_n <= 1'b0;
else if (ciaRange)
overlay_n <= 1'b1;
end

always @(posedge CPU_AS_n or negedge RESET_n)
begin
if (!RESET_n)
begin
flashBase <= 4'h0;
flashBaseValid <= 1'b0;
autoConfigComplete <= 1'b0;
end
else if (autoConfigAccess && !RW)
begin
if (ADDRESS_LOW == 7'h24)
begin
flashBase <= DATA;
flashBaseValid <= 1'b1;
autoConfigComplete <= 1'b1;
end
else if (ADDRESS_LOW == 7'h26)
autoConfigComplete <= 1'b1;
end
end

assign DTACK_n = !CPU_AS_n && relocatorAccess ? 1'b0 : 1'bZ;
assign MB_AS_n = !(!CPU_AS_n && !relocatorAccess);

assign FLASH_RD_n = !CPU_AS_n && (relocatorKickstartAccess || flashAccess) && RW ? {UDS_n, LDS_n} : 2'b11;
assign FLASH_WR_n = !CPU_AS_n && flashAccess && !RW ? {UDS_n, LDS_n} : 2'b11;

assign DATA = !CPU_AS_n && autoConfigAccess && RW ? dataOut : 4'bZZZZ;

always @(negedge CPU_AS_n)
begin
if (ADDRESS_LOW[7:6] == 2'd0)
case (ADDRESS_LOW[5:1])
5'h00: dataOut <= 4'b1100; // Zorro II, non-RAM board
5'h01: dataOut <= SIZE_512K ? 4'b0100 : 4'b0101; // 512K / 1M
// Inverted bits from here
5'h02: dataOut <= ~product_id[7:4];
5'h03: dataOut <= ~product_id[3:0];
5'h04: dataOut <= ~4'b1000; // 8 Meg area, board cannot be shut-up
// 5 - 7 reserved, set to inverted zero using fall-through
5'h08: dataOut <= ~manufacturer_id[15:12];
5'h09: dataOut <= ~manufacturer_id[11:8];
5'h0A: dataOut <= ~manufacturer_id[7:4];
5'h0B: dataOut <= ~manufacturer_id[3:0];
5'h0C: dataOut <= ~serial[31:28];
5'h0D: dataOut <= ~serial[27:24];
5'h0E: dataOut <= ~serial[23:20];
5'h0F: dataOut <= ~serial[19:16];
5'h10: dataOut <= ~serial[15:12];
5'h11: dataOut <= ~serial[11:8];
5'h12: dataOut <= ~serial[7:4];
5'h13: dataOut <= ~serial[3:0];
default: dataOut <= 4'hF;
endcase
else
dataOut <= 4'hF;
end
endmodule
Binary file modified Software/FK
Binary file not shown.
11 changes: 5 additions & 6 deletions Software/FlashDeviceSST39.c
Original file line number Diff line number Diff line change
Expand Up @@ -195,7 +195,7 @@ tFlashCommandStatus resetFlashDevice(ULONG address)
/* Parameters: ULONG address, UBYTE sectorNumber */
/* Description: Erases a specific sector number from flash device */
/*****************************************************************************/
tFlashCommandStatus eraseFlashSector(ULONG address, UBYTE sectorNumber)
tFlashCommandStatus eraseFlashSector(ULONG address, ULONG sectorNumber)
{
tFlashCommandStatus flashCommandStatus = flashIdle;

Expand All @@ -205,18 +205,17 @@ tFlashCommandStatus eraseFlashSector(ULONG address, UBYTE sectorNumber)

if (sectorNumber < MAX_SECTORS)
{
if (flashOK == unlockFlashDevice(address + (SECTOR_SIZE * sectorNumber)))
if (flashOK == unlockFlashDevice(address))
{
*(UWORD *)(address + FLASH_ERASE_ADDR_1) = FLASH_ERASE_DATA_1;
#ifndef NDEBUG
printf("FLOW: FLASH_ERASE_ADDR_1 0x%X, FLASH_ERASE_DATA_1 0x%X\n", (address + FLASH_ERASE_ADDR_1), FLASH_ERASE_DATA_1);
#endif

if (flashOK == unlockFlashDevice(address + (SECTOR_SIZE * sectorNumber)))
if (flashOK == unlockFlashDevice(address))
{
*(UWORD *)(address + (sectorNumber << 16)) = FLASH_SECTOR_DATA_1;
*(UWORD *)(address + (sectorNumber << 13)) = FLASH_SECTOR_DATA_1;
#ifndef NDEBUG
printf("FLOW: Sector Address 0x%X, FLASH_SECTOR_DATA_1 0x%X\n", address + (sectorNumber << 16), FLASH_SECTOR_DATA_1);
printf("FLOW: Sector Address 0x%X, FLASH_SECTOR_DATA_1 0x%X\n", address + (sectorNumber << 13), FLASH_SECTOR_DATA_1);
#endif
flashCommandStatus = flashOK;
}
Expand Down
6 changes: 3 additions & 3 deletions Software/FlashDeviceSST39.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@
/* Defines *******************************************************************/
/*****************************************************************************/

#define SECTOR_SIZE 0x10000
#define MAX_SECTORS 8
#define SECTOR_SIZE 0x1000 // 4KB
#define MAX_SECTORS 128

#define TOGGLE_STATUS 0x4040

Expand Down Expand Up @@ -83,7 +83,7 @@ extern tFlashCommandStatus unlockFlashDevice(ULONG address);
extern tFlashCommandStatus readManufactureID(ULONG address, UWORD * pManufactureID);
extern tFlashCommandStatus readDeviceID(ULONG address, UWORD * pDeviceID);
extern tFlashCommandStatus resetFlashDevice(ULONG address);
extern tFlashCommandStatus eraseFlashSector(ULONG address, UBYTE sectorNumber);
extern tFlashCommandStatus eraseFlashSector(ULONG address, ULONG sectorNumber);
extern tFlashCommandStatus eraseCompleteFlash(ULONG address);
extern tFlashCommandStatus writeFlashWord(ULONG baseAddress, ULONG writeAddress, UWORD data);

Expand Down
Binary file modified Software/FlashKickstart
Binary file not shown.
3 changes: 2 additions & 1 deletion Software/FlashKickstart.c
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,7 @@ int main(int argc, char **argv)
/* Check if application has been started with correct parameters */
if (argc <= 1)
{
printf("FlashKickstart v3.3\n");
printf("FlashKickstart v3.4\n");
printf("usage: FlashKickstart <option> <filename>\n");
printf(" -i\tFLASH CHIP INFO\n");
printf(" -e\tERASE\n");
Expand Down Expand Up @@ -241,6 +241,7 @@ int main(int argc, char **argv)
{
printf("FLASH Kickstart Hardware identified with configuration:\n");
printf("Board address: 0x%06X\n", (unsigned)myCD->cd_BoardAddr);
printf("Board serial number: 0x%08X\n", (unsigned)myCD->cd_Rom.er_SerialNumber);
printf("Flash size: %luK\n", ((ULONG)myCD->cd_BoardSize)/1024);
}

Expand Down
Loading

0 comments on commit 356c8e2

Please sign in to comment.