changeset 3243:c7cb4340f6eb

Add: support for 32 channel eDMA, support for cached memory.
author vae
date Wed, 09 May 2012 22:07:24 +0000
parents 1057533611c4
children 139bc58bc0bd
files packages/devs/spi/freescale/dspi/current/ChangeLog packages/devs/spi/freescale/dspi/current/cdl/spi_freescale_dspi.cdl packages/devs/spi/freescale/dspi/current/include/spi_freescale_dspi.h packages/devs/spi/freescale/dspi/current/include/spi_freescale_dspi_buses.inl packages/devs/spi/freescale/dspi/current/src/spi_freescale_dspi.c
diffstat 5 files changed, 34 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/packages/devs/spi/freescale/dspi/current/ChangeLog
+++ b/packages/devs/spi/freescale/dspi/current/ChangeLog
@@ -1,3 +1,11 @@
+2012-05-04  Ilija Kocho <ilijak@siva.com.mk>
+
+	* cdl/spi_freescale_dspi.cdl: 
+	* include/spi_freescale_dspi_buses.inl
+	* src/spi_freescale_dspi.c:
+	Add: support for 32 channel eDMA, support for cached memory.
+	[Bugzilla 1001579]
+
 2012-01-06  Ilija Kocho <ilijak@siva.com.mk>
 
 	* cdl/spi_freescale_dspi.cdl: 
--- a/packages/devs/spi/freescale/dspi/current/cdl/spi_freescale_dspi.cdl
+++ b/packages/devs/spi/freescale/dspi/current/cdl/spi_freescale_dspi.cdl
@@ -333,7 +333,7 @@ cdl_package CYGPKG_DEVS_SPI_FREESCALE_DS
                 cdl_component CYGNUM_DEVS_SPI_FREESCALE_DSPI[set ::spibus]_TX_DMA_PRI {
                     display "Transmit DMA channel priority"
                     flavor data
-                    legal_values  { 0 to (CYGNUM_HAL_FREESCALE_EDMA_CHAN_NUM-1) 255 }
+                    legal_values  { 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 255 }
                     default_value 255
                     description "
                     DMA can work in either round robin or preeptve arbitration
@@ -360,9 +360,8 @@ cdl_package CYGPKG_DEVS_SPI_FREESCALE_DS
                 cdl_option CYGOPT_DEVS_SPI_FREESCALE_DSPI[set ::spibus]_TCD_SECTION {
                     display "DMA TCD section"
                     flavor data
-                    default_value { "\".sram\"" }
-                    legal_values { "\".sram\"" "\".ram\"" }
-
+                    default_value CYGHWR_HAL_EDMA_TCD_SECTION
+ 
                     description "
                     Section in which will be DMA Transfer Control
                     Descriptors shall reside"
@@ -383,7 +382,7 @@ cdl_package CYGPKG_DEVS_SPI_FREESCALE_DS
                 cdl_component CYGNUM_DEVS_SPI_FREESCALE_DSPI[set ::spibus]_RX_DMA_PRI {
                     display "Receive DMA channel priority"
                     flavor data
-                    legal_values { 0 to (CYGNUM_HAL_FREESCALE_EDMA_CHAN_NUM-1) 255 }
+                    legal_values { 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 255 }
                     default_value 255
                     description "
                     DMA can work in either round robin or preeptve arbitration
--- a/packages/devs/spi/freescale/dspi/current/include/spi_freescale_dspi.h
+++ b/packages/devs/spi/freescale/dspi/current/include/spi_freescale_dspi.h
@@ -117,7 +117,7 @@ enum { SPI_DMA_CHAN_TX_I, SPI_DMA_CHAN_R
 typedef struct cyg_spi_freescale_dspi_bus_setup_s
 {
     cyghwr_devs_freescale_dspi_t*   dspi_p;    // Base address of SPI register block.
-    cyghwr_hal_freescale_dma_set_t* dma_set_p;       // DMA configuration block.
+    cyghwr_hal_freescale_dma_set_t* dma_set_p; // DMA configuration block.
     cyg_vector_t                    intr_num;        // DSPI interrupt vector
     cyg_priority_t                  intr_prio;       // Interrupt priority
     cyg_uint32                      mcr_opt ;        // Module Configuratyon Register options
--- a/packages/devs/spi/freescale/dspi/current/include/spi_freescale_dspi_buses.inl
+++ b/packages/devs/spi/freescale/dspi/current/include/spi_freescale_dspi_buses.inl
@@ -49,7 +49,6 @@
 //
 //=============================================================================
 
-
 #define PUSHQUE_ALIGN CYGBLD_ATTRIB_ALIGN(4)
 
 #define DSPI_DMA_BANDWIDTH FREESCALE_EDMA_CSR_BWC_0
@@ -64,7 +63,7 @@
 #define  CYGBLD_DSPI0_TCD_SECTION \
     CYGBLD_ATTRIB_SECTION(CYGOPT_DEVS_SPI_FREESCALE_DSPI0_TCD_SECTION)
 
-extern cyg_spi_freescale_dspi_bus_t cyg_spi_dspi_bus1;
+extern cyg_spi_freescale_dspi_bus_t cyg_spi_dspi_bus0;
 
 // Pinonomy -------------------------------------------------------------------
 
@@ -106,7 +105,8 @@ static const cyg_uint32 spi0_cs_pins[] =
 static volatile
 cyg_uint32 dspi0_pushque[CYGNUM_DEVS_SPI_FREESCALE_DSPI0_PUSHQUE_SIZE+4] PUSHQUE_ALIGN;
 
-static const cyghwr_hal_freescale_dma_chan_set_t dspi0_dma_chan[] = {
+static cyghwr_hal_freescale_dma_chan_set_t dspi0_dma_chan[] =
+{
     {
         .dma_src = FREESCALE_DMAMUX_SRC_SPI0_TX
         | FREESCALE_DMAMUX_CHCFG_ENBL_M,
@@ -122,8 +122,6 @@ static const cyghwr_hal_freescale_dma_ch
 };
 
 static cyghwr_hal_freescale_dma_set_t dspi0_dma_set = {
-    .edma_p = CYGHWR_IO_FREESCALE_EDMA0_P,
-    .dmamux_p = CYGHWR_IO_FREESCALE_DMAMUX0_P,
     .chan_p = dspi0_dma_chan,
     .chan_n = 2
 };
@@ -183,7 +181,7 @@ static const cyg_spi_freescale_dspi_bus_
                        FREESCALE_DSPI_MCR_PCSIS(CYGHWR_DEVS_SPI_FREESCALE_DSPI0_PCSIS)
 };
 
-cyg_spi_freescale_dspi_bus_t cyg_spi_dspi_bus1 = {
+cyg_spi_freescale_dspi_bus_t cyg_spi_dspi_bus0 = {
     .spi_bus.spi_transaction_begin    = dspi_transaction_begin,
     .spi_bus.spi_transaction_transfer = dspi_transaction_transfer,
     .spi_bus.spi_transaction_tick     = dspi_transaction_tick,
@@ -258,9 +256,11 @@ static const cyg_uint32 spi1_cs_pins[] =
 
 #ifdef CYGINT_DEVS_SPI_DSPI1_USES_DMA
 static volatile
-cyg_uint32 dspi1_pushque[CYGNUM_DEVS_SPI_FREESCALE_DSPI1_PUSHQUE_SIZE+4] PUSHQUE_ALIGN;
+cyg_uint32 dspi1_pushque[CYGNUM_DEVS_SPI_FREESCALE_DSPI1_PUSHQUE_SIZE+4]
+           PUSHQUE_ALIGN EDMA_RAM_BUF_SECTION;
 
-static const cyghwr_hal_freescale_dma_chan_set_t dspi1_dma_chan[] = {
+static const cyghwr_hal_freescale_dma_chan_set_t dspi1_dma_chan[2] =
+{
     {
         .dma_src = FREESCALE_DMAMUX_SRC_SPI1_TX
         | FREESCALE_DMAMUX_CHCFG_ENBL_M,
@@ -276,8 +276,6 @@ static const cyghwr_hal_freescale_dma_ch
 };
 
 static cyghwr_hal_freescale_dma_set_t dspi1_dma_set = {
-    .edma_p = CYGHWR_IO_FREESCALE_EDMA0_P,
-    .dmamux_p = CYGHWR_IO_FREESCALE_DMAMUX0_P,
     .chan_p = dspi1_dma_chan,
     .chan_n = 2
 };
@@ -372,7 +370,7 @@ cyg_spi_freescale_dspi_bus_t cyg_spi_dsp
 #define  CYGBLD_DSPI2_TCD_SECTION \
     CYGBLD_ATTRIB_SECTION(CYGOPT_DEVS_SPI_FREESCALE_DSPI2_TCD_SECTION)
 
-extern cyg_spi_freescale_dspi_bus_t cyg_spi_dspi_bus1;
+extern cyg_spi_freescale_dspi_bus_t cyg_spi_dspi_bus2;
 
 // Pinonomy -------------------------------------------------------------------
 
@@ -414,7 +412,8 @@ static const cyg_uint32 spi2_cs_pins[] =
 static volatile
 cyg_uint32 dspi2_pushque[CYGNUM_DEVS_SPI_FREESCALE_DSPI2_PUSHQUE_SIZE+4] PUSHQUE_ALIGN;
 
-static const cyghwr_hal_freescale_dma_chan_set_t dspi2_dma_chan[] = {
+static const cyghwr_hal_freescale_dma_chan_set_t dspi2_dma_chan[] =
+{
     {
         .dma_src = FREESCALE_DMAMUX_SRC_SPI2_TX
         | FREESCALE_DMAMUX_CHCFG_ENBL_M,
@@ -430,8 +429,6 @@ static const cyghwr_hal_freescale_dma_ch
 };
 
 static cyghwr_hal_freescale_dma_set_t dspi2_dma_set = {
-    .edma_p = CYGHWR_IO_FREESCALE_EDMA0_P,
-    .dmamux_p = CYGHWR_IO_FREESCALE_DMAMUX0_P,
     .chan_p = dspi2_dma_chan,
     .chan_n = 2
 };
@@ -491,7 +488,7 @@ static const cyg_spi_freescale_dspi_bus_
                        FREESCALE_DSPI_MCR_PCSIS(CYGHWR_DEVS_SPI_FREESCALE_DSPI2_PCSIS)
 };
 
-cyg_spi_freescale_dspi_bus_t cyg_spi_dspi_bus1 = {
+cyg_spi_freescale_dspi_bus_t cyg_spi_dspi_bus2 = {
     .spi_bus.spi_transaction_begin    = dspi_transaction_begin,
     .spi_bus.spi_transaction_transfer = dspi_transaction_transfer,
     .spi_bus.spi_transaction_tick     = dspi_transaction_tick,
--- a/packages/devs/spi/freescale/dspi/current/src/spi_freescale_dspi.c
+++ b/packages/devs/spi/freescale/dspi/current/src/spi_freescale_dspi.c
@@ -47,11 +47,13 @@
 //
 //=============================================================================
 
+#include <pkgconf/hal.h>
 #include <string.h>
 #include <cyg/hal/hal_io.h>
 #include <cyg/hal/hal_if.h>
 #include <cyg/hal/hal_intr.h>
 #include <cyg/hal/drv_api.h>
+#include <cyg/hal/hal_cache.h>
 
 #include <cyg/infra/cyg_type.h>
 #include <cyg/infra/cyg_ass.h>
@@ -855,6 +857,12 @@ static void spi_transaction_do (cyg_spi_
                 tx_data += pushque_n;
         }
     }
+    if(dma_set_p && rx_data) {
+        // Rx buffer may be out of sync with cache.
+        DEBUG2_PRINTF("DSPI DMA: Invalidate cache\n");
+        HAL_DCACHE_INVALIDATE(rx_data, count);
+        DEBUG2_PRINTF("DSPI DMA: Cache invalidated\n");
+    }
     if(!polled)
         cyg_drv_interrupt_mask(dspi_bus->setup_p->intr_num);
 
@@ -965,7 +973,7 @@ static void dspi_transaction_end(cyg_spi
     cyg_spi_freescale_dspi_device_t* dspi_device =
           (cyg_spi_freescale_dspi_device_t*) device;
 
-    cyghwr_hal_freescale_dma_set_t *dma_set_p = dspi_bus->setup_p->dma_set_p;
+    const cyghwr_hal_freescale_dma_set_t *dma_set_p = dspi_bus->setup_p->dma_set_p;
     cyghwr_hal_freescale_edma_t *edma_p;
     cyghwr_devs_freescale_dspi_t* dspi_p = dspi_bus->setup_p->dspi_p;