1
0
mirror of https://github.com/marqs85/ossc.git synced 2024-06-03 00:29:31 +00:00

SD SPI implementation finished

This commit is contained in:
marqs 2016-10-21 01:19:53 +03:00
parent 71d60144e8
commit f55e9a877e
46 changed files with 2349 additions and 3392 deletions

View File

@ -9,15 +9,15 @@ extern "C"
{ {
#endif /* __cplusplus */ #endif /* __cplusplus */
#define SCL_MIN_CLKDIV 10
void I2C_init(alt_u32 base,alt_u32 clk,alt_u32 speed); void I2C_init(alt_u32 base,alt_u32 clk,alt_u32 speed);
int I2C_start(alt_u32 base, alt_u32 add, alt_u32 read); int I2C_start(alt_u32 base, alt_u32 add, alt_u32 read);
alt_u32 I2C_read(alt_u32 base,alt_u32 last); alt_u32 I2C_read(alt_u32 base,alt_u32 last);
alt_u32 I2C_write(alt_u32 base,alt_u8 data, alt_u32 last); alt_u32 I2C_write(alt_u32 base,alt_u8 data, alt_u32 last);
alt_u32 SPI_read(alt_u32 base); void SPI_read(alt_u32 base, alt_u8 *rdata, int len);
void SPI_write(alt_u32 base,alt_u8 data); void SPI_write(alt_u32 base, alt_u8 *wdata, int len);
#define I2C_OK (0) #define I2C_OK (0)
#define I2C_ACK (0) #define I2C_ACK (0)
#define I2C_NOACK (1) #define I2C_NOACK (1)

View File

@ -182,25 +182,31 @@ alt_u32 I2C_write(alt_u32 base,alt_u8 data, alt_u32 last)
} }
alt_u32 SPI_read(alt_u32 base) void SPI_read(alt_u32 base, alt_u8 *rdata, int len)
{ {
/* start read*/ int i;
IOWR_I2C_OPENCORES_CR(base, I2C_OPENCORES_CR_RD_MSK|I2C_OPENCORES_CR_NACK_MSK|I2C_OPENCORES_CR_SPIM_MSK );
/* wait for the trnasaction to be over.*/ for (i=0; i<len; i++) {
while( IORD_I2C_OPENCORES_SR(base) & I2C_OPENCORES_SR_TIP_MSK); /* start read*/
IOWR_I2C_OPENCORES_CR(base, I2C_OPENCORES_CR_RD_MSK|I2C_OPENCORES_CR_NACK_MSK|I2C_OPENCORES_CR_SPIM_MSK );
/* now read the data */ /* wait for the trnasaction to be over.*/
return (IORD_I2C_OPENCORES_RXR(base)); while( IORD_I2C_OPENCORES_SR(base) & I2C_OPENCORES_SR_TIP_MSK);
/* now read the data */
if (rdata)
rdata[i] = IORD_I2C_OPENCORES_RXR(base);
}
} }
void SPI_write(alt_u32 base,alt_u8 data) { void SPI_write(alt_u32 base, alt_u8 *wdata, int len)
/* transmit the data*/ {
IOWR_I2C_OPENCORES_TXR(base, data); int i;
/* start write */ for (i=0; i<len; i++) {
IOWR_I2C_OPENCORES_CR(base, I2C_OPENCORES_CR_WR_MSK|I2C_OPENCORES_CR_NACK_MSK|I2C_OPENCORES_CR_SPIM_MSK ); /* transmit the data*/
IOWR_I2C_OPENCORES_TXR(base, wdata[i]);
/* wait for the trnasaction to be over.*/ /* start write */
while( IORD_I2C_OPENCORES_SR(base) & I2C_OPENCORES_SR_TIP_MSK); IOWR_I2C_OPENCORES_CR(base, I2C_OPENCORES_CR_WR_MSK|I2C_OPENCORES_CR_NACK_MSK|I2C_OPENCORES_CR_SPIM_MSK );
/* wait for the trnasaction to be over.*/
while( IORD_I2C_OPENCORES_SR(base) & I2C_OPENCORES_SR_TIP_MSK);
}
} }

View File

@ -129,7 +129,7 @@
module i2c_master_bit_ctrl( module i2c_master_bit_ctrl(
clk, rst, nReset, clk, rst, nReset,
clk_cnt, ena, cmd, cmd_ack, busy, al, din, dout, clk_cnt, ena, cmd, cmd_ack, busy, al, din, dout,
scl_i, scl_o, scl_oen, sda_i, sda_o, sda_oen scl_i, scl_o, scl_oen, sda_i, sda_o, sda_oen, spi_miso
); );
// //
@ -164,6 +164,9 @@ module i2c_master_bit_ctrl(
output sda_oen; // i2c data line output enable (active low) output sda_oen; // i2c data line output enable (active low)
reg sda_oen; reg sda_oen;
// SPI MISO
input spi_miso;
reg spi_rden;
// //
// variable declarations // variable declarations
@ -249,7 +252,7 @@ module i2c_master_bit_ctrl(
else else
begin begin
sSCL <= #1 scl_i; sSCL <= #1 scl_i;
sSDA <= #1 sda_i; sSDA <= #1 spi_rden ? spi_miso : sda_i;
dSCL <= #1 sSCL; dSCL <= #1 sSCL;
dSDA <= #1 sSDA; dSDA <= #1 sSDA;
@ -349,6 +352,7 @@ module i2c_master_bit_ctrl(
scl_oen <= #1 1'b1; scl_oen <= #1 1'b1;
sda_oen <= #1 1'b1; sda_oen <= #1 1'b1;
sda_chk <= #1 1'b0; sda_chk <= #1 1'b0;
spi_rden <= #1 1'b0;
end end
else if (rst | al) else if (rst | al)
begin begin
@ -357,6 +361,7 @@ module i2c_master_bit_ctrl(
scl_oen <= #1 1'b1; scl_oen <= #1 1'b1;
sda_oen <= #1 1'b1; sda_oen <= #1 1'b1;
sda_chk <= #1 1'b0; sda_chk <= #1 1'b0;
spi_rden <= #1 1'b0;
end end
else else
begin begin
@ -546,6 +551,7 @@ module i2c_master_bit_ctrl(
scl_oen <= #1 1'b0; // set SCL low scl_oen <= #1 1'b0; // set SCL low
sda_oen <= #1 1'b1; // tri-state SDA sda_oen <= #1 1'b1; // tri-state SDA
sda_chk <= #1 1'b0; // don't check SDA output sda_chk <= #1 1'b0; // don't check SDA output
spi_rden <= #1 1'b0; //clear SPI read enable
end end
spi_rd_b: spi_rd_b:
@ -554,6 +560,7 @@ module i2c_master_bit_ctrl(
scl_oen <= #1 1'b0; // keep SCL low scl_oen <= #1 1'b0; // keep SCL low
sda_oen <= #1 1'b1; // keep SDA tri-stated sda_oen <= #1 1'b1; // keep SDA tri-stated
sda_chk <= #1 1'b0; // don't check SDA output sda_chk <= #1 1'b0; // don't check SDA output
spi_rden <= #1 1'b1; //set SPI read enable
end end
spi_rd_c: spi_rd_c:
@ -562,6 +569,7 @@ module i2c_master_bit_ctrl(
scl_oen <= #1 1'b1; // set SCL high scl_oen <= #1 1'b1; // set SCL high
sda_oen <= #1 1'b1; // keep SDA tri-stated sda_oen <= #1 1'b1; // keep SDA tri-stated
sda_chk <= #1 1'b0; // don't check SDA output sda_chk <= #1 1'b0; // don't check SDA output
spi_rden <= #1 1'b1; //set SPI read enable
end end
spi_rd_d: spi_rd_d:
@ -571,6 +579,7 @@ module i2c_master_bit_ctrl(
scl_oen <= #1 1'b1; // tri-state SCL scl_oen <= #1 1'b1; // tri-state SCL
sda_oen <= #1 1'b1; // keep SDA tri-stated sda_oen <= #1 1'b1; // keep SDA tri-stated
sda_chk <= #1 1'b0; // don't check SDA output sda_chk <= #1 1'b0; // don't check SDA output
spi_rden <= #1 1'b0; //clear SPI read enable
end end
// write (last SPI bit) // write (last SPI bit)

View File

@ -74,7 +74,7 @@
module i2c_master_byte_ctrl ( module i2c_master_byte_ctrl (
clk, rst, nReset, ena, clk_cnt, start, stop, read, write, ack_in, spi_mode, din, clk, rst, nReset, ena, clk_cnt, start, stop, read, write, ack_in, spi_mode, din,
cmd_ack, ack_out, dout, i2c_busy, i2c_al, scl_i, scl_o, scl_oen, sda_i, sda_o, sda_oen ); cmd_ack, ack_out, dout, i2c_busy, i2c_al, scl_i, scl_o, scl_oen, sda_i, sda_o, sda_oen, spi_miso );
// //
// inputs & outputs // inputs & outputs
@ -112,6 +112,8 @@ module i2c_master_byte_ctrl (
output sda_o; output sda_o;
output sda_oen; output sda_oen;
// SPI MISO
input spi_miso;
// //
// Variable declarations // Variable declarations
@ -164,7 +166,8 @@ module i2c_master_byte_ctrl (
.scl_oen ( scl_oen ), .scl_oen ( scl_oen ),
.sda_i ( sda_i ), .sda_i ( sda_i ),
.sda_o ( sda_o ), .sda_o ( sda_o ),
.sda_oen ( sda_oen ) .sda_oen ( sda_oen ),
.spi_miso (spi_miso)
); );
// generate go-signal // generate go-signal

View File

@ -75,7 +75,7 @@
module i2c_master_top( module i2c_master_top(
wb_clk_i, wb_rst_i, arst_i, wb_adr_i, wb_dat_i, wb_dat_o, wb_clk_i, wb_rst_i, arst_i, wb_adr_i, wb_dat_i, wb_dat_o,
wb_we_i, wb_stb_i, wb_cyc_i, wb_ack_o, wb_inta_o, wb_we_i, wb_stb_i, wb_cyc_i, wb_ack_o, wb_inta_o,
scl_pad_i, scl_pad_o, scl_padoen_o, sda_pad_i, sda_pad_o, sda_padoen_o ); scl_pad_i, scl_pad_o, scl_padoen_o, sda_pad_i, sda_pad_o, sda_padoen_o, spi_miso_pad_i );
// parameters // parameters
parameter ARST_LVL = 1'b0; // asynchronous reset level parameter ARST_LVL = 1'b0; // asynchronous reset level
@ -112,7 +112,9 @@ module i2c_master_top(
output sda_pad_o; // SDA-line output (always 1'b0) output sda_pad_o; // SDA-line output (always 1'b0)
output sda_padoen_o; // SDA-line output enable (active low) output sda_padoen_o; // SDA-line output enable (active low)
// extra SPI MISO line
input spi_miso_pad_i;
// //
// variable declarations // variable declarations
// //
@ -253,7 +255,8 @@ module i2c_master_top(
.scl_oen ( scl_padoen_o ), .scl_oen ( scl_padoen_o ),
.sda_i ( sda_pad_i ), .sda_i ( sda_pad_i ),
.sda_o ( sda_pad_o ), .sda_o ( sda_pad_o ),
.sda_oen ( sda_padoen_o ) .sda_oen ( sda_padoen_o ),
.spi_miso ( spi_miso_pad_i )
); );
// status register block + interrupt request signal // status register block + interrupt request signal

View File

@ -8,9 +8,10 @@ module i2c_opencores
( (
wb_clk_i, wb_rst_i, wb_adr_i, wb_dat_i, wb_dat_o, wb_clk_i, wb_rst_i, wb_adr_i, wb_dat_i, wb_dat_o,
wb_we_i, wb_stb_i, /*wb_cyc_i,*/ wb_ack_o, wb_inta_o, wb_we_i, wb_stb_i, /*wb_cyc_i,*/ wb_ack_o, wb_inta_o,
scl_pad_io, sda_pad_io scl_pad_io, sda_pad_io, spi_miso_pad_i
); );
parameter drive_scl_high = 0;
// Common bus signals // Common bus signals
input wb_clk_i; // WISHBONE clock input wb_clk_i; // WISHBONE clock
@ -30,6 +31,9 @@ output wb_inta_o; // WISHBONE interrupt output
inout scl_pad_io; // I2C clock io inout scl_pad_io; // I2C clock io
inout sda_pad_io; // I2C data io inout sda_pad_io; // I2C data io
// SPI MISO
input spi_miso_pad_i;
wire wb_cyc_i; // WISHBONE cycle input wire wb_cyc_i; // WISHBONE cycle input
// Wire tri-state scl/sda // Wire tri-state scl/sda
wire scl_pad_i; wire scl_pad_i;
@ -39,7 +43,7 @@ wire scl_padoen_o;
assign wb_cyc_i = wb_stb_i; assign wb_cyc_i = wb_stb_i;
assign scl_pad_i = scl_pad_io; assign scl_pad_i = scl_pad_io;
assign scl_pad_io = scl_padoen_o ? 1'bZ : scl_pad_o; assign scl_pad_io = scl_padoen_o ? (drive_scl_high ? 1'b1 : 1'bZ) : scl_pad_o;
wire sda_pad_i; wire sda_pad_i;
wire sda_pad_o; wire sda_pad_o;
@ -66,7 +70,8 @@ i2c_master_top i2c_master_top_inst
.wb_ack_o(wb_ack_o), .wb_inta_o(wb_inta_o), .wb_ack_o(wb_ack_o), .wb_inta_o(wb_inta_o),
.scl_pad_i(scl_pad_i), .scl_pad_o(scl_pad_o), .scl_padoen_o(scl_padoen_o), .scl_pad_i(scl_pad_i), .scl_pad_o(scl_pad_o), .scl_padoen_o(scl_padoen_o),
.sda_pad_i(sda_pad_i), .sda_pad_o(sda_pad_o), .sda_padoen_o(sda_padoen_o) .sda_pad_i(sda_pad_i), .sda_pad_o(sda_pad_o), .sda_padoen_o(sda_padoen_o),
.spi_miso_pad_i(spi_miso_pad_i)
); );
endmodule endmodule

View File

@ -59,7 +59,13 @@ add_fileset_file timescale.v VERILOG PATH timescale.v
# #
# parameters # parameters
# #
add_parameter drive_scl_high INTEGER 1
set_parameter_property drive_scl_high DEFAULT_VALUE 0
set_parameter_property drive_scl_high DISPLAY_NAME "Drive SCL high instead of tristate"
set_parameter_property drive_scl_high DISPLAY_HINT boolean
set_parameter_property drive_scl_high TYPE INTEGER
set_parameter_property drive_scl_high UNITS None
set_parameter_property drive_scl_high HDL_PARAMETER true
# #
# display items # display items
@ -109,6 +115,7 @@ set_interface_property export SVD_ADDRESS_GROUP ""
add_interface_port export scl_pad_io export Bidir 1 add_interface_port export scl_pad_io export Bidir 1
add_interface_port export sda_pad_io export Bidir 1 add_interface_port export sda_pad_io export Bidir 1
add_interface_port export spi_miso_pad_i export Input 1
# #

View File

@ -268,6 +268,7 @@
<Linker Options="" Required="yes"/> <Linker Options="" Required="yes"/>
<ResourceCompiler Options="" Required="no"/> <ResourceCompiler Options="" Required="no"/>
<General OutputFile="" IntermediateDirectory="./Debug" Command="" CommandArguments="" UseSeparateDebugArgs="no" DebugArguments="" WorkingDirectory="$(IntermediateDirectory)" PauseExecWhenProcTerminates="yes" IsGUIProgram="no" IsEnabled="yes"/> <General OutputFile="" IntermediateDirectory="./Debug" Command="" CommandArguments="" UseSeparateDebugArgs="no" DebugArguments="" WorkingDirectory="$(IntermediateDirectory)" PauseExecWhenProcTerminates="yes" IsGUIProgram="no" IsEnabled="yes"/>
<BuildSystem Name="Default"/>
<Environment EnvVarSetName="&lt;Use Defaults&gt;" DbgSetName="&lt;Use Defaults&gt;"> <Environment EnvVarSetName="&lt;Use Defaults&gt;" DbgSetName="&lt;Use Defaults&gt;">
<![CDATA[]]> <![CDATA[]]>
</Environment> </Environment>
@ -279,6 +280,7 @@
<PreBuild/> <PreBuild/>
<PostBuild/> <PostBuild/>
<CustomBuild Enabled="yes"> <CustomBuild Enabled="yes">
<Target Name="nios2-bsp-editor">nios2-bsp-editor</Target>
<RebuildCommand/> <RebuildCommand/>
<CleanCommand>make clean</CleanCommand> <CleanCommand>make clean</CleanCommand>
<BuildCommand>nios2-bsp-generate-files --bsp-dir . --settings settings.bsp</BuildCommand> <BuildCommand>nios2-bsp-generate-files --bsp-dir . --settings settings.bsp</BuildCommand>
@ -306,6 +308,7 @@
<Linker Options="-O2" Required="yes"/> <Linker Options="-O2" Required="yes"/>
<ResourceCompiler Options="" Required="no"/> <ResourceCompiler Options="" Required="no"/>
<General OutputFile="" IntermediateDirectory="./Release" Command="" CommandArguments="" UseSeparateDebugArgs="no" DebugArguments="" WorkingDirectory="$(IntermediateDirectory)" PauseExecWhenProcTerminates="yes" IsGUIProgram="no" IsEnabled="yes"/> <General OutputFile="" IntermediateDirectory="./Release" Command="" CommandArguments="" UseSeparateDebugArgs="no" DebugArguments="" WorkingDirectory="$(IntermediateDirectory)" PauseExecWhenProcTerminates="yes" IsGUIProgram="no" IsEnabled="yes"/>
<BuildSystem Name="Default"/>
<Environment EnvVarSetName="&lt;Use Defaults&gt;" DbgSetName="&lt;Use Defaults&gt;"> <Environment EnvVarSetName="&lt;Use Defaults&gt;" DbgSetName="&lt;Use Defaults&gt;">
<![CDATA[]]> <![CDATA[]]>
</Environment> </Environment>
@ -317,6 +320,7 @@
<PreBuild/> <PreBuild/>
<PostBuild/> <PostBuild/>
<CustomBuild Enabled="yes"> <CustomBuild Enabled="yes">
<Target Name="nios2-bsp-editor">nios2-bsp-editor</Target>
<RebuildCommand/> <RebuildCommand/>
<CleanCommand>make clean</CleanCommand> <CleanCommand>make clean</CleanCommand>
<BuildCommand>nios2-bsp-generate-files --bsp-dir ./ --settings settings.bsp</BuildCommand> <BuildCommand>nios2-bsp-generate-files --bsp-dir ./ --settings settings.bsp</BuildCommand>

View File

@ -79,8 +79,6 @@ wire VSYNC_out_videogen;
wire PCLK_out_videogen; wire PCLK_out_videogen;
wire DATA_enable_videogen; wire DATA_enable_videogen;
wire [7:0] lcd_ctrl;
reg [3:0] reset_n_ctr; reg [3:0] reset_n_ctr;
reg reset_n_reg = 1'b1; reg reset_n_reg = 1'b1;
@ -107,15 +105,16 @@ assign LED_R = videogen_sel ? 1'b0 : ((pll_lock_lost != 3'b000)|h_unstable);
assign LED_G = (ir_code == 0); assign LED_G = (ir_code == 0);
`endif `endif
assign LCD_CS_N = lcd_ctrl[0]; assign SD_DAT[3] = sys_ctrl[7]; //SD_SPI_SS_N
assign LCD_RS = lcd_ctrl[1]; assign LCD_CS_N = sys_ctrl[6];
assign LCD_BL = sys_ctrl[1]; //reset_n in v1.2 PCB assign LCD_RS = sys_ctrl[5];
assign LCD_BL = sys_ctrl[4]; //reset_n in v1.2 PCB
assign reset_n = sys_ctrl[0]; //HDMI_TX_RST_N in v1.2 PCB assign reset_n = sys_ctrl[0]; //HDMI_TX_RST_N in v1.2 PCB
`ifdef VIDEOGEN `ifdef VIDEOGEN
wire videogen_sel; wire videogen_sel;
assign videogen_sel = ~sys_ctrl[2]; assign videogen_sel = ~sys_ctrl[1];
assign HDMI_TX_RD = videogen_sel ? R_out_videogen : R_out; assign HDMI_TX_RD = videogen_sel ? R_out_videogen : R_out;
assign HDMI_TX_GD = videogen_sel ? G_out_videogen : G_out; assign HDMI_TX_GD = videogen_sel ? G_out_videogen : G_out;
assign HDMI_TX_BD = videogen_sel ? B_out_videogen : B_out; assign HDMI_TX_BD = videogen_sel ? B_out_videogen : B_out;
@ -147,20 +146,19 @@ end
assign cpu_reset_n = reset_n_reg; assign cpu_reset_n = reset_n_reg;
sys sys_inst( sys sys_inst(
.clk_clk (clk27), .clk_clk (clk27),
.reset_reset_n (cpu_reset_n), .reset_reset_n (cpu_reset_n),
.i2c_opencores_0_export_scl_pad_io (scl), .i2c_opencores_0_export_scl_pad_io (scl),
.i2c_opencores_0_export_sda_pad_io (sda), .i2c_opencores_0_export_sda_pad_io (sda),
.spi_0_external_MISO (SD_DAT[0]), .i2c_opencores_0_export_spi_miso_pad_i (1'b0),
.spi_0_external_MOSI (SD_CMD), .i2c_opencores_1_export_scl_pad_io (SD_CLK),
.spi_0_external_SCLK (SD_CLK), .i2c_opencores_1_export_sda_pad_io (SD_CMD),
.spi_0_external_SS_n (SD_DAT[3]), .i2c_opencores_1_export_spi_miso_pad_i (SD_DAT[0]),
.pio_0_sys_ctrl_out_export (sys_ctrl), .pio_0_sys_ctrl_out_export (sys_ctrl),
.pio_1_controls_in_export ({ir_code_cnt, 5'b00000, HDMI_TX_MODE, btn, ir_code}), .pio_1_controls_in_export ({ir_code_cnt, 5'b00000, HDMI_TX_MODE, btn, ir_code}),
.pio_2_horizontal_info_out_export (h_info), .pio_2_horizontal_info_out_export (h_info),
.pio_3_vertical_info_out_export (v_info), .pio_3_vertical_info_out_export (v_info),
.pio_4_linecount_in_export ({VSYNC_out, 13'h0000, fpga_vsyncgen, 5'h00, lines_out}), .pio_4_linecount_in_export ({VSYNC_out, 13'h0000, fpga_vsyncgen, 5'h00, lines_out})
.pio_5_lcd_ctrl_out_export (lcd_ctrl)
); );
scanconverter scanconverter_inst ( scanconverter scanconverter_inst (

View File

@ -160,6 +160,8 @@ C_SRCS += ossc/controls.c
C_SRCS += ossc/firmware.c C_SRCS += ossc/firmware.c
C_SRCS += ossc/menu.c C_SRCS += ossc/menu.c
C_SRCS += ossc/userdata.c C_SRCS += ossc/userdata.c
C_SRCS += ulibSD/sd_io.c
C_SRCS += ulibSD/spi_io.c
CXX_SRCS := CXX_SRCS :=
ASM_SRCS := ASM_SRCS :=
@ -202,6 +204,7 @@ APP_INCLUDE_DIRS += tvp7002
APP_INCLUDE_DIRS += ths7353 APP_INCLUDE_DIRS += ths7353
APP_INCLUDE_DIRS += spi_charlcd APP_INCLUDE_DIRS += spi_charlcd
APP_INCLUDE_DIRS += memory APP_INCLUDE_DIRS += memory
APP_INCLUDE_DIRS += ulibSD
APP_INCLUDE_DIRS += ossc APP_INCLUDE_DIRS += ossc
APP_LIBRARY_DIRS := APP_LIBRARY_DIRS :=
APP_LIBRARY_NAMES := APP_LIBRARY_NAMES :=

View File

@ -1,6 +1,5 @@
#include <stdio.h> #include <stdio.h>
#include <unistd.h> #include <unistd.h>
#include "sysconfig.h"
#include "system.h" #include "system.h"
#include "i2c_opencores.h" #include "i2c_opencores.h"
#include "it6613.h" #include "it6613.h"

View File

@ -1,9 +1,7 @@
#ifndef IT6613_H_ #ifndef IT6613_H_
#define IT6613_H_ #define IT6613_H_
//#define I2C_DEBUG #include "sysconfig.h"
//#define I2CA_HDMI_BASE I2C_OPENCORES_1_BASE
#define I2CA_BASE I2C_OPENCORES_0_BASE
#define IT6613_VENDORID 0xCA #define IT6613_VENDORID 0xCA
#define IT6613_DEVICEID 0x13 #define IT6613_DEVICEID 0x13

File diff suppressed because it is too large Load Diff

View File

@ -36,7 +36,8 @@ int check_flash()
if ((epcq_controller_dev == NULL) || !(epcq_controller_dev->is_epcs && (epcq_controller_dev->page_size == PAGESIZE))) if ((epcq_controller_dev == NULL) || !(epcq_controller_dev->is_epcs && (epcq_controller_dev->page_size == PAGESIZE)))
return -1; return -1;
//printf("Flash size in bytes: %d\nSector size: %d (%d pages)\nPage size: %d\n", epcq_controller_dev->size_in_bytes, epcq_controller_dev->sector_size, epcq_controller_dev->sector_size/epcq_controller_dev->page_size, epcq_controller_dev->page_size); printf("Flash size in bytes: %d\nSector size: %d (%d pages)\nPage size: %d\n",
epcq_controller_dev->size_in_bytes, epcq_controller_dev->sector_size, epcq_controller_dev->sector_size/epcq_controller_dev->page_size, epcq_controller_dev->page_size);
return 0; return 0;
} }

View File

@ -23,45 +23,19 @@
extern char menu_row1[LCD_ROW_LEN+1], menu_row2[LCD_ROW_LEN+1]; extern char menu_row1[LCD_ROW_LEN+1], menu_row2[LCD_ROW_LEN+1];
alt_up_sd_card_dev *sdcard_dev; SD_DEV sdcard_dev;
int read_sd_block(alt_u32 offset, alt_u32 size, alt_u8 *dstbuf)
{
/*int i;
alt_u32 tmp;
if ((offset % SD_BUFFER_SIZE) || (size > 512)) {
sniprintf(menu_row1, LCD_ROW_LEN+1, "Invalid read cmd");
menu_row2[0] = '\0';
return -1;
}
if (!Read_Sector_Data((offset/SD_BUFFER_SIZE), 0)) {
sniprintf(menu_row1, LCD_ROW_LEN+1, "SD read failure");
menu_row2[0] = '\0';
return -2;
}
// Copy buffer to SW
for (i=0; i<size; i=i+4) {
tmp = IORD_32DIRECT(sdcard_dev->base, i);
*((alt_u32*)(dstbuf+i)) = tmp;
}
*/
return 0;
}
int check_sdcard(alt_u8 *databuf) int check_sdcard(alt_u8 *databuf)
{ {
/* sdcard_dev = alt_up_sd_card_open_dev(ALTERA_UP_SD_CARD_AVALON_INTERFACE_0_NAME); SDRESULTS res;
if ((sdcard_dev == NULL) || !alt_up_sd_card_is_Present()) { res = SD_Init(&sdcard_dev);
printf("SD det status: %u\n", res);
if (res) {
sniprintf(menu_row1, LCD_ROW_LEN+1, "No SD card det."); sniprintf(menu_row1, LCD_ROW_LEN+1, "No SD card det.");
menu_row2[0] = '\0'; menu_row2[0] = '\0';
return 1; return 1;
} }
return read_sd_block(0, 512, databuf);*/ return SD_Read(&sdcard_dev, databuf, 0, 0, 512);
return 0;
} }

View File

@ -22,12 +22,7 @@
#include "alt_types.h" #include "alt_types.h"
#include "sysconfig.h" #include "sysconfig.h"
#include "Altera_UP_SD_Card_Avalon_Interface_mod.h" #include "sd_io.h"
// SD controller uses 512-byte chunks
#define SD_BUFFER_SIZE 512
int read_sd_block(alt_u32 offset, alt_u32 size, alt_u8 *dstbuf);
int check_sdcard(alt_u8 *databuf); int check_sdcard(alt_u8 *databuf);

View File

@ -32,13 +32,13 @@
#include "sdcard.h" #include "sdcard.h"
#include "menu.h" #include "menu.h"
#include "avconfig.h" #include "avconfig.h"
#include "sysconfig.h"
#include "firmware.h" #include "firmware.h"
#include "userdata.h" #include "userdata.h"
#include "it6613.h" #include "it6613.h"
#include "it6613_sys.h" #include "it6613_sys.h"
#include "HDMI_TX.h" #include "HDMI_TX.h"
#include "hdmitx.h" #include "hdmitx.h"
#include "sd_io.h"
#define STABLE_THOLD 1 #define STABLE_THOLD 1
#define MIN_LINES_PROGRESSIVE 200 #define MIN_LINES_PROGRESSIVE 200
@ -47,6 +47,8 @@
#define SYNC_LOSS_THOLD -5 #define SYNC_LOSS_THOLD -5
#define STATUS_TIMEOUT 10000 #define STATUS_TIMEOUT 10000
alt_u8 sys_ctrl;
// Current mode // Current mode
avmode_t cm; avmode_t cm;
@ -101,7 +103,7 @@ inline void TX_enable(tx_mode_t mode)
void set_lpf(alt_u8 lpf) void set_lpf(alt_u8 lpf)
{ {
alt_u32 pclk; alt_u32 pclk;
pclk = (clkrate[REFCLK_EXT27]/cm.clkcnt)*video_modes[cm.id].h_total; pclk = (TVP_EXTCLK_HZ/cm.clkcnt)*video_modes[cm.id].h_total;
printf("PCLK_in: %luHz\n", pclk); printf("PCLK_in: %luHz\n", pclk);
//Auto //Auto
@ -353,8 +355,8 @@ void program_mode()
stable_frames = STABLE_THOLD; stable_frames = STABLE_THOLD;
if ((cm.clkcnt != 0) && (cm.totlines != 0)) { //prevent div by 0 if ((cm.clkcnt != 0) && (cm.totlines != 0)) { //prevent div by 0
h_hz = clkrate[REFCLK_EXT27]/cm.clkcnt; h_hz = TVP_EXTCLK_HZ/cm.clkcnt;
v_hz_x100 = cm.progressive ? ((100*clkrate[REFCLK_EXT27])/cm.totlines)/cm.clkcnt : (2*((100*clkrate[REFCLK_EXT27])/cm.totlines))/cm.clkcnt; v_hz_x100 = cm.progressive ? ((100*TVP_EXTCLK_HZ)/cm.totlines)/cm.clkcnt : (2*((100*TVP_EXTCLK_HZ)/cm.totlines))/cm.clkcnt;
} else { } else {
h_hz = 15700; h_hz = 15700;
v_hz_x100 = 6000; v_hz_x100 = 6000;
@ -440,15 +442,16 @@ int init_hw()
{ {
alt_u32 chiprev; alt_u32 chiprev;
// Reset error vector and scan converter // Reset hardware
IOWR_ALTERA_AVALON_PIO_DATA(PIO_0_BASE, 0x03); IOWR_ALTERA_AVALON_PIO_DATA(PIO_0_BASE, AV_RESET_N|LCD_BL);
IOWR_ALTERA_AVALON_PIO_DATA(PIO_0_BASE, 0x00); IOWR_ALTERA_AVALON_PIO_DATA(PIO_0_BASE, 0x00);
IOWR_ALTERA_AVALON_PIO_DATA(PIO_2_BASE, 0x00000000); IOWR_ALTERA_AVALON_PIO_DATA(PIO_2_BASE, 0x00000000);
IOWR_ALTERA_AVALON_PIO_DATA(PIO_3_BASE, 0x00000000); IOWR_ALTERA_AVALON_PIO_DATA(PIO_3_BASE, 0x00000000);
usleep(10000); usleep(10000);
// unreset hw // unreset hw
IOWR_ALTERA_AVALON_PIO_DATA(PIO_0_BASE, 0x03); sys_ctrl = AV_RESET_N|LCD_BL|SD_SPI_SS_N|LCD_CS_N;
IOWR_ALTERA_AVALON_PIO_DATA(PIO_0_BASE, sys_ctrl);
//wait >500ms for SD card interface to be stable //wait >500ms for SD card interface to be stable
//over 200ms and LCD may be buggy? //over 200ms and LCD may be buggy?
@ -456,6 +459,7 @@ int init_hw()
// IT6613 officially supports only 100kHz, but 400kHz seems to work // IT6613 officially supports only 100kHz, but 400kHz seems to work
I2C_init(I2CA_BASE,ALT_CPU_FREQ,400000); I2C_init(I2CA_BASE,ALT_CPU_FREQ,400000);
//I2C_init(I2C_OPENCORES_1_BASE,ALT_CPU_FREQ,400000);
/* Initialize the character display */ /* Initialize the character display */
lcd_init(); lcd_init();
@ -657,7 +661,8 @@ int main()
case ACTIVITY_CHANGE: case ACTIVITY_CHANGE:
if (cm.sync_active) { if (cm.sync_active) {
printf("Sync up\n"); printf("Sync up\n");
IOWR_ALTERA_AVALON_PIO_DATA(PIO_0_BASE, (IORD_ALTERA_AVALON_PIO_DATA(PIO_0_BASE) | (1<<2))); //disable videogen sys_ctrl |= VIDGEN_OFF;
IOWR_ALTERA_AVALON_PIO_DATA(PIO_0_BASE, sys_ctrl);
enable_outputs(); enable_outputs();
} else { } else {
printf("Sync lost\n"); printf("Sync lost\n");

View File

@ -21,9 +21,18 @@
#define AV_CONTROLLER_H_ #define AV_CONTROLLER_H_
#include "avconfig.h" #include "avconfig.h"
#include "sysconfig.h"
#define HDMITX_MODE_MASK 0x00040000 #define HDMITX_MODE_MASK 0x00040000
//sys_ctrl bits
#define SD_SPI_SS_N (1<<7)
#define LCD_CS_N (1<<6)
#define LCD_RS (1<<5)
#define LCD_BL (1<<4)
#define VIDGEN_OFF (1<<1)
#define AV_RESET_N (1<<0)
static const char *avinput_str[] = { "Test pattern", "AV1: RGBS", "AV1: RGsB", "AV1: YPbPr", "AV2: YPbPr", "AV2: RGsB", "AV3: RGBHV", "AV3: RGBS", "AV3: RGsB", "AV3: YPbPr" }; static const char *avinput_str[] = { "Test pattern", "AV1: RGBS", "AV1: RGsB", "AV1: YPbPr", "AV2: YPbPr", "AV2: RGsB", "AV3: RGBHV", "AV3: RGBS", "AV3: RGsB", "AV3: YPbPr" };
typedef enum { typedef enum {

View File

@ -20,7 +20,6 @@
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
#include "alt_types.h" #include "alt_types.h"
#include "sysconfig.h"
#include "controls.h" #include "controls.h"
#include "menu.h" #include "menu.h"
#include "av_controller.h" #include "av_controller.h"
@ -37,6 +36,7 @@ extern avmode_t cm;
extern avconfig_t tc; extern avconfig_t tc;
extern avinput_t target_mode; extern avinput_t target_mode;
extern alt_u8 menu_active; extern alt_u8 menu_active;
extern alt_u8 sys_ctrl;
alt_u32 remote_code; alt_u32 remote_code;
alt_u8 remote_rpt, remote_rpt_prev; alt_u8 remote_rpt, remote_rpt_prev;
@ -71,7 +71,6 @@ void setup_rc()
confirm = 0; confirm = 0;
} }
} }
} }
remote_code_prev = remote_code; remote_code_prev = remote_code;
@ -128,7 +127,8 @@ void parse_control()
printf("Lines: %u M: %u\n", IORD_ALTERA_AVALON_PIO_DATA(PIO_4_BASE) & 0xffff, cm.macrovis); printf("Lines: %u M: %u\n", IORD_ALTERA_AVALON_PIO_DATA(PIO_4_BASE) & 0xffff, cm.macrovis);
break; break;
case RC_LCDBL: case RC_LCDBL:
IOWR_ALTERA_AVALON_PIO_DATA(PIO_0_BASE, (IORD_ALTERA_AVALON_PIO_DATA(PIO_0_BASE) ^ (1<<1))); sys_ctrl ^= LCD_BL;
IOWR_ALTERA_AVALON_PIO_DATA(PIO_0_BASE, sys_ctrl);
break; break;
case RC_SL_MODE: tc.sl_mode = (tc.sl_mode < SL_MODE_MAX) ? (tc.sl_mode + 1) : 0; break; case RC_SL_MODE: tc.sl_mode = (tc.sl_mode < SL_MODE_MAX) ? (tc.sl_mode + 1) : 0; break;
case RC_SL_TYPE: tc.sl_type = (tc.sl_type < SL_TYPE_MAX) ? (tc.sl_type + 1) : 0; break; case RC_SL_TYPE: tc.sl_type = (tc.sl_type < SL_TYPE_MAX) ? (tc.sl_type + 1) : 0; break;

View File

@ -20,6 +20,8 @@
#ifndef CONTROLS_H_ #ifndef CONTROLS_H_
#define CONTROLS_H_ #define CONTROLS_H_
#include "sysconfig.h"
#define RC_MASK 0x0000ffff #define RC_MASK 0x0000ffff
#define PB_MASK 0x00030000 #define PB_MASK 0x00030000
#define PB0_BIT 0x00010000 #define PB0_BIT 0x00010000

View File

@ -22,7 +22,6 @@
#include "firmware.h" #include "firmware.h"
#include "sdcard.h" #include "sdcard.h"
#include "flash.h" #include "flash.h"
#include "sysconfig.h"
#include "controls.h" #include "controls.h"
#include "tvp7002.h" #include "tvp7002.h"
#include "av_controller.h" #include "av_controller.h"
@ -32,6 +31,8 @@
extern char menu_row1[LCD_ROW_LEN+1], menu_row2[LCD_ROW_LEN+1]; extern char menu_row1[LCD_ROW_LEN+1], menu_row2[LCD_ROW_LEN+1];
extern alt_u16 rc_keymap[REMOTE_MAX_KEYS]; extern alt_u16 rc_keymap[REMOTE_MAX_KEYS];
extern SD_DEV sdcard_dev;
extern alt_u8 sys_ctrl;
static int check_fw_header(alt_u8 *databuf, fw_hdr *hdr) static int check_fw_header(alt_u8 *databuf, fw_hdr *hdr)
{ {
@ -81,9 +82,11 @@ static int check_fw_image(alt_u32 offset, alt_u32 size, alt_u32 golden_crc, alt_
alt_u32 crcval=0, i, bytes_to_read; alt_u32 crcval=0, i, bytes_to_read;
int retval; int retval;
for (i=0; i<size; i=i+SD_BUFFER_SIZE) { for (i=0; i<size; i=i+SD_BLK_SIZE) {
bytes_to_read = ((size-i < SD_BUFFER_SIZE) ? (size-i) : SD_BUFFER_SIZE); bytes_to_read = ((size-i < SD_BLK_SIZE) ? (size-i) : SD_BLK_SIZE);
retval = read_sd_block(offset+i, bytes_to_read, tmpbuf); retval = SD_Read(&sdcard_dev, tmpbuf, (offset+i)/SD_BLK_SIZE, 0, bytes_to_read);
//retval = read_sd_block(offset+i, bytes_to_read, tmpbuf);
if (retval != 0) if (retval != 0)
return -2; return -2;
@ -112,12 +115,13 @@ int fw_update()
{ {
int retval, i; int retval, i;
int retries = FW_UPDATE_RETRIES; int retries = FW_UPDATE_RETRIES;
alt_u8 databuf[SD_BUFFER_SIZE]; alt_u8 databuf[SD_BLK_SIZE];
alt_u32 btn_vec; alt_u32 btn_vec;
alt_u32 bytes_to_rw; alt_u32 bytes_to_rw;
fw_hdr fw_header; fw_hdr fw_header;
retval = check_sdcard(databuf); retval = check_sdcard(databuf);
SPI_CS_High();
if (retval != 0) if (retval != 0)
goto failure; goto failure;
@ -143,7 +147,8 @@ int fw_update()
break; break;
} else if (btn_vec == rc_keymap[RC_BTN2]) { } else if (btn_vec == rc_keymap[RC_BTN2]) {
retval = 2; retval = 2;
return 1; strncpy(menu_row1, "Cancelled", LCD_ROW_LEN+1);
goto failure;
} }
usleep(WAITLOOP_SLEEP_US); usleep(WAITLOOP_SLEEP_US);
@ -151,7 +156,8 @@ int fw_update()
//disable video output //disable video output
tvp_disable_output(); tvp_disable_output();
IOWR_ALTERA_AVALON_PIO_DATA(PIO_0_BASE, (IORD_ALTERA_AVALON_PIO_DATA(PIO_0_BASE) | (1<<2))); sys_ctrl |= VIDGEN_OFF;
IOWR_ALTERA_AVALON_PIO_DATA(PIO_0_BASE, sys_ctrl);
usleep(10000); usleep(10000);
strncpy(menu_row1, "Updating FW", LCD_ROW_LEN+1); strncpy(menu_row1, "Updating FW", LCD_ROW_LEN+1);
@ -159,11 +165,11 @@ update_init:
strncpy(menu_row2, "please wait...", LCD_ROW_LEN+1); strncpy(menu_row2, "please wait...", LCD_ROW_LEN+1);
lcd_write_menu(); lcd_write_menu();
for (i=0; i<fw_header.data_len; i=i+SD_BUFFER_SIZE) { for (i=0; i<fw_header.data_len; i=i+SD_BLK_SIZE) {
bytes_to_rw = ((fw_header.data_len-i < SD_BUFFER_SIZE) ? (fw_header.data_len-i) : SD_BUFFER_SIZE); bytes_to_rw = ((fw_header.data_len-i < SD_BLK_SIZE) ? (fw_header.data_len-i) : SD_BLK_SIZE);
retval = read_sd_block(512+i, bytes_to_rw, databuf); retval = SD_Read(&sdcard_dev, databuf, (512+i)/SD_BLK_SIZE, 0, bytes_to_rw);
if (retval != 0) if (retval != 0)
return -200; goto failure;
retval = write_flash_page(databuf, ((bytes_to_rw < PAGESIZE) ? bytes_to_rw : PAGESIZE), (i/PAGESIZE)); retval = write_flash_page(databuf, ((bytes_to_rw < PAGESIZE) ? bytes_to_rw : PAGESIZE), (i/PAGESIZE));
if (retval != 0) if (retval != 0)
@ -183,10 +189,11 @@ update_init:
if (retval != 0) if (retval != 0)
goto failure; goto failure;
SPI_CS_High();
return 0; return 0;
failure: failure:
SPI_CS_High();
lcd_write_menu(); lcd_write_menu();
usleep(1000000); usleep(1000000);

View File

@ -21,6 +21,7 @@
#define FIRMWARE_H_ #define FIRMWARE_H_
#include "alt_types.h" #include "alt_types.h"
#include "sysconfig.h"
#define FW_VER_MAJOR 0 #define FW_VER_MAJOR 0
#define FW_VER_MINOR 74 #define FW_VER_MINOR 74

View File

@ -50,8 +50,8 @@ static const char *sl_id_desc[] = { "Top", "Bottom" };
static void sampler_phase_disp(alt_u8 v) { sniprintf(menu_row2, LCD_ROW_LEN+1, "%d deg", (v*1125)/100); } static void sampler_phase_disp(alt_u8 v) { sniprintf(menu_row2, LCD_ROW_LEN+1, "%d deg", (v*1125)/100); }
static void sync_vth_disp(alt_u8 v) { sniprintf(menu_row2, LCD_ROW_LEN+1, "%d mV", (v*1127)/100); } static void sync_vth_disp(alt_u8 v) { sniprintf(menu_row2, LCD_ROW_LEN+1, "%d mV", (v*1127)/100); }
static void intclks_to_time_disp(alt_u8 v) { sniprintf(menu_row2, LCD_ROW_LEN+1, "%u.%.2u us", (unsigned)(((1000000U*v)/(clkrate[REFCLK_INTCLK]/1000))/1000), (unsigned)((((1000000U*v)/(clkrate[REFCLK_INTCLK]/1000))%1000)/10)); } static void intclks_to_time_disp(alt_u8 v) { sniprintf(menu_row2, LCD_ROW_LEN+1, "%u.%.2u us", (unsigned)(((1000000U*v)/(TVP_INTCLK_HZ/1000))/1000), (unsigned)((((1000000U*v)/(TVP_INTCLK_HZ/1000))%1000)/10)); }
static void extclks_to_time_disp(alt_u8 v) { sniprintf(menu_row2, LCD_ROW_LEN+1, "%u.%.2u us", (unsigned)(((1000000U*v)/(clkrate[REFCLK_EXT27]/1000))/1000), (unsigned)((((1000000U*v)/(clkrate[REFCLK_EXT27]/1000))%1000)/10)); } static void extclks_to_time_disp(alt_u8 v) { sniprintf(menu_row2, LCD_ROW_LEN+1, "%u.%.2u us", (unsigned)(((1000000U*v)/(TVP_EXTCLK_HZ/1000))/1000), (unsigned)((((1000000U*v)/(TVP_EXTCLK_HZ/1000))%1000)/10)); }
static void sl_str_disp(alt_u8 v) { sniprintf(menu_row2, LCD_ROW_LEN+1, "%u%%", ((v+1)*625)/100); } static void sl_str_disp(alt_u8 v) { sniprintf(menu_row2, LCD_ROW_LEN+1, "%u%%", ((v+1)*625)/100); }
static void lines_disp(alt_u8 v) { sniprintf(menu_row2, LCD_ROW_LEN+1, "%u lines", v); } static void lines_disp(alt_u8 v) { sniprintf(menu_row2, LCD_ROW_LEN+1, "%u lines", v); }
static void pixels_disp(alt_u8 v) { sniprintf(menu_row2, LCD_ROW_LEN+1, "%u pixels", v); } static void pixels_disp(alt_u8 v) { sniprintf(menu_row2, LCD_ROW_LEN+1, "%u pixels", v); }
@ -118,9 +118,9 @@ MENU(menu_main, P99_PROTECT({ \
{ "Sync opt. >", OPT_SUBMENU, { .sub = { &menu_sync, NULL } } }, { "Sync opt. >", OPT_SUBMENU, { .sub = { &menu_sync, NULL } } },
{ "Output opt. >", OPT_SUBMENU, { .sub = { &menu_output, NULL } } }, { "Output opt. >", OPT_SUBMENU, { .sub = { &menu_output, NULL } } },
{ "Post-proc. >", OPT_SUBMENU, { .sub = { &menu_postproc, NULL } } }, { "Post-proc. >", OPT_SUBMENU, { .sub = { &menu_postproc, NULL } } },
{ "<Fw. update >", OPT_FUNC_CALL, { .fun = { fw_update, "OK - pls restart" } } }, { "<Fw. update >", OPT_FUNC_CALL, { .fun = { fw_update, "OK - pls restart", "failed" } } },
{ "<Reset settings>", OPT_FUNC_CALL, { .fun = { set_default_avconfig, "Reset done" } } }, { "<Reset settings>", OPT_FUNC_CALL, { .fun = { set_default_avconfig, "Reset done", "" } } },
{ "<Save settings >", OPT_FUNC_CALL, { .fun = { write_userdata, "Saved" } } }, { "<Save settings >", OPT_FUNC_CALL, { .fun = { write_userdata, "Saved", "failed" } } },
})) }))
// Max 3 levels currently // Max 3 levels currently
@ -237,9 +237,9 @@ void display_menu(alt_u8 forcedisp)
break; break;
case OPT_FUNC_CALL: case OPT_FUNC_CALL:
if (code == OPT_SELECT) if (code == OPT_SELECT)
sniprintf(menu_row2, LCD_ROW_LEN+1, "%s", (retval==0) ? navi[navlvl].m->items[navi[navlvl].mp].fun.text_success : "failed"); sniprintf(menu_row2, LCD_ROW_LEN+1, "%s", (retval==0) ? navi[navlvl].m->items[navi[navlvl].mp].fun.text_success : navi[navlvl].m->items[navi[navlvl].mp].fun.text_failure);
else else
menu_row2[0] = 0; menu_row2[0] = 0;
break; break;
default: default:
break; break;

View File

@ -62,6 +62,7 @@ typedef struct {
typedef struct { typedef struct {
func_call f; func_call f;
char *text_success; char *text_success;
char *text_failure;
} opt_func_call; } opt_func_call;
typedef struct menustruct menu_t; typedef struct menustruct menu_t;

View File

@ -20,6 +20,10 @@
#ifndef SYSCONFIG_H_ #ifndef SYSCONFIG_H_
#define SYSCONFIG_H_ #define SYSCONFIG_H_
//#define I2C_DEBUG
#define I2CA_BASE I2C_OPENCORES_0_BASE
#define SD_SPI_BASE I2C_OPENCORES_1_BASE
#ifndef DEBUG #ifndef DEBUG
#define OS_PRINTF(...) #define OS_PRINTF(...)
#define ErrorF(...) #define ErrorF(...)

View File

@ -19,7 +19,6 @@
#include <string.h> #include <string.h>
#include "userdata.h" #include "userdata.h"
#include "sysconfig.h"
#include "flash.h" #include "flash.h"
#include "firmware.h" #include "firmware.h"
#include "controls.h" #include "controls.h"

View File

@ -21,6 +21,7 @@
#define USERDATA_H_ #define USERDATA_H_
#include "alt_types.h" #include "alt_types.h"
#include "sysconfig.h"
#define USERDATA_HDR_SIZE 11 #define USERDATA_HDR_SIZE 11
typedef struct { typedef struct {

View File

@ -23,6 +23,7 @@
#include "alt_types.h" #include "alt_types.h"
#include "altera_avalon_pio_regs.h" #include "altera_avalon_pio_regs.h"
#include "i2c_opencores.h" #include "i2c_opencores.h"
#include "av_controller.h"
#define LCD_CMD 0x00 #define LCD_CMD 0x00
#define LCD_DATA 0x40 #define LCD_DATA 0x40
@ -30,50 +31,46 @@
#define WRDELAY 20 #define WRDELAY 20
#define CLEARDELAY 800 #define CLEARDELAY 800
extern alt_u8 sys_ctrl;
static void lcd_cmd(alt_u8 cmd, alt_u16 postdelay) {
SPI_write(I2CA_BASE, &cmd, 1);
usleep(postdelay);
}
void lcd_init() void lcd_init()
{ {
alt_u8 lcd_ctrl = 0x00; sys_ctrl &= ~(LCD_CS_N|LCD_RS);
IOWR_ALTERA_AVALON_PIO_DATA(PIO_5_BASE, lcd_ctrl); IOWR_ALTERA_AVALON_PIO_DATA(PIO_0_BASE, sys_ctrl);
usleep(WRDELAY); usleep(WRDELAY);
SPI_write(I2CA_BASE, 0x38); // function set lcd_cmd(0x38,WRDELAY); // function set
usleep(WRDELAY); lcd_cmd(0x39,WRDELAY); // function set, select extended table (IS=1)
SPI_write(I2CA_BASE, 0x39); // function set, select extended table (IS=1) lcd_cmd(0x14,WRDELAY); // osc freq
usleep(WRDELAY); lcd_cmd(0x71,WRDELAY); // contrast set
SPI_write(I2CA_BASE, 0x14); // osc freq lcd_cmd(0x5E,WRDELAY); // power/icon/cont
usleep(WRDELAY); lcd_cmd(0x6D,WRDELAY); // follower control
SPI_write(I2CA_BASE, 0x71); // contrast set lcd_cmd(0x0C,WRDELAY); // display on
usleep(WRDELAY); lcd_cmd(0x01,CLEARDELAY); // clear display
SPI_write(I2CA_BASE, 0x5E); // power/icon/cont lcd_cmd(0x06,WRDELAY); // entry mode set
usleep(WRDELAY); lcd_cmd(0x02,CLEARDELAY); // return home
SPI_write(I2CA_BASE, 0x6D); // follower control
usleep(WRDELAY);
SPI_write(I2CA_BASE, 0x0C); // display on
usleep(WRDELAY);
SPI_write(I2CA_BASE, 0x01); // clear display
usleep(CLEARDELAY);
SPI_write(I2CA_BASE, 0x06); // entry mode set
usleep(WRDELAY);
SPI_write(I2CA_BASE, 0x02); // return home
usleep(CLEARDELAY);
lcd_ctrl |= LCD_CS_N; sys_ctrl |= LCD_CS_N;
IOWR_ALTERA_AVALON_PIO_DATA(PIO_5_BASE, lcd_ctrl); IOWR_ALTERA_AVALON_PIO_DATA(PIO_0_BASE, sys_ctrl);
} }
void lcd_write(char *row1, char *row2) void lcd_write(char *row1, char *row2)
{ {
alt_u8 i, rowlen; alt_u8 i, rowlen;
alt_u8 lcd_ctrl = 0x00;
IOWR_ALTERA_AVALON_PIO_DATA(PIO_5_BASE, lcd_ctrl); sys_ctrl &= ~(LCD_CS_N|LCD_RS);
IOWR_ALTERA_AVALON_PIO_DATA(PIO_0_BASE, sys_ctrl);
SPI_write(I2CA_BASE, 0x01); // clear display lcd_cmd(0x01,CLEARDELAY); // clear display
usleep(CLEARDELAY);
// Set RS to enter data write mode // Set RS to enter data write mode
lcd_ctrl |= LCD_RS; sys_ctrl |= LCD_RS;
IOWR_ALTERA_AVALON_PIO_DATA(PIO_5_BASE, lcd_ctrl); IOWR_ALTERA_AVALON_PIO_DATA(PIO_0_BASE, sys_ctrl);
//ensure no empty row //ensure no empty row
rowlen = strnlen(row1, LCD_ROW_LEN); rowlen = strnlen(row1, LCD_ROW_LEN);
@ -82,19 +79,16 @@ void lcd_write(char *row1, char *row2)
rowlen++; rowlen++;
} }
for (i=0; i<rowlen; i++) { for (i=0; i<rowlen; i++)
SPI_write(I2CA_BASE, row1[i]); lcd_cmd(row1[i],WRDELAY);
usleep(WRDELAY);
}
// second row // second row
lcd_ctrl &= ~LCD_RS; sys_ctrl &= ~LCD_RS;
IOWR_ALTERA_AVALON_PIO_DATA(PIO_5_BASE, lcd_ctrl); IOWR_ALTERA_AVALON_PIO_DATA(PIO_0_BASE, sys_ctrl);
SPI_write(I2CA_BASE, (1<<7)|0x40); lcd_cmd((1<<7)|0x40,WRDELAY);
usleep(WRDELAY);
lcd_ctrl |= LCD_RS; sys_ctrl |= LCD_RS;
IOWR_ALTERA_AVALON_PIO_DATA(PIO_5_BASE, lcd_ctrl); IOWR_ALTERA_AVALON_PIO_DATA(PIO_0_BASE, sys_ctrl);
//ensure no empty row //ensure no empty row
rowlen = strnlen(row2, LCD_ROW_LEN); rowlen = strnlen(row2, LCD_ROW_LEN);
@ -103,11 +97,9 @@ void lcd_write(char *row1, char *row2)
rowlen++; rowlen++;
} }
for (i=0; i<rowlen; i++) { for (i=0; i<rowlen; i++)
SPI_write(I2CA_BASE, row2[i]); lcd_cmd(row2[i],WRDELAY);
usleep(WRDELAY);
}
lcd_ctrl |= LCD_CS_N; sys_ctrl |= LCD_CS_N;
IOWR_ALTERA_AVALON_PIO_DATA(PIO_5_BASE, lcd_ctrl); IOWR_ALTERA_AVALON_PIO_DATA(PIO_0_BASE, sys_ctrl);
} }

View File

@ -26,12 +26,6 @@
#define LCD_ROW_LEN 16 #define LCD_ROW_LEN 16
//#define I2C_DEBUG
#define I2CA_BASE I2C_OPENCORES_0_BASE
#define LCD_CS_N (1<<0)
#define LCD_RS (1<<1)
void lcd_init(); void lcd_init();
void lcd_write(char *row1, char *row2); void lcd_write(char *row1, char *row2);

View File

@ -51,9 +51,6 @@ typedef enum {
#define THS_LPF_BYPASS 0x03 #define THS_LPF_BYPASS 0x03
//#define I2C_DEBUG
#define I2CA_BASE I2C_OPENCORES_0_BASE
int ths_init(); int ths_init();
void ths_set_lpf(alt_u8 val); void ths_set_lpf(alt_u8 val);

View File

@ -38,6 +38,9 @@ const ypbpr_to_rgb_csc_t csc_coeffs[] = {
{ "Rec. 709", 0x2000, 0x0000, 0x323E, 0x2000, 0xFA04, 0xF113, 0x2000, 0x3B61, 0x0000 }, // eq. 105 { "Rec. 709", 0x2000, 0x0000, 0x323E, 0x2000, 0xFA04, 0xF113, 0x2000, 0x3B61, 0x0000 }, // eq. 105
}; };
static const alt_u8 Kvco[] = {75, 85, 150, 200};
static const char *Kvco_str[] = { "Ultra low", "Low", "Medium", "High" };
extern mode_data_t video_modes[]; extern mode_data_t video_modes[];
static void tvp_set_clamp(video_format fmt) static void tvp_set_clamp(video_format fmt)
@ -95,11 +98,11 @@ inline void tvp_writereg(alt_u32 regaddr, alt_u8 data)
inline void tvp_reset() inline void tvp_reset()
{ {
usleep(10000); /*usleep(10000);
IOWR_ALTERA_AVALON_PIO_DATA(PIO_0_BASE, 0x00); IOWR_ALTERA_AVALON_PIO_DATA(PIO_0_BASE, 0x00);
usleep(10000); usleep(10000);
IOWR_ALTERA_AVALON_PIO_DATA(PIO_0_BASE, 0x01); IOWR_ALTERA_AVALON_PIO_DATA(PIO_0_BASE, 0x01);
usleep(10000); usleep(10000);*/
} }
inline void tvp_disable_output() inline void tvp_disable_output()
@ -241,7 +244,7 @@ void tvp_setup_hpll(alt_u16 h_samplerate, alt_u16 v_lines, alt_u8 hz, alt_u8 pll
tvp_writereg(TVP_HPLLCTRL, ((vco_range << 6) | (cp_current << 3))); tvp_writereg(TVP_HPLLCTRL, ((vco_range << 6) | (cp_current << 3)));
} }
void tvp_sel_clk(alt_u8 refclk) void tvp_sel_clk(tvp_refclk_t refclk)
{ {
alt_u8 status = tvp_readreg(TVP_INPMUX2) & 0xFA; alt_u8 status = tvp_readreg(TVP_INPMUX2) & 0xFA;

View File

@ -24,21 +24,18 @@
#include "video_modes.h" #include "video_modes.h"
#include "sysconfig.h" #include "sysconfig.h"
//#define I2C_DEBUG
#define I2CA_BASE I2C_OPENCORES_0_BASE
#define DEFAULT_VSYNC_THOLD 0x44 #define DEFAULT_VSYNC_THOLD 0x44
#define DEFAULT_LINELEN_TOL 0x06 #define DEFAULT_LINELEN_TOL 0x06
#define TVP_INTCLK_HZ 6500000UL
#define TVP_EXTCLK_HZ 27000000UL
typedef enum { typedef enum {
TVP_INPUT1 = 0, TVP_INPUT1 = 0,
TVP_INPUT2 = 1, TVP_INPUT2 = 1,
TVP_INPUT3 = 2 TVP_INPUT3 = 2
} tvp_input_t; } tvp_input_t;
static const alt_u8 Kvco[] = {75, 85, 150, 200};
static const char *Kvco_str[] = { "Ultra low", "Low", "Medium", "High" };
typedef enum { typedef enum {
REFCLK_EXT27 = 0, REFCLK_EXT27 = 0,
REFCLK_INTCLK = 1 REFCLK_INTCLK = 1
@ -66,8 +63,6 @@ typedef struct {
alt_u8 b_f_gain; alt_u8 b_f_gain;
} __attribute__((packed)) color_setup_t; } __attribute__((packed)) color_setup_t;
static const alt_u32 clkrate[] = {27000000, 6500000}; //in MHz
inline alt_u32 tvp_readreg(alt_u32 regaddr); inline alt_u32 tvp_readreg(alt_u32 regaddr);
@ -91,7 +86,7 @@ void tvp_set_fine_gain_offset(color_setup_t *col);
void tvp_setup_hpll(alt_u16 h_samplerate, alt_u16 v_lines, alt_u8 hz, alt_u8 plldivby2); void tvp_setup_hpll(alt_u16 h_samplerate, alt_u16 v_lines, alt_u8 hz, alt_u8 plldivby2);
void tvp_sel_clk(alt_u8 refclk); void tvp_sel_clk(tvp_refclk_t refclk);
void tvp_sel_csc(const ypbpr_to_rgb_csc_t *csc); void tvp_sel_csc(const ypbpr_to_rgb_csc_t *csc);

View File

@ -13,7 +13,8 @@
#define _INTEGER_H_ #define _INTEGER_H_
#include <stdint.h> #include <stdint.h>
#include <typedef.h>
#if 0
/* 16-bit, 32-bit or larger integer */ /* 16-bit, 32-bit or larger integer */
typedef int16_t INT; typedef int16_t INT;
typedef uint16_t UINT; typedef uint16_t UINT;
@ -37,8 +38,8 @@ typedef uint32_t DWORD;
/* Boolean type */ /* Boolean type */
typedef enum { FALSE = 0, TRUE } BOOLEAN; typedef enum { FALSE = 0, TRUE } BOOLEAN;
#endif
typedef enum { LOW = 0, HIGH } THROTTLE; typedef enum { LOW = 0, HIGH } THROTTLE;
#endif #endif
// «integer.h» is part of: // «integer.h» is part of:

View File

@ -109,6 +109,7 @@ void __SD_Speed_Transfer(BYTE throttle) {
BYTE __SD_Send_Cmd(BYTE cmd, DWORD arg) BYTE __SD_Send_Cmd(BYTE cmd, DWORD arg)
{ {
BYTE wiredata[10];
BYTE crc, res; BYTE crc, res;
// ACMD«n» is the command sequense of CMD55-CMD«n» // ACMD«n» is the command sequense of CMD55-CMD«n»
if(cmd & 0x80) { if(cmd & 0x80) {
@ -118,29 +119,29 @@ BYTE __SD_Send_Cmd(BYTE cmd, DWORD arg)
} }
// Select the card // Select the card
__SD_Deassert();
SPI_RW(0xFF);
__SD_Assert(); __SD_Assert();
SPI_RW(0xFF);
// Send complete command set // Send complete command set
SPI_RW(cmd); // Start and command index wiredata[0] = cmd; // Start and command index
SPI_RW((BYTE)(arg >> 24)); // Arg[31-24] wiredata[1] = (arg >> 24); // Arg[31-24]
SPI_RW((BYTE)(arg >> 16)); // Arg[23-16] wiredata[2] = (arg >> 16); // Arg[23-16]
SPI_RW((BYTE)(arg >> 8 )); // Arg[15-08] wiredata[3] = (arg >> 8 ); // Arg[15-08]
SPI_RW((BYTE)(arg >> 0 )); // Arg[07-00] wiredata[4] = (arg >> 0 ); // Arg[07-00]
// CRC? // CRC?
crc = 0x01; // Dummy CRC and stop crc = 0x01; // Dummy CRC and stop
if(cmd == CMD0) crc = 0x95; // Valid CRC for CMD0(0) if(cmd == CMD0) crc = 0x95; // Valid CRC for CMD0(0)
if(cmd == CMD8) crc = 0x87; // Valid CRC for CMD8(0x1AA) if(cmd == CMD8) crc = 0x87; // Valid CRC for CMD8(0x1AA)
SPI_RW(crc); wiredata[5] = crc;
SPI_W(wiredata, 6);
// Receive command response // Receive command response
// Wait for a valid response in timeout of 5 milliseconds // Wait for a valid response in timeout of 5 milliseconds
SPI_Timer_On(5); SPI_Timer_On(5);
do { do {
res = SPI_RW(0xFF); SPI_R(&res, 1);
} while((res & 0x80)&&(SPI_Timer_Status()==TRUE)); } while((res & 0x80)&&(SPI_Timer_Status()==TRUE));
SPI_Timer_Off(); SPI_Timer_Off();
// Return with the response value // Return with the response value
@ -185,8 +186,8 @@ SDRESULTS __SD_Write_Block(SD_DEV *dev, void *dat, BYTE token)
DWORD __SD_Sectors (SD_DEV *dev) DWORD __SD_Sectors (SD_DEV *dev)
{ {
BYTE csd[16]; BYTE csd[18];
BYTE idx; BYTE tkn;
DWORD ss = 0; DWORD ss = 0;
WORD C_SIZE = 0; WORD C_SIZE = 0;
BYTE C_SIZE_MULT = 0; BYTE C_SIZE_MULT = 0;
@ -194,12 +195,18 @@ DWORD __SD_Sectors (SD_DEV *dev)
if(__SD_Send_Cmd(CMD9, 0)==0) if(__SD_Send_Cmd(CMD9, 0)==0)
{ {
// Wait for response // Wait for response
while (SPI_RW(0xFF) == 0xFF); SPI_Timer_On(5); // Wait for data packet (timeout of 5ms)
for (idx=0; idx!=16; idx++) csd[idx] = SPI_RW(0xFF); do {
// Dummy CRC SPI_R(&tkn, 1);
SPI_RW(0xFF); } while((tkn==0xFF)&&(SPI_Timer_Status()==TRUE));
SPI_RW(0xFF); SPI_Timer_Off();
SPI_Release();
if(tkn!=0xFE)
return 0;
// TODO: CRC check
SPI_R(csd, 18);
if(dev->cardtype & SDCT_SD1) if(dev->cardtype & SDCT_SD1)
{ {
ss = csd[0]; ss = csd[0];
@ -225,12 +232,15 @@ DWORD __SD_Sectors (SD_DEV *dev)
C_SIZE <<= 8; C_SIZE <<= 8;
C_SIZE |= (csd[9] & 0xFF); C_SIZE |= (csd[9] & 0xFF);
// C_SIZE_MULT [--]. don't exits // C_SIZE_MULT [--]. don't exits
C_SIZE_MULT = 0; C_SIZE_MULT = 17; //C_SIZE_MULT+2 = 19
printf("csize: %u\n", C_SIZE);
} }
ss = (C_SIZE + 1); ss = (C_SIZE + 1);
ss *= __SD_Power_Of_Two(C_SIZE_MULT + 2); // SD_BLK_SIZE = 2^9
ss *= __SD_Power_Of_Two(READ_BL_LEN); //ss *= __SD_Power_Of_Two(C_SIZE_MULT + 2 + READ_BL_LEN - 9);
ss /= SD_BLK_SIZE; ss *= 1 << (C_SIZE_MULT + 2 + READ_BL_LEN - 9);
//ss /= SD_BLK_SIZE;
printf("ss: %u\n", ss);
return (ss); return (ss);
} else return (0); // Error } else return (0); // Error
} }
@ -242,6 +252,7 @@ DWORD __SD_Sectors (SD_DEV *dev)
SDRESULTS SD_Init(SD_DEV *dev) SDRESULTS SD_Init(SD_DEV *dev)
{ {
BYTE initdata[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
#if defined(_M_IX86) // x86 #if defined(_M_IX86) // x86
dev->fp = fopen(dev->fn, "r+"); dev->fp = fopen(dev->fn, "r+");
if (dev->fp == NULL) if (dev->fp == NULL)
@ -265,67 +276,68 @@ SDRESULTS SD_Init(SD_DEV *dev)
// Initialize SPI for use with the memory card // Initialize SPI for use with the memory card
SPI_Init(); SPI_Init();
SPI_CS_High(); __SD_Deassert();
SPI_Freq_Low(); SPI_Freq_Low();
// 80 dummy clocks // 80 dummy clocks
for(idx = 0; idx != 10; idx++) SPI_RW(0xFF); //for(idx = 0; idx != 10; idx++) SPI_RW(0xFF);
SPI_W(initdata, sizeof(initdata));
SPI_Timer_On(500); /*SPI_Timer_On(500);
while(SPI_Timer_Status()==TRUE); while(SPI_Timer_Status()==TRUE);
SPI_Timer_Off(); SPI_Timer_Off();*/
dev->mount = FALSE; dev->mount = FALSE;
SPI_Timer_On(500); SPI_Timer_On(500);
while ((__SD_Send_Cmd(CMD0, 0) != 1)&&(SPI_Timer_Status()==TRUE)); while ((__SD_Send_Cmd(CMD0, 0) != 1)&&(SPI_Timer_Status()==TRUE));
SPI_Timer_Off(); SPI_Timer_Off();
// Idle state // Idle state
if (__SD_Send_Cmd(CMD0, 0) == 1) {
// SD version 2? // SD version 2?
if (__SD_Send_Cmd(CMD8, 0x1AA) == 1) { if (__SD_Send_Cmd(CMD8, 0x1AA) == 1) {
// Get trailing return value of R7 resp // Get trailing return value of R7 resp
for (n = 0; n < 4; n++) ocr[n] = SPI_RW(0xFF); SPI_R(ocr, 4);
// VDD range of 2.7-3.6V is OK? // VDD range of 2.7-3.6V is OK?
if ((ocr[2] == 0x01)&&(ocr[3] == 0xAA)) if ((ocr[2] == 0x01)&&(ocr[3] == 0xAA))
{ {
// Wait for leaving idle state (ACMD41 with HCS bit)... // Wait for leaving idle state (ACMD41 with HCS bit)...
SPI_Timer_On(1000); SPI_Timer_On(1000);
while ((SPI_Timer_Status()==TRUE)&&(__SD_Send_Cmd(ACMD41, 1UL << 30))); while ((SPI_Timer_Status()==TRUE)&&(__SD_Send_Cmd(ACMD41, 1UL << 30)));
SPI_Timer_Off();
// CCS in the OCR?
if ((SPI_Timer_Status()==TRUE)&&(__SD_Send_Cmd(CMD58, 0) == 0))
{
for (n = 0; n < 4; n++) ocr[n] = SPI_RW(0xFF);
// SD version 2?
ct = (ocr[0] & 0x40) ? SDCT_SD2 | SDCT_BLOCK : SDCT_SD2;
}
}
} else {
// SD version 1 or MMC?
if (__SD_Send_Cmd(ACMD41, 0) <= 1)
{
// SD version 1
ct = SDCT_SD1;
cmd = ACMD41;
} else {
// MMC version 3
ct = SDCT_MMC;
cmd = CMD1;
}
// Wait for leaving idle state
SPI_Timer_On(250);
while((SPI_Timer_Status()==TRUE)&&(__SD_Send_Cmd(cmd, 0)));
SPI_Timer_Off(); SPI_Timer_Off();
if(SPI_Timer_Status()==FALSE) ct = 0; // CCS in the OCR?
if(__SD_Send_Cmd(CMD59, 0)) ct = 0; // Deactivate CRC check (default) if ((SPI_Timer_Status()==TRUE)&&(__SD_Send_Cmd(CMD58, 0) == 0))
if(__SD_Send_Cmd(CMD16, 512)) ct = 0; // Set R/W block length to 512 bytes {
SPI_R(ocr, 4);
// SD version 2?
ct = (ocr[0] & 0x40) ? SDCT_SD2 | SDCT_BLOCK : SDCT_SD2;
}
} }
} else {
// SD version 1 or MMC?
if (__SD_Send_Cmd(ACMD41, 0) <= 1)
{
// SD version 1
ct = SDCT_SD1;
cmd = ACMD41;
} else {
// MMC version 3
ct = SDCT_MMC;
cmd = CMD1;
}
// Wait for leaving idle state
SPI_Timer_On(250);
while((SPI_Timer_Status()==TRUE)&&(__SD_Send_Cmd(cmd, 0)));
SPI_Timer_Off();
if(SPI_Timer_Status()==FALSE) ct = 0;
if(__SD_Send_Cmd(CMD59, 0)) ct = 0; // Deactivate CRC check (default)
if(__SD_Send_Cmd(CMD16, 512)) ct = 0; // Set R/W block length to 512 bytes
} }
} }
if(ct) { if(ct) {
dev->cardtype = ct; dev->cardtype = ct;
dev->mount = TRUE; dev->mount = TRUE;
dev->last_sector = __SD_Sectors(dev) - 1; dev->last_sector = __SD_Sectors(dev) - 1;
printf("lastsec %u\n", dev->last_sector);
#ifdef SD_IO_DBG_COUNT #ifdef SD_IO_DBG_COUNT
dev->debug.read = 0; dev->debug.read = 0;
dev->debug.write = 0; dev->debug.write = 0;
@ -365,11 +377,14 @@ SDRESULTS SD_Read(SD_DEV *dev, void *dat, DWORD sector, WORD ofs, WORD cnt)
WORD remaining; WORD remaining;
res = SD_ERROR; res = SD_ERROR;
if ((sector > dev->last_sector)||(cnt == 0)) return(SD_PARERR); if ((sector > dev->last_sector)||(cnt == 0)) return(SD_PARERR);
// Convert sector number to byte address (sector * SD_BLK_SIZE) // Convert sector number to byte address (sector * SD_BLK_SIZE) for SDC1
if (__SD_Send_Cmd(CMD17, sector * SD_BLK_SIZE) == 0) { if (!(dev->cardtype & SDCT_BLOCK))
sector *= SD_BLK_SIZE;
if (__SD_Send_Cmd(CMD17, sector) == 0) {
SPI_Timer_On(100); // Wait for data packet (timeout of 100ms) SPI_Timer_On(100); // Wait for data packet (timeout of 100ms)
do { do {
tkn = SPI_RW(0xFF); SPI_R(&tkn, 1);
} while((tkn==0xFF)&&(SPI_Timer_Status()==TRUE)); } while((tkn==0xFF)&&(SPI_Timer_Status()==TRUE));
SPI_Timer_Off(); SPI_Timer_Off();
// Token of single block? // Token of single block?
@ -377,20 +392,14 @@ SDRESULTS SD_Read(SD_DEV *dev, void *dat, DWORD sector, WORD ofs, WORD cnt)
// Size block (512 bytes) + CRC (2 bytes) - offset - bytes to count // Size block (512 bytes) + CRC (2 bytes) - offset - bytes to count
remaining = SD_BLK_SIZE + 2 - ofs - cnt; remaining = SD_BLK_SIZE + 2 - ofs - cnt;
// Skip offset // Skip offset
if(ofs) { if(ofs) {
do { SPI_R(NULL, ofs);
SPI_RW(0xFF);
} while(--ofs);
} }
// I receive the data and I write in user's buffer // I receive the data and I write in user's buffer
do { SPI_R((BYTE*)dat, cnt);
*(BYTE*)dat = SPI_RW(0xFF);
dat++;
} while(--cnt);
// Skip remaining // Skip remaining
do { // TODO: CRC
SPI_RW(0xFF); SPI_R(NULL, remaining);
} while (--remaining);
res = SD_OK; res = SD_OK;
} }
} }

View File

@ -56,6 +56,8 @@ typedef struct _SD_DEV {
#else // For use with uControllers #else // For use with uControllers
#include "sysconfig.h"
#include "stddef.h"
#include "spi_io.h" /* Provide the low-level functions */ #include "spi_io.h" /* Provide the low-level functions */
/* Definitions of SD commands */ /* Definitions of SD commands */

View File

@ -1,16 +1,35 @@
#include <alt_types.h>
#include <altera_avalon_spi.h>
#include <altera_avalon_spi_regs.h>
#include <altera_avalon_pio_regs.h>
#include <sys/alt_timestamp.h>
#include <system.h>
#include <io.h>
#include "i2c_opencores.h"
#include "spi_io.h" #include "spi_io.h"
#include "av_controller.h"
#define SD_SLAVE_ID 0 extern alt_u8 sys_ctrl;
alt_u32 sd_timer_ts;
void SPI_Init (void) { void SPI_Init (void) {
return; I2C_init(SD_SPI_BASE,ALT_CPU_FREQ,400000);
}
void SPI_W(BYTE *wd, int len) {
SPI_write(SD_SPI_BASE, wd, len);
}
void SPI_R(BYTE *rd, int len) {
SPI_read(SD_SPI_BASE, rd, len);
} }
BYTE SPI_RW (BYTE d) { BYTE SPI_RW (BYTE d) {
BYTE rdata; BYTE w;
SPI_R(&w, 1);
alt_avalon_spi_command(SPI_0_BASE, SD_SLAVE_ID, 1, &d, 1, &rdata, 0); return w;
return rdata;
} }
void SPI_Release (void) { void SPI_Release (void) {
@ -18,29 +37,32 @@ void SPI_Release (void) {
} }
inline void SPI_CS_Low (void) { inline void SPI_CS_Low (void) {
return; sys_ctrl &= ~SD_SPI_SS_N;
IOWR_ALTERA_AVALON_PIO_DATA(PIO_0_BASE, sys_ctrl);
} }
inline void SPI_CS_High (void){ inline void SPI_CS_High (void){
return; sys_ctrl |= SD_SPI_SS_N;
IOWR_ALTERA_AVALON_PIO_DATA(PIO_0_BASE, sys_ctrl);
} }
inline void SPI_Freq_High (void) { inline void SPI_Freq_High (void) {
return; I2C_init(SD_SPI_BASE,ALT_CPU_FREQ,ALT_CPU_FREQ/SCL_MIN_CLKDIV);
} }
inline void SPI_Freq_Low (void) { inline void SPI_Freq_Low (void) {
return; I2C_init(SD_SPI_BASE,ALT_CPU_FREQ,400000);
} }
void SPI_Timer_On (WORD ms) { void SPI_Timer_On (WORD ms) {
sd_timer_ts = ms*(ALT_CPU_FREQ/1000);
alt_timestamp_start();
} }
inline BOOL SPI_Timer_Status (void) { inline BOOL SPI_Timer_Status (void) {
return alt_timestamp() < sd_timer_ts;
} }
inline void SPI_Timer_Off (void) { inline void SPI_Timer_Off (void) {
return;
} }

View File

@ -8,6 +8,7 @@
#ifndef _SPI_IO_H_ #ifndef _SPI_IO_H_
#define _SPI_IO_H_ #define _SPI_IO_H_
#include "sysconfig.h"
#include "integer.h" /* Type redefinition for portability */ #include "integer.h" /* Type redefinition for portability */
@ -20,6 +21,20 @@
*/ */
void SPI_Init (void); void SPI_Init (void);
/**
\brief Read sequence of bytes
\param *rd Pointer to array where read bytes are written.
\param len Length of the array.
*/
void SPI_R (BYTE *rd, int len);
/**
\brief Write sequence of bytes
\param *wd Pointer to array which holds the bytes.
\param len Length of the array.
*/
void SPI_W (BYTE *wd, int len);
/** /**
\brief Read/Write a single byte. \brief Read/Write a single byte.
\param d Byte to send. \param d Byte to send.

View File

@ -217,13 +217,6 @@ altera_avalon_jtag_uart_driver_C_LIB_SRCS := \
altera_avalon_pio_driver_SRCS_ROOT := drivers altera_avalon_pio_driver_SRCS_ROOT := drivers
# altera_avalon_pio_driver sources # altera_avalon_pio_driver sources
# altera_avalon_spi_driver sources root
altera_avalon_spi_driver_SRCS_ROOT := drivers
# altera_avalon_spi_driver sources
altera_avalon_spi_driver_C_LIB_SRCS := \
$(altera_avalon_spi_driver_SRCS_ROOT)/src/altera_avalon_spi.c
# altera_avalon_timer_driver sources root # altera_avalon_timer_driver sources root
altera_avalon_timer_driver_SRCS_ROOT := drivers altera_avalon_timer_driver_SRCS_ROOT := drivers
@ -355,7 +348,6 @@ nios2_hw_crc32_driver_C_LIB_SRCS := \
# Assemble all component C source files # Assemble all component C source files
COMPONENT_C_LIB_SRCS += \ COMPONENT_C_LIB_SRCS += \
$(altera_avalon_jtag_uart_driver_C_LIB_SRCS) \ $(altera_avalon_jtag_uart_driver_C_LIB_SRCS) \
$(altera_avalon_spi_driver_C_LIB_SRCS) \
$(altera_avalon_timer_driver_C_LIB_SRCS) \ $(altera_avalon_timer_driver_C_LIB_SRCS) \
$(altera_epcq_controller_mod_driver_C_LIB_SRCS) \ $(altera_epcq_controller_mod_driver_C_LIB_SRCS) \
$(altera_nios2_gen2_hal_driver_C_LIB_SRCS) \ $(altera_nios2_gen2_hal_driver_C_LIB_SRCS) \

View File

@ -4,7 +4,7 @@
* Machine generated for CPU 'nios2_qsys_0' in SOPC Builder design 'sys' * Machine generated for CPU 'nios2_qsys_0' in SOPC Builder design 'sys'
* SOPC Builder design path: ../../sys.sopcinfo * SOPC Builder design path: ../../sys.sopcinfo
* *
* Generated: Sun Oct 16 12:18:06 EEST 2016 * Generated: Thu Oct 20 01:24:13 EEST 2016
*/ */
/* /*
@ -60,7 +60,6 @@
#include "altera_nios2_gen2_irq.h" #include "altera_nios2_gen2_irq.h"
#include "altera_avalon_jtag_uart.h" #include "altera_avalon_jtag_uart.h"
#include "altera_avalon_spi.h"
#include "altera_avalon_timer.h" #include "altera_avalon_timer.h"
#include "altera_epcq_controller_mod.h" #include "altera_epcq_controller_mod.h"
#include "i2c_opencores.h" #include "i2c_opencores.h"
@ -71,10 +70,10 @@
ALTERA_NIOS2_GEN2_IRQ_INSTANCE ( NIOS2_QSYS_0, nios2_qsys_0); ALTERA_NIOS2_GEN2_IRQ_INSTANCE ( NIOS2_QSYS_0, nios2_qsys_0);
ALTERA_AVALON_JTAG_UART_INSTANCE ( JTAG_UART_0, jtag_uart_0); ALTERA_AVALON_JTAG_UART_INSTANCE ( JTAG_UART_0, jtag_uart_0);
ALTERA_AVALON_SPI_INSTANCE ( SPI_0, spi_0);
ALTERA_AVALON_TIMER_INSTANCE ( TIMER_0, timer_0); ALTERA_AVALON_TIMER_INSTANCE ( TIMER_0, timer_0);
ALTERA_EPCQ_CONTROLLER_MOD_AVL_MEM_AVL_CSR_INSTANCE ( EPCQ_CONTROLLER_0, EPCQ_CONTROLLER_0_AVL_MEM, EPCQ_CONTROLLER_0_AVL_CSR, epcq_controller_0); ALTERA_EPCQ_CONTROLLER_MOD_AVL_MEM_AVL_CSR_INSTANCE ( EPCQ_CONTROLLER_0, EPCQ_CONTROLLER_0_AVL_MEM, EPCQ_CONTROLLER_0_AVL_CSR, epcq_controller_0);
I2C_OPENCORES_INSTANCE ( I2C_OPENCORES_0, i2c_opencores_0); I2C_OPENCORES_INSTANCE ( I2C_OPENCORES_0, i2c_opencores_0);
I2C_OPENCORES_INSTANCE ( I2C_OPENCORES_1, i2c_opencores_1);
/* /*
* Initialize the interrupt controller devices * Initialize the interrupt controller devices
@ -99,7 +98,7 @@ void alt_sys_init( void )
{ {
ALTERA_AVALON_TIMER_INIT ( TIMER_0, timer_0); ALTERA_AVALON_TIMER_INIT ( TIMER_0, timer_0);
ALTERA_AVALON_JTAG_UART_INIT ( JTAG_UART_0, jtag_uart_0); ALTERA_AVALON_JTAG_UART_INIT ( JTAG_UART_0, jtag_uart_0);
ALTERA_AVALON_SPI_INIT ( SPI_0, spi_0);
ALTERA_EPCQ_CONTROLLER_MOD_INIT ( EPCQ_CONTROLLER_0, epcq_controller_0); ALTERA_EPCQ_CONTROLLER_MOD_INIT ( EPCQ_CONTROLLER_0, epcq_controller_0);
I2C_OPENCORES_INIT ( I2C_OPENCORES_0, i2c_opencores_0); I2C_OPENCORES_INIT ( I2C_OPENCORES_0, i2c_opencores_0);
I2C_OPENCORES_INIT ( I2C_OPENCORES_1, i2c_opencores_1);
} }

View File

@ -9,15 +9,15 @@ extern "C"
{ {
#endif /* __cplusplus */ #endif /* __cplusplus */
#define SCL_MIN_CLKDIV 10
void I2C_init(alt_u32 base,alt_u32 clk,alt_u32 speed); void I2C_init(alt_u32 base,alt_u32 clk,alt_u32 speed);
int I2C_start(alt_u32 base, alt_u32 add, alt_u32 read); int I2C_start(alt_u32 base, alt_u32 add, alt_u32 read);
alt_u32 I2C_read(alt_u32 base,alt_u32 last); alt_u32 I2C_read(alt_u32 base,alt_u32 last);
alt_u32 I2C_write(alt_u32 base,alt_u8 data, alt_u32 last); alt_u32 I2C_write(alt_u32 base,alt_u8 data, alt_u32 last);
alt_u32 SPI_read(alt_u32 base); void SPI_read(alt_u32 base, alt_u8 *rdata, int len);
void SPI_write(alt_u32 base,alt_u8 data); void SPI_write(alt_u32 base, alt_u8 *wdata, int len);
#define I2C_OK (0) #define I2C_OK (0)
#define I2C_ACK (0) #define I2C_ACK (0)
#define I2C_NOACK (1) #define I2C_NOACK (1)

View File

@ -182,25 +182,31 @@ alt_u32 I2C_write(alt_u32 base,alt_u8 data, alt_u32 last)
} }
alt_u32 SPI_read(alt_u32 base) void SPI_read(alt_u32 base, alt_u8 *rdata, int len)
{ {
/* start read*/ int i;
IOWR_I2C_OPENCORES_CR(base, I2C_OPENCORES_CR_RD_MSK|I2C_OPENCORES_CR_NACK_MSK|I2C_OPENCORES_CR_SPIM_MSK );
/* wait for the trnasaction to be over.*/ for (i=0; i<len; i++) {
while( IORD_I2C_OPENCORES_SR(base) & I2C_OPENCORES_SR_TIP_MSK); /* start read*/
IOWR_I2C_OPENCORES_CR(base, I2C_OPENCORES_CR_RD_MSK|I2C_OPENCORES_CR_NACK_MSK|I2C_OPENCORES_CR_SPIM_MSK );
/* now read the data */ /* wait for the trnasaction to be over.*/
return (IORD_I2C_OPENCORES_RXR(base)); while( IORD_I2C_OPENCORES_SR(base) & I2C_OPENCORES_SR_TIP_MSK);
/* now read the data */
if (rdata)
rdata[i] = IORD_I2C_OPENCORES_RXR(base);
}
} }
void SPI_write(alt_u32 base,alt_u8 data) { void SPI_write(alt_u32 base, alt_u8 *wdata, int len)
/* transmit the data*/ {
IOWR_I2C_OPENCORES_TXR(base, data); int i;
/* start write */ for (i=0; i<len; i++) {
IOWR_I2C_OPENCORES_CR(base, I2C_OPENCORES_CR_WR_MSK|I2C_OPENCORES_CR_NACK_MSK|I2C_OPENCORES_CR_SPIM_MSK ); /* transmit the data*/
IOWR_I2C_OPENCORES_TXR(base, wdata[i]);
/* wait for the trnasaction to be over.*/ /* start write */
while( IORD_I2C_OPENCORES_SR(base) & I2C_OPENCORES_SR_TIP_MSK); IOWR_I2C_OPENCORES_CR(base, I2C_OPENCORES_CR_WR_MSK|I2C_OPENCORES_CR_NACK_MSK|I2C_OPENCORES_CR_SPIM_MSK );
/* wait for the trnasaction to be over.*/
while( IORD_I2C_OPENCORES_SR(base) & I2C_OPENCORES_SR_TIP_MSK);
}
} }

View File

@ -2,9 +2,9 @@
<sch:Settings xmlns:sch="http://www.altera.com/embeddedsw/bsp/schema"> <sch:Settings xmlns:sch="http://www.altera.com/embeddedsw/bsp/schema">
<BspType>hal</BspType> <BspType>hal</BspType>
<BspVersion>default</BspVersion> <BspVersion>default</BspVersion>
<BspGeneratedTimeStamp>Oct 16, 2016 12:18:06 PM</BspGeneratedTimeStamp> <BspGeneratedTimeStamp>Oct 21, 2016 1:18:01 AM</BspGeneratedTimeStamp>
<BspGeneratedUnixTimeStamp>1476609486611</BspGeneratedUnixTimeStamp> <BspGeneratedUnixTimeStamp>1477001881487</BspGeneratedUnixTimeStamp>
<BspGeneratedLocation>/home/markus/Code/ossc/software/sys_controller_bsp</BspGeneratedLocation> <BspGeneratedLocation>./</BspGeneratedLocation>
<BspSettingsFile>settings.bsp</BspSettingsFile> <BspSettingsFile>settings.bsp</BspSettingsFile>
<SopcDesignFile>../../sys.sopcinfo</SopcDesignFile> <SopcDesignFile>../../sys.sopcinfo</SopcDesignFile>
<JdiFile>default</JdiFile> <JdiFile>default</JdiFile>
@ -26,7 +26,7 @@
<SettingName>hal.timestamp_timer</SettingName> <SettingName>hal.timestamp_timer</SettingName>
<Identifier>ALT_TIMESTAMP_CLK</Identifier> <Identifier>ALT_TIMESTAMP_CLK</Identifier>
<Type>UnquotedString</Type> <Type>UnquotedString</Type>
<Value>none</Value> <Value>timer_0</Value>
<DefaultValue>none</DefaultValue> <DefaultValue>none</DefaultValue>
<DestinationFile>system_h_define</DestinationFile> <DestinationFile>system_h_define</DestinationFile>
<Description>Slave descriptor of timestamp timer device. This device is used by Altera HAL timestamp drivers for high-resolution time measurement. This setting defines the value of ALT_TIMESTAMP_CLK in system.h.</Description> <Description>Slave descriptor of timestamp timer device. This device is used by Altera HAL timestamp drivers for high-resolution time measurement. This setting defines the value of ALT_TIMESTAMP_CLK in system.h.</Description>
@ -899,7 +899,7 @@
<attributes>memory</attributes> <attributes>memory</attributes>
</MemoryMap> </MemoryMap>
<MemoryMap> <MemoryMap>
<slaveDescriptor>spi_0</slaveDescriptor> <slaveDescriptor>i2c_opencores_1</slaveDescriptor>
<addressRange>0x00821000 - 0x0082101F</addressRange> <addressRange>0x00821000 - 0x0082101F</addressRange>
<addressSpan>32</addressSpan> <addressSpan>32</addressSpan>
<attributes/> <attributes/>
@ -923,44 +923,38 @@
<attributes/> <attributes/>
</MemoryMap> </MemoryMap>
<MemoryMap> <MemoryMap>
<slaveDescriptor>pio_5</slaveDescriptor> <slaveDescriptor>pio_4</slaveDescriptor>
<addressRange>0x00821080 - 0x0082108F</addressRange> <addressRange>0x00821080 - 0x0082108F</addressRange>
<addressSpan>16</addressSpan> <addressSpan>16</addressSpan>
<attributes/> <attributes/>
</MemoryMap> </MemoryMap>
<MemoryMap> <MemoryMap>
<slaveDescriptor>pio_4</slaveDescriptor> <slaveDescriptor>pio_3</slaveDescriptor>
<addressRange>0x00821090 - 0x0082109F</addressRange> <addressRange>0x00821090 - 0x0082109F</addressRange>
<addressSpan>16</addressSpan> <addressSpan>16</addressSpan>
<attributes/> <attributes/>
</MemoryMap> </MemoryMap>
<MemoryMap> <MemoryMap>
<slaveDescriptor>pio_3</slaveDescriptor> <slaveDescriptor>pio_2</slaveDescriptor>
<addressRange>0x008210A0 - 0x008210AF</addressRange> <addressRange>0x008210A0 - 0x008210AF</addressRange>
<addressSpan>16</addressSpan> <addressSpan>16</addressSpan>
<attributes/> <attributes/>
</MemoryMap> </MemoryMap>
<MemoryMap> <MemoryMap>
<slaveDescriptor>pio_2</slaveDescriptor> <slaveDescriptor>pio_1</slaveDescriptor>
<addressRange>0x008210B0 - 0x008210BF</addressRange> <addressRange>0x008210B0 - 0x008210BF</addressRange>
<addressSpan>16</addressSpan> <addressSpan>16</addressSpan>
<attributes/> <attributes/>
</MemoryMap> </MemoryMap>
<MemoryMap> <MemoryMap>
<slaveDescriptor>pio_1</slaveDescriptor> <slaveDescriptor>pio_0</slaveDescriptor>
<addressRange>0x008210C0 - 0x008210CF</addressRange> <addressRange>0x008210C0 - 0x008210CF</addressRange>
<addressSpan>16</addressSpan> <addressSpan>16</addressSpan>
<attributes/> <attributes/>
</MemoryMap> </MemoryMap>
<MemoryMap>
<slaveDescriptor>pio_0</slaveDescriptor>
<addressRange>0x008210D0 - 0x008210DF</addressRange>
<addressSpan>16</addressSpan>
<attributes/>
</MemoryMap>
<MemoryMap> <MemoryMap>
<slaveDescriptor>jtag_uart_0</slaveDescriptor> <slaveDescriptor>jtag_uart_0</slaveDescriptor>
<addressRange>0x008210E0 - 0x008210E7</addressRange> <addressRange>0x008210D0 - 0x008210D7</addressRange>
<addressSpan>8</addressSpan> <addressSpan>8</addressSpan>
<attributes>printable</attributes> <attributes>printable</attributes>
</MemoryMap> </MemoryMap>

View File

@ -4,7 +4,7 @@
* Machine generated for CPU 'nios2_qsys_0' in SOPC Builder design 'sys' * Machine generated for CPU 'nios2_qsys_0' in SOPC Builder design 'sys'
* SOPC Builder design path: ../../sys.sopcinfo * SOPC Builder design path: ../../sys.sopcinfo
* *
* Generated: Sun Oct 16 12:18:06 EEST 2016 * Generated: Thu Oct 20 01:24:13 EEST 2016
*/ */
/* /*
@ -150,7 +150,6 @@
#define __ALTERA_AVALON_JTAG_UART #define __ALTERA_AVALON_JTAG_UART
#define __ALTERA_AVALON_ONCHIP_MEMORY2 #define __ALTERA_AVALON_ONCHIP_MEMORY2
#define __ALTERA_AVALON_PIO #define __ALTERA_AVALON_PIO
#define __ALTERA_AVALON_SPI
#define __ALTERA_AVALON_TIMER #define __ALTERA_AVALON_TIMER
#define __ALTERA_EPCQ_CONTROLLER_MOD #define __ALTERA_EPCQ_CONTROLLER_MOD
#define __ALTERA_NIOS2_GEN2 #define __ALTERA_NIOS2_GEN2
@ -176,19 +175,19 @@
#define ALT_NUM_INTERNAL_INTERRUPT_CONTROLLERS 1 #define ALT_NUM_INTERNAL_INTERRUPT_CONTROLLERS 1
#define ALT_NUM_INTERRUPT_CONTROLLERS 1 #define ALT_NUM_INTERRUPT_CONTROLLERS 1
#define ALT_STDERR "/dev/jtag_uart_0" #define ALT_STDERR "/dev/jtag_uart_0"
#define ALT_STDERR_BASE 0x8210e0 #define ALT_STDERR_BASE 0x8210d0
#define ALT_STDERR_DEV jtag_uart_0 #define ALT_STDERR_DEV jtag_uart_0
#define ALT_STDERR_IS_JTAG_UART #define ALT_STDERR_IS_JTAG_UART
#define ALT_STDERR_PRESENT #define ALT_STDERR_PRESENT
#define ALT_STDERR_TYPE "altera_avalon_jtag_uart" #define ALT_STDERR_TYPE "altera_avalon_jtag_uart"
#define ALT_STDIN "/dev/jtag_uart_0" #define ALT_STDIN "/dev/jtag_uart_0"
#define ALT_STDIN_BASE 0x8210e0 #define ALT_STDIN_BASE 0x8210d0
#define ALT_STDIN_DEV jtag_uart_0 #define ALT_STDIN_DEV jtag_uart_0
#define ALT_STDIN_IS_JTAG_UART #define ALT_STDIN_IS_JTAG_UART
#define ALT_STDIN_PRESENT #define ALT_STDIN_PRESENT
#define ALT_STDIN_TYPE "altera_avalon_jtag_uart" #define ALT_STDIN_TYPE "altera_avalon_jtag_uart"
#define ALT_STDOUT "/dev/jtag_uart_0" #define ALT_STDOUT "/dev/jtag_uart_0"
#define ALT_STDOUT_BASE 0x8210e0 #define ALT_STDOUT_BASE 0x8210d0
#define ALT_STDOUT_DEV jtag_uart_0 #define ALT_STDOUT_DEV jtag_uart_0
#define ALT_STDOUT_IS_JTAG_UART #define ALT_STDOUT_IS_JTAG_UART
#define ALT_STDOUT_PRESENT #define ALT_STDOUT_PRESENT
@ -243,7 +242,7 @@
#define ALT_MAX_FD 32 #define ALT_MAX_FD 32
#define ALT_SYS_CLK none #define ALT_SYS_CLK none
#define ALT_TIMESTAMP_CLK none #define ALT_TIMESTAMP_CLK TIMER_0
/* /*
@ -260,13 +259,27 @@
#define I2C_OPENCORES_0_TYPE "i2c_opencores" #define I2C_OPENCORES_0_TYPE "i2c_opencores"
/*
* i2c_opencores_1 configuration
*
*/
#define ALT_MODULE_CLASS_i2c_opencores_1 i2c_opencores
#define I2C_OPENCORES_1_BASE 0x821000
#define I2C_OPENCORES_1_IRQ 4
#define I2C_OPENCORES_1_IRQ_INTERRUPT_CONTROLLER_ID 0
#define I2C_OPENCORES_1_NAME "/dev/i2c_opencores_1"
#define I2C_OPENCORES_1_SPAN 32
#define I2C_OPENCORES_1_TYPE "i2c_opencores"
/* /*
* jtag_uart_0 configuration * jtag_uart_0 configuration
* *
*/ */
#define ALT_MODULE_CLASS_jtag_uart_0 altera_avalon_jtag_uart #define ALT_MODULE_CLASS_jtag_uart_0 altera_avalon_jtag_uart
#define JTAG_UART_0_BASE 0x8210e0 #define JTAG_UART_0_BASE 0x8210d0
#define JTAG_UART_0_IRQ 1 #define JTAG_UART_0_IRQ 1
#define JTAG_UART_0_IRQ_INTERRUPT_CONTROLLER_ID 0 #define JTAG_UART_0_IRQ_INTERRUPT_CONTROLLER_ID 0
#define JTAG_UART_0_NAME "/dev/jtag_uart_0" #define JTAG_UART_0_NAME "/dev/jtag_uart_0"
@ -313,7 +326,7 @@
*/ */
#define ALT_MODULE_CLASS_pio_0 altera_avalon_pio #define ALT_MODULE_CLASS_pio_0 altera_avalon_pio
#define PIO_0_BASE 0x8210d0 #define PIO_0_BASE 0x8210c0
#define PIO_0_BIT_CLEARING_EDGE_REGISTER 0 #define PIO_0_BIT_CLEARING_EDGE_REGISTER 0
#define PIO_0_BIT_MODIFYING_OUTPUT_REGISTER 0 #define PIO_0_BIT_MODIFYING_OUTPUT_REGISTER 0
#define PIO_0_CAPTURE 0 #define PIO_0_CAPTURE 0
@ -340,7 +353,7 @@
*/ */
#define ALT_MODULE_CLASS_pio_1 altera_avalon_pio #define ALT_MODULE_CLASS_pio_1 altera_avalon_pio
#define PIO_1_BASE 0x8210c0 #define PIO_1_BASE 0x8210b0
#define PIO_1_BIT_CLEARING_EDGE_REGISTER 0 #define PIO_1_BIT_CLEARING_EDGE_REGISTER 0
#define PIO_1_BIT_MODIFYING_OUTPUT_REGISTER 0 #define PIO_1_BIT_MODIFYING_OUTPUT_REGISTER 0
#define PIO_1_CAPTURE 0 #define PIO_1_CAPTURE 0
@ -367,7 +380,7 @@
*/ */
#define ALT_MODULE_CLASS_pio_2 altera_avalon_pio #define ALT_MODULE_CLASS_pio_2 altera_avalon_pio
#define PIO_2_BASE 0x8210b0 #define PIO_2_BASE 0x8210a0
#define PIO_2_BIT_CLEARING_EDGE_REGISTER 0 #define PIO_2_BIT_CLEARING_EDGE_REGISTER 0
#define PIO_2_BIT_MODIFYING_OUTPUT_REGISTER 0 #define PIO_2_BIT_MODIFYING_OUTPUT_REGISTER 0
#define PIO_2_CAPTURE 0 #define PIO_2_CAPTURE 0
@ -394,7 +407,7 @@
*/ */
#define ALT_MODULE_CLASS_pio_3 altera_avalon_pio #define ALT_MODULE_CLASS_pio_3 altera_avalon_pio
#define PIO_3_BASE 0x8210a0 #define PIO_3_BASE 0x821090
#define PIO_3_BIT_CLEARING_EDGE_REGISTER 0 #define PIO_3_BIT_CLEARING_EDGE_REGISTER 0
#define PIO_3_BIT_MODIFYING_OUTPUT_REGISTER 0 #define PIO_3_BIT_MODIFYING_OUTPUT_REGISTER 0
#define PIO_3_CAPTURE 0 #define PIO_3_CAPTURE 0
@ -421,7 +434,7 @@
*/ */
#define ALT_MODULE_CLASS_pio_4 altera_avalon_pio #define ALT_MODULE_CLASS_pio_4 altera_avalon_pio
#define PIO_4_BASE 0x821090 #define PIO_4_BASE 0x821080
#define PIO_4_BIT_CLEARING_EDGE_REGISTER 0 #define PIO_4_BIT_CLEARING_EDGE_REGISTER 0
#define PIO_4_BIT_MODIFYING_OUTPUT_REGISTER 0 #define PIO_4_BIT_MODIFYING_OUTPUT_REGISTER 0
#define PIO_4_CAPTURE 0 #define PIO_4_CAPTURE 0
@ -442,64 +455,6 @@
#define PIO_4_TYPE "altera_avalon_pio" #define PIO_4_TYPE "altera_avalon_pio"
/*
* pio_5 configuration
*
*/
#define ALT_MODULE_CLASS_pio_5 altera_avalon_pio
#define PIO_5_BASE 0x821080
#define PIO_5_BIT_CLEARING_EDGE_REGISTER 0
#define PIO_5_BIT_MODIFYING_OUTPUT_REGISTER 0
#define PIO_5_CAPTURE 0
#define PIO_5_DATA_WIDTH 8
#define PIO_5_DO_TEST_BENCH_WIRING 0
#define PIO_5_DRIVEN_SIM_VALUE 0
#define PIO_5_EDGE_TYPE "NONE"
#define PIO_5_FREQ 27000000
#define PIO_5_HAS_IN 0
#define PIO_5_HAS_OUT 1
#define PIO_5_HAS_TRI 0
#define PIO_5_IRQ -1
#define PIO_5_IRQ_INTERRUPT_CONTROLLER_ID -1
#define PIO_5_IRQ_TYPE "NONE"
#define PIO_5_NAME "/dev/pio_5"
#define PIO_5_RESET_VALUE 0
#define PIO_5_SPAN 16
#define PIO_5_TYPE "altera_avalon_pio"
/*
* spi_0 configuration
*
*/
#define ALT_MODULE_CLASS_spi_0 altera_avalon_spi
#define SPI_0_BASE 0x821000
#define SPI_0_CLOCKMULT 1
#define SPI_0_CLOCKPHASE 0
#define SPI_0_CLOCKPOLARITY 0
#define SPI_0_CLOCKUNITS "Hz"
#define SPI_0_DATABITS 8
#define SPI_0_DATAWIDTH 16
#define SPI_0_DELAYMULT "1.0E-9"
#define SPI_0_DELAYUNITS "ns"
#define SPI_0_EXTRADELAY 0
#define SPI_0_INSERT_SYNC 0
#define SPI_0_IRQ 4
#define SPI_0_IRQ_INTERRUPT_CONTROLLER_ID 0
#define SPI_0_ISMASTER 1
#define SPI_0_LSBFIRST 0
#define SPI_0_NAME "/dev/spi_0"
#define SPI_0_NUMSLAVES 1
#define SPI_0_PREFIX "spi_"
#define SPI_0_SPAN 32
#define SPI_0_SYNC_REG_DEPTH 2
#define SPI_0_TARGETCLOCK 13500000u
#define SPI_0_TARGETSSDELAY "0.0"
#define SPI_0_TYPE "altera_avalon_spi"
/* /*
* timer_0 configuration * timer_0 configuration
* *

189
sys.qsys
View File

@ -57,6 +57,22 @@
type = "String"; type = "String";
} }
} }
element i2c_opencores_1
{
datum _sortIndex
{
value = "10";
type = "int";
}
}
element i2c_opencores_1.avalon_slave_0
{
datum baseAddress
{
value = "8523776";
type = "String";
}
}
element jtag_uart_0 element jtag_uart_0
{ {
datum _sortIndex datum _sortIndex
@ -69,7 +85,7 @@
{ {
datum baseAddress datum baseAddress
{ {
value = "8524000"; value = "8523984";
type = "String"; type = "String";
} }
} }
@ -141,7 +157,7 @@
{ {
datum baseAddress datum baseAddress
{ {
value = "8523984"; value = "8523968";
type = "String"; type = "String";
} }
} }
@ -157,7 +173,7 @@
{ {
datum baseAddress datum baseAddress
{ {
value = "8523968"; value = "8523952";
type = "String"; type = "String";
} }
} }
@ -173,7 +189,7 @@
{ {
datum baseAddress datum baseAddress
{ {
value = "8523952"; value = "8523936";
type = "String"; type = "String";
} }
} }
@ -189,7 +205,7 @@
{ {
datum baseAddress datum baseAddress
{ {
value = "8523936"; value = "8523920";
type = "String"; type = "String";
} }
} }
@ -202,22 +218,6 @@
} }
} }
element pio_4.s1 element pio_4.s1
{
datum baseAddress
{
value = "8523920";
type = "String";
}
}
element pio_5
{
datum _sortIndex
{
value = "16";
type = "int";
}
}
element pio_5.s1
{ {
datum baseAddress datum baseAddress
{ {
@ -225,22 +225,6 @@
type = "String"; type = "String";
} }
} }
element spi_0
{
datum _sortIndex
{
value = "10";
type = "int";
}
}
element spi_0.spi_control_port
{
datum baseAddress
{
value = "8523776";
type = "String";
}
}
element timer_0 element timer_0
{ {
datum _sortIndex datum _sortIndex
@ -284,6 +268,11 @@
internal="i2c_opencores_0.export" internal="i2c_opencores_0.export"
type="conduit" type="conduit"
dir="end" /> dir="end" />
<interface
name="i2c_opencores_1_export"
internal="i2c_opencores_1.export"
type="conduit"
dir="end" />
<interface <interface
name="pio_0_sys_ctrl_out" name="pio_0_sys_ctrl_out"
internal="pio_0.external_connection" internal="pio_0.external_connection"
@ -309,17 +298,7 @@
internal="pio_4.external_connection" internal="pio_4.external_connection"
type="conduit" type="conduit"
dir="end" /> dir="end" />
<interface
name="pio_5_lcd_ctrl_out"
internal="pio_5.external_connection"
type="conduit"
dir="end" />
<interface name="reset" internal="clk_27.clk_in_reset" type="reset" dir="end" /> <interface name="reset" internal="clk_27.clk_in_reset" type="reset" dir="end" />
<interface
name="spi_0_external"
internal="spi_0.external"
type="conduit"
dir="end" />
<module name="clk_27" kind="clock_source" version="15.1" enabled="1"> <module name="clk_27" kind="clock_source" version="15.1" enabled="1">
<parameter name="clockFrequency" value="27000000" /> <parameter name="clockFrequency" value="27000000" />
<parameter name="clockFrequencyKnown" value="true" /> <parameter name="clockFrequencyKnown" value="true" />
@ -343,7 +322,16 @@
name="i2c_opencores_0" name="i2c_opencores_0"
kind="i2c_opencores" kind="i2c_opencores"
version="13.0" version="13.0"
enabled="1" /> enabled="1">
<parameter name="drive_scl_high" value="0" />
</module>
<module
name="i2c_opencores_1"
kind="i2c_opencores"
version="13.0"
enabled="1">
<parameter name="drive_scl_high" value="1" />
</module>
<module <module
name="jtag_uart_0" name="jtag_uart_0"
kind="altera_avalon_jtag_uart" kind="altera_avalon_jtag_uart"
@ -399,7 +387,7 @@
<parameter name="dataAddrWidth" value="24" /> <parameter name="dataAddrWidth" value="24" />
<parameter name="dataMasterHighPerformanceAddrWidth" value="1" /> <parameter name="dataMasterHighPerformanceAddrWidth" value="1" />
<parameter name="dataMasterHighPerformanceMapParam" value="" /> <parameter name="dataMasterHighPerformanceMapParam" value="" />
<parameter name="dataSlaveMapParam"><![CDATA[<address-map><slave name='epcq_controller_0.avl_mem' start='0x0' end='0x800000' type='altera_epcq_controller_mod.avl_mem' /><slave name='onchip_memory2_0.s1' start='0x810000' end='0x81A000' type='altera_avalon_onchip_memory2.s1' /><slave name='nios2_qsys_0.debug_mem_slave' start='0x820800' end='0x821000' type='altera_nios2_gen2.debug_mem_slave' /><slave name='spi_0.spi_control_port' start='0x821000' end='0x821020' type='altera_avalon_spi.spi_control_port' /><slave name='timer_0.s1' start='0x821020' end='0x821040' type='altera_avalon_timer.s1' /><slave name='epcq_controller_0.avl_csr' start='0x821040' end='0x821060' type='altera_epcq_controller_mod.avl_csr' /><slave name='i2c_opencores_0.avalon_slave_0' start='0x821060' end='0x821080' type='i2c_opencores.avalon_slave_0' /><slave name='pio_5.s1' start='0x821080' end='0x821090' type='altera_avalon_pio.s1' /><slave name='pio_4.s1' start='0x821090' end='0x8210A0' type='altera_avalon_pio.s1' /><slave name='pio_3.s1' start='0x8210A0' end='0x8210B0' type='altera_avalon_pio.s1' /><slave name='pio_2.s1' start='0x8210B0' end='0x8210C0' type='altera_avalon_pio.s1' /><slave name='pio_1.s1' start='0x8210C0' end='0x8210D0' type='altera_avalon_pio.s1' /><slave name='pio_0.s1' start='0x8210D0' end='0x8210E0' type='altera_avalon_pio.s1' /><slave name='jtag_uart_0.avalon_jtag_slave' start='0x8210E0' end='0x8210E8' type='altera_avalon_jtag_uart.avalon_jtag_slave' /></address-map>]]></parameter> <parameter name="dataSlaveMapParam"><![CDATA[<address-map><slave name='epcq_controller_0.avl_mem' start='0x0' end='0x800000' type='altera_epcq_controller_mod.avl_mem' /><slave name='onchip_memory2_0.s1' start='0x810000' end='0x81A000' type='altera_avalon_onchip_memory2.s1' /><slave name='nios2_qsys_0.debug_mem_slave' start='0x820800' end='0x821000' type='altera_nios2_gen2.debug_mem_slave' /><slave name='i2c_opencores_1.avalon_slave_0' start='0x821000' end='0x821020' type='i2c_opencores.avalon_slave_0' /><slave name='timer_0.s1' start='0x821020' end='0x821040' type='altera_avalon_timer.s1' /><slave name='epcq_controller_0.avl_csr' start='0x821040' end='0x821060' type='altera_epcq_controller_mod.avl_csr' /><slave name='i2c_opencores_0.avalon_slave_0' start='0x821060' end='0x821080' type='i2c_opencores.avalon_slave_0' /><slave name='pio_4.s1' start='0x821080' end='0x821090' type='altera_avalon_pio.s1' /><slave name='pio_3.s1' start='0x821090' end='0x8210A0' type='altera_avalon_pio.s1' /><slave name='pio_2.s1' start='0x8210A0' end='0x8210B0' type='altera_avalon_pio.s1' /><slave name='pio_1.s1' start='0x8210B0' end='0x8210C0' type='altera_avalon_pio.s1' /><slave name='pio_0.s1' start='0x8210C0' end='0x8210D0' type='altera_avalon_pio.s1' /><slave name='jtag_uart_0.avalon_jtag_slave' start='0x8210D0' end='0x8210D8' type='altera_avalon_jtag_uart.avalon_jtag_slave' /></address-map>]]></parameter>
<parameter name="data_master_high_performance_paddr_base" value="0" /> <parameter name="data_master_high_performance_paddr_base" value="0" />
<parameter name="data_master_high_performance_paddr_size" value="0" /> <parameter name="data_master_high_performance_paddr_size" value="0" />
<parameter name="data_master_paddr_base" value="0" /> <parameter name="data_master_paddr_base" value="0" />
@ -668,36 +656,6 @@
<parameter name="simDrivenValue" value="0" /> <parameter name="simDrivenValue" value="0" />
<parameter name="width" value="32" /> <parameter name="width" value="32" />
</module> </module>
<module name="pio_5" kind="altera_avalon_pio" version="15.1" enabled="1">
<parameter name="bitClearingEdgeCapReg" value="false" />
<parameter name="bitModifyingOutReg" value="false" />
<parameter name="captureEdge" value="false" />
<parameter name="clockRate" value="27000000" />
<parameter name="direction" value="Output" />
<parameter name="edgeType" value="RISING" />
<parameter name="generateIRQ" value="false" />
<parameter name="irqType" value="LEVEL" />
<parameter name="resetValue" value="0" />
<parameter name="simDoTestBenchWiring" value="false" />
<parameter name="simDrivenValue" value="0" />
<parameter name="width" value="8" />
</module>
<module name="spi_0" kind="altera_avalon_spi" version="15.1" enabled="1">
<parameter name="avalonSpec" value="2.0" />
<parameter name="clockPhase" value="0" />
<parameter name="clockPolarity" value="0" />
<parameter name="dataWidth" value="8" />
<parameter name="disableAvalonFlowControl" value="false" />
<parameter name="inputClockRate" value="27000000" />
<parameter name="insertDelayBetweenSlaveSelectAndSClk" value="false" />
<parameter name="insertSync" value="false" />
<parameter name="lsbOrderedFirst" value="false" />
<parameter name="masterSPI" value="true" />
<parameter name="numberOfSlaves" value="1" />
<parameter name="syncRegDepth" value="2" />
<parameter name="targetClockRate" value="13500000" />
<parameter name="targetSlaveSelectToSClkDelay" value="0.0" />
</module>
<module name="timer_0" kind="altera_avalon_timer" version="15.1" enabled="1"> <module name="timer_0" kind="altera_avalon_timer" version="15.1" enabled="1">
<parameter name="alwaysRun" value="false" /> <parameter name="alwaysRun" value="false" />
<parameter name="counterSize" value="32" /> <parameter name="counterSize" value="32" />
@ -716,7 +674,7 @@
start="nios2_qsys_0.data_master" start="nios2_qsys_0.data_master"
end="jtag_uart_0.avalon_jtag_slave"> end="jtag_uart_0.avalon_jtag_slave">
<parameter name="arbitrationPriority" value="1" /> <parameter name="arbitrationPriority" value="1" />
<parameter name="baseAddress" value="0x008210e0" /> <parameter name="baseAddress" value="0x008210d0" />
<parameter name="defaultConnection" value="false" /> <parameter name="defaultConnection" value="false" />
</connection> </connection>
<connection <connection
@ -728,6 +686,15 @@
<parameter name="baseAddress" value="0x00821060" /> <parameter name="baseAddress" value="0x00821060" />
<parameter name="defaultConnection" value="false" /> <parameter name="defaultConnection" value="false" />
</connection> </connection>
<connection
kind="avalon"
version="15.1"
start="nios2_qsys_0.data_master"
end="i2c_opencores_1.avalon_slave_0">
<parameter name="arbitrationPriority" value="1" />
<parameter name="baseAddress" value="0x00821000" />
<parameter name="defaultConnection" value="false" />
</connection>
<connection <connection
kind="avalon" kind="avalon"
version="15.1" version="15.1"
@ -770,7 +737,7 @@
start="nios2_qsys_0.data_master" start="nios2_qsys_0.data_master"
end="pio_0.s1"> end="pio_0.s1">
<parameter name="arbitrationPriority" value="1" /> <parameter name="arbitrationPriority" value="1" />
<parameter name="baseAddress" value="0x008210d0" /> <parameter name="baseAddress" value="0x008210c0" />
<parameter name="defaultConnection" value="false" /> <parameter name="defaultConnection" value="false" />
</connection> </connection>
<connection <connection
@ -779,7 +746,7 @@
start="nios2_qsys_0.data_master" start="nios2_qsys_0.data_master"
end="pio_1.s1"> end="pio_1.s1">
<parameter name="arbitrationPriority" value="1" /> <parameter name="arbitrationPriority" value="1" />
<parameter name="baseAddress" value="0x008210c0" /> <parameter name="baseAddress" value="0x008210b0" />
<parameter name="defaultConnection" value="false" /> <parameter name="defaultConnection" value="false" />
</connection> </connection>
<connection <connection
@ -788,7 +755,7 @@
start="nios2_qsys_0.data_master" start="nios2_qsys_0.data_master"
end="pio_2.s1"> end="pio_2.s1">
<parameter name="arbitrationPriority" value="1" /> <parameter name="arbitrationPriority" value="1" />
<parameter name="baseAddress" value="0x008210b0" /> <parameter name="baseAddress" value="0x008210a0" />
<parameter name="defaultConnection" value="false" /> <parameter name="defaultConnection" value="false" />
</connection> </connection>
<connection <connection
@ -797,15 +764,6 @@
start="nios2_qsys_0.data_master" start="nios2_qsys_0.data_master"
end="pio_3.s1"> end="pio_3.s1">
<parameter name="arbitrationPriority" value="1" /> <parameter name="arbitrationPriority" value="1" />
<parameter name="baseAddress" value="0x008210a0" />
<parameter name="defaultConnection" value="false" />
</connection>
<connection
kind="avalon"
version="15.1"
start="nios2_qsys_0.data_master"
end="pio_4.s1">
<parameter name="arbitrationPriority" value="1" />
<parameter name="baseAddress" value="0x00821090" /> <parameter name="baseAddress" value="0x00821090" />
<parameter name="defaultConnection" value="false" /> <parameter name="defaultConnection" value="false" />
</connection> </connection>
@ -813,7 +771,7 @@
kind="avalon" kind="avalon"
version="15.1" version="15.1"
start="nios2_qsys_0.data_master" start="nios2_qsys_0.data_master"
end="pio_5.s1"> end="pio_4.s1">
<parameter name="arbitrationPriority" value="1" /> <parameter name="arbitrationPriority" value="1" />
<parameter name="baseAddress" value="0x00821080" /> <parameter name="baseAddress" value="0x00821080" />
<parameter name="defaultConnection" value="false" /> <parameter name="defaultConnection" value="false" />
@ -827,15 +785,6 @@
<parameter name="baseAddress" value="0x00821020" /> <parameter name="baseAddress" value="0x00821020" />
<parameter name="defaultConnection" value="false" /> <parameter name="defaultConnection" value="false" />
</connection> </connection>
<connection
kind="avalon"
version="15.1"
start="nios2_qsys_0.data_master"
end="spi_0.spi_control_port">
<parameter name="arbitrationPriority" value="1" />
<parameter name="baseAddress" value="0x00821000" />
<parameter name="defaultConnection" value="false" />
</connection>
<connection <connection
kind="avalon" kind="avalon"
version="15.1" version="15.1"
@ -861,9 +810,7 @@
<connection kind="clock" version="15.1" start="clk_27.clk" end="pio_2.clk" /> <connection kind="clock" version="15.1" start="clk_27.clk" end="pio_2.clk" />
<connection kind="clock" version="15.1" start="clk_27.clk" end="pio_3.clk" /> <connection kind="clock" version="15.1" start="clk_27.clk" end="pio_3.clk" />
<connection kind="clock" version="15.1" start="clk_27.clk" end="pio_4.clk" /> <connection kind="clock" version="15.1" start="clk_27.clk" end="pio_4.clk" />
<connection kind="clock" version="15.1" start="clk_27.clk" end="pio_5.clk" />
<connection kind="clock" version="15.1" start="clk_27.clk" end="timer_0.clk" /> <connection kind="clock" version="15.1" start="clk_27.clk" end="timer_0.clk" />
<connection kind="clock" version="15.1" start="clk_27.clk" end="spi_0.clk" />
<connection <connection
kind="clock" kind="clock"
version="15.1" version="15.1"
@ -874,6 +821,11 @@
version="15.1" version="15.1"
start="clk_27.clk" start="clk_27.clk"
end="i2c_opencores_0.clock" /> end="i2c_opencores_0.clock" />
<connection
kind="clock"
version="15.1"
start="clk_27.clk"
end="i2c_opencores_1.clock" />
<connection <connection
kind="clock" kind="clock"
version="15.1" version="15.1"
@ -893,6 +845,13 @@
end="epcq_controller_0.interrupt_sender"> end="epcq_controller_0.interrupt_sender">
<parameter name="irqNumber" value="2" /> <parameter name="irqNumber" value="2" />
</connection> </connection>
<connection
kind="interrupt"
version="15.1"
start="nios2_qsys_0.irq"
end="i2c_opencores_1.interrupt_sender">
<parameter name="irqNumber" value="4" />
</connection>
<connection <connection
kind="interrupt" kind="interrupt"
version="15.1" version="15.1"
@ -907,13 +866,6 @@
end="timer_0.irq"> end="timer_0.irq">
<parameter name="irqNumber" value="0" /> <parameter name="irqNumber" value="0" />
</connection> </connection>
<connection
kind="interrupt"
version="15.1"
start="nios2_qsys_0.irq"
end="spi_0.irq">
<parameter name="irqNumber" value="4" />
</connection>
<connection <connection
kind="nios_custom_instruction" kind="nios_custom_instruction"
version="15.1" version="15.1"
@ -946,6 +898,11 @@
version="15.1" version="15.1"
start="clk_27.clk_reset" start="clk_27.clk_reset"
end="i2c_opencores_0.clock_reset" /> end="i2c_opencores_0.clock_reset" />
<connection
kind="reset"
version="15.1"
start="clk_27.clk_reset"
end="i2c_opencores_1.clock_reset" />
<connection <connection
kind="reset" kind="reset"
version="15.1" version="15.1"
@ -986,21 +943,11 @@
version="15.1" version="15.1"
start="clk_27.clk_reset" start="clk_27.clk_reset"
end="epcq_controller_0.reset" /> end="epcq_controller_0.reset" />
<connection
kind="reset"
version="15.1"
start="clk_27.clk_reset"
end="pio_5.reset" />
<connection <connection
kind="reset" kind="reset"
version="15.1" version="15.1"
start="clk_27.clk_reset" start="clk_27.clk_reset"
end="timer_0.reset" /> end="timer_0.reset" />
<connection
kind="reset"
version="15.1"
start="clk_27.clk_reset"
end="spi_0.reset" />
<connection <connection
kind="reset" kind="reset"
version="15.1" version="15.1"

File diff suppressed because it is too large Load Diff