Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
E
ezynq
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
Elphel
ezynq
Commits
fe897345
Commit
fe897345
authored
Sep 23, 2013
by
Andrey Filippov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
debugging, made generated lowlevel.c produce working image
parent
ea7d60dc
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
62 additions
and
22 deletions
+62
-22
ezynq_clk.py
ezynq_clk.py
+1
-1
ezynq_ddr.py
ezynq_ddr.py
+9
-1
ezynq_slcr_clk_def.py
ezynq_slcr_clk_def.py
+2
-2
ezynq_uboot.py
ezynq_uboot.py
+30
-10
ezynqcfg.py
ezynqcfg.py
+16
-4
test.mk
test.mk
+4
-4
No files found.
ezynq_clk.py
View file @
fe897345
...
...
@@ -893,7 +893,7 @@ class EzynqClk:
# reg uart_clk_ctrl, offs=0x154 dflt:0x3f03 actual: 0xa02
if
'UART'
in
self
.
iface_divs
:
print
self
.
iface_divs
[
'UART'
]
#
print self.iface_divs['UART']
if
self
.
iface_divs
[
'UART'
][
'PLL'
]
==
'ARM'
:
uart_srcsel
=
2
elif
self
.
iface_divs
[
'UART'
][
'PLL'
]
==
'DDR'
:
...
...
ezynq_ddr.py
View file @
fe897345
...
...
@@ -28,6 +28,7 @@ import ezynq_registers
import
ezynq_ddrcfg_defs
import
ezynq_feature_config
import
ezynq_ddriob_def
import
ezynq_slcr_clk_def
def
set_random_bits
(
old
,
d
,
bits
):
data
=
0
mask
=
0
...
...
@@ -44,7 +45,14 @@ class EzynqDDR:
self
.
features
=
ezynq_feature_config
.
EzynqFeatures
(
self
.
DDR_CFG_DEFS
,
0
)
#DDR_CFG_DEFS
self
.
ddrc_register_set
=
ezynq_registers
.
EzynqRegisters
(
self
.
DDRC_DEFS
,
0
,
regs_masked
,
permit_undefined_bits
)
self
.
ddriob_register_set
=
ezynq_registers
.
EzynqRegisters
(
self
.
DDRIOB_DEFS
,
0
,
regs_masked
,
permit_undefined_bits
)
def
generate_command_queue_empty
(
self
):
# generate code to be included in u-boot for testing DDR command queue
reg_set
=
ezynq_registers
.
EzynqRegisters
(
ezynq_slcr_clk_def
.
SLCR_CLK_DEFS
,
0
,[])
reg_set
.
wait_reg_field_values
(
'ddr_cmd_sta'
,
# DDR Command queue state
((
'cmd_q_empty'
,
0
)),
True
)
# 0 - no commands for DDRC are queued, 1 - commands pending
return
reg_set
.
get_register_sets
(
sort_addr
=
True
,
apply_new
=
True
)
def
parse_parameters
(
self
,
raw_configs
):
self
.
features
.
parse_features
(
raw_configs
)
...
...
ezynq_slcr_clk_def.py
View file @
fe897345
...
...
@@ -699,11 +699,11 @@ SLCR_CLK_DEFS={ #not all fields are defined currently
'FIELDS'
:{
'reserved'
:
{
'r'
:(
1
,
31
),
'd'
:
0
,
'c'
:
'reserved'
},
'start_ref'
:
{
'r'
:(
0
,
0
),
'd'
:
0
,
'c'
:
'1 - Start Refresh (self-clearing). Only needed if auto refresh is disabled in reg_ddrc_dis_auto_refresh'
}}},
'ddr_cmd_sta'
:
{
'OFFS'
:
0x618
,
'DFLT'
:
0
,
'R
O'
:
'RW
'
,
'ddr_cmd_sta'
:
{
'OFFS'
:
0x618
,
'DFLT'
:
0
,
'R
W'
:
'RO
'
,
'COMMENTS'
:
'DDR Command queue state'
,
'FIELDS'
:{
'reserved'
:
{
'r'
:(
1
,
31
),
'd'
:
0
,
'c'
:
'reserved'
},
'
vmd_q_empty'
:
{
'r'
:(
0
,
0
),
'd'
:
0
,
'm'
:
'R'
,
'c'
:
'0 - no commands fro
DDRC are queued, 1 - commands pending'
}}},
'
cmd_q_empty'
:
{
'r'
:(
0
,
0
),
'd'
:
0
,
'm'
:
'R'
,
'c'
:
'0 - no commands for
DDRC are queued, 1 - commands pending'
}}},
'ddr_urgent_sel'
:
{
'OFFS'
:
0x61c
,
'DFLT'
:
0
,
'RW'
:
'RW'
,
'COMMENTS'
:
'DDR Urgent select'
,
'FIELDS'
:{
...
...
ezynq_uboot.py
View file @
fe897345
...
...
@@ -330,14 +330,15 @@ void dump_ddrc_regs(void)
def
make_slcr_register_dump
(
self
):
self
.
sections
.
append
(
'slcr_dump'
)
self
.
cfile
+=
'''/* Dump all SLCR */
void dump_sl
x
r_regs(void)
void dump_sl
c
r_regs(void)
{
\t
uart_dump_regs(0xf8000000, 0xf8000b74, 16);
\t
uart_puts("
\\
r
\\
n");
}
'''
def
dci_calibration
(
self
,
reg_sets
,
ddr
):
#ddr is an instance of ezynq_ddr.EzynqDDR
def
dci_calibration
(
self
,
reg_sets
):
if
len
(
reg_sets
)
==
0
:
print
'No DCI calibration register data is provided, skipping generating dci_calibration()'
return
...
...
@@ -346,11 +347,12 @@ inline void dci_calibration(void)
{
\t
/* Toggle active-low DCI reset, initialize DCI calibration, wait for DONE */
'''
self
.
_add_reg_writes
(
reg_sets
)
self
.
cfile
+=
'}
\n\n
'
self
.
sections
.
append
(
'dci_calibration'
)
def
ddr_start
(
self
,
reg_sets
,
ddr
):
#ddr is an instance of ezynq_ddr.EzynqDDR
def
ddr_start
(
self
,
reg_sets
):
if
len
(
reg_sets
)
==
0
:
print
'No DDR start data is provided, skipping generating ddr_start()'
return
...
...
@@ -362,6 +364,17 @@ inline void ddr_start(void)
self
.
cfile
+=
'}
\n\n
'
self
.
sections
.
append
(
'ddr_start'
)
def
ddrc_wait_empty_queue
(
self
,
reg_sets
):
if
len
(
reg_sets
)
==
0
:
print
'No DDR start data is provided, skipping generating ddrc_status()'
return
self
.
cfile
+=
'''/* Verify there are no commands in DDRC queue pending */
inline void ddrc_wait_queue_empty(void)
{
'''
self
.
_add_reg_writes
(
reg_sets
)
self
.
cfile
+=
'}
\n\n
'
self
.
sections
.
append
(
'ddrc_status'
)
def
_cp_led
(
self
,
name
):
led_cp
=
self
.
features
.
get_par_value_or_none
(
name
)
...
...
@@ -407,10 +420,10 @@ void lowlevel_init(void)
self
.
_cp_led
(
'LED_CHECKPOINT_5'
)
# After UART is programmed
if
self
.
features
.
get_par_value_or_none
(
'DUMP_SLCR_EARLY'
):
self
.
cfile
+=
'
\t
uart_puts("SLCR registers before DCI/DDR initialization
\\
r
\\
n")
\n
'
self
.
cfile
+=
'
\t
uart_puts("SLCR registers before DCI/DDR initialization
\\
r
\\
n")
;
\n
'
self
.
cfile
+=
'
\t
dump_slcr_regs(); /*Dump all SLCR registers before DCI/DDR initialization */
\n
'
if
self
.
features
.
get_par_value_or_none
(
'DUMP_DDRC_EARLY'
):
self
.
cfile
+=
'
\t
uart_puts("DDRC registers before DCI/DDR initialization
\\
r
\\
n")
\n
'
self
.
cfile
+=
'
\t
uart_puts("DDRC registers before DCI/DDR initialization
\\
r
\\
n")
;
\n
'
self
.
cfile
+=
'
\t
dump_ddrc_regs(); /*Dump all DDRC registers before DCI/DDR initialization */
\n
'
self
.
cfile
+=
'''/*
Calibrate DDR DCI impedance and wait for completion
...
...
@@ -427,10 +440,10 @@ void lowlevel_init(void)
'''
self
.
_cp_led
(
'LED_CHECKPOINT_7'
)
# After DDR is initialized
if
self
.
features
.
get_par_value_or_none
(
'DUMP_SLCR_LATE'
):
self
.
cfile
+=
'
\t
uart_puts("SLCR registers after DCI/DDR initialization
\\
r
\\
n")
\n
'
self
.
cfile
+=
'
\t
uart_puts("SLCR registers after DCI/DDR initialization
\\
r
\\
n")
;
\n
'
self
.
cfile
+=
'
\t
dump_slcr_regs(); /*Dump all SLCR registers after DCI/DDR initialization */
\n
'
if
self
.
features
.
get_par_value_or_none
(
'DUMP_DDRC_LATE'
):
self
.
cfile
+=
'
\t
uart_puts("DDRC registers after DCI/DDR initialization
\\
r
\\
n")
\n
'
self
.
cfile
+=
'
\t
uart_puts("DDRC registers after DCI/DDR initialization
\\
r
\\
n")
;
\n
'
self
.
cfile
+=
'
\t
dump_ddrc_regs(); /*Dump all DDRC registers after DCI/DDR initialization */
\n
'
self
.
cfile
+=
'''/*
Copy 3 pages of OCM from 0x00000.0x2ffff to DDR 0x4000000.0x402ffff
...
...
@@ -440,9 +453,8 @@ void lowlevel_init(void)
\t
while (s< ((int *)0x30000)) *d++=*s++;
'''
# CONFIG_EZYNQ_LED_CHECKPOINT_10 = OFF # Before relocation down to address 0
# CONFIG_EZYNQ_LED_CHECKPOINT_11 = ON # After relocation down to address 0
# CONFIG_EZYNQ_LED_CHECKPOINT_12 = OFF # Before leaving lowlevel_init()
self
.
cfile
+=
'
\t
ddrc_wait_queue_empty(); /* Wait no commands are pending in DDRC queue */
\n
'
self
.
_cp_led
(
'LED_CHECKPOINT_8'
)
# Before relocation to DDR (to 0x4000000+ )
self
.
cfile
+=
'''/*
Now jump to the same instruction in the DDR copy of the currently executed code in OCM
...
...
@@ -452,6 +464,8 @@ void lowlevel_init(void)
\t
asm("add pc, pc, #0x4000000" );
'''
# seems some delay is needed before remapping DDR memory
self
.
cfile
+=
'
\t
ddrc_wait_queue_empty(); /* seems some delay is needed here before remapping DDR memory */
\n
'
self
.
_cp_led
(
'LED_CHECKPOINT_9'
)
# After relocation to DDR (to 0x4000000+ )
self
.
cfile
+=
'''/*
Remap DDR to zero, FILTERSTART
...
...
@@ -479,6 +493,9 @@ void lowlevel_init(void)
\t
s= (int *) 0x4000000;
\t
d= (int *) 0;
\t
while (d < ((int *) 0x30000)) *d++=*s++;
\t
ddrc_wait_queue_empty(); /* Wait no commands are pending in DDRC queue */
/*
Continue with the original low-level init, Now we have 2 copies of the code again,
currently executing somewhere above 0x4000000. But as soon as we will return
...
...
@@ -493,6 +510,9 @@ void lowlevel_init(void)
\t
/* Urgent write, ports S2/S3 */
\t
writel(0xC, &slcr_base->ddr_urgent);
'''
if
'uart_xmit'
in
self
.
sections
:
self
.
cfile
+=
'
\t
uart_wait_tx_fifo_empty(); /* u-boot may re-program UART differently, wait all is sent before getting there */
\n
'
#uart_wait_tx_fifo_empty() - add if u-boot debug is on
self
.
_cp_led
(
'LED_CHECKPOINT_12'
)
# Before leaving lowlevel_init()
self
.
cfile
+=
'''/* Lock SLCR back after everything with it is done */
\t
lock_slcr();
...
...
ezynqcfg.py
View file @
fe897345
...
...
@@ -354,7 +354,6 @@ if raw_config_value('CONFIG_EZYNQ_SKIP_DDR', raw_configs) is None:
segments
.
append
({
'TO'
:
len
(
reg_sets
),
'RBL'
:
True
,
'NAME'
:
'DDR0'
,
'TITLE'
:
'DDR registers configuration'
})
else
:
print
'Debug mode: skipping DDR-related configuration'
#initialize clocks
# unlock slcr - it is locked by RBL, but attempt to unlock in RBL will fail (and hang the system)
reg_sets
=
clk
.
clocks_regs_setup
(
reg_sets
,
force
)
...
...
@@ -405,6 +404,14 @@ if not led_debug_mio_pin is None:
reg_sets_led
=
mio_regs
.
generate_led_off_on
(
led_debug_mio_pin
)
reg_sets
.
extend
(
reg_sets_led
)
# just to be listed, not to be loaded
segments
.
append
({
'TO'
:
len
(
reg_sets
),
'RBL'
:
False
,
'NAME'
:
'LED'
,
'TITLE'
:
'registers/data to turn on/off debug LED - listed out of sequence'
})
#add code to check DDRC status (no commands in queue)
reg_sets_ddrc_sta
=
ddr
.
generate_command_queue_empty
()
reg_sets
.
extend
(
reg_sets_ddrc_sta
)
# just to be listed, not to be loaded
segments
.
append
({
'TO'
:
len
(
reg_sets
),
'RBL'
:
False
,
'NAME'
:
'DDRC_STA'
,
'TITLE'
:
'resgister to test DDRC comamnd queue status - listed out of sequence'
})
# def generate_led_off_on(self, mio_pin):
#CONFIG_EZYNQ_LED_DEBUG=47 # toggle LED during boot
#CONFIG_EZYNQ_BOOT_DEBUG
...
...
@@ -504,9 +511,14 @@ if 'UART_XMIT' in segment_dict:
#if not u_boot.features.get_par_value_or_none('BOOT_DEBUG') is None:
if
'DCI'
in
segment_dict
:
u_boot
.
dci_calibration
(
reg_sets
[
segment_dict
[
'DCI'
][
'FROM'
]:
segment_dict
[
'DCI'
][
'TO'
]],
ddr
)
if
'DDR'
in
segment_dict
:
u_boot
.
ddr_start
(
reg_sets
[
segment_dict
[
'DDR'
][
'FROM'
]:
segment_dict
[
'DDR'
][
'TO'
]],
ddr
)
u_boot
.
dci_calibration
(
reg_sets
[
segment_dict
[
'DCI'
][
'FROM'
]:
segment_dict
[
'DCI'
][
'TO'
]])
if
'DDR_START'
in
segment_dict
:
u_boot
.
ddr_start
(
reg_sets
[
segment_dict
[
'DDR_START'
][
'FROM'
]:
segment_dict
[
'DDR_START'
][
'TO'
]])
if
'DDRC_STA'
in
segment_dict
:
u_boot
.
ddrc_wait_empty_queue
(
reg_sets
[
segment_dict
[
'DDRC_STA'
][
'FROM'
]:
segment_dict
[
'DDRC_STA'
][
'TO'
]])
#segments.append({'TO':len(reg_sets),'RBL':False,'NAME':'DDRC_STA','TITLE':'resgister to test DDRC comamnd queue status - listed out of sequence'})
u_boot
.
make_lowlevel_init
()
u_boot
.
output_c_file
(
args
.
lowlevel
)
#print u_boot.get_c_file()
test.mk
View file @
fe897345
...
...
@@ -10,10 +10,10 @@ CONFIG_EZYNQ_DUMP_DDRC_LATE = y # Dump DDRC registers after DDR memory is initia
#Turning LED on/off at different stages of the boot process. Requires CONFIG_EZYNQ_LED_DEBUG to be set
#If defined, each can be 0,1, ON or OFF
CONFIG_EZYNQ_LED_CHECKPOINT_1 = ON # in RBL setup, as soon as MIO is programmed
#
CONFIG_EZYNQ_LED_CHECKPOINT_2 = OFF # First after getting to user code
#
CONFIG_EZYNQ_LED_CHECKPOINT_3 = ON # After setting clock registers
#
CONFIG_EZYNQ_LED_CHECKPOINT_4 = OFF # After PLL bypass is OFF
#
CONFIG_EZYNQ_LED_CHECKPOINT_5 = ON # After UART is programmed
CONFIG_EZYNQ_LED_CHECKPOINT_2 = OFF # First after getting to user code
CONFIG_EZYNQ_LED_CHECKPOINT_3 = ON # After setting clock registers
CONFIG_EZYNQ_LED_CHECKPOINT_4 = OFF # After PLL bypass is OFF
CONFIG_EZYNQ_LED_CHECKPOINT_5 = ON # After UART is programmed
CONFIG_EZYNQ_LED_CHECKPOINT_6 = OFF # After DCI is calibrated
CONFIG_EZYNQ_LED_CHECKPOINT_7 = ON # After DDR is initialized
CONFIG_EZYNQ_LED_CHECKPOINT_8 = OFF # Before relocation to DDR (to 0x4000000+ )
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment