AnsweredAssumed Answered

Problems with Custom Boot in MPC8260

Question asked by Victor Pastor on May 25, 2010

Hi,

 

I'm new on programming for powerpc. I'm trying to make an application that sends a string to the serial port (SMC_2). The card that I'm using is an embedded powerquicc mpc8260. It has a Custom Boot that depending of two switches set the Counter Program to 0xf3000100. Then my program has to start at this position. I took the functions from the boot code. Here is my program:

 typedef struct buffer_descriptor{U16  cntl_stat     ;                 /*!< control & status register size = 2  offset  0*/U16  data_len      ;                 /*!< data length register    size = 2  offset  2*/U32  buf_address   ;                 /*!< buffer address register size = 4  offset 4*/}bd_t; typedef struct smc_buffers{                                                                                         /*smc1    smc2*/bd_t  rxbd          ;            /*!< receive buffer desciptor  size = 8    3F00    3f40*/U8  name        [8] ;            /*!< name of channel(user)     size = 8    3F08    3f48*/U8 rxbuffer    [16];             /*!< receive buffer            size = 16   3F10    3f50*/bd_t  txbd          ;            /*!< transmit buffer desciptor size = 8    3F20    3f60*/U32  condition     ;             /*!< condition register(user)  size = 4    3F28    3f68*/S32   last_result   ;            /*!< last result register(user)size = 4    3F2C    3F6C*/U8   txbuffer  [16];             /*!< transmit buffer           size = 16   3F30    3F70*/}smc_buffers_t;     //other structs
//other structstypedef struct proj_space{scc_buffers_t scc_buf[4]          ;              /*!< scc buffers and descriptors size = 256  0x300*/CS_t          device;U8            TBD[0x3560]         ;              /*!< for project use size = 14336  0x400*/U8            FCC1[0x100]         ;              /*Stuart*/U8            FCC2[0x100]         ;              /*Stuart*/U8            I2C[0x100]          ;              /*Stuart*/irq_action_t   *user_vectors[64]   ;              /*!< interrupt vectors size = 256    0x000*/low_vector    *except_vectors[32] ;              /*!< exception vectors size = 128    0x100*/U32           Registers_Store[37] ;              /*!< register store      size = 148    0x180*/U8            spare[0xEC]         ;smc_block_t   smc_blk             ;              /*!< smc block       size = 256  */}proj_space_t;
//other structstypedef struct dp_ram{/*proj_space_t  project; */proj_space_t    project ;U8              stuart      [  16384 ]    ;/*!< */param_ram_t     params                  ;/*!< dpram parameter blocks*//*S8              res2         [   8192 ]    ;/ *!< Reserved*/log_t      error;U8              dpram3       [   4096 ]    ;/*!< */S8              res3         [  16384 ]    ;/*!< Reserved*/sysconf_t       siu_conf                   ;/*!<  SIU Configuration*/memctl_t        memctl                     ;/*!<  Memory Controller*/sit_t           sit                        ;/*!<  System Integration Timers*/line_buf_t      line                       ;/*!<  PCI used by project*/intctl_t        intctl                     ;/*!<  Interrupt Controller*/car_t           clkrst                     ;/*!<  Clocks and reset*/iop_t           ioport                     ;/*!<  IO Port control/status*/cpmtim_t        cpmtimer                   ;/*!<  CPM timers*/sdma_t          sdma                       ;/*!<  SDMA control/status*/fcc_t           fcc          [      3 ]    ;/*!<  Three FCCs*/S8              res4         [    167 ]    ;/*!<  changed from original was 159*/S8              res4a        [    489 ]    ;/*!<  changed from original was 496*/U32             brgc5                      ;/*!<  Baud rate 5*/U32             brgc6                      ;/*!<  Baud rate 6*/U32             brgc7                      ;/*!<  Baud rate 7*/U32             brgc8                      ;/*!<  Baud rate 8*/S8              res5         [    608 ]    ;/*!< Reserved*/i2c_t           i2c                        ;/*!<  I2C control/status*/cpm_t           cpm                        ;/*!<  Communication processor*/U32             brgc1                      ;/*!<  Baud rate 1*/U32             brgc2                      ;/*!<  Baud rate 2*/U32             brgc3                      ;/*!<  Baud rate 3*/U32             brgc4                      ;/*!<  Baud rate 4*/scc_t           scc          [      4 ]    ;/*!<  Four SCCs*/smc_t           smc          [      2 ]    ;/*!<  Couple of SMCs*/spi_t           spi                        ;/*!<  A SPI*/cpmux_t         cpmux                      ;/*!<  CPM clock route mux*/}               dp_ram_t;static volatile dp_ram_t * const DP_RAM = (dp_ram_t *) DPRAM_ADRS;void sio_tx_str( nat8 channel, CONCHP p );bool hal_sio_tx_ready( U8 channel );dp_ram_t * hal_get_dp_ram_ptr( void );void watchdog_service ( void );ErrStr hal_watchdog_service( void );void hal_sio_tx_byte( U8 channel, Byte b );typedef enum smc_channels_e {SMC_1 = 0, SMC_2 = 1, SMC_ERROR = SMC_2} smc_channels_e ;void _start (void){sio_tx_str( SMC_2, "HELLO WORLD" );}void sio_tx_str( nat8 channel, CONCHP p ){    if (p) {        while (*p) {          while (! hal_sio_tx_ready( channel )) {               watchdog_service();           }            hal_sio_tx_byte( channel, *p++ );        }    }}bool hal_sio_tx_ready( U8 channel ){    bool status = true;    dp_ram_t * dp = hal_get_dp_ram_ptr();    hal_watchdog_service();    if ( dp->project.smc_blk.smc_buf_blk[channel].txbd.cntl_stat & BD_BUSY )    {        status = false;    }    return status;}dp_ram_t * hal_get_dp_ram_ptr( void ){    return (dp_ram_t *)DP_RAM;}void watchdog_service ( void ){   hal_watchdog_service();}ErrStr hal_watchdog_service( void ){    /* as specified in ICD */    __asm__ ("eieio");    WATCH_DOG_ADRS[ 0 ] = 0x0F;    __asm__ ("eieio");    WATCH_DOG_ADRS[ 1 ] = 0xF0;    __asm__ ("eieio");    WATCH_DOG_ADRS[ 2 ] = 0x81;    __asm__ ("eieio");    return 0;}void hal_sio_tx_byte( U8 channel, Byte b ){    volatile smc_buffers_t * buf;    buf = ( smc_buffers_t * ) & DP_RAM->project.smc_blk.smc_buf_blk[channel];    buf->txbuffer[0] = b;    buf->txbd.data_len = 1;    buf->txbd.buf_address = ( U32 ) & buf->txbuffer;    buf->txbd.cntl_stat = 0xA000;}

 And for compiling it I'm using cygwin with a cross-compiler:

 

powerpc-elf-gcc -Wall -g -c -Wno-pointer-sign -Wno-return-type -fomit-frame-pointer -fno-strict-aliasing  -ffreestanding -o prueba.o pruebse.c

 

powerpc-elf-ld -T ld.script -o pruebse.x pruebse.o

 

In the ld.script I have:

PROVIDE (__stack = 0); PROVIDE (___stack = 0);
PROVIDE (__executable_start = 0x100); . = 0x100;

 

powerpc-750-linux-gnu-objcopy -I elf32-powerpc -O srec --srec-forceS3 --srec-len=32 --set-start 0x0 --adjust-vma 0xf3000000 pruebse.x pruebse.mot

 

And the program doesn't send anything.

 

Could anyone help me please?

 

Sorry for my English.

 

Outcomes