Ticket #1117: rtems-4.6.99.3_gen5200.diff

File rtems-4.6.99.3_gen5200.diff, 87.5 KB (added by thomas.doerfler, on Dec 3, 2006 at 1:31:12 PM)

rtems-4.6.99.3_gen5200.diff

  • aclocal/bsp-alias.m4

    diff -Nur -x configure -x Makefile.in -x autom4te.cache -x .svn -x '*.rej' -x '*.orig' -x '*~' ./rtems-4.6.99.3/aclocal/bsp-alias.m4 ./rtems-4.6.99.3_patched/aclocal/bsp-alias.m4
    old new  
    2525    pc586)        $2=pc386            ;; # i386 - PC with Pentium
    2626    pc686)        $2=pc386            ;; # i386 - PC with PentiumPro
    2727    pck6)         $2=pc386            ;; # i386 - PC with K6
     28    brs5l*)       $2=gen5200          ;; # MPC5200 based board
    2829    pm520*)       $2=gen5200          ;; # MPC5200 based board
    2930    simcpu32)     $2=sim68000         ;; # BSVC CPU32 variant
    3031    simsh7032)    $2=shsim            ;; # SH7032 simulator
  • aclocal/check-bsps.m4

    diff -Nur -x configure -x Makefile.in -x autom4te.cache -x .svn -x '*.rej' -x '*.orig' -x '*~' ./rtems-4.6.99.3/aclocal/check-bsps.m4 ./rtems-4.6.99.3_patched/aclocal/check-bsps.m4
    old new  
    2626                             bsps="$bsps mbx860_002"
    2727                             bsps="$bsps mbx860_005b"
    2828                             ;;
    29           gen5200)           bsps="pm520_cr825 pm520_ze30";;
     29          gen5200)           bsps="pm520_cr825 pm520_ze30 brs5l";;
    3030          motorola_powerpc)  bsps="mvme2307 mcp750 mtx603e mvme2100";;
    3131          pc386)             bsps="pc386 pc386dx pc486 pc586 pc686 pck6";;
    3232          erc32)             bsps="erc32 erc32nfp sis";;
  • c/src/lib/libbsp/powerpc/gen5200/Makefile.am

    diff -Nur -x configure -x Makefile.in -x autom4te.cache -x .svn -x '*.rej' -x '*.orig' -x '*~' ./rtems-4.6.99.3/c/src/lib/libbsp/powerpc/gen5200/Makefile.am ./rtems-4.6.99.3_patched/c/src/lib/libbsp/powerpc/gen5200/Makefile.am
    old new  
    2929        $(CPPASCOMPILE) -DASM -o $@ -c $<
    3030project_lib_DATA = start.$(OBJEXT)
    3131
    32 dist_project_lib_DATA += startup/linkcmds startup/linkcmds.pm520
     32dist_project_lib_DATA += startup/linkcmds.brs5l startup/linkcmds.pm520
    3333
    3434noinst_PROGRAMS += bestcomm.rel
    3535bestcomm_rel_SOURCES = bestcomm/include/ppctypes.h \
     
    9090nvram_rel_SOURCES = nvram/nvram.c nvram/nvram.h nvram/m93cxx.h
    9191nvram_rel_CPPFLAGS = $(AM_CPPFLAGS)
    9292nvram_rel_LDFLAGS = $(RTEMS_RELLDFLAGS)
     93include_bsp_HEADERS += nvram/nvram.h
    9394
    9495noinst_PROGRAMS += slicetimer.rel
    9596slicetimer_rel_SOURCES = slicetimer/slicetimer.c slicetimer/slicetimer.h
    9697slicetimer_rel_CPPFLAGS = $(AM_CPPFLAGS)
    9798slicetimer_rel_LDFLAGS = $(RTEMS_RELLDFLAGS)
     99include_bsp_HEADERS += slicetimer/slicetimer.h
    98100
    99101noinst_PROGRAMS += tod.rel
    100102tod_rel_SOURCES = tod/todcfg.c tod/pcf8563.c tod/pcf8563.h \
     
    108110startup_rel_SOURCES = ../../shared/bspclean.c ../../shared/bsplibc.c \
    109111    ../../shared/bsppost.c startup/bspstart.c ../../shared/bootcard.c \
    110112    ../../shared/main.c ../../shared/sbrk.c \
    111     ../../shared/gnatinstallhandler.c startup/cpuinit.c
     113    ../../shared/gnatinstallhandler.c startup/cpuinit.c start/start.S
    112114startup_rel_CPPFLAGS = $(AM_CPPFLAGS)
    113115startup_rel_LDFLAGS = $(RTEMS_RELLDFLAGS)
    114116
  • c/src/lib/libbsp/powerpc/gen5200/bestcomm/bestcomm_glue.c

    diff -Nur -x configure -x Makefile.in -x autom4te.cache -x .svn -x '*.rej' -x '*.orig' -x '*~' ./rtems-4.6.99.3/c/src/lib/libbsp/powerpc/gen5200/bestcomm/bestcomm_glue.c ./rtems-4.6.99.3_patched/c/src/lib/libbsp/powerpc/gen5200/bestcomm/bestcomm_glue.c
    old new  
    4646|    none                                                                   |
    4747\*=========================================================================*/
    4848{
     49  rtems_interrupt_level level;
    4950  if (0 != ((1UL<<bestcomm_taskno) & SDMA_INT_BIT_IMPL)) {
     51    rtems_interrupt_disable(level);
    5052    /*
    5153     * valid task number
    5254     * enable interrupt in bestcomm mask
    5355     */
    5456    SDMA_INT_ENABLE(&mpc5200.IntMask,bestcomm_taskno);
     57    rtems_interrupt_enable(level);
    5558  }
    5659}
    5760
     
    7376|    none                                                                   |
    7477\*=========================================================================*/
    7578{
     79  rtems_interrupt_level level;
    7680  if (0 != ((1UL<<bestcomm_taskno) & SDMA_INT_BIT_IMPL)) {
     81    rtems_interrupt_disable(level);
    7782    /*
    7883     * valid task number
    7984     * disable interrupt in bestcomm mask
    8085     */
    8186    SDMA_INT_DISABLE(&mpc5200.IntMask,bestcomm_taskno);
     87    rtems_interrupt_enable(level);
    8288  }
    8389}
    8490
     
    245251    TasksLoadImage( (void *)&(mpc5200.taskBar));
    246252
    247253    /*
    248      * FIXME: initialize interrupt dispatcher
     254     * initialize interrupt dispatcher
    249255     */
    250256      if(!BSP_install_rtems_irq_handler (&bestcomm_glue_irq_data)) {
    251257        rtems_panic ("Can't attach MPC5x00 BestComm interrupt handler\n");
  • c/src/lib/libbsp/powerpc/gen5200/bsp_specs

    diff -Nur -x configure -x Makefile.in -x autom4te.cache -x .svn -x '*.rej' -x '*.orig' -x '*~' ./rtems-4.6.99.3/c/src/lib/libbsp/powerpc/gen5200/bsp_specs ./rtems-4.6.99.3_patched/c/src/lib/libbsp/powerpc/gen5200/bsp_specs
    old new  
    1010%{!qnolinkcmds: -T linkcmds%s}}}
    1111
    1212*startfile:
    13 %{!qrtems: %(old_startfile)} %{!nostdlib: %{qrtems:  ecrti%O%s \
    14 %{!qrtems_debug: start.o%s} \
    15 %{qrtems_debug: start_g.o%s}}}
     13%{!qrtems: %(old_startfile)} %{!nostdlib: %{qrtems: \
     14%{!qrtems_debug: } \
     15%{qrtems_debug: } ecrti%O%s}}
    1616
    1717*endfile:
    1818%{!qrtems: %(old_endfile)} %{qrtems: ecrtn%O%s}
  • c/src/lib/libbsp/powerpc/gen5200/console/console.c

    diff -Nur -x configure -x Makefile.in -x autom4te.cache -x .svn -x '*.rej' -x '*.orig' -x '*~' ./rtems-4.6.99.3/c/src/lib/libbsp/powerpc/gen5200/console/console.c ./rtems-4.6.99.3_patched/c/src/lib/libbsp/powerpc/gen5200/console/console.c
    old new  
    212212
    213213   /*
    214214        * Calculate baud rate
     215        * round divider to nearest!
    215216    */
    216     baud = IPB_CLOCK / (baud * 32);
     217    baud = (IPB_CLOCK + baud *16) / (baud * 32);
    217218
    218219    }
    219220
  • c/src/lib/libbsp/powerpc/gen5200/include/bsp.h

    diff -Nur -x configure -x Makefile.in -x autom4te.cache -x .svn -x '*.rej' -x '*.orig' -x '*~' ./rtems-4.6.99.3/c/src/lib/libbsp/powerpc/gen5200/include/bsp.h ./rtems-4.6.99.3_patched/c/src/lib/libbsp/powerpc/gen5200/include/bsp.h
    old new  
    6161 */
    6262/* ROM definitions (2 MB) */
    6363#define ROM_START       0xFFE00000
    64 #define ROM_END         0xFFFFFFFF
     64#define ROM_SIZE        0x00200000
     65#define ROM_END         (ROM_START+ROM_SIZE-1)
    6566#define BOOT_START      ROM_START
    6667#define BOOT_END        ROM_END
    6768
    6869/* SDRAM definitions (256 MB) */
    69 #define RAM_START    0x00000000
    70 #define RAM_END      0x0FFFFFFF
     70#define RAM_START       0x00000000
     71#define RAM_SIZE        0x10000000
     72#define RAM_END         (RAM_START+RAM_SIZE-1)
    7173
    7274/* DPRAM definitions (64 KB) */
    7375#define DPRAM_START  0xFF000000
     
    198200#define UARTS_USE_TERMIOS_INT   1
    199201
    200202/* ata modes */
    201 #undef ATA_USE_INT
     203/* #undef ATA_USE_INT */
     204#define ATA_USE_INT
    202205
    203206/* clock settings */
    204207#if defined(HAS_UBOOT)
     
    211214#define G2_CLOCK  231000000  /* 231 MHz */
    212215#endif
    213216
     217/*
     218 *  Convert decrement value to tenths of microsecnds (used by
     219 *  shared timer driver).
     220 *
     221 *    + CPU has a XLB_CLOCK bus,
     222 *    + There are 4 bus cycles per click
     223 *    + We return value in 1/10 microsecond units.
     224 *   Modified following equation to integer equation to remove
     225 *   floating point math.
     226 *   (int) ((float)(_value) / ((XLB_CLOCK/1000000 * 0.1) / 4.0))
     227 */
     228
     229#define BSP_Convert_decrementer( _value ) \
     230  (int) (((_value) * 4000) / (XLB_CLOCK/10000))
     231
    214232/* slicetimer settings */
    215233#define USE_SLICETIMER_0     TRUE
    216234#define USE_SLICETIMER_1     FALSE
  • c/src/lib/libbsp/powerpc/gen5200/include/mpc5200.h

    diff -Nur -x configure -x Makefile.in -x autom4te.cache -x .svn -x '*.rej' -x '*.orig' -x '*~' ./rtems-4.6.99.3/c/src/lib/libbsp/powerpc/gen5200/include/mpc5200.h ./rtems-4.6.99.3_patched/c/src/lib/libbsp/powerpc/gen5200/include/mpc5200.h
    old new  
    300300#define GPT_STATUS_RESET           0x0000000F
    301301#define GPT_STATUS_TEXP            (1 << 3)
    302302#define GPT_STATUS_PIN             (1 << 8)
     303#define GPT_EMSEL_GPIO_DIR         (2 << 4)
     304#define GPT_EMSEL_GPIO_OUT         (1 << 4)
    303305#define GPT_EMSEL_GPIO_OUT_HIGH    (3 << 4)
    304306#define GPT_EMSEL_TIMER_MS_GPIO    (4 << 0)
    305307#define GPT_EMSEL_GPIO_IN          (0 << 0)
    306308#define GPT_EMSEL_CE               (1 << 12)
    307309#define GPT_EMSEL_ST_CONT          (1 << 10)
    308310#define GPT_EMSEL_INTEN            (1 << 8)
     311#define GPT_EMSEL_WDEN                            (1 << 15)
    309312
    310313#define GPT0                       0
    311314#define GPT1                       1
  • c/src/lib/libbsp/powerpc/gen5200/include/tm27.h

    diff -Nur -x configure -x Makefile.in -x autom4te.cache -x .svn -x '*.rej' -x '*.orig' -x '*~' ./rtems-4.6.99.3/c/src/lib/libbsp/powerpc/gen5200/include/tm27.h ./rtems-4.6.99.3_patched/c/src/lib/libbsp/powerpc/gen5200/include/tm27.h
    old new  
    1515#ifndef __tm27_h
    1616#define __tm27_h
    1717
     18#include <bsp/irq.h>
     19
    1820/*
    1921 *  Stuff for Time Test 27
    2022 */
    2123
    22 #define MUST_WAIT_FOR_INTERRUPT 0
    23 
    24 #define Install_tm27_vector( handler ) \
    25    do { \
    26         static rtems_irq_connect_data scIrqData = { \
    27           PPC_IRQ_SCALL, \
    28           (rtems_irq_hdl) handler, \
    29           NULL, \
    30           NULL, \
    31           NULL  \
    32         }; \
    33         BSP_install_rtems_irq_handler (&scIrqData); \
    34    } while(0)
    35 
    36 #define Cause_tm27_intr() asm volatile ("sc")
     24#define MUST_WAIT_FOR_INTERRUPT 1
    3725
    38 #define Clear_tm27_intr() /* empty */
     26void nullFunc() {}
    3927
    40 #define Lower_tm27_intr() /* empty */
     28static rtems_irq_connect_data clockIrqData = {BSP_DECREMENTER,
     29                                              0,
     30                                              (rtems_irq_enable)nullFunc,
     31                                              (rtems_irq_disable)nullFunc,
     32                                              (rtems_irq_is_enabled) nullFunc};
     33void Install_tm27_vector(void (*_handler)())
     34{
     35  clockIrqData.hdl = _handler;
     36  if (!BSP_install_rtems_irq_handler (&clockIrqData)) {
     37        printk("Error installing clock interrupt handler!\n");
     38        rtems_fatal_error_occurred(1);
     39  }
     40}
     41
     42#define Cause_tm27_intr()  \
     43  do { \
     44    uint32_t   _clicks = 8; \
     45    asm volatile( "mtdec %0" : "=r" ((_clicks)) : "r" ((_clicks)) ); \
     46  } while (0)
     47
     48#define Clear_tm27_intr() \
     49  do { \
     50    uint32_t   _clicks = 0xffffffff; \
     51    asm volatile( "mtdec %0" : "=r" ((_clicks)) : "r" ((_clicks)) ); \
     52  } while (0)
     53
     54#define Lower_tm27_intr() \
     55  do { \
     56    uint32_t   _msr = 0; \
     57    _ISR_Set_level( 0 ); \
     58    asm volatile( "mfmsr %0 ;" : "=r" (_msr) : "r" (_msr) ); \
     59    _msr |=  0x8002; \
     60    asm volatile( "mtmsr %0 ;" : "=r" (_msr) : "r" (_msr) ); \
     61  } while (0)
    4162
    4263#endif
  • c/src/lib/libbsp/powerpc/gen5200/mscan/mscan.c

    diff -Nur -x configure -x Makefile.in -x autom4te.cache -x .svn -x '*.rej' -x '*.orig' -x '*~' ./rtems-4.6.99.3/c/src/lib/libbsp/powerpc/gen5200/mscan/mscan.c ./rtems-4.6.99.3_patched/c/src/lib/libbsp/powerpc/gen5200/mscan/mscan.c
    old new  
    3030
    3131/* #define MSCAN_LOOPBACK */
    3232
     33volatile uint32_t tx_int_wr_count = 0;
     34
    3335struct mpc5200_rx_cntrl mpc5200_mscan_rx_cntrl[MPC5200_CAN_NO];
    34 static struct mscan_channel_info chan_info[MPC5200_CAN_NO];
     36volatile static struct mscan_channel_info chan_info[MPC5200_CAN_NO];
     37
     38/* time segmant table  */
     39uint8_t can_time_segment_table[CAN_MAX_NO_OF_TQ - MIN_NO_OF_TQ + 1][NO_OF_TABLE_ENTRIES] = {
     40
     41/* Total no. of time quantas */   /* Time Segment 1*/    /* Time Segment 2 */     /* Sync: Jump width */
     42{         7,                                4,                     2,                       1          },
     43{         8,                                5,                     2,                       1          },
     44{         9,                                6,                     2,                       2          },
     45{        10,                                6,                     3,                       2          },
     46{        11,                                7,                     3,                       2          },
     47{        12,                                8,                     3,                       2          },
     48{        13,                                8,                     4,                       2          },
     49{        14,                                9,                     4,                       2          },
     50{        15,                               10,                     4,                       2          },
     51{        16,                               10,                     5,                       2          },
     52{        17,                               11,                     5,                       2          },
     53{        18,                               12,                     5,                       2          },
     54{        19,                               12,                     6,                       2          },
     55{        20,                               13,                     6,                       2          },
     56{        21,                               14,                     6,                       2          },
     57{        22,                               14,                     7,                       2          },
     58{        23,                               15,                     7,                       2          },
     59{        24,                               15,                     8,                       2          },
     60{        25,                               16,                     8,                       2          }};
     61
     62
     63/*
     64 * MPC5x00 MSCAN tx ring buffer function to get a can message buffer from the head of the tx ring buffer
     65 */
     66volatile static struct can_message * get_tx_buffer(struct mscan_channel_info *chan)
     67  {
     68  /* define a temp. mess ptr. */
     69  volatile struct can_message * tmp_mess_ptr = NULL, *temp_head_ptr;
     70
     71  /* set temp. head pointer */
     72  temp_head_ptr = chan->tx_ring_buf.head_ptr;
     73
     74  /* check buffer empty condition */
     75  if(temp_head_ptr != chan->tx_ring_buf.tail_ptr)
     76    {
     77
     78    /* current buffer head. ptr. */
     79    tmp_mess_ptr = temp_head_ptr;
     80
     81    /* increment the head pointer */
     82    temp_head_ptr++;
     83
     84    /* check for wrap around condition */
     85    if(temp_head_ptr > chan->tx_ring_buf.buf_ptr + NO_OF_MSCAN_TX_BUFF)
     86      {
     87
     88      /* set head ptr. to the begin of the ring buffer */
     89      temp_head_ptr = chan->tx_ring_buf.buf_ptr;
     90
     91      }
     92
     93    /* end of crtical section restore head ptr. */
     94    chan->tx_ring_buf.head_ptr = temp_head_ptr;
     95    }
     96
     97  /* return the current head pointer */
     98  return tmp_mess_ptr;
     99  }
     100
     101/*
     102 * MPC5x00 MSCAN tx ring buffer function to write a can message buffer to the tail of the tx ring buffer
     103 */
     104volatile static struct can_message * fill_tx_buffer(struct mscan_channel_info *chan, struct can_message * mess_ptr)
     105  {
     106  /* define a temp. mess ptr. to the entry which follows the current tail entry */
     107  struct can_message * tmp_mess_ptr = chan->tx_ring_buf.tail_ptr + 1;
     108
     109  /* check for the wrap around condition */
     110  if(tmp_mess_ptr >  chan->tx_ring_buf.buf_ptr + NO_OF_MSCAN_TX_BUFF)
     111    {
     112        /* set temp. mess. ptr to the begin of the ring buffer */
     113        tmp_mess_ptr = chan->tx_ring_buf.buf_ptr;
     114    }
     115
     116  /* check buffer full condition */
     117  if(tmp_mess_ptr == chan->tx_ring_buf.head_ptr)
     118    {
     119        /* return NULL in case buffer is full */
     120        return NULL;
     121    }
     122  else
     123    {
     124        /* copy the can mess. to the tail of the buffer */
     125    memcpy((void *)chan->tx_ring_buf.tail_ptr, (void *)mess_ptr, sizeof(struct can_message));
     126
     127    /* set new tail equal to temp. mess. ptr. */
     128    chan->tx_ring_buf.tail_ptr = tmp_mess_ptr;
     129    }
     130
     131  /* return the actual tail ptr. (next free entry) */
     132  return chan->tx_ring_buf.tail_ptr;
     133  }
    35134
    36135/*
    37136 * MPC5x00 MSCAN interrupt handler
     
    41140  rtems_status_code status;
    42141  mscan_handle *mscan_hdl = (mscan_handle *)handle;
    43142  struct mscan_channel_info *chan = &chan_info[mscan_hdl->mscan_channel];
    44   struct can_message rx_mess, *rx_mess_ptr;
     143  struct can_message rx_mess, *rx_mess_ptr, *tx_mess_ptr;
    45144  volatile struct mpc5200_mscan *mscan = chan->regs;
     145  register uint8_t idx;
    46146
    47147  /*
    48    handle tx interrupts
     148   handle tx ring buffer
    49149   */
    50150
    51   /* check and disable tx interrupt for message buffer 0 */
    52   if(mscan->tier & MSCAN_TX_BUFF0)
    53     mscan->tier &= ~(MSCAN_TX_BUFF0);
    54 
    55   /* check and disable tx interrupt for message buffer 1 */
    56   if(mscan->tier & MSCAN_TX_BUFF1)
    57     mscan->tier &= ~(MSCAN_TX_BUFF1);
    58 
    59   /* check and disable tx interrupt for message buffer 2 */
    60   if(mscan->tier & MSCAN_TX_BUFF2)
    61     mscan->tier &= ~(MSCAN_TX_BUFF2);
     151  /* loop over all 3 tx buffers */
     152  for(idx = TFLG_TXE0; idx <= TFLG_TXE2; idx=idx<<1)
     153    {
     154
     155    /* check for tx buffer vacation */
     156    if((mscan->tflg) & idx)
     157      {
     158
     159      /* try to get a message */
     160      tx_mess_ptr = get_tx_buffer(chan);
     161
     162      /* check for new tx message */
     163      if(tx_mess_ptr != NULL)
     164        {
     165
     166        /* select the tx buffer */
     167        mscan->bsel  = idx;
     168
     169        /* check for toucan interface */
     170        if((mscan_hdl->toucan_callback) == NULL)
     171          {
     172
     173          /* set tx id */
     174                  mscan->txidr0 = SET_IDR0(tx_mess_ptr->mess_id);
     175                  mscan->txidr1 = SET_IDR1(tx_mess_ptr->mess_id);
     176                  mscan->txidr2 = 0;
     177          mscan->txidr3 = 0;
     178
     179          /* insert dlc into mscan register */
     180                  mscan->txdlr = (uint8_t)((tx_mess_ptr->mess_len) & 0x000F);
     181              }
     182
     183        /* select one free tx buffer if TOUCAN not registered) */
     184        if(((mscan_hdl->toucan_callback) == NULL) || (((mscan_hdl->toucan_callback) != NULL) && ((tx_mess_ptr->toucan_tx_id) == idx)))
     185          {
     186
     187          /* set tx id */
     188                  mscan->txidr0 = SET_IDR0(tx_mess_ptr->mess_id);
     189                  mscan->txidr1 = SET_IDR1(tx_mess_ptr->mess_id);
     190                  mscan->txidr2 = 0;
     191          mscan->txidr3 = 0;
     192
     193          /* insert dlc into mscan register */
     194                  mscan->txdlr = (uint8_t)((tx_mess_ptr->mess_len) & 0x000F);
     195
     196          /* copy tx data to MSCAN registers */
     197          switch(mscan->txdlr)
     198            {
     199            case 8:
     200              mscan->txdsr7 = tx_mess_ptr->mess_data[7];
     201            case 7:
     202              mscan->txdsr6 = tx_mess_ptr->mess_data[6];
     203            case 6:
     204              mscan->txdsr5 = tx_mess_ptr->mess_data[5];
     205            case 5:
     206              mscan->txdsr4 = tx_mess_ptr->mess_data[4];
     207            case 4:
     208              mscan->txdsr3 = tx_mess_ptr->mess_data[3];
     209            case 3:
     210              mscan->txdsr2 = tx_mess_ptr->mess_data[2];
     211            case 2:
     212              mscan->txdsr1 = tx_mess_ptr->mess_data[1];
     213            case 1:
     214              mscan->txdsr0 = tx_mess_ptr->mess_data[0];
     215              break;
     216            default:
     217              break;
     218            }
     219
     220          /* enable message buffer specific interrupt */
     221              mscan->tier |= mscan->bsel;
     222
     223              /* start transfer */
     224          mscan->tflg = mscan->bsel;
     225
     226          /* release counting semaphore of tx ring buffer */
     227                  rtems_semaphore_release((rtems_id)(chan->tx_rb_sid));
     228
     229                  tx_int_wr_count++;
     230
     231          }
     232        else
     233          {
     234
     235          /* refill the tx ring buffer with the message */
     236          fill_tx_buffer(chan, tx_mess_ptr);
     237
     238              }
     239            }
     240          else
     241            {
     242                /* reset interrupt enable bit */
     243            mscan->tier &= ~(idx);
     244            }
     245      }
     246    }
    62247
    63248  /*
    64249   handle rx interrupts
     
    84269
    85270        /* check the rx fliter-match indicators (16-bit filter mode) */
    86271        /* in case of more than one hit, lower hit has priority */
    87         switch((mscan->idac) & 0x7)
     272          idx = (mscan->idac) & 0x7;
     273          switch(idx)
    88274          {
    89275
    90276          case 0:
    91             rx_mess_ptr = (struct can_message *)&(mpc5200_mscan_rx_cntrl[MSCAN_A].can_rx_message[0]);
    92             break;
    93 
    94               case 1:
    95             rx_mess_ptr = (struct can_message *)&(mpc5200_mscan_rx_cntrl[MSCAN_A].can_rx_message[1]);
    96             break;
    97 
     277          case 1:
    98278          case 2:
    99             rx_mess_ptr = (struct can_message *)&(mpc5200_mscan_rx_cntrl[MSCAN_A].can_rx_message[2]);
    100                     break;
    101 
    102                   case 3:
    103             rx_mess_ptr = (struct can_message *)&(mpc5200_mscan_rx_cntrl[MSCAN_A].can_rx_message[3]);
    104                     break;
     279          case 3:
     280            rx_mess_ptr =
     281              (struct can_message *)&(mpc5200_mscan_rx_cntrl[mscan_hdl->mscan_channel].can_rx_message[idx]);
     282            break;
    105283
    106284          /* this case should never happen */
    107285                  default:
     
    530708  /*    [01]:SLPRQ       0 : No Sleep Mode Request                  */
    531709  /*    [00]:INITRQ      0 : No init. Mode Request                  */
    532710  /* wait for MSCAN A_/_B bus synch. */
    533   while(!((mscan->ctl0) & CTL0_SYNCH));
    534711
     712#if 0 /* we don't have a need to wait for sync. */
     713  while(!((mscan->ctl0) & CTL0_SYNCH));
     714#endif
    535715  return;
    536716
    537717  }
    538718
     719/* calculate the can clock prescaler value */
     720uint8_t prescaler_calculation(uint32_t can_bit_rate, uint32_t can_clock_frq, uint8_t *tq_no) {
     721
     722/* local variables */
     723uint8_t tq_no_min_dev = 0;
     724uint32_t frq_tq, frq_dev, frq_dev_min = 0xFFFFFFFF;
     725
     726/* loop through all values of time quantas */
     727for(*tq_no = CAN_MAX_NO_OF_TQ; *tq_no >= MIN_NO_OF_TQ; (*tq_no)--) {
     728
     729  /* calculate time quanta freq. */
     730  frq_tq = *tq_no * can_bit_rate;
     731
     732  /* calculate the deviation from requested tq freq. */
     733  frq_dev = can_clock_frq%frq_tq;
     734
     735  /* check the deviation freq. */
     736  if(frq_dev == 0) {
     737
     738    /* return if best match (zero deviation) */
     739   return (uint8_t)(can_clock_frq/frq_tq);
     740    }
     741  else
     742    {
     743
     744    /* check for minimum of freq. deviation */
     745    if(frq_dev < frq_dev_min) {
     746
     747      /* recognize the minimum freq. deviation */
     748      frq_dev_min = frq_dev;
     749
     750      /* recognize the no. of time quantas */
     751      tq_no_min_dev = *tq_no;
     752          }
     753        }
     754  }
     755
     756/* return the optimized prescaler value */
     757 *tq_no = tq_no_min_dev;
     758 return (uint8_t)(can_clock_frq/(tq_no_min_dev * can_bit_rate));
     759}
    539760
    540761/*
    541762 * MPC5x00 MSCAN set up the bit timing
    542763 */
    543 void mpc5200_mscan_perform_bit_time_settings(volatile struct mpc5200_mscan *mscan)
     764void mpc5200_mscan_perform_bit_time_settings(volatile struct mpc5200_mscan *mscan, uint32_t can_bit_rate, uint32_t can_clock_frq)
    544765{
    545766  uint32_t prescale_val = 0;
    546   uint32_t tq_num;
    547   uint32_t sync_seg,tseg1,tseg2;
    548  
    549   if(IPB_CLOCK%(CAN_BIT_RATE * CAN_MAX_NO_OF_TQ))
    550     prescale_val = (IPB_CLOCK/(CAN_BIT_RATE * (CAN_MAX_NO_OF_TQ*2/3))) + 1;
    551   else
    552     prescale_val = IPB_CLOCK/(CAN_BIT_RATE* (CAN_MAX_NO_OF_TQ*2/3));
    553  
    554   tq_num = ((IPB_CLOCK/prescale_val)+CAN_BIT_RATE/2)/CAN_BIT_RATE;
    555   /*
    556    * XXX: make this table controlled according to MPC5200UM/Rev.3,Table 19-34
    557    */
    558   sync_seg = 2;
    559   tseg2 = (tq_num-sync_seg)/6;
    560   tseg1 = tq_num - sync_seg - tseg2;
     767  uint8_t tq_no, tseg_1, tseg_2, sseg;
     768
     769  /* get optimized prescaler value */
     770  prescale_val = prescaler_calculation(can_bit_rate, can_clock_frq, &tq_no);
     771
     772  /* get time segment length from time segment table */
     773  tseg_1 = can_time_segment_table[tq_no - MIN_NO_OF_TQ][TSEG_1];
     774  tseg_2 = can_time_segment_table[tq_no - MIN_NO_OF_TQ][TSEG_2];
     775  sseg    = can_time_segment_table[tq_no - MIN_NO_OF_TQ][SJW];
    561776
    562777  /* Bus Timing Register 0 MSCAN_A/_B ------------------------------*/
    563778  /*    [07]:SJW1        1 : Synchronization jump width, Bit1       */
     
    569784  /*    [02]:BRP2        1 : Baud Rate Prescaler, Bit 2             */
    570785  /*    [01]:BRP1        0 : Baud Rate Prescaler, Bit 1             */
    571786  /*    [00]:BRP0        1 : Baud Rate Prescaler, Bit 0             */
    572   mscan->btr0 |= (BTR0_SJW(sync_seg-1) | BTR0_BRP(prescale_val - 1));
     787  mscan->btr0 = (BTR0_SJW(sseg-1) | BTR0_BRP(prescale_val-1));
    573788
    574789  /* Bus Timing Register 1 MSCAN_A/_B ------------------------------*/
    575790  /*    [07]:SAMP        0 : One Sample per bit                     */
     
    581796  /*    [02]:TSEG12      1 : Time Segment 1, Bit 2                  */
    582797  /*    [01]:TSEG11      1 : Time Segment 1, Bit 1                  */
    583798  /*    [00]:TSEG10      0 : Time Segment 1, Bit 0                  */
    584   mscan->btr1 &= ~(BTR1_SAMP);
    585   mscan->btr1 |=  (BTR1_TSEG_22_20(tseg2-1) | BTR1_TSEG_13_10(tseg1-1));
     799  mscan->btr1 =  (BTR1_TSEG_22_20(tseg_2-1) | BTR1_TSEG_13_10(tseg_1-1));
    586800
    587801  return;
    588802
     
    594808 */
    595809void mpc5200_mscan_perform_init_mode_settings(volatile struct mpc5200_mscan *mscan)
    596810  {
    597     mpc5200_mscan_perform_bit_time_settings(mscan);
     811
     812  /* perform all can bit time settings */
     813  mpc5200_mscan_perform_bit_time_settings(mscan,CAN_BIT_RATE,IPB_CLOCK);
     814
    598815  /* Control Register 1 --------------------------------------------*/
    599816  /*    [07]:CANE        0 : MSCAN Module is disabled               */
    600817  /*    [06]:CLKSRC      0 : Clock Source -> IPB_CLOCK (bsp.h)      */
     
    634851  mscan->idac &= ~(IDAC_IDAM1);
    635852  mscan->idac |=  (IDAC_IDAM0);
    636853
    637   /* initialize rx filter masks: only accept exact matches */
    638   mscan->idmr0  = 0x00;
    639   mscan->idmr1  = 0x00;
    640   mscan->idmr2  = 0x00;
    641   mscan->idmr3  = 0x00;
    642   mscan->idmr4  = 0x00;
    643   mscan->idmr5  = 0x00;
    644   mscan->idmr6  = 0x00;
    645   mscan->idmr7  = 0x00;
    646 
    647   /* initialize rx filters: set to illegal values, so no matches occure */
    648   mscan->idar0  = 0xff;
    649   mscan->idar1  = 0xff;
    650   mscan->idar2  = 0xff;
    651   mscan->idar3  = 0xff;
    652   mscan->idar4  = 0xff;
    653   mscan->idar5  = 0xff;
    654   mscan->idar6  = 0xff;
    655   mscan->idar7  = 0xff;
     854  /* initialize rx filter masks (16 bit) */
     855  mscan->idmr0  = SET_IDMR0(0x07FF);
     856  mscan->idmr1  = SET_IDMR1(0x07FF);
     857  mscan->idmr2  = SET_IDMR2(0x07FF);
     858  mscan->idmr3  = SET_IDMR3(0x07FF);
     859  mscan->idmr4  = SET_IDMR4(0x07FF);
     860  mscan->idmr5  = SET_IDMR5(0x07FF);
     861  mscan->idmr6  = SET_IDMR6(0x07FF);
     862  mscan->idmr7  = SET_IDMR7(0x07FF);
    656863
    657864  /* Control Register 1 --------------------------------------------*/
    658865  /*    [07]:CANE     0->1 : MSCAN Module is enabled                */
     
    719926  switch(mode)
    720927    {
    721928
     929    case MSCAN_INIT_NORMAL_MODE:
     930      /* if not already set enter init mode */
     931          mpc5200_mscan_enter_init_mode(mscan);
     932          /* perform initialization which has to be done in init mode */
     933      mpc5200_mscan_perform_init_mode_settings(mscan);
     934      break;
     935
    722936    case MSCAN_NORMAL_MODE:
    723937      /* if not already set enter init mode */
    724938      mpc5200_mscan_enter_init_mode(mscan);
    725939
    726940      if((chan->mode) == MSCAN_INITIALIZED_MODE)
     941        {
     942
    727943        /* perform initialization which has to be done in init mode */
    728944        mpc5200_mscan_perform_init_mode_settings(mscan);
    729       else
     945            }
     946
     947      if((chan->mode) == MSCAN_SLEEP_MODE)
     948        {
     949
    730950        /* exit sleep mode */
    731951            mpc5200_mscan_exit_sleep_mode(mscan);
     952            }
    732953
    733           /* exit init mode */
     954      /* exit init mode */
    734955      mpc5200_mscan_exit_init_mode(mscan);
    735956      /* enable ints. */
    736957      mpc5200_mscan_int_enable(mscan);
    737958      /* wait for bus sync. */
    738959      mpc5200_mscan_wait_sync(mscan);
    739       return RTEMS_SUCCESSFUL;
    740960      break;
    741961
    742962    case MSCAN_SLEEP_MODE:
    743       /* enable ints. */
     963      /* disable ints. */
    744964      mpc5200_mscan_int_disable(mscan);
    745       /* if not already set enter init mode */
    746       mpc5200_mscan_enter_init_mode(mscan);
    747965      /* exit sleep mode */
    748966          mpc5200_mscan_enter_sleep_mode(mscan);
    749           /* exit init mode */
    750       mpc5200_mscan_exit_init_mode(mscan);
    751       return RTEMS_SUCCESSFUL;
    752967      break;
    753968
    754969    default:
     
    773988  rtems_status_code status;
    774989  struct mscan_channel_info *chan = &chan_info[minor];
    775990
     991
    776992  /* set registers according to MSCAN channel information */
    777993  switch(minor)
    778994    {
    779995
    780996    case MSCAN_A:
    781997      chan->rx_qname = rtems_build_name ('C', 'N', 'A', 'Q');
     998      chan->tx_rb_sname = rtems_build_name ('C', 'N', 'A', 'S');
    782999
    7831000      /* register RTEMS device names for MSCAN A */
    784           if((status = rtems_io_register_name (MSCAN_A_DEV_NAME, major, MSCAN_A)) != RTEMS_SUCCESSFUL)
     1001      if((status = rtems_io_register_name (MSCAN_A_DEV_NAME, major, MSCAN_A)) != RTEMS_SUCCESSFUL)
     1002            return status;
     1003
     1004      /* register RTEMS device names for MSCAN 0 */
     1005      if((status = rtems_io_register_name (MSCAN_0_DEV_NAME, major, MSCAN_A)) != RTEMS_SUCCESSFUL)
    7851006            return status;
    7861007
     1008          /* allocate the space for MSCAN A tx ring buffer */
     1009          if(((chan->tx_ring_buf.buf_ptr) = malloc(sizeof(struct can_message)*(NO_OF_MSCAN_TX_BUFF+1))) != NULL)
     1010            {
     1011        chan->tx_ring_buf.head_ptr = chan->tx_ring_buf.tail_ptr = chan->tx_ring_buf.buf_ptr;
     1012            }
     1013          else
     1014            {
     1015                return RTEMS_UNSATISFIED;
     1016            }
    7871017      break;
    7881018
    7891019    case MSCAN_B:
    7901020          chan->rx_qname = rtems_build_name ('C', 'N', 'B', 'Q');
     1021      chan->tx_rb_sname = rtems_build_name ('C', 'N', 'B', 'S');
    7911022
    7921023          /* register RTEMS device names for MSCAN B */
    7931024          if((status = rtems_io_register_name (MSCAN_B_DEV_NAME, major, MSCAN_B)) != RTEMS_SUCCESSFUL)
    7941025            return status;
    7951026
     1027      /* register RTEMS device names for MSCAN 1 */
     1028          if((status = rtems_io_register_name (MSCAN_1_DEV_NAME, major, MSCAN_B)) != RTEMS_SUCCESSFUL)
     1029            return status;
     1030
     1031      /* allocate the space for MSCAN B tx ring buffer */
     1032          if(((chan->tx_ring_buf.buf_ptr) = malloc(sizeof(struct can_message)*(NO_OF_MSCAN_TX_BUFF+1))) != NULL)
     1033            {
     1034                chan->tx_ring_buf.head_ptr = chan->tx_ring_buf.tail_ptr = chan->tx_ring_buf.buf_ptr;
     1035            }
     1036          else
     1037            {
     1038                return RTEMS_UNSATISFIED;
     1039            }
    7961040      break;
    7971041
    7981042    default:
     
    8001044      break;
    8011045    }
    8021046
    803   /* create RTEMS rx message queue for MSCAN A */
    804   if((status = rtems_message_queue_create(chan->rx_qname,
    805                                                  (uint32_t) NO_OF_MSCAN_A_RX_BUFF,
    806                                                  (uint32_t) MSCAN_MESSAGE_SIZE(sizeof(struct can_message)),
    807                                                  (rtems_attribute) RTEMS_LOCAL | RTEMS_FIFO,
    808                                                  (rtems_id *)&(chan->rx_qid)))
    809                                                  != RTEMS_SUCCESSFUL)
    810     {
    811       return status;
    812 
    813     }
     1047  /* create RTEMS rx message queue */
     1048  status = rtems_message_queue_create(chan->rx_qname,
     1049                                             (uint32_t) NO_OF_MSCAN_RX_BUFF,
     1050                                             (uint32_t) MSCAN_MESSAGE_SIZE(sizeof(struct can_message)),
     1051                                             (rtems_attribute) RTEMS_LOCAL | RTEMS_FIFO,
     1052                                             (rtems_id *)&(chan->rx_qid));
     1053
     1054  /* create counting RTEMS tx ring buffer semaphore */
     1055  status = rtems_semaphore_create(chan->tx_rb_sname,
     1056                                 (uint32_t)(NO_OF_MSCAN_TX_BUFF),
     1057                                  RTEMS_COUNTING_SEMAPHORE | RTEMS_NO_INHERIT_PRIORITY | RTEMS_NO_PRIORITY_CEILING | RTEMS_LOCAL,
     1058                                 (rtems_task_priority)0,
     1059                                 (rtems_id *)&(chan->tx_rb_sid));
    8141060
    815   /* Set up interrupts MSCAN A */
     1061  /* Set up interrupts */
    8161062  if(!BSP_install_rtems_irq_handler(&(mpc5200_mscan_irq_data[minor])))
    8171063    rtems_panic("Can't attach MPC5x00 MSCAN interrupt handler %d\n", minor);
    8181064
    8191065  /* basic setup for channel info. struct. */
    820   chan->regs        = (struct mpc5200_mscan *)&(mpc5200.mscan[minor]);
    821   chan->int_rx_err  = 0;
    822   chan->id_extended = FALSE;
    823   chan->mode        = MSCAN_INITIALIZED_MODE;
     1066  chan->regs           = (struct mpc5200_mscan *)&(mpc5200.mscan[minor]);
     1067  chan->int_rx_err     = 0;
     1068  chan->id_extended    = FALSE;
     1069  chan->mode           = MSCAN_INITIALIZED_MODE;
     1070  chan->tx_buf_no      = NO_OF_MSCAN_TX_BUFF;
    8241071
    8251072  return status;
    8261073
     
    8441091  if((status = mscan_channel_initialize(major,MSCAN_B)) != RTEMS_SUCCESSFUL)
    8451092    rtems_fatal_error_occurred(status);
    8461093
    847   if((status = mpc5200_mscan_set_mode(MSCAN_A, MSCAN_NORMAL_MODE)) != RTEMS_SUCCESSFUL)
     1094  if((status = mpc5200_mscan_set_mode(MSCAN_A, MSCAN_INIT_NORMAL_MODE)) != RTEMS_SUCCESSFUL)
    8481095    rtems_fatal_error_occurred(status);
    8491096
    850   if((status = mpc5200_mscan_set_mode(MSCAN_B, MSCAN_NORMAL_MODE)) != RTEMS_SUCCESSFUL)
     1097  if((status = mpc5200_mscan_set_mode(MSCAN_B, MSCAN_INIT_NORMAL_MODE)) != RTEMS_SUCCESSFUL)
    8511098    rtems_fatal_error_occurred(status);
    8521099
    8531100  return status;
     
    8631110                                 void * arg
    8641111                               )
    8651112  {
    866   rtems_status_code status;
     1113  rtems_status_code status = RTEMS_SUCCESSFUL;
    8671114  struct mscan_channel_info *chan = NULL;
    8681115
    8691116  switch(minor)
     
    8791126      break;
    8801127    }
    8811128
    882   /* if not already set enter init mode */
    883   status = mpc5200_mscan_set_mode(minor, MSCAN_NORMAL_MODE);
     1129
     1130  /* check mode */
     1131  if((chan->mode) == MSCAN_SLEEP_MODE)
     1132    {
     1133
     1134    /* if not already set enter init mode */
     1135    status = mpc5200_mscan_set_mode(minor, MSCAN_NORMAL_MODE);
     1136    }
    8841137
    8851138  return status;
    8861139
     
    9471200      break;
    9481201    }
    9491202
     1203
     1204  /* end init mode if it is first read */
     1205  if((chan->mode) == MSCAN_INIT_NORMAL_MODE)
     1206    {
     1207
     1208    /* if not already set enter init mode */
     1209    mpc5200_mscan_set_mode(minor, MSCAN_NORMAL_MODE);
     1210    }
     1211
    9501212  if((status = rtems_message_queue_receive(chan->rx_qid,
    9511213                                          (void *)(rx_mess),
    9521214                                          (uint32_t *)&message_size,
     
    9781240                                 void * arg
    9791241                                )
    9801242  {
    981   rtems_libio_rw_args_t         *parms      = (rtems_libio_rw_args_t *)arg;
    982   struct mscan_tx_parms         *tx_parms   = (struct mscan_tx_parms *)(parms->buffer);
    983   struct can_message            *tx_mess    = (struct can_message *)(tx_parms->tx_mess);
    984   struct mscan_channel_info     *chan       = NULL;
    985   mscan_handle                  *mscan_hdl  = NULL;
    986   volatile struct mpc5200_mscan *mscan      = NULL;
     1243  rtems_status_code status;
     1244  rtems_libio_rw_args_t         *parms       = (rtems_libio_rw_args_t *)arg;
     1245  struct mscan_tx_parms         *tx_parms    = (struct mscan_tx_parms *)(parms->buffer);
     1246  struct can_message            *tx_mess     = (struct can_message *)(tx_parms->tx_mess);
     1247  struct mscan_channel_info     *chan        = NULL;
     1248  mscan_handle                  *mscan_hdl   = NULL;
     1249  volatile struct mpc5200_mscan *mscan       = NULL;
    9871250
    9881251  switch(minor)
    9891252    {
    990 
    9911253    case MSCAN_A:
    9921254    case MSCAN_B:
    9931255          chan      = &chan_info[minor];
     
    10001262      break;
    10011263    }
    10021264
    1003   /* select one free tx buffer (TOUCAN not registered) */
    1004   if((mscan_hdl->toucan_callback) == NULL)
    1005     {
    1006 
    1007     if(mscan->tflg & MSCAN_TX_BUFF2)
    1008       mscan->bsel  = MSCAN_TX_BUFF2;
    1009 
    1010     if(mscan->tflg & MSCAN_TX_BUFF1)
    1011       mscan->bsel  = MSCAN_TX_BUFF1;
    1012 
    1013     if(mscan->tflg & MSCAN_TX_BUFF0)
    1014       mscan->bsel  = MSCAN_TX_BUFF0;
    1015     }
    1016   else
     1265  /* end init mode if it is first write */
     1266  if((chan->mode) == MSCAN_INIT_NORMAL_MODE)
    10171267    {
    10181268
    1019     /* select a specific, preconfigured tx buffer (TOUCAN registered) */
    1020     switch(tx_parms->tx_id)
    1021       {
    1022 
    1023       case 0:
    1024                 if(mscan->tflg & MSCAN_TX_BUFF0)
    1025           mscan->bsel  = MSCAN_TX_BUFF0;
    1026         break;
    1027 
    1028           case 1:
    1029             if(mscan->tflg & MSCAN_TX_BUFF1)
    1030           mscan->bsel  = MSCAN_TX_BUFF1;
    1031             break;
    1032 
    1033           case 2:
    1034                 if(mscan->tflg & MSCAN_TX_BUFF2)
    1035           mscan->bsel  = MSCAN_TX_BUFF2;
    1036             break;
    1037 
    1038       default:
    1039         break;
    1040 
    1041           }
    1042 
     1269    /* if not already set enter init mode */
     1270    mpc5200_mscan_set_mode(minor, MSCAN_NORMAL_MODE);
    10431271    }
    10441272
    1045   /* if no tx buffer is available, teminate the write request */
    1046   if(!(mscan->bsel))
    1047     {
    1048 
    1049     parms->bytes_moved = 0;
    1050     return RTEMS_UNSATISFIED;
    1051 
    1052     }
     1273  /* preset moved bytes */
     1274  parms->bytes_moved = 0;
    10531275
    1054   /* prepare tx id and dlc (TOUCAN not initialized) */
    1055   if((mscan_hdl->toucan_callback) == NULL)
     1276  /* obtain counting semaphore of tx ring buffer */
     1277  if((status = rtems_semaphore_obtain((rtems_id)(chan->tx_rb_sid),
     1278                                       RTEMS_NO_WAIT,
     1279                                          (rtems_interval)0))
     1280                                        == RTEMS_SUCCESSFUL)
    10561281    {
    10571282
    1058     /* check for tx length */
    1059     if((tx_mess->mess_len) & 0x000F)
    1060       {
     1283    /* append the TOUCAN tx_id to the mess. due to interrupt handling */
     1284        tx_mess->toucan_tx_id = tx_parms->tx_id;
    10611285
    1062       /* set tx id */
    1063       mscan->txidr0 = SET_IDR0(tx_mess->mess_id);
    1064       mscan->txidr1 = SET_IDR1(tx_mess->mess_id);
    1065       mscan->txidr2 = 0;
    1066       mscan->txidr3 = 0;
     1286    /* fill the tx ring buffer with the message */
     1287    fill_tx_buffer(chan, tx_mess);
    10671288
    1068       /* insert dlc into mscan register */
    1069       mscan->txdlr = (uint8_t)((tx_mess->mess_len) & 0x000F);
     1289    /* enable message buffer specific interrupt */
     1290    mscan->tier |= (TIER_TXEI0 | TIER_TXEI1 | TIER_TXEI2);
    10701291
    1071       }
    1072     else
    1073       {
    1074 
    1075       parms->bytes_moved = 0;
    1076           return RTEMS_UNSATISFIED;
    1077 
    1078       }
    1079 
    1080     }
    1081 
    1082   /* copy tx data to MSCAN registers */
    1083   switch(mscan->txdlr)
    1084     {
    1085 
    1086     case 8:
    1087       mscan->txdsr7 = tx_mess->mess_data[7];
    1088     case 7:
    1089       mscan->txdsr6 = tx_mess->mess_data[6];
    1090     case 6:
    1091       mscan->txdsr5 = tx_mess->mess_data[5];
    1092     case 5:
    1093       mscan->txdsr4 = tx_mess->mess_data[4];
    1094     case 4:
    1095       mscan->txdsr3 = tx_mess->mess_data[3];
    1096     case 3:
    1097       mscan->txdsr2 = tx_mess->mess_data[2];
    1098     case 2:
    1099       mscan->txdsr1 = tx_mess->mess_data[1];
    1100     case 1:
    1101       mscan->txdsr0 = tx_mess->mess_data[0];
    1102       break;
    1103     default:
    1104       break;
     1292    /* calculate moved bytes */
     1293    parms->bytes_moved = (tx_mess->mess_len) & 0x000F;
    11051294
    11061295    }
    11071296
    1108   /* enable message buffer specific interrupt */
    1109   mscan->tier |= mscan->bsel;
    1110 
    1111   /* start transfer */
    1112   mscan->tflg = mscan->bsel;
    1113 
    1114   return RTEMS_SUCCESSFUL;
     1297  return status;
    11151298
    11161299  }
    11171300
     
    11241307                                    void * arg
    11251308                                  )
    11261309  {
     1310  rtems_status_code status;
    11271311  uint16_t tx_id;
    1128   rtems_libio_ioctl_args_t      *parms      = (rtems_libio_ioctl_args_t *)arg;
    1129   struct mscan_ctrl_parms       *ctrl_parms = (struct mscan_ctrl_parms *)(parms->buffer);
    1130   struct mscan_channel_info     *chan       = NULL;
    1131   mscan_handle                  *mscan_hdl  = NULL;
    1132   volatile struct mpc5200_mscan *mscan      = NULL;
     1312  rtems_libio_ioctl_args_t      *parms       = (rtems_libio_ioctl_args_t *)arg;
     1313  struct mscan_ctrl_parms       *ctrl_parms  = (struct mscan_ctrl_parms *)(parms->buffer);
     1314  struct mscan_channel_info     *chan        = NULL;
     1315  mscan_handle                  *mscan_hdl   = NULL;
     1316  volatile struct mpc5200_mscan *mscan       = NULL;
     1317  uint8_t                       tx_buf_count = 0;
    11331318
    11341319  switch(minor)
    11351320    {
     
    12391424        {
    12401425
    12411426        case RX_BUFFER_0:
    1242           mscan->idmr0  = SET_IDR0(ctrl_parms->ctrl_id_mask);
    1243           mscan->idmr1  = SET_IDR1(ctrl_parms->ctrl_id_mask);
     1427          mscan->idmr0  = SET_IDMR0(ctrl_parms->ctrl_id_mask);
     1428          mscan->idmr1  = SET_IDMR1(ctrl_parms->ctrl_id_mask);
    12441429          break;
    12451430
    12461431        case RX_BUFFER_1:
    1247           mscan->idmr2  = SET_IDR2(ctrl_parms->ctrl_id_mask);
    1248           mscan->idmr3  = SET_IDR3(ctrl_parms->ctrl_id_mask);
     1432          mscan->idmr2  = SET_IDMR2(ctrl_parms->ctrl_id_mask);
     1433          mscan->idmr3  = SET_IDMR3(ctrl_parms->ctrl_id_mask);
    12491434          break;
    12501435
    12511436        case RX_BUFFER_2:
    1252           mscan->idmr4  = SET_IDR4(ctrl_parms->ctrl_id_mask);
    1253           mscan->idmr5  = SET_IDR5(ctrl_parms->ctrl_id_mask);
     1437          mscan->idmr4  = SET_IDMR4(ctrl_parms->ctrl_id_mask);
     1438          mscan->idmr5  = SET_IDMR5(ctrl_parms->ctrl_id_mask);
    12541439          break;
    12551440
    12561441        case RX_BUFFER_3:
    1257           mscan->idmr6  = SET_IDR6(ctrl_parms->ctrl_id_mask);
    1258           mscan->idmr7  = SET_IDR7(ctrl_parms->ctrl_id_mask);
     1442          mscan->idmr6  = SET_IDMR6(ctrl_parms->ctrl_id_mask);
     1443          mscan->idmr7  = SET_IDMR7(ctrl_parms->ctrl_id_mask);
    12591444          break;
    12601445
    12611446        default:
     
    12811466        {
    12821467
    12831468        case RX_BUFFER_0:
    1284           ctrl_parms->ctrl_id_mask = GET_IDR0(mscan->idmr0) | GET_IDR1(mscan->idmr1);
     1469          ctrl_parms->ctrl_id_mask = GET_IDMR0(mscan->idmr0) | GET_IDMR1(mscan->idmr1);
    12851470          break;
    12861471
    12871472        case RX_BUFFER_1:
    1288           ctrl_parms->ctrl_id_mask = GET_IDR2(mscan->idmr2) | GET_IDR3(mscan->idmr3);
     1473          ctrl_parms->ctrl_id_mask = GET_IDMR2(mscan->idmr2) | GET_IDMR3(mscan->idmr3);
    12891474          break;
    12901475
    12911476        case RX_BUFFER_2:
    1292           ctrl_parms->ctrl_id_mask = GET_IDR4(mscan->idmr4) | GET_IDR5(mscan->idmr5);
     1477          ctrl_parms->ctrl_id_mask = GET_IDMR4(mscan->idmr4) | GET_IDMR5(mscan->idmr5);
    12931478          break;
    12941479
    12951480        case RX_BUFFER_3:
    1296           ctrl_parms->ctrl_id_mask = GET_IDR6(mscan->idmr6) | GET_IDR7(mscan->idmr7);
     1481          ctrl_parms->ctrl_id_mask = GET_IDMR6(mscan->idmr6) | GET_IDMR7(mscan->idmr7);
    12971482          break;
    12981483
    12991484        default:
     
    13391524
    13401525      break;
    13411526
     1527    /* set can bitrate */
     1528    case MSCAN_SET_BAUDRATE:
     1529
     1530      /* check bitrate settings */
     1531      if(((ctrl_parms->ctrl_can_bitrate) >= CAN_BIT_RATE_MIN) && ((ctrl_parms->ctrl_can_bitrate) <= CAN_BIT_RATE_MAX)) {
     1532
     1533        /* enter init mode */
     1534        mpc5200_mscan_enter_init_mode(mscan);
     1535
     1536        /* perform all can bit time settings */
     1537        mpc5200_mscan_perform_bit_time_settings(mscan,(uint32_t)(ctrl_parms->ctrl_can_bitrate),IPB_CLOCK);
     1538
     1539        /* exit init mode and perform further initialization which is required in the normal mode */
     1540        mpc5200_mscan_exit_init_mode(mscan);
     1541
     1542        /* enable ints. */
     1543        mpc5200_mscan_int_enable(mscan);
     1544
     1545        /* wait for bus sync. */
     1546        mpc5200_mscan_wait_sync(mscan);
     1547
     1548            return RTEMS_SUCCESSFUL;
     1549            }
     1550          else {
     1551
     1552             return RTEMS_UNSATISFIED;
     1553             }
     1554
     1555      break;
     1556
     1557    case SET_TX_BUF_NO:
     1558
     1559      /* check for different settings of tx ring buffer */
     1560      if((tx_buf_count = chan->tx_buf_no) != (uint8_t)(ctrl_parms->ctrl_tx_buf_no))
     1561        {
     1562
     1563        /* preset the channel specific no of messages in the tx ring buffer */
     1564        tx_buf_count = chan->tx_buf_no;
     1565
     1566        /* try to obtain all of the tx ring buffers */
     1567        while(tx_buf_count > 0)
     1568          {
     1569
     1570          /* obtain semaphore of all tx ring buffers */
     1571                  if((status = rtems_semaphore_obtain((rtems_id)(chan->tx_rb_sid),
     1572                                                           RTEMS_WAIT,
     1573                                                          (rtems_interval)10))
     1574                                                == RTEMS_SUCCESSFUL)
     1575                {
     1576
     1577                    tx_buf_count--;
     1578
     1579                }
     1580
     1581          }
     1582
     1583        /* free the former tx ring buffer */
     1584        free((void *)chan->tx_ring_buf.buf_ptr);
     1585
     1586        /* allocate the tx ring buffer with new size */
     1587            if(((chan->tx_ring_buf.buf_ptr) = malloc(sizeof(struct can_message)*((uint8_t)(ctrl_parms->ctrl_tx_buf_no)+1))) != NULL)
     1588              {
     1589                  chan->tx_ring_buf.head_ptr = chan->tx_ring_buf.tail_ptr = chan->tx_ring_buf.buf_ptr;
     1590              }
     1591            else
     1592              {
     1593                  return RTEMS_UNSATISFIED;
     1594              }
     1595
     1596        /* set the new amount of tx buffers */
     1597        chan->tx_buf_no =  (uint8_t)(ctrl_parms->ctrl_tx_buf_no);
     1598
     1599        /* release the semaphore of all tx ring buffers */
     1600        while(tx_buf_count < chan->tx_buf_no)
     1601                  {
     1602
     1603                  /* obtain semaphore of all tx ring buffers */
     1604              rtems_semaphore_release((rtems_id)(chan->tx_rb_sid));
     1605
     1606                  tx_buf_count++;
     1607
     1608                  }
     1609
     1610            }
     1611          else
     1612            {
     1613
     1614        return RTEMS_SUCCESSFUL;
     1615
     1616            }
     1617      break;
     1618
    13421619    default:
    13431620      break;
    13441621
  • c/src/lib/libbsp/powerpc/gen5200/mscan/mscan.h

    diff -Nur -x configure -x Makefile.in -x autom4te.cache -x .svn -x '*.rej' -x '*.orig' -x '*~' ./rtems-4.6.99.3/c/src/lib/libbsp/powerpc/gen5200/mscan/mscan.h ./rtems-4.6.99.3_patched/c/src/lib/libbsp/powerpc/gen5200/mscan/mscan.h
    old new  
    2626extern "C" {
    2727#endif
    2828
     29#define MIN_NO_OF_TQ         7
     30#define NO_OF_TABLE_ENTRIES  4
     31#define TSEG_1               1
     32#define TSEG_2               2
     33#define SJW                  3
    2934
    3035#define MSCAN_MAX_DATA_BYTES     8
    3136#define MSCAN_RX_BUFF_NUM        4
     
    3439
    3540#define MSCAN_A_DEV_NAME         "/dev/mscana"
    3641#define MSCAN_B_DEV_NAME         "/dev/mscanb"
     42#define MSCAN_0_DEV_NAME         "/dev/mscan0"
     43#define MSCAN_1_DEV_NAME         "/dev/mscan1"
    3744#define MSCAN_A                  0
    3845#define MSCAN_B                  1
    3946
    40 #define MSCAN_INITIALIZED_MODE   0
    41 #define MSCAN_INIT_NORMAL_MODE   1
    42 #define MSCAN_NORMAL_MODE        2
    43 #define MSCAN_SLEEP_MODE         4
     47#define MSCAN_NON_INITIALIZED_MODE   0
     48#define MSCAN_INITIALIZED_MODE       1
     49#define MSCAN_INIT_NORMAL_MODE       2
     50#define MSCAN_NORMAL_MODE            4
     51#define MSCAN_SLEEP_MODE             8
     52
     53#define CAN_BIT_RATE_MAX         1000000
     54#define CAN_BIT_RATE_MIN         100000
    4455
    4556#define CAN_BIT_RATE             100000
    4657#define CAN_MAX_NO_OF_TQ         25
     
    5465#define MSCAN_GET_RX_ID_MASK     4
    5566#define MSCAN_SET_TX_ID          5
    5667#define MSCAN_GET_TX_ID          6
     68
    5769#define TOUCAN_MSCAN_INIT        7
     70#define MSCAN_SET_BAUDRATE       8
     71#define SET_TX_BUF_NO            9
    5872
    5973#define MSCAN_RX_BUFF_NOACTIVE   (0 << 4)
    6074#define MSCAN_RX_BUFF_EMPTY      (1 << 6)
     
    6276#define MSCAN_RX_BUFF_OVERRUN    ((MSCAN_RX_BUFF_EMPTY) | (MSCAN_RX_BUFF_FULL))
    6377#define MSCAN_RX_BUFF_BUSY       (1 << 4)
    6478
    65 #define MSCAN_A_MBUFF_MASK       0x07
    66 #define MSCAN_B_MBUFF_MASK       0x07
     79#define MSCAN_MBUFF_MASK         0x07
    6780
    6881#define MSCAN_TX_BUFF0           (1 << 0)
    6982#define MSCAN_TX_BUFF1           (1 << 1)
     
    175188#define SET_IDR7(u16)            SET_IDR1(u16)
    176189
    177190#define GET_IDR0(u16)            ((uint16_t) ((u16) << 3))
    178 #define GET_IDR1(u16)            ((uint16_t)((u16) >> 5))
     191#define GET_IDR1(u16)            ((uint16_t)(((u16) >> 5)&0x0007))
    179192
    180193#define GET_IDR2(u16)            GET_IDR0(u16)
    181194#define GET_IDR3(u16)            GET_IDR1(u16)
     
    186199#define GET_IDR6(u16)            GET_IDR0(u16)
    187200#define GET_IDR7(u16)            GET_IDR1(u16)
    188201
    189 #define NO_OF_MSCAN_A_RX_BUFF    20
    190 #define NO_OF_MSCAN_B_RX_BUFF    20
     202#define SET_IDMR0(u16)           ((uint8_t)((u16) >> 3))
     203#define SET_IDMR1(u16)           ((uint8_t)((((u16) & 0x0007) << 5))|0x001F)
     204
     205#define SET_IDMR2(u16)           SET_IDMR0(u16)
     206#define SET_IDMR3(u16)           SET_IDMR1(u16)
     207
     208#define SET_IDMR4(u16)           SET_IDMR0(u16)
     209#define SET_IDMR5(u16)           SET_IDMR1(u16)
     210
     211#define SET_IDMR6(u16)           SET_IDMR0(u16)
     212#define SET_IDMR7(u16)           SET_IDMR1(u16)
     213
     214#define GET_IDMR0(u16)           ((uint16_t) ((u16) << 3))
     215#define GET_IDMR1(u16)           ((uint16_t)(((u16) >> 5)&0x0007))
     216
     217#define GET_IDMR2(u16)           GET_IDMR0(u16)
     218#define GET_IDMR3(u16)           GET_IDMR1(u16)
     219
     220#define GET_IDMR4(u16)           GET_IDMR0(u16)
     221#define GET_IDMR5(u16)           GET_IDMR1(u16)
     222
     223#define GET_IDMR6(u16)           GET_IDMR0(u16)
     224#define GET_IDMR7(u16)           GET_IDMR1(u16)
     225
     226#define NO_OF_MSCAN_RX_BUFF      20
    191227#define MSCAN_MESSAGE_SIZE(size) (((size)%CPU_ALIGNMENT) ? (((size) + CPU_ALIGNMENT)-((size) + CPU_ALIGNMENT)%CPU_ALIGNMENT) : (size))
    192228
    193229#define TX_BUFFER_0              0
     
    199235#define RX_BUFFER_2              2
    200236#define RX_BUFFER_3              3
    201237
     238#define NO_OF_MSCAN_TX_BUFF      20
     239#define RING_BUFFER_EMPTY(rbuff) ((((rbuff)->head) == ((rbuff)->tail)) ? TRUE : FALSE)
     240#define RING_BUFFER_FULL(rbuff)  ((((rbuff)->head) == ((rbuff)->tail)) ? TRUE : FALSE)
     241
     242
    202243typedef struct _mscan_handle
    203244  {
    204245  uint8_t mscan_channel;
     
    212253  uint16_t mess_time_stamp;
    213254  uint8_t  mess_data[MSCAN_MAX_DATA_BYTES];
    214255  uint8_t  mess_len;
     256  uint32_t toucan_tx_id;
    215257  };
    216258
     259volatile struct ring_buf
     260    {
     261    volatile struct can_message *buf_ptr;
     262    volatile struct can_message *head_ptr;
     263    volatile struct can_message *tail_ptr;
     264    };
     265
    217266struct mpc5200_rx_cntrl
    218267  {
    219268  struct can_message can_rx_message[MSCAN_RX_BUFF_NUM];
    220269  };
    221270
    222 
    223271struct mscan_channel_info
    224272  {
    225273  volatile struct mpc5200_mscan *regs;
    226274  uint32_t   int_rx_err;
    227   rtems_id           rx_qid;
     275  rtems_id   rx_qid;
    228276  uint32_t   rx_qname;
     277  rtems_id   tx_rb_sid;
     278  uint32_t   tx_rb_sname;
    229279  uint8_t    id_extended;
    230280  uint8_t    mode;
     281  uint8_t    tx_buf_no;
     282  volatile struct ring_buf tx_ring_buf;
    231283  };
    232284
    233285struct mscan_rx_parms
     
    248300    uint32_t ctrl_id;
    249301    uint32_t ctrl_id_mask;
    250302    uint8_t  ctrl_reg_no;
     303    uint8_t  ctrl_tx_buf_no;
     304    uint32_t ctrl_can_bitrate;
    251305    void (*toucan_cb_fnc)(int16_t);
    252306  };
    253307
     
    304358void mpc5200_mscan_perform_normal_mode_settings(volatile struct mpc5200_mscan *);
    305359rtems_status_code mpc5200_mscan_set_mode(rtems_device_minor_number, uint8_t);
    306360rtems_status_code mscan_channel_initialize(rtems_device_major_number, rtems_device_minor_number);
     361uint8_t prescaler_calculation(uint32_t, uint32_t, uint8_t *);
     362void mpc5200_mscan_perform_bit_time_settings(volatile struct mpc5200_mscan *, uint32_t, uint32_t);
    307363
    308364
    309365#ifdef __cplusplus
  • c/src/lib/libbsp/powerpc/gen5200/network_5200/network.c

    diff -Nur -x configure -x Makefile.in -x autom4te.cache -x .svn -x '*.rej' -x '*.orig' -x '*~' ./rtems-4.6.99.3/c/src/lib/libbsp/powerpc/gen5200/network_5200/network.c ./rtems-4.6.99.3_patched/c/src/lib/libbsp/powerpc/gen5200/network_5200/network.c
    old new  
    7878
    7979#define SDMA_BD_TFD     0x08000000      /*< Transmit Frame Done         */
    8080#define SDMA_BD_INT     0x04000000      /*< Interrupt on frame done     */
    81 #define SDMA_BD_RX_NUM  32 /* Number of receive buffer descriptors      */
    82 #define SDMA_BD_TX_NUM  48 /* Number of transmit buffer descriptors     */
     81#define SDMA_BD_RX_NUM  64 /* Number of receive buffer descriptors      */
     82#define SDMA_BD_TX_NUM  64 /* Number of transmit buffer descriptors     */
    8383
    8484#define SET_BD_STATUS(bd, stat) {               \
    8585        (bd)->Status &= 0x0000ffff;                     \
     
    127127 * This must *not* be the same event used by the TCP/IP task synchronization.
    128128 */
    129129#define INTERRUPT_EVENT RTEMS_EVENT_1
     130#define FATAL_INT_EVENT RTEMS_EVENT_3
    130131
    131132/*
    132133 * RTEMS event used to start transmit daemon.
     
    197198  } mpc5200_buffer_desc_t;
    198199
    199200
     201#define FEC_INTR_MASK_USED \
     202(FEC_INTR_LCEN  |FEC_INTR_CRLEN |\
     203 FEC_INTR_XFUNEN|FEC_INTR_XFERREN|FEC_INTR_RFERREN)
     204
    200205/*
    201206 * Device data
    202207 */
     
    235240  unsigned long           txRetryLimit;
    236241  };
    237242
    238 uint8_t tx_shadow_buffer[TX_BUF_COUNT][(ETHER_MAX_LEN+3)&~3];
    239 
    240243static struct mpc5200_enet_struct enet_driver[NIFACES];
    241244
    242245extern int taskTable;
     246static void mpc5200_fec_restart(struct mpc5200_enet_struct *sc);
    243247
    244248
    245249
     
    280284}
    281285
    282286/*
     287 * Function:    mpc5200_fec_rx_bd_cleanup
     288 *
     289 * Description: put all mbufs pending in rx BDs back to buffer pool
     290 *
     291 * Returns:             void
     292 *
     293 */
     294static void mpc5200_fec_rx_bd_cleanup(struct mpc5200_enet_struct *sc) {
     295  int rxBdIndex;
     296  struct mbuf *m,*n;
     297
     298  /*
     299   * Drain RX buffer descriptor ring.
     300   */
     301  for( rxBdIndex = 0; rxBdIndex < sc->rxBdCount; rxBdIndex++ ) {
     302    n = sc->rxMbuf[rxBdIndex];
     303    while (n != NULL) {
     304      m = n;
     305      MFREE(m,n);
     306    }
     307  }
     308}
     309
     310/*
    283311 * Function:    MPC5200_eth_addr_filter_set
    284312 *
    285313 * Description: Set individual address filter for unicast address and
     
    492520 *
    493521 */
    494522static int mpc5200_fec_reset(struct mpc5200_enet_struct *sc) {
     523  volatile int delay;
    495524  /*
    496525   * Clear FIFO status registers
    497526   */
     
    499528  mpc5200.tfifo_status &= FEC_FIFO_STAT_ERROR;
    500529 
    501530  /*
    502    *
     531   * reset the FIFOs
    503532   */
     533  mpc5200.reset_cntrl = 0x03000000;
     534
     535  for (delay = 0;delay < 16*4;delay++) {};
     536
    504537  mpc5200.reset_cntrl = 0x01000000;
    505538 
    506539  /*
     
    511544  /*
    512545   * wait at least 16 clock cycles
    513546   */
    514   rtems_task_wake_after(2);
     547  for (delay = 0;delay < 16*4;delay++) {};
    515548 
    516549  return TRUE;
    517550}
     
    554587#endif  /* ETH_DEBUG */
    555588
    556589 /*
    557   * mask FEC chip interrupts
     590  * block FEC chip interrupts
    558591  */
    559   mpc5200.imask = FEC_INTR_MASK_ALL;
     592  mpc5200.imask = 0;
    560593
    561594 /*
    562595  * issue graceful stop command to the FEC transmitter if necessary
     
    565598
    566599 /*
    567600  * wait for graceful stop to register
     601  * FIXME: add rtems_task_wake_after here, if it takes to long
    568602  */
    569603  while((counter--) && (!(mpc5200.ievent & FEC_INTR_GRA)));
    570604
     
    584618  */
    585619  mpc5200.ecntrl &= ~(FEC_ECNTRL_OE | FEC_ECNTRL_EN);
    586620
    587   }
     621  /*
     622   * cleanup all buffers
     623   */
     624  mpc5200_fec_rx_bd_cleanup(sc);
    588625
     626  }
    589627
    590628/*
    591  * MPC5200 SmartComm ethernet interrupt handler
     629 * MPC5200 FEC interrupt handler
    592630 */
    593 void mpc5200_smartcomm_rx_irq_handler(rtems_irq_hdl_param unused)
    594   {
     631void mpc5200_fec_irq_handler(rtems_irq_hdl_param handle)
     632{
     633  struct mpc5200_enet_struct *sc = (struct mpc5200_enet_struct *) handle;
    595634  volatile uint32_t ievent;
    596635
    597636  ievent = mpc5200.ievent;
    598637
     638  mpc5200.ievent = ievent;
     639  /*
     640   * check errors, update statistics
     641   */
     642  if (ievent & FEC_INTR_LATE_COL) {
     643    sc->txLateCollision++;
     644  }
     645  if (ievent & FEC_INTR_COL_RETRY) {
     646    sc->txRetryLimit++;
     647  }
     648  if (ievent & FEC_INTR_XFIFO_UN) {
     649    sc->txUnderrun++;
     650  }
     651  if (ievent & FEC_INTR_XFIFO_ERR) {
     652    sc->txUnderrun++;
     653  }
     654  if (ievent & FEC_INTR_RFIFO_ERR) {
     655    sc->rxOverrun++;
     656  }
     657  /*
     658   * fatal error ocurred?
     659   */
     660  if (ievent & (FEC_INTR_XFIFO_ERR | FEC_INTR_RFIFO_ERR)) {
     661    mpc5200.imask &= ~(FEC_INTR_XFERREN | FEC_INTR_RFERREN);
     662    rtems_event_send(enet_driver[0].rxDaemonTid, FATAL_INT_EVENT);
     663  }
     664}
    599665
     666/*
     667 * MPC5200 SmartComm ethernet interrupt handler
     668 */
     669void mpc5200_smartcomm_rx_irq_handler(rtems_irq_hdl_param unused)
     670  {
    600671 /* Frame received? */
    601672  if(GET_SDMA_PENDINGBIT(FEC_RECV_TASK_NO))
    602673    {
     
    617688 */
    618689void mpc5200_smartcomm_tx_irq_handler(rtems_irq_hdl_param unused)
    619690  {
    620   volatile uint32_t ievent;
    621 
    622   ievent = mpc5200.ievent;
    623 
    624 
    625691 /* Buffer transmitted or transmitter error? */
    626692  if(GET_SDMA_PENDINGBIT(FEC_XMIT_TASK_NO))
    627693    {
     
    652718  * Notes:
    653719  *
    654720  */
    655 static void mpc5200_fec_retire_tbd(struct mpc5200_enet_struct *sc)
     721static void mpc5200_fec_retire_tbd(struct mpc5200_enet_struct *sc,
     722                                   boolean force)
    656723{
    657724  struct mbuf *n;
    658725  TaskBD1_t   *bdRing = (TaskBD1_t *)TaskGetBDRing( txTaskId );;
     
    662729   */
    663730 
    664731  while ((sc->txBdActiveCount > 0) &&
    665          (bdRing[sc->txBdTail].Status == 0x0)) {
     732         (force || (bdRing[sc->txBdTail].Status == 0x0))) {
    666733    if (sc->txMbuf[sc->txBdTail] != NULL) {
    667734      /*
    668735       * NOTE: txMbuf can be NULL, if mbuf has been split into different BDs
     
    677744  }
    678745}
    679746
     747 /*
     748  * Function:        mpc5200_fec_tx_bd_requeue
     749  *
     750  * Description:        put buffers back to interface output queue
     751  *
     752  * Returns:            void
     753  *
     754  * Notes:
     755  *
     756  */
     757static void mpc5200_fec_tx_bd_requeue(struct mpc5200_enet_struct *sc)
     758{
     759  /*
     760   * Clear already transmitted BDs first. Will not work calling same
     761   * from fecExceptionHandler(TFINT).
     762   */
     763 
     764  while (sc->txBdActiveCount > 0) {
     765    if (sc->txMbuf[sc->txBdHead] != NULL) {
     766      /*
     767       * NOTE: txMbuf can be NULL, if mbuf has been split into different BDs
     768       */
     769      IF_PREPEND(&(sc->arpcom.ac_if.if_snd),sc->txMbuf[sc->txBdHead]);
     770      sc->txMbuf[sc->txBdHead] = NULL;
     771    }
     772    sc->txBdActiveCount--;
     773    if(--sc->txBdHead < 0) {
     774      sc->txBdHead = sc->txBdCount-1;
     775    }   
     776  }
     777}
    680778
    681779static void mpc5200_fec_sendpacket(struct ifnet *ifp,struct mbuf *m) {
    682780  struct mpc5200_enet_struct *sc = ifp->if_softc;
     
    693791 /*
    694792  * Free up buffer descriptors
    695793  */
    696   mpc5200_fec_retire_tbd(sc);
     794  mpc5200_fec_retire_tbd(sc,FALSE);
    697795
    698796 /*
    699797  * Set up the transmit buffer descriptors.
     
    728826       * last buffer descriptor in a frame can generate
    729827       * an interrupt.
    730828       */
    731       mpc5200_fec_retire_tbd(sc);
     829      mpc5200_fec_retire_tbd(sc,FALSE);
    732830     
    733831      while((sc->txBdActiveCount + nAdded) == sc->txBdCount) {
    734832        bestcomm_glue_irq_enable(FEC_XMIT_TASK_NO);
    735833        rtems_bsdnet_event_receive(INTERRUPT_EVENT,
    736834                                   RTEMS_WAIT | RTEMS_EVENT_ANY,
    737835                                   RTEMS_NO_TIMEOUT, &events);
    738         mpc5200_fec_retire_tbd(sc);
     836        mpc5200_fec_retire_tbd(sc,FALSE);
    739837      }
    740838    }
    741839
     
    768866      status             = ((m->m_next == NULL)
    769867                            ? TASK_BD_TFD | TASK_BD_INT
    770868                            : 0);
    771     /*
    772      * Don't set the READY flag till the
    773      * whole packet has been readied.
    774      */
     869      /*
     870       * Don't set the READY flag till the
     871       * whole packet has been readied.
     872       */
    775873      if (firstBd != NULL) {
    776874        status |= (uint32)SDMA_BD_MASK_READY;
    777875      }
     
    821919  struct mbuf *m;
    822920  rtems_event_set events;
    823921
    824   for(;;)
    825     {
     922  for(;;) {
    826923   /*
    827924    * Wait for packet
    828925    */
     926    bestcomm_glue_irq_enable(FEC_XMIT_TASK_NO);
    829927    rtems_bsdnet_event_receive(START_TRANSMIT_EVENT|INTERRUPT_EVENT,
    830928                               RTEMS_EVENT_ANY | RTEMS_WAIT,
    831929                               RTEMS_NO_TIMEOUT,
     
    9441042     */
    9451043    bestcomm_glue_irq_enable(FEC_RECV_TASK_NO);
    9461044     
    947     rtems_bsdnet_event_receive (INTERRUPT_EVENT,
     1045    rtems_bsdnet_event_receive (INTERRUPT_EVENT | FATAL_INT_EVENT,
    9481046                                RTEMS_WAIT | RTEMS_EVENT_ANY,
    9491047                                RTEMS_NO_TIMEOUT, &events);
    950 
     1048    if (events & FATAL_INT_EVENT) {
     1049      /*
     1050       * fatal interrupt ocurred, so reinit fec and restart bestcomm tasks
     1051       */
     1052      mpc5200_fec_restart(sc);
     1053      rxBdIndex = 0;
     1054    }
    9511055  }
    9521056}
    9531057
     
    9651069 */
    9661070static void mpc5200_fec_initialize_hardware(struct mpc5200_enet_struct *sc)
    9671071  {
    968   int            timeout;
    969   unsigned short phyAddr = 0;
    9701072
    9711073 /*
    9721074  * Reset mpc5200 FEC
     
    9811083 /*
    9821084  * Set interrupt mask register
    9831085  */
    984   mpc5200.imask = (FEC_INTR_HBEEN
    985                  | FEC_INTR_BREN
    986                  | FEC_INTR_BTEN
    987                  | FEC_INTR_GRAEN
    988                  | FEC_INTR_LATE_COL
    989                  | FEC_INTR_COL_RETRY
    990                  | FEC_INTR_XFIFO_UN
    991                  | FEC_INTR_XFIFO_ERR
    992                  | FEC_INTR_RFIFO_ERR
    993                  | FEC_INTR_TFINT
    994                  );
     1086  mpc5200.imask = FEC_INTR_MASK_USED;
    9951087  /*
    9961088   * Set FEC-Lite receive control register (R_CNTRL)
    9971089   * frame length=1518, MII mode for 18-wire-transceiver
     
    10541146  * enable CRC in finite state machine register
    10551147  */
    10561148  mpc5200.xmit_fsm = FEC_FSM_CRC | FEC_FSM_ENFSM;
     1149  }
    10571150
    10581151 /*
    10591152  * Initialize PHY(LXT971A):
     
    10751168  * Note:
    10761169  *   The physical address is dependent on hardware configuration.
    10771170  *
     1171  * Returns:            void
     1172  *
     1173  * Notes:
     1174  *
    10781175  */
     1176static void mpc5200_fec_initialize_phy(struct mpc5200_enet_struct *sc)
     1177  {
     1178  int            timeout;
     1179  unsigned short phyAddr = 0;
     1180
    10791181
    10801182 /*
    10811183  * Reset PHY, then delay 300ns
     
    11801282/*
    11811283 * set up sdma tasks for ethernet
    11821284 */
    1183 static void mpc5200_sdma_task_setup(void) {
     1285static void mpc5200_sdma_task_setup(struct mpc5200_enet_struct *sc) {
    11841286  TaskSetupParamSet_t   rxParam;        /* RX task setup parameters     */
    11851287  TaskSetupParamSet_t   txParam;        /* TX task setup parameters     */
    11861288
    11871289  /*
    11881290   * Setup the SDMA RX task.
    11891291   */
    1190   rxParam.NumBD        = SDMA_BD_RX_NUM;
     1292  rxParam.NumBD        = sc->rxBdCount;
    11911293  rxParam.Size.MaxBuf  = ETHER_MAX_LEN;
    11921294  rxParam.Initiator    = 0;
    11931295  rxParam.StartAddrSrc = (uint32)&(mpc5200.rfifo_data);
     
    12011303  /*
    12021304   * Setup the TX task.
    12031305   */
    1204   txParam.NumBD        = SDMA_BD_TX_NUM;
     1306  txParam.NumBD        = sc->txBdCount;
    12051307  txParam.Size.MaxBuf  = ETHER_MAX_LEN;
    12061308  txParam.Initiator    = 0;
    12071309  txParam.StartAddrSrc = (uint32)NULL;
     
    12151317
    12161318}
    12171319
     1320void mpc5200_fec_irq_on(const rtems_irq_connect_data* ptr)
     1321{
     1322  mpc5200.imask = FEC_INTR_MASK_USED;
     1323}
     1324
     1325
     1326int mpc5200_fec_irq_isOn(const rtems_irq_connect_data* ptr)
     1327{
     1328  return mpc5200.imask != 0;
     1329}
     1330
     1331
     1332void mpc5200_fec_irq_off(const rtems_irq_connect_data* ptr)
     1333{
     1334  mpc5200.imask = 0;
     1335}
     1336
    12181337
    12191338/*
    12201339 * Initialize and start the device
     
    12231342{
    12241343  struct mpc5200_enet_struct *sc = (struct mpc5200_enet_struct *)arg;
    12251344  struct ifnet *ifp = &sc->arpcom.ac_if;
     1345  rtems_irq_connect_data fec_irq_data = {
     1346    BSP_SIU_IRQ_ETH,
     1347    mpc5200_fec_irq_handler, /* rtems_irq_hdl           */
     1348    (rtems_irq_hdl_param)sc, /* (rtems_irq_hdl_param)   */
     1349    mpc5200_fec_irq_on,      /* (rtems_irq_enable)      */
     1350    mpc5200_fec_irq_off,     /* (rtems_irq_disable)     */
     1351    mpc5200_fec_irq_isOn     /* (rtems_irq_is_enabled)  */
     1352  };
     1353
    12261354
    12271355  if(sc->txDaemonTid == 0)
    12281356    {
     
    12391367
    12401368      bestcomm_glue_init();
    12411369
    1242       mpc5200_sdma_task_setup();
     1370      mpc5200_sdma_task_setup(sc);
    12431371   
    12441372      /*
    12451373       * Set up interrupts
     
    12501378      bestcomm_glue_irq_install(FEC_XMIT_TASK_NO,
    12511379                                mpc5200_smartcomm_tx_irq_handler,
    12521380                                NULL);
     1381      if(!BSP_install_rtems_irq_handler (&fec_irq_data)) {
     1382        rtems_panic ("Can't attach MPC5x00 FEX interrupt handler\n");
     1383      }
     1384
    12531385      /* mpc5200_fec_tx_bd_init(sc); */
    12541386      mpc5200_fec_rx_bd_init(sc);
    12551387
     
    12581390       */
    12591391      mpc5200_fec_initialize_hardware(sc);
    12601392      /*
     1393       * Set up the phy
     1394       */
     1395      mpc5200_fec_initialize_phy(sc);
     1396      /*
    12611397       * Set priority of different initiators
    12621398       */
    12631399      mpc5200.IPR0 = 7; /* always initiator     */
     
    13221458
    13231459}
    13241460
     1461/*
     1462 * restart the driver, reinit the fec
     1463 * this function is responsible to reinitialize the FEC in case a fatal
     1464 * error has ocurred. This is needed, wen a RxFIFO Overrun or a TxFIFO underrun
     1465 * has ocurred. In these cases, the FEC is automatically disabled, and
     1466 * both FIFOs must be reset and the BestComm tasks must be restarted
     1467 *
     1468 * Note: the daemon tasks will continue to run
     1469 * (in fact this function will be called in the context of the rx daemon task)
     1470 */
     1471#define NEW_SDMA_SETUP
     1472
     1473static void mpc5200_fec_restart(struct mpc5200_enet_struct *sc)
     1474{
     1475  /*
     1476   * FIXME: bring Tx Daemon into idle state
     1477   */
     1478#ifdef NEW_SDMA_SETUP
     1479  /*
     1480   * cleanup remaining receive mbufs
     1481   */
     1482  mpc5200_fec_rx_bd_cleanup(sc);
     1483#endif
     1484  /*
     1485   * Stop SDMA tasks
     1486   */
     1487  TaskStop( rxTaskId);
     1488  TaskStop( txTaskId);
     1489  /*
     1490   * FIXME: wait, until Tx Daemon is in idle state
     1491   */
     1492
     1493  /*
     1494   * Disable transmit / receive interrupts
     1495   */
     1496  bestcomm_glue_irq_disable(FEC_XMIT_TASK_NO);
     1497  bestcomm_glue_irq_disable(FEC_RECV_TASK_NO);
     1498#ifdef NEW_SDMA_SETUP
     1499  /*
     1500   * recycle pending tx buffers
     1501   * FIXME: try to extract pending Tx buffers
     1502   */
     1503#if 0
     1504  mpc5200_fec_tx_bd_requeue(sc);
     1505#else
     1506  mpc5200_fec_retire_tbd(sc,TRUE);
     1507#endif
     1508#endif
     1509  /*
     1510   * re-initialize the FEC hardware
     1511   */
     1512  mpc5200_fec_initialize_hardware(sc);
     1513
     1514#ifdef NEW_SDMA_SETUP
     1515  /*
     1516   * completely reinitialize Bestcomm tasks
     1517   */
     1518  mpc5200_sdma_task_setup(sc);
     1519
     1520  /*
     1521   * reinit receive mbufs
     1522   */
     1523  mpc5200_fec_rx_bd_init(sc);
     1524#endif
     1525  /*
     1526   * Clear SmartDMA task interrupt pending bits.
     1527   */
     1528  TaskIntClear( rxTaskId );
     1529 
     1530  /*
     1531   * Enable the SmartDMA receive/transmit task.
     1532   */
     1533  TaskStart( rxTaskId, 1, rxTaskId, 1 );
     1534  TaskStart( txTaskId, 1, txTaskId, 1 );
     1535  /*
     1536   * reenable rx/tx interrupts
     1537   */
     1538  bestcomm_glue_irq_enable(FEC_XMIT_TASK_NO);
     1539  bestcomm_glue_irq_enable(FEC_RECV_TASK_NO);
     1540  /*
     1541   * (re-)init fec hardware
     1542   */
     1543  mpc5200_fec_initialize_hardware(sc);
     1544  /*
     1545   * reenable fec FIFO error interrupts
     1546   */
     1547  mpc5200.imask = FEC_INTR_MASK_USED;
     1548  /*
     1549   * Enable FEC-Lite controller
     1550   */
     1551  mpc5200.ecntrl |= (FEC_ECNTRL_OE | FEC_ECNTRL_EN);
     1552}
     1553
    13251554
    13261555/*
    13271556 * Driver ioctl handler
  • c/src/lib/libbsp/powerpc/gen5200/preinstall.am

    diff -Nur -x configure -x Makefile.in -x autom4te.cache -x .svn -x '*.rej' -x '*.orig' -x '*~' ./rtems-4.6.99.3/c/src/lib/libbsp/powerpc/gen5200/preinstall.am ./rtems-4.6.99.3_patched/c/src/lib/libbsp/powerpc/gen5200/preinstall.am
    old new  
    7777        $(INSTALL_DATA) $< $(PROJECT_LIB)/start.$(OBJEXT)
    7878TMPINSTALL_FILES += $(PROJECT_LIB)/start.$(OBJEXT)
    7979
    80 $(PROJECT_LIB)/linkcmds: startup/linkcmds $(PROJECT_LIB)/$(dirstamp)
    81         $(INSTALL_DATA) $< $(PROJECT_LIB)/linkcmds
    82 PREINSTALL_FILES += $(PROJECT_LIB)/linkcmds
     80$(PROJECT_LIB)/linkcmds.brs5l: startup/linkcmds.brs5l $(PROJECT_LIB)/$(dirstamp)
     81        $(INSTALL_DATA) $< $(PROJECT_LIB)/linkcmds.brs5l
     82PREINSTALL_FILES += $(PROJECT_LIB)/linkcmds.brs5l
     83
     84$(PROJECT_LIB)/linkcmds.pm520: startup/linkcmds.pm520 $(PROJECT_LIB)/$(dirstamp)
     85        $(INSTALL_DATA) $< $(PROJECT_LIB)/linkcmds.pm520
     86PREINSTALL_FILES += $(PROJECT_LIB)/linkcmds.pm520
    8387
    8488$(PROJECT_LIB)/linkcmds.pm520: startup/linkcmds.pm520 $(PROJECT_LIB)/$(dirstamp)
    8589        $(INSTALL_DATA) $< $(PROJECT_LIB)/linkcmds.pm520
  • c/src/lib/libbsp/powerpc/gen5200/start/start.S

    diff -Nur -x configure -x Makefile.in -x autom4te.cache -x .svn -x '*.rej' -x '*.orig' -x '*~' ./rtems-4.6.99.3/c/src/lib/libbsp/powerpc/gen5200/start/start.S ./rtems-4.6.99.3_patched/c/src/lib/libbsp/powerpc/gen5200/start/start.S
    old new  
    111111.endm
    112112
    113113.macro LWI reg, value
    114         lis \reg , \value@h
    115         ori \reg , \reg, \value@l
     114        lis \reg , (\value)@h
     115        ori \reg , \reg, (\value)@l
    116116        sync
    117117.endm
    118118
     
    286286         
    287287       
    288288
    289 #ifdef RSM5LOG 
     289#ifdef BRS5L
    290290        LWI     r30, CSBOOTROM_VAL
    291291        stw     r30, CSBOOTROM(r31)             /* Set CSBOOTROM */
    292292       
     
    299299        rlwinm  r30, r30,17,15,31
    300300        stw     r30, CS0STR(r31)                /* Set CS0STR */       
    301301                       
    302         LWI     r30, ROM_END
     302        lis     r30, ROM_END@h
     303        ori     r30, r30, ROM_END@l
     304       
    303305        rlwinm  r30, r30,17,15,31
    304306        stw     r30, CS0STP(r31)                /* Set CS0STP */
    305307                       
     
    327329        ori     r30,r30,0x1a                    /* size code: bank is 128MByte */
    328330        stw     r30,SDRAMCS0(r31)               /* Set SDRAMCS0 */
    329331
    330         LWI     r30,(RAM_END+1-RAM_START)/2
     332        LWI     r30,(RAM_SIZE)>>1
    331333        ori     r30,r30,0x1a                    /* size code: bank is 128MByte */
    332334        stw     r30, SDRAMCS1(r31)              /* Set SDRAMCS1 */
    333335       
     
    441443        stw     r30,ADREN(r31)                  /* enable CS1 */
    442444
    443445/* clear entire on chip SRAM (unique for ROM startup) */
    444         LWI     r30, (MBAR+ONCHIP_SRAM_OFFSET)  /* get start address of onchip SRAM */
     446        lis     r30, (MBAR+ONCHIP_SRAM_OFFSET)@h        /* get start address of onchip SRAM */
     447        ori     r30,r30,(MBAR+ONCHIP_SRAM_OFFSET)@l
    445448        LWI     r29, ONCHIP_SRAM_SIZE           /* get size of onchip SRAM */
    446449       
    447450        bl      clr_mem                         /* Clear onchip SRAM */
    448451       
    449 #endif /* defined(RSM5LOG) */
     452#endif /* defined(BRS5L) */
    450453/* clear .bss section (unique for ROM startup) */
    451454        LWI     r30, _bss_start                 /* get start address of bss section */
    452455        LWI     r29, _bss_size                  /* get size of bss section */
     
    522525        LWI     r30, 0xCCC70004                 /* Burst2Read Prec.delay=0x8, Burst Write delay=0x8 */
    523526        stw     r30, CFG2(r31)                  /* Burst Read2Write delay=0xB, Burst length=0x7, Read Tap=0x4 */
    524527       
    525 #ifdef RSM5LOG
     528#ifdef BRS5L
    526529        LWI     r30, 0xD1470000                 /* Mode Set enabled, Clock enabled, Auto refresh enabled, Mem. data drv */
    527530        stw     r30, CTRL(r31)                  /* Refresh counter=0xFFFF */
    528531       
     
    608611       
    609612copy_image_end:
    610613        blr
    611 #endif /* defined(RSM5LOG) */
     614#endif /* defined(BRS5L) */
    612615
    613616FID_DCache:
    614617        mflr    r26                     
     
    740743        mtfsfi  6, 0
    741744        mtfsfi  7, 0
    742745               
    743          
    744         CLRBITS r30, r29, MSR_FP                /* disable FPU and FPU exceptions  */
    745         mtmsr   r30
    746        
    747746        blr
    748747
    749748SPRG_init:                                      /* initialize registers */
  • c/src/lib/libbsp/powerpc/gen5200/startup/linkcmds

    diff -Nur -x configure -x Makefile.in -x autom4te.cache -x .svn -x '*.rej' -x '*.orig' -x '*~' ./rtems-4.6.99.3/c/src/lib/libbsp/powerpc/gen5200/startup/linkcmds ./rtems-4.6.99.3_patched/c/src/lib/libbsp/powerpc/gen5200/startup/linkcmds
    old new  
    1 /*
    2  *  This file contains directives for the GNU linker which are specific
    3  *  to a gen5200 Board
    4  *
    5  *  linkcmds,v 1.3 2003/01/20 19:53:27 joel Exp
    6  */
    7 
    8 OUTPUT_FORMAT("elf32-powerpc", "elf32-powerpc",
    9               "elf32-powerpc")
    10 OUTPUT_ARCH(powerpc)
    11  SEARCH_DIR(/usr/local/rtems/powerpc-rtems/lib);
    12  
    13 ENTRY(start)
    14 
    15 /*
    16  * Declare some sizes.
    17  * XXX: The assignment of ". += XyzSize;" fails in older gld's if the
    18  *      number used there is not constant.  If this happens to you, edit
    19  *      the lines marked XXX below to use a constant value.
    20  */
    21 HeapSize = DEFINED(HeapSize) ? HeapSize    : 0x6800000;  /* 104M  Heap */
    22 StackSize = DEFINED(StackSize) ? StackSize :   0x80000;  /* 512 kB   */
    23 WorkSpaceSize = DEFINED(WorkSpaceSize) ? WorkSpaceSize : 0x80000; /* 512k */
    24 RamDiskSize = DEFINED(RamDiskSize) ? RamDiskSize : 0x80000; /* 512 ram disk */
    25  
    26 MEMORY
    27         {
    28         ram : org = 0x0, l = 256M
    29         mpc5200_regs : org = 0xF0000000, l = 24K
    30         dpram : org = 0xFF000000, l = 0x400
    31         flash : org = 0xFFE00000, l = 2M
    32         }
    33 
    34 
    35 SECTIONS
    36 {
    37 
    38    .vectors 0x100 :
    39     {
    40     *(.vectors)
    41     }   
    42     > ram
    43 
    44     /*
    45      * The stack will live in this area - between the vectors and
    46      * the text section.
    47      */
    48        
    49     .text 0x10000:
    50     {
    51     _textbase = .;
    52 
    53 
    54     text.start = .;
    55 
    56     /* Entry point is the .entry section */
    57     *(.entry)
    58     *(.entry2)
    59 
    60     /* Actual Code */
    61     *(.text*)
    62 
    63     *(.rodata*)
    64     *(.rodata1)
    65 
    66 
    67     /*
    68      * Special FreeBSD sysctl sections.
    69      */
    70     . = ALIGN (16);
    71     __start_set_sysctl_set = .;
    72     *(set_sysctl_*);
    73     __stop_set_sysctl_set = ABSOLUTE(.);
    74     *(set_domain_*);
    75     *(set_pseudo_*);
    76 
    77     /* C++ constructors/destructors */
    78     *(.gnu.linkonce.t*)
    79 
    80     /*  Initialization and finalization code.
    81      *
    82      *  Various files can provide initialization and finalization functions.
    83      *  The bodies of these functions are in .init and .fini sections. We
    84      *  accumulate the bodies here, and prepend function prologues from
    85      *  ecrti.o and function epilogues from ecrtn.o. ecrti.o must be linked
    86      *  first; ecrtn.o must be linked last. Because these are wildcards, it
    87      *  doesn't matter if the user does not actually link against ecrti.o and
    88      *  ecrtn.o; the linker won't look for a file to match a wildcard.  The
    89      *  wildcard also means that it doesn't matter which directory ecrti.o
    90      *  and ecrtn.o are in.
    91      */
    92     PROVIDE (_init = .);
    93     *ecrti.o(.init)
    94     *(.init)
    95     *ecrtn.o(.init)
    96    
    97     PROVIDE (_fini = .);
    98     *ecrti.o(.fini)
    99     *(.fini)
    100     *ecrtn.o(.init)
    101 
    102     /*
    103      *  C++ constructors and destructors for static objects.
    104      *  PowerPC EABI does not use crtstuff yet, so we build "old-style"
    105      *  constructor and destructor lists that begin with the list lenght
    106      *  end terminate with a NULL entry.
    107      */
    108      
    109     PROVIDE (__CTOR_LIST__ = .);             
    110     /* LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2) */
    111     *crtbegin.o(.ctors)
    112     *(.ctors)
    113     *crtend.o(.ctors)
    114     LONG(0)
    115     PROVIDE (__CTOR_END__ = .);
    116        
    117     PROVIDE (__DTOR_LIST__ = .);
    118     /* LONG((__DTOR_END__ - __DTOR_LIST__) / 4 - 2) */
    119     *crtbegin.o(.dtors)
    120     *(.dtors)
    121     *crtend.o(.dtors)
    122     LONG(0)
    123     PROVIDE (__DTOR_END__ = .);
    124        
    125     /* Exception frame info */
    126     *(.eh_frame)
    127 
    128     /* Miscellaneous read-only data */
    129     _rodata_start = . ;
    130     *(.gnu.linkonce.r*)
    131     *(.lit)
    132     *(.shdata)
    133     *(.rodata)
    134     *(.rodata1)
    135     *(.descriptors)
    136     *(rom_ver)
    137     _erodata = .;
    138 
    139     PROVIDE (__EXCEPT_START__ = .);
    140     *(.gcc_except_table)
    141     PROVIDE (__EXCEPT_END__ = .);
    142     __GOT_START__ = .;
    143     s.got = .;
    144     *(.got.plt)
    145     *(.got)
    146     *(.got1)
    147     PROVIDE (__GOT2_START__ = .);
    148     PROVIDE (_GOT2_START_ = .);
    149     *(.got2)
    150     PROVIDE (__GOT2_END__ = .);
    151     PROVIDE (_GOT2_END_ = .);
    152    
    153     PROVIDE (__FIXUP_START__ = .);
    154     PROVIDE (_FIXUP_START_ = .);
    155     *(.fixup)
    156     PROVIDE (_FIXUP_END_ = .);
    157     PROVIDE (__FIXUP_END__ = .);
    158    
    159     /* Various possible names for the end of the .text section */
    160     etext = ALIGN(0x10);
    161     _etext = .;
    162     _endtext = .;
    163     text.end = .;
    164     PROVIDE (etext = .);
    165     PROVIDE (__etext = .);
    166  
    167     } > ram
    168          
    169     PROVIDE (__SDATA2_START__ = .);
    170   .sdata2         : { *(.sdata2) *(.gnu.linkonce.s2.*)  } >ram
    171   .sbss2          : { *(.sbss2) *(.gnu.linkonce.sb2.*)  } >ram
    172     PROVIDE (__SBSS2_END__ = .);
    173        
    174     .sbss2        : { *(.sbss2)         } >ram
    175     PROVIDE (__SBSS2_END__ = .);
    176        
    177     /* R/W Data */
    178     .data ( . ) :
    179     {
    180       . = ALIGN (4);
    181 
    182       data.start = .;
    183 
    184       *(.data)
    185       *(.data1)
    186       *(.data.* .gnu.linkonce.d.*)
    187       PROVIDE (__SDATA_START__ = .);
    188       *(.sdata*)
    189       *(.gnu.linkonce.s.*)
    190       data.end = .;
    191     } > ram
    192 
    193     __SBSS_START__ = .;
    194     .bss :
    195     {
    196       bss.start = .;
    197       *(.bss .bss* .gnu.linkonce.b*)
    198       *(.sbss*) *(COMMON)
    199       . = ALIGN(4);
    200       bss.end = .;
    201     } > ram
    202     __SBSS_END__ = .;
    203 
    204     PROVIDE(_bss_start   = ADDR(.bss));
    205     PROVIDE(_bss_size    = SIZEOF(.bss));
    206     PROVIDE(_data_start  = ADDR(.data));
    207     PROVIDE(_data_size   = SIZEOF(.data));
    208     PROVIDE(_text_start  = ADDR(.text));
    209     PROVIDE(_text_size   = SIZEOF(.text));
    210     PROVIDE(_end = data.end);
    211 
    212     .gzipmalloc : {
    213         . = ALIGN (16);
    214         _startmalloc = .;
    215      } >ram
    216                
    217 
    218     /*
    219      * Interrupt stack setup
    220      */
    221     IntrStack_start = ALIGN(0x10);
    222     . += 0x4000;
    223     intrStack = .;
    224     PROVIDE(intrStackPtr = intrStack);
    225 
    226 
    227 
    228 
    229     _WorkspaceBase = .;
    230     __WorkspaceBase = .;
    231     . += WorkSpaceSize;
    232 
    233     _RamDiskBase = .;
    234     __RamDiskBase = .;
    235     . += RamDiskSize;
    236     _RamDiskEnd  = .;
    237     __RamDiskEnd = .;
    238     PROVIDE( _RamDiskSize = _RamDiskEnd - _RamDiskBase );
    239 
    240     _HeapStart = .;
    241     __HeapStart = .;
    242     . += HeapSize;
    243     _HeapEnd = .;
    244     __HeapEnd = .;
    245 
    246     clear_end = .;
    247 
    248     /* Sections for compressed .text and .data         */
    249     /* after the .datarom section is an int specifying */
    250     /* the length of the following compressed image    */
    251     /* Executes once then could get overwritten        */
    252     .textrom 0x100000 :
    253     {
    254         *(.textrom)
    255         _endloader = .;
    256     } > ram
    257 
    258     .datarom :
    259     {
    260         _dr_start = .;
    261         *(.datarom)
    262         _dr_end = .;
    263     } > ram
    264     dr_len = _dr_end - _dr_start;
    265 
    266     mpc5200_regs :
    267     {
    268     MBAR = .;
    269     mpc5200 = .;
    270     _mpc5200 = .;
    271     . += (0x6000);
    272     } > mpc5200_regs
    273 
    274     .dpram :
    275     {
    276       dp_ram = .;
    277       _dp_ram = .;
    278       . += (0x400);
    279      } > dpram
    280 
    281 
    282      /* the reset vector is at 0xfff00000 which is */
    283      /* located at offset 0x400000 from the base   */
    284      /* of flash                                   */
    285     .bootrom 0xFFE00000 :
    286     {
    287       *(.bootrom)
    288       _endboot = .;
    289     } > flash
    290 
    291 
    292     .line 0 : { *(.line) }
    293     .debug 0 : { *(.debug) }
    294     .debug_sfnames 0 : { *(.debug_sfnames) }
    295     .debug_srcinfo 0 : { *(.debug_srcinfo) }
    296     .debug_pubnames 0 : { *(.debug_pubnames) }
    297     .debug_aranges 0 : { *(.debug_aranges) }
    298     .debug_aregion 0 : { *(.debug_aregion) }
    299     .debug_macinfo 0 : { *(.debug_macinfo) }
    300     .stab 0 : { *(.stab) }
    301     .stabstr 0 : { *(.stabstr) }
    302 }
  • c/src/lib/libbsp/powerpc/gen5200/startup/linkcmds.brs5l

    diff -Nur -x configure -x Makefile.in -x autom4te.cache -x .svn -x '*.rej' -x '*.orig' -x '*~' ./rtems-4.6.99.3/c/src/lib/libbsp/powerpc/gen5200/startup/linkcmds.brs5l ./rtems-4.6.99.3_patched/c/src/lib/libbsp/powerpc/gen5200/startup/linkcmds.brs5l
    old new  
     1/*
     2 *  This file contains directives for the GNU linker which are specific
     3 *  to a gen5200 Board
     4 *
     5 *  linkcmds,v 1.3 2003/01/20 19:53:27 joel Exp
     6 */
     7
     8OUTPUT_FORMAT("elf32-powerpc", "elf32-powerpc",
     9              "elf32-powerpc")
     10OUTPUT_ARCH(powerpc)
     11 SEARCH_DIR(/usr/local/rtems/powerpc-rtems/lib);
     12 
     13ENTRY(start)
     14
     15/*
     16 * Declare some sizes.
     17 * XXX: The assignment of ". += XyzSize;" fails in older gld's if the
     18 *      number used there is not constant.  If this happens to you, edit
     19 *      the lines marked XXX below to use a constant value.
     20 */
     21HeapSize = DEFINED(HeapSize) ? HeapSize    : 0x6800000;  /* 104M  Heap */
     22StackSize = DEFINED(StackSize) ? StackSize :   0x80000;  /* 512 kB   */
     23WorkSpaceSize = DEFINED(WorkSpaceSize) ? WorkSpaceSize : 0x80000; /* 512k */
     24RamDiskSize = DEFINED(RamDiskSize) ? RamDiskSize : 0x80000; /* 512 ram disk */
     25 
     26MEMORY
     27        {
     28        ram : org = 0x0, l = 256M
     29        mpc5200_regs : org = 0xF0000000, l = 24K
     30        dpram : org = 0xFF000000, l = 0x400
     31        flash : org = 0xFFE00000, l = 2M
     32        }
     33
     34
     35SECTIONS
     36{
     37
     38   .vectors 0x100 :
     39    {
     40    *(.vectors)
     41    }   
     42    > ram
     43
     44    /*
     45     * The stack will live in this area - between the vectors and
     46     * the text section.
     47     */
     48       
     49    .text 0x10000:
     50    {
     51    _textbase = .;
     52
     53
     54    text.start = .;
     55
     56    /* Entry point is the .entry section */
     57    *(.entry)
     58    *(.entry2)
     59
     60    /* Actual Code */
     61    *(.text)
     62    *(.text.*)
     63
     64
     65    *(.rodata*)
     66    *(.rodata1)
     67
     68
     69    /*
     70     * Special FreeBSD sysctl sections.
     71     */
     72    . = ALIGN (16);
     73    __start_set_sysctl_set = .;
     74    *(set_sysctl_*);
     75    __stop_set_sysctl_set = ABSOLUTE(.);
     76    *(set_domain_*);
     77    *(set_pseudo_*);
     78
     79    /* C++ constructors/destructors */
     80    *(.gnu.linkonce.t*)
     81
     82    /*  Initialization and finalization code.
     83     *
     84     *  Various files can provide initialization and finalization functions.
     85     *  The bodies of these functions are in .init and .fini sections. We
     86     *  accumulate the bodies here, and prepend function prologues from
     87     *  ecrti.o and function epilogues from ecrtn.o. ecrti.o must be linked
     88     *  first; ecrtn.o must be linked last. Because these are wildcards, it
     89     *  doesn't matter if the user does not actually link against ecrti.o and
     90     *  ecrtn.o; the linker won't look for a file to match a wildcard.  The
     91     *  wildcard also means that it doesn't matter which directory ecrti.o
     92     *  and ecrtn.o are in.
     93     */
     94    PROVIDE (_init = .);
     95    *ecrti.o(.init)
     96    *(.init)
     97    *ecrtn.o(.init)
     98   
     99    PROVIDE (_fini = .);
     100    *ecrti.o(.fini)
     101    *(.fini)
     102    *ecrtn.o(.init)
     103
     104    /*
     105     *  C++ constructors and destructors for static objects.
     106     *  PowerPC EABI does not use crtstuff yet, so we build "old-style"
     107     *  constructor and destructor lists that begin with the list lenght
     108     *  end terminate with a NULL entry.
     109     */
     110     
     111    PROVIDE (__CTOR_LIST__ = .);             
     112    /* LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2) */
     113    *crtbegin.o(.ctors)
     114    *(.ctors)
     115    *crtend.o(.ctors)
     116    LONG(0)
     117    PROVIDE (__CTOR_END__ = .);
     118       
     119    PROVIDE (__DTOR_LIST__ = .);
     120    /* LONG((__DTOR_END__ - __DTOR_LIST__) / 4 - 2) */
     121    *crtbegin.o(.dtors)
     122    *(.dtors)
     123    *crtend.o(.dtors)
     124    LONG(0)
     125    PROVIDE (__DTOR_END__ = .);
     126       
     127    /* Exception frame info */
     128    *(.eh_frame)
     129
     130    /* Miscellaneous read-only data */
     131    _rodata_start = . ;
     132    *(.gnu.linkonce.r*)
     133    *(.lit)
     134    *(.shdata)
     135    *(.rodata)
     136    *(.rodata1)
     137    *(.descriptors)
     138    *(rom_ver)
     139    _erodata = .;
     140
     141    PROVIDE (__EXCEPT_START__ = .);
     142    *(.gcc_except_table)
     143    PROVIDE (__EXCEPT_END__ = .);
     144    __GOT_START__ = .;
     145    s.got = .;
     146    *(.got.plt)
     147    *(.got)
     148    *(.got1)
     149    PROVIDE (__GOT2_START__ = .);
     150    PROVIDE (_GOT2_START_ = .);
     151    *(.got2)
     152    PROVIDE (__GOT2_END__ = .);
     153    PROVIDE (_GOT2_END_ = .);
     154   
     155    PROVIDE (__FIXUP_START__ = .);
     156    PROVIDE (_FIXUP_START_ = .);
     157    *(.fixup)
     158    PROVIDE (_FIXUP_END_ = .);
     159    PROVIDE (__FIXUP_END__ = .);
     160   
     161    /* Various possible names for the end of the .text section */
     162    etext = ALIGN(0x10);
     163    _etext = .;
     164    _endtext = .;
     165    text.end = .;
     166    PROVIDE (etext = .);
     167    PROVIDE (__etext = .);
     168 
     169    } > ram
     170         
     171    PROVIDE (__SDATA2_START__ = .);
     172  .sdata2         : { *(.sdata2) *(.gnu.linkonce.s2.*)  } >ram
     173  .sbss2          : { *(.sbss2) *(.gnu.linkonce.sb2.*)  } >ram
     174    PROVIDE (__SBSS2_END__ = .);
     175       
     176    .sbss2        : { *(.sbss2)         } >ram
     177    PROVIDE (__SBSS2_END__ = .);
     178       
     179    /* R/W Data */
     180    .data ( . ) :
     181    {
     182      . = ALIGN (4);
     183
     184      data.start = .;
     185
     186      *(.data)
     187      *(.data1)
     188      *(.data.* .gnu.linkonce.d.*)
     189      PROVIDE (__SDATA_START__ = .);
     190      *(.sdata)
     191      *(.gnu.linkonce.s.*)
     192      data.end = .;
     193    } > ram
     194
     195    __SBSS_START__ = .;
     196    .bss :
     197    {
     198      bss.start = .;
     199      *(.bss) *(.sbss) *(COMMON)
     200      . = ALIGN(4);
     201      bss.end = .;
     202    } > ram
     203    __SBSS_END__ = .;
     204
     205    PROVIDE(_bss_start   = ADDR(.bss));
     206    PROVIDE(_bss_size    = SIZEOF(.bss));
     207    PROVIDE(_data_start  = ADDR(.data));
     208    PROVIDE(_data_size   = SIZEOF(.data));
     209    PROVIDE(_text_start  = ADDR(.text));
     210    PROVIDE(_text_size   = SIZEOF(.text));
     211    PROVIDE(_end = data.end);
     212
     213    .gzipmalloc : {
     214        . = ALIGN (16);
     215        _startmalloc = .;
     216     } >ram
     217               
     218
     219    /*
     220     * Interrupt stack setup
     221     */
     222    IntrStack_start = ALIGN(0x10);
     223    . += 0x4000;
     224    intrStack = .;
     225    PROVIDE(intrStackPtr = intrStack);
     226
     227
     228
     229
     230    _WorkspaceBase = .;
     231    __WorkspaceBase = .;
     232    . += WorkSpaceSize;
     233
     234    _RamDiskBase = .;
     235    __RamDiskBase = .;
     236    . += RamDiskSize;
     237    _RamDiskEnd  = .;
     238    __RamDiskEnd = .;
     239    PROVIDE( _RamDiskSize = _RamDiskEnd - _RamDiskBase );
     240
     241    _HeapStart = .;
     242    __HeapStart = .;
     243    . += HeapSize;
     244    _HeapEnd = .;
     245    __HeapEnd = .;
     246
     247    clear_end = .;
     248
     249    /* Sections for compressed .text and .data         */
     250    /* after the .datarom section is an int specifying */
     251    /* the length of the following compressed image    */
     252    /* Executes once then could get overwritten        */
     253    .textrom 0x100000 :
     254    {
     255        *(.textrom)
     256        _endloader = .;
     257    } > ram
     258
     259    .datarom :
     260    {
     261        _dr_start = .;
     262        *(.datarom)
     263        _dr_end = .;
     264    } > ram
     265    dr_len = _dr_end - _dr_start;
     266
     267    mpc5200_regs :
     268    {
     269    MBAR = .;
     270    mpc5200 = .;
     271    _mpc5200 = .;
     272    . += (0x6000);
     273    } > mpc5200_regs
     274
     275    .dpram :
     276    {
     277      dp_ram = .;
     278      _dp_ram = .;
     279      . += (0x400);
     280     } > dpram
     281
     282
     283     /* the reset vector is at 0xfff00000 which is */
     284     /* located at offset 0x400000 from the base   */
     285     /* of flash                                   */
     286    .bootrom 0xFFE00000 :
     287    {
     288      *(.bootrom)
     289      _endboot = .;
     290    } > flash
     291
     292
     293    .line 0 : { *(.line) }
     294    .debug 0 : { *(.debug) }
     295    .debug_sfnames 0 : { *(.debug_sfnames) }
     296    .debug_srcinfo 0 : { *(.debug_srcinfo) }
     297    .debug_pubnames 0 : { *(.debug_pubnames) }
     298    .debug_aranges 0 : { *(.debug_aranges) }
     299    .debug_aregion 0 : { *(.debug_aregion) }
     300    .debug_macinfo 0 : { *(.debug_macinfo) }
     301    .stab 0 : { *(.stab) }
     302    .stabstr 0 : { *(.stabstr) }
     303}
  • c/src/lib/libbsp/powerpc/gen5200/tod/pcf8563.c

    diff -Nur -x configure -x Makefile.in -x autom4te.cache -x .svn -x '*.rej' -x '*.orig' -x '*~' ./rtems-4.6.99.3/c/src/lib/libbsp/powerpc/gen5200/tod/pcf8563.c ./rtems-4.6.99.3_patched/c/src/lib/libbsp/powerpc/gen5200/tod/pcf8563.c
    old new  
    148148    v1 = info[PCF8563_DAY_ADR-PCF8563_SECOND_ADR] & PCF8563_DAY_MASK;
    149149    time->day = From_BCD(v1);
    150150
    151     v1 = info[PCF8563_HOUR_ADR-PCF8563_SECOND_ADR] & PCF8563_HOUR_ADR;
     151    v1 = info[PCF8563_HOUR_ADR-PCF8563_SECOND_ADR] & PCF8563_HOUR_MASK;
    152152    time->hour = From_BCD(v1);
    153153
    154154    v1 = info[PCF8563_MINUTE_ADR-PCF8563_SECOND_ADR] & PCF8563_MINUTE_MASK;
     
    211211     */
    212212    try = 0;
    213213    do {
    214         status = i2c_write(bus, addr, info, 8);
     214        status = i2c_write(bus, addr, info,sizeof(info));
    215215        try++;
    216216    } while ((status != I2C_SUCCESSFUL) && (try < 10));
    217217
  • make/custom/brs5l.cfg

    diff -Nur -x configure -x Makefile.in -x autom4te.cache -x .svn -x '*.rej' -x '*.orig' -x '*~' ./rtems-4.6.99.3/make/custom/brs5l.cfg ./rtems-4.6.99.3_patched/make/custom/brs5l.cfg
    old new  
     1#
     2#  Config file for customer specific MPC5200 board
     3#
     4#  brs5l.cfg,v 1.8 2005/03/03 13:16:01 ralf Exp
     5#
     6
     7#
     8#  All GEN5200 configurations share the same base file, only a few
     9#  parameters differ.
     10
     11
     12RTEMS_BOARD_MODEL=BRS5L
     13RTEMS_LINKCMDS=linkcmds.brs5l
     14
     15include $(RTEMS_ROOT)/make/custom/gen5200.cfg
  • make/custom/mpc8260ads.cfg

    diff -Nur -x configure -x Makefile.in -x autom4te.cache -x .svn -x '*.rej' -x '*.orig' -x '*~' ./rtems-4.6.99.3/make/custom/mpc8260ads.cfg ./rtems-4.6.99.3_patched/make/custom/mpc8260ads.cfg
    old new  
    2222# optimize flag: typically -0, could use -O4 or -fast
    2323# -O4 is ok for RTEMS
    2424# NOTE: some level of -O may be actually required by inline assembler
    25 CFLAGS_OPTIMIZE_V=-O4 -fno-keep-inline-functions
     25CFLAGS_OPTIMIZE_V=-O4 -fno-keep-inline-functions -g
    2626
    2727# The following are definitions of make-exe which will work using ld as
    2828# is currently required.  It is expected that as of gcc 2.8, the end user