diff options
author | Joel Sherrill <joel.sherrill@OARcorp.com> | 2007-06-22 19:15:44 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@OARcorp.com> | 2007-06-22 19:15:44 +0000 |
commit | b16f38a39998437132dd2825ae57dd4249c1168f (patch) | |
tree | 88fd6bcdc83b961bdfca9a86a75e6bc6ecb90076 /c | |
parent | 2007-06-22 Joel Sherrill <joel.sherrill@OARcorp.com> (diff) | |
download | rtems-b16f38a39998437132dd2825ae57dd4249c1168f.tar.bz2 |
2007-06-22 Joel Sherrill <joel.sherrill@oarcorp.com>
* clock/clock.c, network_5200/network.c: Convert to using clock driver
template.
Diffstat (limited to 'c')
-rw-r--r-- | c/src/lib/libbsp/powerpc/gen5200/ChangeLog | 5 | ||||
-rw-r--r-- | c/src/lib/libbsp/powerpc/gen5200/clock/clock.c | 279 | ||||
-rw-r--r-- | c/src/lib/libbsp/powerpc/gen5200/network_5200/network.c | 4 |
3 files changed, 94 insertions, 194 deletions
diff --git a/c/src/lib/libbsp/powerpc/gen5200/ChangeLog b/c/src/lib/libbsp/powerpc/gen5200/ChangeLog index 49030a62b9..19874248b7 100644 --- a/c/src/lib/libbsp/powerpc/gen5200/ChangeLog +++ b/c/src/lib/libbsp/powerpc/gen5200/ChangeLog @@ -1,3 +1,8 @@ +2007-06-22 Joel Sherrill <joel.sherrill@oarcorp.com> + + * clock/clock.c, network_5200/network.c: Convert to using clock driver + template. + 2007-06-22 Joel Sherrill <joel.sherrill@OARcorp.com> * startup/linkcmds.brs5l: Add missing wild card on .sdata section so diff --git a/c/src/lib/libbsp/powerpc/gen5200/clock/clock.c b/c/src/lib/libbsp/powerpc/gen5200/clock/clock.c index 5480197b4a..829f9c2f8d 100644 --- a/c/src/lib/libbsp/powerpc/gen5200/clock/clock.c +++ b/c/src/lib/libbsp/powerpc/gen5200/clock/clock.c @@ -10,6 +10,8 @@ | D-82178 Puchheim | | Germany | | rtems@embedded-brains.de | +| | +| Reworked by Joel Sherrill to use clockdrv_shell.c | +-----------------------------------------------------------------+ | The license and distribution terms for this file may be | | found in the file LICENSE in this distribution or at | @@ -110,84 +112,67 @@ #include <stdlib.h> /* for atexit() */ #include "../include/mpc5200.h" -volatile uint32_t Clock_driver_ticks; - -void Clock_exit(void); - -uint32_t counter_value; - -volatile int ClockInitialized = 0; - - -/* - * These are set by clock driver during its init - */ -rtems_device_major_number rtems_clock_major = ~0; -rtems_device_minor_number rtems_clock_minor; - +#define GPT (BSP_PERIODIC_TIMER - BSP_SIU_IRQ_TMR0) +/* this lets us do nanoseconds since last tick */ uint64_t Clock_last_TBR; +volatile uint32_t counter_value; +volatile int ClockInitialized = 0; /* * ISR Handlers */ void mpc5200_gpt_clock_isr(rtems_irq_hdl_param handle) - { +{ uint32_t status; struct mpc5200_gpt *gpt = (struct mpc5200_gpt *)handle; status = gpt->status; - - if(ClockInitialized && (status & GPT_STATUS_TEXP)) - { - + if (ClockInitialized && (status & GPT_STATUS_TEXP)) { gpt->status |= GPT_STATUS_TEXP; Clock_last_TBR = PPC_Get_timebase_register(); - Clock_driver_ticks++; rtems_clock_tick(); - - } - } - +} /* * Initialize MPC5x00 GPT */ void mpc5200_init_gpt(uint32_t gpt_no) - { +{ struct mpc5200_gpt *gpt = (struct mpc5200_gpt *)(&mpc5200.gpt[gpt_no]); gpt->status = GPT_STATUS_RESET; - gpt->emsel = GPT_EMSEL_CE | GPT_EMSEL_ST_CONT | GPT_EMSEL_INTEN | GPT_EMSEL_GPIO_OUT_HIGH | GPT_EMSEL_TIMER_MS_GPIO; - - } + gpt->emsel = GPT_EMSEL_CE | GPT_EMSEL_ST_CONT | GPT_EMSEL_INTEN | + GPT_EMSEL_GPIO_OUT_HIGH | GPT_EMSEL_TIMER_MS_GPIO; +} /* * Set MPC5x00 GPT counter */ void mpc5200_set_gpt_count(uint32_t counter_value, uint32_t gpt_no) - { +{ uint32_t prescaler_value = 1; uint32_t counter = counter_value; struct mpc5200_gpt *gpt = (struct mpc5200_gpt *)(&mpc5200.gpt[gpt_no]); - /* Calculate counter/prescaler value, e.g. IPB_Clock=33MHz -> Int. every 0,3 nsecs. - 130 secs.*/ - while((counter >= (1 << 16)) && (prescaler_value < (1 << 16))) - { - prescaler_value++; - counter = counter_value / prescaler_value; - } + /* Calculate counter/prescaler value, e.g. + * IPB_Clock=33MHz -> Int. every 0,3 nsecs. - 130 secs + */ + while ((counter >= (1 << 16)) && (prescaler_value < (1 << 16))) { + prescaler_value++; + counter = counter_value / prescaler_value; + } counter = (uint16_t)counter; gpt->count_in = (prescaler_value << 16) + counter; - } +} uint32_t bsp_clock_nanoseconds_since_last_tick(void) { @@ -206,41 +191,35 @@ uint32_t bsp_clock_nanoseconds_since_last_tick(void) * Enable MPC5x00 GPT interrupt */ void mpc5200_enable_gpt_int(uint32_t gpt_no) - { +{ struct mpc5200_gpt *gpt = (struct mpc5200_gpt *)(&mpc5200.gpt[gpt_no]); gpt->emsel |= GPT_EMSEL_CE | GPT_EMSEL_INTEN; Clock_last_TBR = PPC_Get_timebase_register(); - - } - +} /* * Disable MPC5x00 GPT interrupt */ void mpc5200_disable_gpt_int(uint32_t gpt_no) - { +{ struct mpc5200_gpt *gpt = (struct mpc5200_gpt *)(&mpc5200.gpt[gpt_no]); gpt->emsel &= ~(GPT_EMSEL_CE | GPT_EMSEL_INTEN); - - } - +} /* * Check MPC5x00 GPT status */ uint32_t mpc5200_check_gpt_status(uint32_t gpt_no) - { +{ struct mpc5200_gpt *gpt = (struct mpc5200_gpt *)(&mpc5200.gpt[gpt_no]); return ((gpt->emsel) & (GPT_EMSEL_CE | GPT_EMSEL_INTEN)); - - } - +} void clockOn(const rtems_irq_connect_data* irq) - { +{ uint32_t gpt_no; gpt_no = BSP_SIU_IRQ_TMR0 - (irq->name); @@ -251,14 +230,11 @@ void clockOn(const rtems_irq_connect_data* irq) mpc5200_set_gpt_count(counter_value, (uint32_t)gpt_no); mpc5200_enable_gpt_int((uint32_t)gpt_no); - Clock_driver_ticks = 0; ClockInitialized = 1; - - } - +} void clockOff(const rtems_irq_connect_data* irq) - { +{ uint32_t gpt_no; gpt_no = BSP_SIU_IRQ_TMR0 - (irq->name); @@ -266,87 +242,68 @@ void clockOff(const rtems_irq_connect_data* irq) mpc5200_disable_gpt_int((uint32_t)gpt_no); ClockInitialized = 0; - - } - +} int clockIsOn(const rtems_irq_connect_data* irq) - { +{ uint32_t gpt_no; gpt_no = BSP_SIU_IRQ_TMR0 - (irq->name); - if(mpc5200_check_gpt_status(gpt_no) && ClockInitialized) + if (mpc5200_check_gpt_status(gpt_no) && ClockInitialized) return ClockInitialized; - else - return 0; - } + return 0; +} int BSP_get_clock_irq_level() - { - +{ /* * Caution : if you change this, you must change the * definition of BSP_PERIODIC_TIMER accordingly */ return BSP_PERIODIC_TIMER; - } +} int BSP_disconnect_clock_handler (void) - { +{ rtems_irq_connect_data clockIrqData; clockIrqData.name = BSP_PERIODIC_TIMER; - if (!BSP_get_current_rtems_irq_handler(&clockIrqData)) - { - + if (!BSP_get_current_rtems_irq_handler(&clockIrqData)) { printk("Unable to stop system clock\n"); rtems_fatal_error_occurred(1); - - } + } return BSP_remove_rtems_irq_handler (&clockIrqData); - - } +} int BSP_connect_clock_handler (uint32_t gpt_no) - { - +{ rtems_irq_hdl hdl = 0; rtems_irq_connect_data clockIrqData; - /* * Reinit structure */ - clockIrqData.name = BSP_PERIODIC_TIMER; - if(!BSP_get_current_rtems_irq_handler(&clockIrqData)) - { - + if (!BSP_get_current_rtems_irq_handler(&clockIrqData)) { printk("Unable to get system clock handler\n"); rtems_fatal_error_occurred(1); + } - } - - if(!BSP_remove_rtems_irq_handler (&clockIrqData)) - { - + if (!BSP_remove_rtems_irq_handler (&clockIrqData)) { printk("Unable to remove current system clock handler\n"); rtems_fatal_error_occurred(1); + } - } - - if ((gpt_no >= GPT0) || - (gpt_no <= GPT7)) { + if ((gpt_no >= GPT0) || (gpt_no <= GPT7)) { hdl = (rtems_irq_hdl_param )&mpc5200.gpt[gpt_no]; - } - else { + } else { printk("Unable to set system clock handler\n"); rtems_fatal_error_occurred(1); } @@ -358,106 +315,42 @@ int BSP_connect_clock_handler (uint32_t gpt_no) clockIrqData.isOn = clockIsOn; return BSP_install_rtems_irq_handler (&clockIrqData); +} - } - - -/* - * Called via atexit() - * Remove the clock interrupt handler by setting handler to NULL - */ -void Clock_exit(void) - { - - (void) BSP_disconnect_clock_handler (); - - } - - -void Install_clock(rtems_device_minor_number gpt_no) - { - - Clock_driver_ticks = 0; - - counter_value = rtems_configuration_get_microseconds_per_tick() * - rtems_cpu_configuration_get_clicks_per_usec(); - - mpc5200_init_gpt((uint32_t)gpt_no); - mpc5200_set_gpt_count(counter_value, (uint32_t)gpt_no); - - - BSP_connect_clock_handler(gpt_no); - - ClockInitialized = 1; - - rtems_clock_set_nanoseconds_extension( - bsp_clock_nanoseconds_since_last_tick - ); - atexit(Clock_exit); - - } - -void ReInstall_clock(uint32_t gpt_no) - { - - BSP_connect_clock_handler(gpt_no); - - } - - -rtems_device_driver Clock_initialize - ( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *pargp - ) - { - /* force minor according to definitions in irq.h */ - minor = BSP_PERIODIC_TIMER - BSP_SIU_IRQ_TMR0; - - Install_clock((uint32_t)minor); - - /* - * make major/minor avail to others such as shared memory driver - */ - rtems_clock_major = major; - rtems_clock_minor = minor; - - return RTEMS_SUCCESSFUL; - - } - -rtems_device_driver Clock_control - ( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *pargp - ) { - - rtems_libio_ioctl_args_t *args = pargp; - - /* forec minor according to definitions in irq.h */ - minor = BSP_PERIODIC_TIMER - BSP_SIU_IRQ_TMR0; - - if(args != 0) { - /* - * This is hokey, but until we get a defined interface - * to do this, it will just be this simple... - */ - if(args->command == rtems_build_name('I', 'S', 'R', ' ')) { - if ((minor >= GPT0) || - (minor <= GPT7)) { - mpc5200_gpt_clock_isr((rtems_irq_hdl_param )&mpc5200.gpt[minor]); - } - else { - printk("Unable to call system clock handler\n"); - rtems_fatal_error_occurred(1); - } - } - else if(args->command == rtems_build_name('N', 'E', 'W', ' ')) { - ReInstall_clock((uint32_t)minor); - } - } - return RTEMS_SUCCESSFUL; +#define CLOCK_VECTOR 0 + +#define Clock_driver_support_at_tick() \ + do { \ + uint32_t status; \ + struct mpc5200_gpt *gpt = (struct mpc5200_gpt *)(&mpc5200.gpt[GPT]); \ + \ + status = gpt->status; \ + \ + if (ClockInitialized && (status & GPT_STATUS_TEXP)) { \ + gpt->status |= GPT_STATUS_TEXP; \ + Clock_last_TBR = PPC_Get_timebase_register(); \ + } \ + } while(0) + +#define Clock_driver_support_install_isr( _new, _old ) \ + do { \ + (_old) = NULL; /* avoid warning */; \ + BSP_connect_clock_handler(GPT); \ + } while(0) + +/* This driver does this in clockOn called at connection time */ +#define Clock_driver_support_initialize_hardware() \ + do { \ + ; \ + } while (0) + +#define Clock_driver_nanoseconds_since_last_tick \ + bsp_clock_nanoseconds_since_last_tick + +#define Clock_driver_support_shutdown_hardware() \ + do { \ + (void) BSP_disconnect_clock_handler (); \ + } while (0) + +#include "../../../shared/clockdrv_shell.c" -} diff --git a/c/src/lib/libbsp/powerpc/gen5200/network_5200/network.c b/c/src/lib/libbsp/powerpc/gen5200/network_5200/network.c index 53d5af9fab..d2bf9cb968 100644 --- a/c/src/lib/libbsp/powerpc/gen5200/network_5200/network.c +++ b/c/src/lib/libbsp/powerpc/gen5200/network_5200/network.c @@ -103,7 +103,7 @@ extern TaskBDIdxTable_t TaskBDIdxTable[MAX_TASKS]; static TaskId rxTaskId; /* SDMA RX task ID */ static TaskId txTaskId; /* SDMA TX task ID */ -/*#define ETH_DEBUG*/ +#define ETH_DEBUG /* * Number of interfaces supported by this driver @@ -564,6 +564,7 @@ static int mpc5200_fec_reset(struct mpc5200_enet_struct *sc) { void mpc5200_fec_off(struct mpc5200_enet_struct *sc) { int counter = 0xffff; + #if defined(ETH_DEBUG) unsigned short phyStatus, i; @@ -1241,6 +1242,7 @@ static void mpc5200_fec_initialize_phy(struct mpc5200_enet_struct *sc) #if defined(ETH_DEBUG) int i; + unsigned short phyStatus; /* * Print PHY registers after initialization. */ |