Changeset 550


Ignore:
Timestamp:
Sep 21, 2018, 10:24:15 PM (3 years ago)
Author:
nicolas.van.phan@…
Message:

Add SD card driver in kernel

Location:
trunk
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/boot/tsar_mips32/boot.c

    r547 r550  
    463463            (device->type != DEV_TYPE_ICU_XCU) &&
    464464            (device->type != DEV_TYPE_MMC_TSR) &&
    465             (device->type != DEV_TYPE_DMA_SCL) )
     465            (device->type != DEV_TYPE_DMA_SCL) &&
     466            (device->type != DEV_TYPE_TXT_MTY) &&
     467            (device->type != DEV_TYPE_IOC_SPI) )
    466468        {
    467469            boot_dev = &boot_info->ext_dev[device_id];
     
    558560            (device->type == DEV_TYPE_MMC_TSR) ||
    559561            (device->type == DEV_TYPE_DMA_SCL) ||
    560             (device->type == DEV_TYPE_TXT_MTY) )
     562            (device->type == DEV_TYPE_TXT_MTY) ||
     563            (device->type == DEV_TYPE_IOC_SPI) )
    561564        {
    562565            if (device->type == DEV_TYPE_RAM_SCL)   // RAM
    563566            {
    564                 // set number of physical memory pages 
     567                // set number of physical memory pages
    565568                boot_info->pages_nr   = device->size >> CONFIG_PPM_PAGE_SHIFT;
    566569
  • trunk/hal/tsar_mips32/core/hal_drivers.c

    r534 r550  
    3131#include <soclib_bdv.h>
    3232#include <soclib_hba.h>
     33#include <soclib_sdc.h>
    3334#include <soclib_mmc.h>
    3435#include <soclib_nic.h>
     
    125126                soclib_hba_init( ioc );
    126127        }
     128        else if (impl == IMPL_IOC_SPI)
     129    {
     130                soclib_sdc_init( ioc );
     131        }
    127132    else
    128133    {
  • trunk/hal/tsar_mips32/drivers/soclib_pic.c

    r534 r550  
    371371    bool_t   is_rx   = src_chdev->is_rx;
    372372
    373     if( (func == DEV_FUNC_IOC) || (func == DEV_FUNC_NIC) ||
     373    if( (func == DEV_FUNC_IOC && impl == IMPL_IOC_BDV) || (func == DEV_FUNC_NIC) ||
    374374        (func == DEV_FUNC_TXT && impl == IMPL_TXT_TTY) || (func == DEV_FUNC_IOB) )          // external IRQ => WTI
    375375    {
     
    417417    }
    418418    else if( (func == DEV_FUNC_DMA) || (func == DEV_FUNC_MMC) ||
    419              (func == DEV_FUNC_TXT && impl == IMPL_TXT_MTY) )   // internal IRQ => HWI
     419             (func == DEV_FUNC_TXT && impl == IMPL_TXT_MTY) ||
     420             (func == DEV_FUNC_IOC && impl == IMPL_IOC_SPI) )   // internal IRQ => HWI
    420421    {
    421422        // get internal IRQ index
     
    423424        if( func == DEV_FUNC_DMA ) hwi_id = lapic_input.dma[channel];
    424425        else if (func == DEV_FUNC_TXT ) hwi_id = lapic_input.mtty;
     426        else if (func == DEV_FUNC_IOC ) hwi_id = lapic_input.sdcard;
    425427        else                       hwi_id = lapic_input.mmc;
    426428
  • trunk/hal/tsar_mips32/drivers/soclib_sdc.c

    r543 r550  
    66///////////////////////////////////////////////////////////////////////////////////
    77
    8 //#include <hard_config.h>
     8// #include <hard_config.h>
    99#include <soclib_sdc.h>
    1010//#include <tty0.h>
    1111//#include <utils.h>
     12#include <hal_kernel_types.h>
     13#include <chdev.h>
     14#include <dev_ioc.h>
     15#include <thread.h>
    1216#include <printk.h>
    1317
     
    334338
    335339////////////////////////
    336 unsigned int _sdc_init()
     340void soclib_sdc_init( chdev_t* chdev )
    337341{
    338342    spi = (struct spi_dev*)SEG_IOC_BASE;
     
    393397    printk("[SDC WARNING] Finish SD card initialization\n\r");
    394398
    395     return 0;
    396 } // end _sdc_init()
    397 
     399    /* Initialize the chdev */
     400    // get extended pointer on SOCLIB_BDV peripheral base address
     401        xptr_t  sdc_xp = chdev->base;
     402
     403    // set driver specific fields
     404    chdev->cmd = &soclib_sdc_cmd;
     405    chdev->isr = &soclib_sdc_isr;
     406
     407} // end soclib_sdc_init()
    398408
    399409/////////////////////////////////////////////////////
    400 unsigned int _sdc_access( unsigned int       use_irq,  // unused
    401                           unsigned int       to_mem,
    402                           unsigned int       lba,
    403                           unsigned long long buf_paddr,
    404                           unsigned int       count )
    405 {
     410void __attribute__ ((noinline)) soclib_sdc_cmd( xptr_t th_xp )
     411{
     412    cxy_t      th_cxy = GET_CXY( th_xp );
     413    thread_t * th_ptr = GET_PTR( th_xp );
     414
     415    // get command arguments and extended pointer on IOC device
     416    uint32_t        cmd_type =         hal_remote_lw ( XPTR( th_cxy , &th_ptr->ioc_cmd.type   ) );
     417    unsigned int    lba      =         hal_remote_lw ( XPTR( th_cxy , &th_ptr->ioc_cmd.lba ) );
     418    xptr_t          buf_xp   = (xptr_t)hal_remote_lwd( XPTR( th_cxy , &th_ptr->ioc_cmd.buf_xp ) );
     419    unsigned int    count    =         hal_remote_lw ( XPTR( th_cxy , &th_ptr->ioc_cmd.count  ) );
     420
    406421    unsigned char args[4];
    407422    unsigned char sdcard_rsp;
     
    410425    unsigned int last = lba + count;
    411426
    412     if ( to_mem )  // read access
     427    if ( cmd_type == IOC_SYNC_READ )  // read access
    413428    {
    414429        for ( ; curr < last ; curr++ )
     
    432447            _sdc_wait_data_block();
    433448
    434             if (spi_get_data(sdcard.spi, buf_paddr, 512 ))
     449            if (spi_get_data(sdcard.spi, buf_xp, 512 ))
    435450            {
    436451                _sdc_disable();
     
    444459            _sdc_disable();
    445460
    446             buf_paddr += 512;
     461            buf_xp += 512;
    447462        }
    448463    }
     
    451466        assert( false, __FUNCTION__, "[SDC ERROR] function _sdc_write() not iplemented yet\n");
    452467    }
    453 
    454     return 0;
    455468}  // _end sdc_access()
    456469
     
    458471// This ISR handles the IRQ generated by a SDC controler
    459472///////////////////////////////////////////////////////////////////////////////
    460 void _sdc_isr( unsigned int irq_type,
    461                unsigned int irq_id,
    462                unsigned int channel )
     473void __attribute__ ((noinline)) soclib_sdc_isr( chdev_t * chdev )
    463474{
    464475    assert( false, __FUNCTION__, "\n[GIET ERROR] _sdc_isr() not implemented\n");
  • trunk/hal/tsar_mips32/drivers/soclib_sdc.h

    r543 r550  
    1010
    1111
     12#include <chdev.h>
    1213#include <soclib_spi.h>
    1314#include <hard_config.h>
     
    4344// Returns 0 if success, other value if failure
    4445///////////////////////////////////////////////////////////////////////////////
    45 unsigned int _sdc_init();
     46// unsigned int _sdc_init();
     47extern void soclib_sdc_init( chdev_t* chdev );
    4648
    4749///////////////////////////////////////////////////////////////////////////////
     
    5456// Returns 0 if success, > 0 if error.
    5557///////////////////////////////////////////////////////////////////////////////
    56 unsigned int _sdc_access( unsigned int       use_irq, 
    57                           unsigned int       to_mem,
    58                           unsigned int       lba,
    59                           unsigned long long buf_vaddr,
    60                           unsigned int       count);
     58extern void soclib_sdc_cmd( xptr_t thread_xp );
    6159
    6260///////////////////////////////////////////////////////////////////////////////
    6361// This ISR handles the IRQ generated by a SDC controler
    6462///////////////////////////////////////////////////////////////////////////////
    65 void _sdc_isr( unsigned int irq_type,
    66                unsigned int irq_id,
    67                unsigned int channel );
     63extern void soclib_sdc_isr( chdev_t* chdev );
    6864
    6965///////////////////////////////////////////////////////////////////////////////
  • trunk/kernel/devices/dev_pic.h

    r534 r550  
    142142    uint32_t   mmc;                             // MMC is single channel
    143143    uint32_t   mtty;                            // Multi Tty (backup tty in cluster 0)
     144    uint32_t   sdcard;                          // SD card on cluster 00
    144145}
    145146lapic_input_t;
  • trunk/kernel/kern/kernel_init.c

    r539 r550  
    423423        }
    424424
     425        ///////////////////////////////
    425426        else if ( func == DEV_FUNC_TXT && info->use_mty0 == 1 )
    426427        {
     
    465466                        }
    466467                    }
     468#if( DEBUG_KERNEL_INIT & 0x1 )
     469if( hal_time_stamp() > DEBUG_KERNEL_INIT )
     470printk("\n[DBG] %s : created MTY[%d] in cluster %x / chdev = %x\n",
     471__FUNCTION__ , channel , local_cxy , chdev_ptr );
     472#endif
    467473                }
    468474            }
    469475        }
     476
     477        ///////////////////////////////
     478        else if ( func == DEV_FUNC_IOC )
     479        {
     480            assert(impl == IMPL_IOC_SPI, __FUNCTION__,
     481                "Internal IOC should have SPI implementation\n");
     482
     483            for ( channel = 0; channel < channels; channel++ )
     484            {
     485                // create chdev in local cluster
     486                chdev_ptr = chdev_create( func,
     487                                          impl,
     488                                          channel,
     489                                          0,
     490                                          base );
     491
     492                assert( (chdev_ptr != NULL) , __FUNCTION__ ,
     493                    "cannot allocate memory for IOC chdev" );
     494               
     495                // make IOC specific initialization
     496                dev_ioc_init( chdev_ptr );
     497
     498                // set the IOC fields in all clusters
     499                xptr_t *chdev_entry = &chdev_dir.ioc[channel];
     500                for ( x = 0; x < info->x_max; x++ )
     501                {
     502                    for ( y = 0; y < info->y_max; y++ )
     503                    {
     504                        cxy_t cxy = (x<<info->y_width) + y;
     505                        hal_remote_swd( XPTR( cxy, chdev_entry ),
     506                                        XPTR( local_cxy, chdev_ptr ) );
     507                    }
     508    }
     509#if( DEBUG_KERNEL_INIT & 0x1 )
     510if( hal_time_stamp() > DEBUG_KERNEL_INIT )
     511printk("\n[DBG] %s : created IOC[%d] in cluster %x / chdev = %x\n",
     512__FUNCTION__ , channel , local_cxy , chdev_ptr );
     513#endif
     514            }
     515        }
     516
    470517    }
    471518}  // end internal_devices_init()
     
    556603                }
    557604
     605                if ( func == DEV_FUNC_IOC && impl == IMPL_IOC_SPI )
     606                {
     607                    continue;
     608                }
     609
    558610                // compute target cluster for chdev[func,channel,direction]
    559611                uint32_t offset     = ext_chdev_gid % ( info->x_size * (info->y_max) ); // [FIXME]
     
    814866                else if( func == DEV_FUNC_DMA ) lapic_input.dma[channel] = id;
    815867                else if( func == DEV_FUNC_TXT ) lapic_input.mtty = id;
     868                else if( func == DEV_FUNC_IOC ) lapic_input.sdcard = id;
    816869                else assert( false , "illegal source device for LAPIC input" );
    817870            }
Note: See TracChangeset for help on using the changeset viewer.