Ignore:
Timestamp:
May 16, 2013, 3:01:37 PM (11 years ago)
Author:
cfuguet
Message:

Modifications in tsar/trunk/softs/tsar_boot:

  • Improving the boot_ioc_read when using a SD card in FPGA platform.
  • Adding some instrumentation on the SD card driver (under preprocessor conditional directives).
  • Including Doxyfile for generate documentation using doxygen.
  • Improving the Makefile to include doc generation.
Location:
trunk/softs/tsar_boot/src
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/softs/tsar_boot/src/boot_elf_loader.c

    r292 r388  
    7373            {
    7474                boot_puts (
    75                                         "ERROR: "
    76                                         "IOC_FAILED"
    77                                         "\n"
    78                                 );
     75                    "ERROR: "
     76                    "IOC_FAILED"
     77                    "\n"
     78                );
    7979
    8080                boot_exit();
    8181            }
    82            
     82
    8383            nb_block    += 1;
    8484            nb_available = 512;
     
    102102                    nb_rest = elf_header_ptr->e_phnum * elf_header_ptr->e_phentsize;
    103103
    104                                         /* Verification of ELF Magic Number */
    105                                         if (
    106                                                 (elf_header_ptr->e_ident[EI_MAG0] != ELFMAG0) ||
    107                                                 (elf_header_ptr->e_ident[EI_MAG1] != ELFMAG1) ||
    108                                                 (elf_header_ptr->e_ident[EI_MAG2] != ELFMAG2) ||
    109                                                 (elf_header_ptr->e_ident[EI_MAG3] != ELFMAG3) )
    110                                         {
    111                                                 boot_puts(
    112                                                         "ERROR: "
    113                                                         "Input file does not use ELF format"
    114                                                         "\n"
    115                                                 );     
    116 
    117                                                 boot_exit();
    118                                         }
    119 
    120                                         /*
    121                                         * Verification of Program Headers table size. It must be
    122                                         * smaller than the work size allocated for the
    123                                         * elf_pht[PHDR_ARRAY_SIZE] array
    124                                         **/
     104                    /* Verification of ELF Magic Number */
     105                    if (
     106                        (elf_header_ptr->e_ident[EI_MAG0] != ELFMAG0) ||
     107                        (elf_header_ptr->e_ident[EI_MAG1] != ELFMAG1) ||
     108                        (elf_header_ptr->e_ident[EI_MAG2] != ELFMAG2) ||
     109                        (elf_header_ptr->e_ident[EI_MAG3] != ELFMAG3) )
     110                    {
     111                        boot_puts(
     112                            "ERROR: "
     113                            "Input file does not use ELF format"
     114                            "\n"
     115                        ); 
     116
     117                        boot_exit();
     118                    }
     119
     120                    /*
     121                    * Verification of Program Headers table size. It must be
     122                    * smaller than the work size allocated for the
     123                    * elf_pht[PHDR_ARRAY_SIZE] array
     124                    **/
    125125                    if (elf_header_ptr->e_phnum > PHDR_ARRAY_SIZE)
    126126                    {
    127127                        boot_puts(
    128                                                         "ERROR: "
    129                                                         "ELF PHDR table size is bigger than "
    130                                                         "the allocated work space"
    131                                                         "\n"
    132                                                 );
     128                            "ERROR: "
     129                            "ELF PHDR table size is bigger than "
     130                            "the allocated work space"
     131                            "\n"
     132                        );
    133133
    134134                        boot_exit();
     
    257257
    258258    boot_puts (
    259                 "Finishing boot_elf_loader function.\n"
    260                 "Entry point address: "
    261         );
     259        "Finishing boot_elf_loader function.\n"
     260        "Entry point address: "
     261    );
    262262    boot_putx(elf_header_ptr->e_entry);
    263263    boot_puts("\n");
  • trunk/softs/tsar_boot/src/boot_ioc.c

    r347 r388  
    22
    33#ifndef SOCLIB_IOC
     4
     5static struct sdcard_dev  _sdcard_device;
     6static struct spi_dev   * _spi_device   = ( struct spi_dev * )IOC_BASE;
    47
    58#ifndef SYSCLK_FREQ
    69#warning "Using default value for SYSCLK_FREQ = 50000000"
    710#define SYSCLK_FREQ 50000000U
    8 #endif
    9 
    10 static struct sdcard_dev  _sdcard_device;
    11 static struct spi_dev   * _spi_device   = ( struct spi_dev * )IOC_BASE;
    12 #endif
    13 
    14 
     11#endif // end ifndef SYSCLK_FREQ
     12
     13#endif // end ifndef SOCLIB_IOC
     14
     15#define SDCARD_RESET_ITER_MAX 4
     16
     17inline void boot_sleep(int cycles)
     18{
     19    int i;
     20    for (i = 0; i < cycles; i++);
     21}
     22
     23#if INSTRUMENTATION
     24inline unsigned int boot_proctime()
     25{
     26    unsigned int ret;
     27    asm volatile ("mfc0 %0, $9":"=r" (ret));
     28    return ret;
     29}
     30#endif // end if INSTRUMENTATION
     31
     32#ifndef SOCLIB_IOC
    1533int boot_ioc_init()
    1634{
    17 #ifdef SOCLIB_IOC
    18     return 0;
    19 #else
    2035    unsigned char sdcard_rsp;
    2136
     
    3752     * Initializing the SD Card
    3853     */
    39     if ( (sdcard_rsp = sdcard_dev_open(&_sdcard_device, _spi_device, 0)) )
    40         return sdcard_rsp;
    41 
    42     if ( (sdcard_rsp = sdcard_dev_set_blocklen(&_sdcard_device, 512)) )
    43         return sdcard_rsp;
     54    unsigned int iter = 0;
     55    while(1)
     56    {
     57        boot_puts("Trying to initialize SD card... ");
     58
     59        sdcard_rsp = sdcard_dev_open(&_sdcard_device, _spi_device, 0);
     60        if (sdcard_rsp == 0)
     61        {
     62            boot_puts("OK\n");
     63            break;
     64        }
     65
     66        boot_puts("KO\n");
     67        boot_sleep(1000);
     68        if (++iter >= SDCARD_RESET_ITER_MAX)
     69        {
     70            boot_puts("\nERROR: During SD card reset to IDLE state\n"
     71                      "/ card response = ");
     72            boot_putx(sdcard_rsp);
     73            boot_puts("\n");
     74            boot_exit();
     75        }
     76    }
     77
     78    /**
     79     * Set the block length of the SD Card
     80     */
     81    sdcard_rsp = sdcard_dev_set_blocklen(&_sdcard_device, 512);
     82    if (sdcard_rsp)
     83    {
     84        boot_puts("ERROR: During SD card blocklen initialization\n");
     85        boot_exit();
     86    }
    4487
    4588    /**
     
    4891    spi_dev_config (
    4992        _spi_device ,
    50         10000000    , /**< SPI_clkL 10 Mhz */
    51         SYSCLK_FREQ , /**< Sys_clk         */
    52         -1          , /**< Charlen: 8      */
     93        10000000    , /**< SPI_clk 10 Mhz */
     94        SYSCLK_FREQ , /**< Sys_clk        */
     95        -1          , /**< Charlen: 8     */
    5396        -1          ,
    5497        -1
     
    58101
    59102    return 0;
    60 #endif
    61 }
     103}
     104#endif // end ifndef SOCLIB_IOC
    62105
    63106/**
     
    137180
    138181#else
     182
    139183///////////////////////////////////////////////////////////////////////////////
    140184// FPGA version of the boot_ioc_read function
     
    143187{
    144188    unsigned int sdcard_rsp;
     189    unsigned int i;
    145190
    146191    sdcard_dev_lseek(&_sdcard_device, lba);
    147192
    148     unsigned int i;
     193#if INSTRUMENTATION
     194    unsigned int start_time;
     195    unsigned int end_time;
     196    boot_puts("[ DEBUG ] Reading blocks ");
     197    boot_putd(lba);
     198    boot_puts(" to ");
     199    boot_putd(lba + count - 1);
     200
     201    start_time = boot_proctime();
     202#endif
     203
    149204    for(i = 0; i < count; i++)
    150205    {
     
    161216
    162217            return 1;
    163         }   
    164     }
     218        }
     219    }
     220
     221#if INSTRUMENTATION
     222    end_time = boot_proctime();
     223
     224    boot_puts(" / cycles for transfert: ");
     225    boot_putd(end_time - start_time);
     226    boot_puts("\n");
     227#endif
    165228
    166229    return 0;
  • trunk/softs/tsar_boot/src/exceptions.c

    r292 r388  
    44 * \author  : Manuel Bouyer
    55 *
    6  * This file defines a simple exeptions handler
     6 * This file defines a simple exceptions handler
    77 */
    88
  • trunk/softs/tsar_boot/src/sdcard.c

    r292 r388  
    4343static void _sdcard_gen_tick(struct sdcard_dev * sdcard, unsigned int tick_count)
    4444{
    45     volatile register int i = 0;
     45    register int i = 0;
    4646    while(i++ < tick_count) spi_put_tx(sdcard->spi, 0xFF, 0);
    4747}
     
    213213
    214214    for (i = 0; i < 4; i++)
     215    {
    215216        args[i] = (sdcard->access_pointer >> (32 - (i+1)*8)) & 0xFF;
     217    }
    216218
    217219    _sdcard_enable(sdcard);
  • trunk/softs/tsar_boot/src/spi.c

    r292 r388  
    1 /*
     1/**
    22 * \file    spi.c
    3  * \data    31 August 2012
     3 * \date    31 August 2012
    44 * \author  Cesar Fuguet <cesar.fuguet-tortolero@lip6.fr>
    55 */
     
    1515static void _spi_wait_if_busy(struct spi_dev * spi)
    1616{
    17     volatile register int delay;
     17    register int delay;
    1818
    1919    while(SPI_IS_BUSY(spi))
    2020    {
    21         for (delay = 0; delay < 10000; delay++);
     21        for (delay = 0; delay < 100; delay++);
    2222    }
    2323}
     
    5858        iowrite8(&spi->rx_tx[index % 4], byte);
    5959        _spi_init_transfer(spi);
    60 
    61         asm volatile("sync");
    6260    }
    6361    _spi_wait_if_busy(spi);
     
    104102    if (spi_freq > 0 && sys_freq > 0)
    105103        iowrite32(&spi->divider, _spi_calc_divider_value(spi_freq, sys_freq));
    106 
    107104}
    108105
Note: See TracChangeset for help on using the changeset viewer.