diff options
-rw-r--r-- | c/src/lib/libbsp/m68k/uC5282/ChangeLog | 9 | ||||
-rw-r--r-- | c/src/lib/libbsp/m68k/uC5282/README | 355 | ||||
-rw-r--r-- | c/src/lib/libbsp/m68k/uC5282/TIMES | 322 | ||||
-rw-r--r-- | c/src/lib/libbsp/m68k/uC5282/startup/bspstart.c | 71 | ||||
-rw-r--r-- | c/src/lib/libbsp/m68k/uC5282/startup/linkcmds | 11 |
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 |