summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--c/src/lib/libbsp/m68k/uC5282/ChangeLog9
-rw-r--r--c/src/lib/libbsp/m68k/uC5282/README355
-rw-r--r--c/src/lib/libbsp/m68k/uC5282/TIMES322
-rw-r--r--c/src/lib/libbsp/m68k/uC5282/startup/bspstart.c71
-rw-r--r--c/src/lib/libbsp/m68k/uC5282/startup/linkcmds11
5 files changed, 442 insertions, 326 deletions
diff --git a/c/src/lib/libbsp/m68k/uC5282/ChangeLog b/c/src/lib/libbsp/m68k/uC5282/ChangeLog
index 19239b1249..bc68423326 100644
--- a/c/src/lib/libbsp/m68k/uC5282/ChangeLog
+++ b/c/src/lib/libbsp/m68k/uC5282/ChangeLog
@@ -1,3 +1,12 @@
+2011-02-17 Till Straumann <strauman@slac.stanford.edu>
+
+ PR 1738/bsps
+ * README, startup/bspstart.c, startup/linkcmds: Add support for dynamic
+ clock speed determination. This algorithm is described in the README
+ file. The output of the RTEMS Timing Tests was moved to TIMES to
+ signicantly shrink the README.
+ * TIMES: New file.
+
2011-02-11 Ralf Corsépius <ralf.corsepius@rtems.org>
* clock/clock.c, startup/bspstart.c, startup/init5282.c:
diff --git a/c/src/lib/libbsp/m68k/uC5282/README b/c/src/lib/libbsp/m68k/uC5282/README
index b8e49d247c..5609b0eb66 100644
--- a/c/src/lib/libbsp/m68k/uC5282/README
+++ b/c/src/lib/libbsp/m68k/uC5282/README
@@ -25,9 +25,9 @@ TODO:
The bsp relies on the Arcturus monitor to set up DRAM and all chip selects.
This seems OK to me, but others may find it lame.....
-I/O pin restrictions make simultaneous operation
-of I2C, CAN and UART2 impossible. The BSP configures UART2 to
-use the CAN pins and leaves the I2C pins available for use.
+I/O pin restrictions make simultaneous operation of I2C, CAN and UART2
+impossible. The BSP configures UART2 to use the CAN pins and leaves
+the I2C pins available for use.
BSP NAME: uC5282
BOARD: Arcturus Netrworks uCdimm 5282
@@ -100,6 +100,37 @@ port into RAM then executed or programmed into flash memory.
6) Type 'goram<CR>' to start the downloaded program, or type 'program<CR>'
to burn the code onto the uCDIMM flash.
+Clock Speed Determination Algorithm
+===================================
+Till Straumann submitted a patch to provide more dynamic clock speed
+selection.
+
+Currently, the uC5282 BSP requires relinking the application with a
+special linker flag in order to make it work with 80MHz boards (breaking
+run-time compatibility with 64MHz variants).
+
+The change aims adds support for run-time guessing/setting of
+the system-clock frequency:
+
+1) If uCbootloader environment variable SYS_CLOCK_SPEED is set to a
+non-zero number then the BSP assumes this number to specify the clock
+frequency in Hz.
+
+2) If 1) yields no non-zero frequency then the linker-provided symbol
+_CPUClockSpeed is assumed to specify the clock frequency (in Hz). This
+is the traditional behavior but the default value of _CPUClockSpeed
+was changed from 64000000 to 0 (in order to let step 3) do it's work
+by default).
+
+3) If neither 1) nor 2) yield a non-zero frequency then assume a PLL
+reference frequency (in Hz) as defined by the linker-provided symbol
+'_PLLRefClockSpeed' (which defaults to 8000000) and compute the system
+clock frequency from the divisor/multiplier settings in the SYNCR
+register.
+
+We have both, 64MHz and 80MHz variants and both use a PLL reference of
+8MHz so that run-time heuristics + detection 3) work fine.
+
EPICS Bootstrap Information
===========================
The EPICS startup code uses the following environment variables. If an
@@ -207,321 +238,3 @@ External interrupt lines (priority is fixed between 3 and 4):
============================================================================
-TIMING TESTS 2005-01-28
-========================
-
-*** TIME TEST 1 ***
-rtems_semaphore_create 19
-rtems_semaphore_delete 21
-rtems_semaphore_obtain: available 4
-rtems_semaphore_obtain: not available -- NO_WAIT 5
-rtems_semaphore_release: no waiting tasks 12
-*** END OF TEST 1 ***
-
-*** TIME TEST 2 ***
-rtems_semaphore_obtain: not available -- caller blocks 34
-*** END OF TEST 2 ***
-
-*** TIME TEST 3 ***
-rtems_semaphore_release: task readied -- preempts caller 27
-*** END OF TEST 3 ***
-
-*** TIME TEST 4 ***
-rtems_task_restart: blocked task -- preempts caller 54
-rtems_task_restart: ready task -- preempts caller 52
-rtems_semaphore_release: task readied -- returns to caller 18
-rtems_task_create 87
-rtems_task_start 24
-rtems_task_restart: suspended task -- returns to caller 27
-rtems_task_delete: suspended task 66
-rtems_task_restart: ready task -- returns to caller 28
-rtems_task_restart: blocked task -- returns to caller 38
-rtems_task_delete: blocked task 69
-*** END OF TEST 4 ***
-
-*** TIME TEST 5 ***
-rtems_task_suspend: calling task 23
-rtems_task_resume: task readied -- preempts caller 22
-*** END OF TEST 5 ***
-
-*** TIME TEST 6 ***
-rtems_task_restart: calling task 30
-rtems_task_suspend: returns to caller 9
-rtems_task_resume: task readied -- returns to caller 12
-rtems_task_delete: ready task 69
-*** END OF TEST 6 ***
-
-*** TIME TEST 7 ***
-rtems_task_restart: suspended task -- preempts caller 44
-*** END OF TEST 7 ***
-
-*** TIME TEST 8 ***
-rtems_task_set_priority: obtain current priority 6
-rtems_task_set_priority: returns to caller 17
-rtems_task_mode: obtain current mode 3
-rtems_task_mode: no reschedule 3
-rtems_task_mode: reschedule -- returns to caller 8
-rtems_task_mode: reschedule -- preempts caller 22
-rtems_task_set_note 6
-rtems_task_get_note 6
-rtems_clock_set 22
-rtems_clock_get 1
-*** END OF TEST 8 ***
-
-*** TIME TEST 9 ***
-rtems_message_queue_create 55
-rtems_message_queue_send: no waiting tasks 20
-rtems_message_queue_urgent: no waiting tasks 21
-rtems_message_queue_receive: available 20
-rtems_message_queue_flush: no messages flushed 8
-rtems_message_queue_flush: messages flushed 12
-rtems_message_queue_delete 29
-*** END OF TEST 9 ***
-
-*** TIME TEST 10 ***
-rtems_message_queue_receive: not available -- NO_WAIT 10
-rtems_message_queue_receive: not available -- caller blocks 38
-*** END OF TEST 10 ***
-
-*** TIME TEST 11 ***
-rtems_message_queue_send: task readied -- preempts caller 37
-*** END OF TEST 11 ***
-
-*** TIME TEST 12 ***
-rtems_message_queue_send: task readied -- returns to caller 23
-*** END OF TEST 12 ***
-
-*** TIME TEST 13 ***
-rtems_message_queue_urgent: task readied -- preempts caller 35
-*** END OF TEST 13 ***
-
-*** TIME TEST 14 ***
-rtems_message_queue_urgent: task readied -- returns to caller 24
-*** END OF TEST 14 ***
-
-*** TIME TEST 15 ***
-rtems_event_receive: obtain current events 0
-rtems_event_receive: not available -- NO_WAIT 5
-rtems_event_receive: not available -- caller blocks 28
-rtems_event_send: no task readied 5
-rtems_event_receive: available 9
-rtems_event_send: task readied -- returns to caller 16
-*** END OF TEST 15 ***
-
-*** TIME TEST 16 ***
-rtems_event_send: task readied -- preempts caller 27
-*** END OF TEST 16 ***
-
-*** TIME TEST 17 ***
-rtems_task_set_priority: preempts caller 39
-*** END OF TEST 17 ***
-
-*** TIME TEST 18 ***
-rtems_task_delete: calling task 83
-*** END OF TEST 18 ***
-
-*** TIME TEST 19 ***
-rtems_signal_catch 5
-rtems_signal_send: returns to caller 12
-rtems_signal_send: signal to self 20
-exit ASR overhead: returns to calling task 15
-exit ASR overhead: returns to preempting task 18
-*** END OF TEST 19 ***
-
-*** TIME TEST 20 ***
-rtems_partition_create 20
-rtems_region_create 40
-rtems_partition_get_buffer: available 11
-rtems_partition_get_buffer: not available 7
-rtems_partition_return_buffer 12
-rtems_partition_delete 11
-rtems_region_get_segment: available 28
-rtems_region_get_segment: not available -- NO_WAIT 29
-rtems_region_return_segment: no waiting tasks 29
-rtems_region_get_segment: not available -- caller blocks 55
-rtems_region_return_segment: task readied -- preempts caller 72
-rtems_region_return_segment: task readied -- returns to caller 58
-rtems_region_delete 25
-rtems_io_initialize 1
-rtems_io_open 1
-rtems_io_close 1
-rtems_io_read 1
-rtems_io_write 1
-rtems_io_control 1
-*** END OF TEST 20 ***
-
-*** TIME TEST 21 ***
-rtems_task_ident 60
-rtems_message_queue_ident 60
-rtems_semaphore_ident 69
-rtems_partition_ident 59
-rtems_region_ident 60
-rtems_port_ident 59
-rtems_timer_ident 61
-rtems_rate_monotonic_ident 60
-*** END OF TEST 21 ***
-
-*** TIME TEST 22 ***
-rtems_message_queue_broadcast: task readied -- returns to caller 32
-rtems_message_queue_broadcast: no waiting tasks 14
-rtems_message_queue_broadcast: task readied -- preempts caller 39
-*** END OF TEST 22 ***
-
-*** TIME TEST 23 ***
-rtems_timer_create 8
-rtems_timer_fire_after: inactive 12
-rtems_timer_fire_after: active 12
-rtems_timer_cancel: active 9
-rtems_timer_cancel: inactive 8
-rtems_timer_reset: inactive 14
-rtems_timer_reset: active 15
-rtems_timer_fire_when: inactive 21
-rtems_timer_fire_when: active 21
-rtems_timer_delete: active 12
-rtems_timer_delete: inactive 11
-rtems_task_wake_when 35
-*** END OF TEST 23 ***
-
-*** TIME TEST 24 ***
-rtems_task_wake_after: yield -- returns to caller 3
-rtems_task_wake_after: yields -- preempts caller 18
-*** END OF TEST 24 ***
-
-*** TIME TEST 25 ***
-rtems_clock_tick 7
-*** END OF TEST 25 ***
-
-*** TIME TEST 26 ***
-_ISR_Disable 1
-_ISR_Flash 0
-_ISR_Enable 0
-_Thread_Disable_dispatch 1
-_Thread_Enable_dispatch 3
-_Thread_Set_state 7
-_Thread_Disptach (NO FP) 16
-context switch: no floating point contexts 12
-context switch: self 2
-context switch: to another task 1
-fp context switch: restore 1st FP task 14
-fp context switch: save idle, restore initialized 3
-fp context switch: save idle, restore idle 13
-fp context switch: save initialized, restore initialized 2
-_Thread_Resume 7
-_Thread_Unblock 6
-_Thread_Ready 5
-_Thread_Get 1
-_Semaphore_Get 1
-_Thread_Get: invalid id 0
-*** END OF TEST 26 ***
-
-*** TIME TEST 27 ***
-interrupt entry overhead: returns to interrupted task 3
-interrupt exit overhead: returns to interrupted task 3
-interrupt entry overhead: returns to nested interrupt 2
-interrupt exit overhead: returns to nested interrupt 2
-interrupt entry overhead: returns to preempting task 4
-interrupt exit overhead: returns to preempting task 20
-*** END OF TEST 27 ***
-
-*** TIME TEST 28 ***
-rtems_port_create 12
-rtems_port_external_to_internal 5
-rtems_port_internal_to_external 6
-rtems_port_delete 12
-*** END OF TEST 28 ***
-
-*** TIME TEST 29 ***
-rtems_rate_monotonic_create 13
-rtems_rate_monotonic_period: initiate period -- returns to caller 20
-rtems_rate_monotonic_period: obtain status 10
-rtems_rate_monotonic_cancel 13
-rtems_rate_monotonic_delete: inactive 17
-rtems_rate_monotonic_delete: active 16
-rtems_rate_monotonic_period: conclude periods -- caller blocks 24
-*** END OF TEST 29 ***
-
-*** TIME CHECKER ***
-Units may not be in microseconds for this test!!!
-0 100000
-Total time = 0
-Average time = 0
-NULL timer stopped at 0
-LOOP (1000) timer stopped at 188
-LOOP (10000) timer stopped at 1875
-LOOP (50000) timer stopped at 9375
-LOOP (100000) timer stopped at 18750
-*** END OF TIME CHECKER ***
-
-*** TIME TEST OVERHEAD ***
-rtems_initialize_executive 0
-rtems_shutdown_executive 0
-rtems_task_create 0
-rtems_task_ident 0
-rtems_task_start 0
-rtems_task_restart 0
-rtems_task_delete 0
-rtems_task_suspend 0
-rtems_task_resume 0
-rtems_task_set_priority 0
-rtems_task_mode 0
-rtems_task_get_note 0
-rtems_task_set_note 0
-rtems_task_wake_when 1
-rtems_task_wake_after 0
-rtems_interrupt_catch 0
-rtems_clock_get 1
-rtems_clock_set 1
-rtems_clock_tick 0
-rtems_timer_create 0
-rtems_timer_delete 0
-rtems_timer_ident 0
-rtems_timer_fire_after 1
-rtems_timer_fire_when 1
-rtems_timer_reset 0
-rtems_timer_cancel 0
-rtems_semaphore_create 0
-rtems_semaphore_delete 0
-rtems_semaphore_ident 0
-rtems_semaphore_obtain 0
-rtems_semaphore_release 0
-rtems_message_queue_create 0
-rtems_message_queue_ident 0
-rtems_message_queue_delete 0
-rtems_message_queue_send 0
-rtems_message_queue_urgent 0
-rtems_message_queue_broadcast 0
-rtems_message_queue_receive 0
-rtems_message_queue_flush 0
-rtems_event_send 0
-rtems_event_receive 0
-rtems_signal_catch 0
-rtems_signal_send 0
-rtems_partition_create 0
-rtems_partition_ident 0
-rtems_partition_delete 0
-rtems_partition_get_buffer 0
-rtems_partition_return_buffer 0
-rtems_region_create 0
-rtems_region_ident 0
-rtems_region_delete 0
-rtems_region_get_segment 0
-rtems_region_return_segment 0
-rtems_port_create 0
-rtems_port_ident 0
-rtems_port_delete 0
-rtems_port_external_to_internal 0
-rtems_port_internal_to_external 0
-rtems_io_initialize 0
-rtems_io_open 0
-rtems_io_close 0
-rtems_io_read 0
-rtems_io_write 0
-rtems_io_control 0
-rtems_fatal_error_occurred 0
-rtems_rate_monotonic_create 0
-rtems_rate_monotonic_ident 0
-rtems_rate_monotonic_delete 0
-rtems_rate_monotonic_cancel 0
-rtems_rate_monotonic_period 0
-rtems_multiprocessing_announce 0
-*** END OF TIME OVERHEAD ***
diff --git a/c/src/lib/libbsp/m68k/uC5282/TIMES b/c/src/lib/libbsp/m68k/uC5282/TIMES
new file mode 100644
index 0000000000..e70166cbc6
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/uC5282/TIMES
@@ -0,0 +1,322 @@
+#
+# $Id$
+#
+
+TIMING TESTS 2005-01-28
+========================
+
+*** TIME TEST 1 ***
+rtems_semaphore_create 19
+rtems_semaphore_delete 21
+rtems_semaphore_obtain: available 4
+rtems_semaphore_obtain: not available -- NO_WAIT 5
+rtems_semaphore_release: no waiting tasks 12
+*** END OF TEST 1 ***
+
+*** TIME TEST 2 ***
+rtems_semaphore_obtain: not available -- caller blocks 34
+*** END OF TEST 2 ***
+
+*** TIME TEST 3 ***
+rtems_semaphore_release: task readied -- preempts caller 27
+*** END OF TEST 3 ***
+
+*** TIME TEST 4 ***
+rtems_task_restart: blocked task -- preempts caller 54
+rtems_task_restart: ready task -- preempts caller 52
+rtems_semaphore_release: task readied -- returns to caller 18
+rtems_task_create 87
+rtems_task_start 24
+rtems_task_restart: suspended task -- returns to caller 27
+rtems_task_delete: suspended task 66
+rtems_task_restart: ready task -- returns to caller 28
+rtems_task_restart: blocked task -- returns to caller 38
+rtems_task_delete: blocked task 69
+*** END OF TEST 4 ***
+
+*** TIME TEST 5 ***
+rtems_task_suspend: calling task 23
+rtems_task_resume: task readied -- preempts caller 22
+*** END OF TEST 5 ***
+
+*** TIME TEST 6 ***
+rtems_task_restart: calling task 30
+rtems_task_suspend: returns to caller 9
+rtems_task_resume: task readied -- returns to caller 12
+rtems_task_delete: ready task 69
+*** END OF TEST 6 ***
+
+*** TIME TEST 7 ***
+rtems_task_restart: suspended task -- preempts caller 44
+*** END OF TEST 7 ***
+
+*** TIME TEST 8 ***
+rtems_task_set_priority: obtain current priority 6
+rtems_task_set_priority: returns to caller 17
+rtems_task_mode: obtain current mode 3
+rtems_task_mode: no reschedule 3
+rtems_task_mode: reschedule -- returns to caller 8
+rtems_task_mode: reschedule -- preempts caller 22
+rtems_task_set_note 6
+rtems_task_get_note 6
+rtems_clock_set 22
+rtems_clock_get 1
+*** END OF TEST 8 ***
+
+*** TIME TEST 9 ***
+rtems_message_queue_create 55
+rtems_message_queue_send: no waiting tasks 20
+rtems_message_queue_urgent: no waiting tasks 21
+rtems_message_queue_receive: available 20
+rtems_message_queue_flush: no messages flushed 8
+rtems_message_queue_flush: messages flushed 12
+rtems_message_queue_delete 29
+*** END OF TEST 9 ***
+
+*** TIME TEST 10 ***
+rtems_message_queue_receive: not available -- NO_WAIT 10
+rtems_message_queue_receive: not available -- caller blocks 38
+*** END OF TEST 10 ***
+
+*** TIME TEST 11 ***
+rtems_message_queue_send: task readied -- preempts caller 37
+*** END OF TEST 11 ***
+
+*** TIME TEST 12 ***
+rtems_message_queue_send: task readied -- returns to caller 23
+*** END OF TEST 12 ***
+
+*** TIME TEST 13 ***
+rtems_message_queue_urgent: task readied -- preempts caller 35
+*** END OF TEST 13 ***
+
+*** TIME TEST 14 ***
+rtems_message_queue_urgent: task readied -- returns to caller 24
+*** END OF TEST 14 ***
+
+*** TIME TEST 15 ***
+rtems_event_receive: obtain current events 0
+rtems_event_receive: not available -- NO_WAIT 5
+rtems_event_receive: not available -- caller blocks 28
+rtems_event_send: no task readied 5
+rtems_event_receive: available 9
+rtems_event_send: task readied -- returns to caller 16
+*** END OF TEST 15 ***
+
+*** TIME TEST 16 ***
+rtems_event_send: task readied -- preempts caller 27
+*** END OF TEST 16 ***
+
+*** TIME TEST 17 ***
+rtems_task_set_priority: preempts caller 39
+*** END OF TEST 17 ***
+
+*** TIME TEST 18 ***
+rtems_task_delete: calling task 83
+*** END OF TEST 18 ***
+
+*** TIME TEST 19 ***
+rtems_signal_catch 5
+rtems_signal_send: returns to caller 12
+rtems_signal_send: signal to self 20
+exit ASR overhead: returns to calling task 15
+exit ASR overhead: returns to preempting task 18
+*** END OF TEST 19 ***
+
+*** TIME TEST 20 ***
+rtems_partition_create 20
+rtems_region_create 40
+rtems_partition_get_buffer: available 11
+rtems_partition_get_buffer: not available 7
+rtems_partition_return_buffer 12
+rtems_partition_delete 11
+rtems_region_get_segment: available 28
+rtems_region_get_segment: not available -- NO_WAIT 29
+rtems_region_return_segment: no waiting tasks 29
+rtems_region_get_segment: not available -- caller blocks 55
+rtems_region_return_segment: task readied -- preempts caller 72
+rtems_region_return_segment: task readied -- returns to caller 58
+rtems_region_delete 25
+rtems_io_initialize 1
+rtems_io_open 1
+rtems_io_close 1
+rtems_io_read 1
+rtems_io_write 1
+rtems_io_control 1
+*** END OF TEST 20 ***
+
+*** TIME TEST 21 ***
+rtems_task_ident 60
+rtems_message_queue_ident 60
+rtems_semaphore_ident 69
+rtems_partition_ident 59
+rtems_region_ident 60
+rtems_port_ident 59
+rtems_timer_ident 61
+rtems_rate_monotonic_ident 60
+*** END OF TEST 21 ***
+
+*** TIME TEST 22 ***
+rtems_message_queue_broadcast: task readied -- returns to caller 32
+rtems_message_queue_broadcast: no waiting tasks 14
+rtems_message_queue_broadcast: task readied -- preempts caller 39
+*** END OF TEST 22 ***
+
+*** TIME TEST 23 ***
+rtems_timer_create 8
+rtems_timer_fire_after: inactive 12
+rtems_timer_fire_after: active 12
+rtems_timer_cancel: active 9
+rtems_timer_cancel: inactive 8
+rtems_timer_reset: inactive 14
+rtems_timer_reset: active 15
+rtems_timer_fire_when: inactive 21
+rtems_timer_fire_when: active 21
+rtems_timer_delete: active 12
+rtems_timer_delete: inactive 11
+rtems_task_wake_when 35
+*** END OF TEST 23 ***
+
+*** TIME TEST 24 ***
+rtems_task_wake_after: yield -- returns to caller 3
+rtems_task_wake_after: yields -- preempts caller 18
+*** END OF TEST 24 ***
+
+*** TIME TEST 25 ***
+rtems_clock_tick 7
+*** END OF TEST 25 ***
+
+*** TIME TEST 26 ***
+_ISR_Disable 1
+_ISR_Flash 0
+_ISR_Enable 0
+_Thread_Disable_dispatch 1
+_Thread_Enable_dispatch 3
+_Thread_Set_state 7
+_Thread_Disptach (NO FP) 16
+context switch: no floating point contexts 12
+context switch: self 2
+context switch: to another task 1
+fp context switch: restore 1st FP task 14
+fp context switch: save idle, restore initialized 3
+fp context switch: save idle, restore idle 13
+fp context switch: save initialized, restore initialized 2
+_Thread_Resume 7
+_Thread_Unblock 6
+_Thread_Ready 5
+_Thread_Get 1
+_Semaphore_Get 1
+_Thread_Get: invalid id 0
+*** END OF TEST 26 ***
+
+*** TIME TEST 27 ***
+interrupt entry overhead: returns to interrupted task 3
+interrupt exit overhead: returns to interrupted task 3
+interrupt entry overhead: returns to nested interrupt 2
+interrupt exit overhead: returns to nested interrupt 2
+interrupt entry overhead: returns to preempting task 4
+interrupt exit overhead: returns to preempting task 20
+*** END OF TEST 27 ***
+
+*** TIME TEST 28 ***
+rtems_port_create 12
+rtems_port_external_to_internal 5
+rtems_port_internal_to_external 6
+rtems_port_delete 12
+*** END OF TEST 28 ***
+
+*** TIME TEST 29 ***
+rtems_rate_monotonic_create 13
+rtems_rate_monotonic_period: initiate period -- returns to caller 20
+rtems_rate_monotonic_period: obtain status 10
+rtems_rate_monotonic_cancel 13
+rtems_rate_monotonic_delete: inactive 17
+rtems_rate_monotonic_delete: active 16
+rtems_rate_monotonic_period: conclude periods -- caller blocks 24
+*** END OF TEST 29 ***
+
+*** TIME CHECKER ***
+Units may not be in microseconds for this test!!!
+0 100000
+Total time = 0
+Average time = 0
+NULL timer stopped at 0
+LOOP (1000) timer stopped at 188
+LOOP (10000) timer stopped at 1875
+LOOP (50000) timer stopped at 9375
+LOOP (100000) timer stopped at 18750
+*** END OF TIME CHECKER ***
+
+*** TIME TEST OVERHEAD ***
+rtems_initialize_executive 0
+rtems_shutdown_executive 0
+rtems_task_create 0
+rtems_task_ident 0
+rtems_task_start 0
+rtems_task_restart 0
+rtems_task_delete 0
+rtems_task_suspend 0
+rtems_task_resume 0
+rtems_task_set_priority 0
+rtems_task_mode 0
+rtems_task_get_note 0
+rtems_task_set_note 0
+rtems_task_wake_when 1
+rtems_task_wake_after 0
+rtems_interrupt_catch 0
+rtems_clock_get 1
+rtems_clock_set 1
+rtems_clock_tick 0
+rtems_timer_create 0
+rtems_timer_delete 0
+rtems_timer_ident 0
+rtems_timer_fire_after 1
+rtems_timer_fire_when 1
+rtems_timer_reset 0
+rtems_timer_cancel 0
+rtems_semaphore_create 0
+rtems_semaphore_delete 0
+rtems_semaphore_ident 0
+rtems_semaphore_obtain 0
+rtems_semaphore_release 0
+rtems_message_queue_create 0
+rtems_message_queue_ident 0
+rtems_message_queue_delete 0
+rtems_message_queue_send 0
+rtems_message_queue_urgent 0
+rtems_message_queue_broadcast 0
+rtems_message_queue_receive 0
+rtems_message_queue_flush 0
+rtems_event_send 0
+rtems_event_receive 0
+rtems_signal_catch 0
+rtems_signal_send 0
+rtems_partition_create 0
+rtems_partition_ident 0
+rtems_partition_delete 0
+rtems_partition_get_buffer 0
+rtems_partition_return_buffer 0
+rtems_region_create 0
+rtems_region_ident 0
+rtems_region_delete 0
+rtems_region_get_segment 0
+rtems_region_return_segment 0
+rtems_port_create 0
+rtems_port_ident 0
+rtems_port_delete 0
+rtems_port_external_to_internal 0
+rtems_port_internal_to_external 0
+rtems_io_initialize 0
+rtems_io_open 0
+rtems_io_close 0
+rtems_io_read 0
+rtems_io_write 0
+rtems_io_control 0
+rtems_fatal_error_occurred 0
+rtems_rate_monotonic_create 0
+rtems_rate_monotonic_ident 0
+rtems_rate_monotonic_delete 0
+rtems_rate_monotonic_cancel 0
+rtems_rate_monotonic_period 0
+rtems_multiprocessing_announce 0
+*** END OF TIME OVERHEAD ***
diff --git a/c/src/lib/libbsp/m68k/uC5282/startup/bspstart.c b/c/src/lib/libbsp/m68k/uC5282/startup/bspstart.c
index 64bc416e9b..de65280e1b 100644
--- a/c/src/lib/libbsp/m68k/uC5282/startup/bspstart.c
+++ b/c/src/lib/libbsp/m68k/uC5282/startup/bspstart.c
@@ -22,6 +22,7 @@
#include <rtems/error.h>
#include <errno.h>
#include <stdio.h>
+#include <mcf5282/mcf5282.h>
/*
* Location of 'VME' access
@@ -34,7 +35,11 @@
*/
extern char RamSize[];
extern char RamBase[];
+extern char _CPUClockSpeed[];
+extern char _PLLRefClockSpeed[];
+uint32_t BSP_sys_clk_speed = (uint32_t)_CPUClockSpeed;
+uint32_t BSP_pll_ref_clock = (uint32_t)_PLLRefClockSpeed;
/*
* CPU-space access
* The NOP after writing the CACR is there to address the following issue as
@@ -236,7 +241,9 @@ static void handler(int pc)
*/
void bsp_start( void )
{
- int i;
+ int i;
+ const char *clk_speed_str;
+ uint32_t clk_speed, mfd, rfd;
/*
* Set up default exception handler
@@ -299,13 +306,69 @@ void bsp_start( void )
MCF5282_CS_CSMR_V;
MCF5282_CS2_CSCR = MCF5282_CS_CSCR_PS_16;
MCF5282_GPIO_PJPAR |= 0x06;
-}
-extern char _CPUClockSpeed[];
+ /*
+ * Hopefully, the UART clock is still correctly set up
+ * so they can see the printk() output...
+ */
+ clk_speed = 0;
+ printk("Trying to figure out the system clock\n");
+ printk("Checking ENV variable SYS_CLOCK_SPEED:\n");
+ if ( (clk_speed_str = bsp_getbenv("SYS_CLOCK_SPEED")) ) {
+ printk("Found: %s\n", clk_speed_str);
+ for ( clk_speed = 0, i=0;
+ clk_speed_str[i] >= '0' && clk_speed_str[i] <= '9';
+ i++ ) {
+ clk_speed = 10*clk_speed + clk_speed_str[i] - '0';
+ }
+ if ( 0 != clk_speed_str[i] ) {
+ printk("Not a decimal number; I'm not using this setting\n");
+ clk_speed = 0;
+ }
+ } else {
+ printk("Not set.\n");
+ }
+
+ if ( 0 == clk_speed )
+ clk_speed = BSP_sys_clk_speed;
+
+ if ( 0 == clk_speed ) {
+ printk("Using some heuristics to determine clock speed...\n");
+ printk("Assuming %uHz PLL ref. clock\n", BSP_pll_ref_clock);
+ if ( 0xf8 != MCF5282_CLOCK_SYNSR ) {
+ printk("FATAL ERROR: Unexpected SYNSR contents, can't proceed\n");
+ bsp_sysReset(0);
+ }
+ mfd = MCF5282_CLOCK_SYNCR;
+ rfd = (mfd >> 8) & 7;
+ mfd = (mfd >> 12) & 7;
+ /* Check against 'known' cases */
+ if ( 0 != rfd || (2 != mfd && 3 != mfd) ) {
+ printk("WARNING: Pll divisor/multiplier has unknown value; \n");
+ printk(" either your board is not 64MHz or 80Mhz or\n");
+ printk(" it uses a PLL reference other than 8MHz.\n");
+ printk(" I'll proceed anyways but you might have to\n");
+ printk(" reset the board and set uCbootloader ENV\n");
+ printk(" variable \"SYS_CLOCK_SPEED\".\n");
+ }
+ mfd = 2 * (mfd + 2);
+ /* sysclk = pll_ref * 2 * (MFD + 2) / 2^(rfd) */
+ printk("PLL multiplier: %u, output divisor: %u\n", mfd, rfd);
+ clk_speed = (BSP_pll_ref_clock * mfd) >> rfd;
+ }
+
+ if ( 0 == clk_speed ) {
+ printk("FATAL ERROR: Unable to determine system clock speed\n");
+ bsp_sysReset(0);
+ } else {
+ BSP_sys_clk_speed = clk_speed;
+ printk("System clock speed: %uHz\n", bsp_get_CPU_clock_speed());
+ }
+}
uint32_t bsp_get_CPU_clock_speed(void)
{
- return( (uint32_t)_CPUClockSpeed);
+ return( BSP_sys_clk_speed );
}
/*
diff --git a/c/src/lib/libbsp/m68k/uC5282/startup/linkcmds b/c/src/lib/libbsp/m68k/uC5282/startup/linkcmds
index 58e3c6155f..47ea80d8d6 100644
--- a/c/src/lib/libbsp/m68k/uC5282/startup/linkcmds
+++ b/c/src/lib/libbsp/m68k/uC5282/startup/linkcmds
@@ -30,8 +30,17 @@ _DownloadLocation = 0x40000;
/*
* System clock speed
+ *
+ * If autodetection of the system clock pased on the PLL ref. clock
+ * (AFAIK 8MHz for both 64MHz and 80MHz boards) doesn't work then
+ * you can:
+ * - define (nonzero) system clock speed from app- linkflags (or here)
+ * - use a uCbootloader env. var: SYS_CLOCK_SPEED to define it.
+ * You can also redefine the PLL reference clock speed from linkflags
+ * or here...
*/
-_CPUClockSpeed = DEFINED(_CPUClockSpeed) ? _CPUClockSpeed : 64000000 ;
+_CPUClockSpeed = DEFINED(_CPUClockSpeed) ? _CPUClockSpeed : 0 ;
+_PLLRefClockSpeed = DEFINED(_PLLRefClockSpeed) ? _PLLRefClockSpeed : 8000000;
/*
* Location of on-chip devices