@@ -61,6 +61,7 @@ typedef struct {
6161 int channelRx ;
6262 bool txrx_req ;
6363 uint8_t req_done ;
64+ unsigned drv_ssel ;
6465} spi_req_reva_state_t ;
6566
6667/* states whether to use call back or not */
@@ -76,7 +77,7 @@ static int MXC_SPI_RevA_TransSetup (mxc_spi_reva_req_t * req);
7677
7778
7879int MXC_SPI_RevA_Init (mxc_spi_reva_regs_t * spi , int masterMode , int quadModeUsed , int numSlaves ,
79- unsigned ssPolarity , unsigned int hz )
80+ unsigned ssPolarity , unsigned int hz , unsigned drv_ssel )
8081{
8182 int spi_num ;
8283
@@ -87,6 +88,7 @@ int MXC_SPI_RevA_Init (mxc_spi_reva_regs_t* spi, int masterMode, int quadModeUse
8788 states [spi_num ].last_size = 0 ;
8889 states [spi_num ].ssDeassert = 1 ;
8990 states [spi_num ].defaultTXData = 0 ;
91+ states [spi_num ].drv_ssel = drv_ssel ;
9092
9193 spi -> ctrl0 = (MXC_F_SPI_REVA_CTRL0_EN );
9294 spi -> sstime = ( (0x1 << MXC_F_SPI_REVA_SSTIME_PRE_POS ) |
@@ -109,22 +111,25 @@ int MXC_SPI_RevA_Init (mxc_spi_reva_regs_t* spi, int masterMode, int quadModeUse
109111 // Clear the interrupts
110112 spi -> intfl = spi -> intfl ;
111113
112- if (numSlaves == 1 ) {
113- spi -> ctrl0 |= MXC_S_SPI_REVA_CTRL0_SS_ACTIVE_SS0 ;
114- }
115-
116- if (numSlaves == 2 ) {
117- spi -> ctrl0 |= (MXC_S_SPI_REVA_CTRL0_SS_ACTIVE_SS0 | MXC_S_SPI_REVA_CTRL0_SS_ACTIVE_SS1 );
118- }
119-
120- if (numSlaves == 3 ) {
121- spi -> ctrl0 |= (MXC_S_SPI_REVA_CTRL0_SS_ACTIVE_SS0 | MXC_S_SPI_REVA_CTRL0_SS_ACTIVE_SS1 | MXC_S_SPI_REVA_CTRL0_SS_ACTIVE_SS2 );
122- }
123-
124- if (numSlaves == 4 ) {
125- spi -> ctrl0 |= (MXC_S_SPI_REVA_CTRL0_SS_ACTIVE_SS0 | MXC_S_SPI_REVA_CTRL0_SS_ACTIVE_SS1 | MXC_S_SPI_REVA_CTRL0_SS_ACTIVE_SS2 | MXC_S_SPI_REVA_CTRL0_SS_ACTIVE_SS3 );
114+ // Driver will drive SS pin?
115+ if (states [spi_num ].drv_ssel ) {
116+ if (numSlaves == 1 ) {
117+ spi -> ctrl0 |= MXC_S_SPI_REVA_CTRL0_SS_ACTIVE_SS0 ;
118+ }
119+
120+ else if (numSlaves == 2 ) {
121+ spi -> ctrl0 |= (MXC_S_SPI_REVA_CTRL0_SS_ACTIVE_SS0 | MXC_S_SPI_REVA_CTRL0_SS_ACTIVE_SS1 );
122+ }
123+
124+ else if (numSlaves == 3 ) {
125+ spi -> ctrl0 |= (MXC_S_SPI_REVA_CTRL0_SS_ACTIVE_SS0 | MXC_S_SPI_REVA_CTRL0_SS_ACTIVE_SS1 | MXC_S_SPI_REVA_CTRL0_SS_ACTIVE_SS2 );
126+ }
127+
128+ else if (numSlaves == 4 ) {
129+ spi -> ctrl0 |= (MXC_S_SPI_REVA_CTRL0_SS_ACTIVE_SS0 | MXC_S_SPI_REVA_CTRL0_SS_ACTIVE_SS1 | MXC_S_SPI_REVA_CTRL0_SS_ACTIVE_SS2 | MXC_S_SPI_REVA_CTRL0_SS_ACTIVE_SS3 );
130+ }
126131 }
127-
132+
128133 //set quad mode
129134 if (quadModeUsed ) {
130135 spi -> ctrl2 |= MXC_S_SPI_REVA_CTRL2_DATA_WIDTH_QUAD ;
@@ -308,11 +313,13 @@ int MXC_SPI_RevA_SetSlave (mxc_spi_reva_regs_t* spi, int ssIdx)
308313 MXC_ASSERT (spi_num >= 0 );
309314 (void )spi_num ;
310315
311- // Setup the slave select
312- // Activate chosen SS pin
313- spi -> ctrl0 |= (1 << ssIdx ) << MXC_F_SPI_REVA_CTRL0_SS_ACTIVE_POS ;
314- // Deactivate all unchosen pins
315- spi -> ctrl0 &= ~MXC_F_SPI_REVA_CTRL0_SS_ACTIVE | ((1 << ssIdx ) << MXC_F_SPI_REVA_CTRL0_SS_ACTIVE_POS );
316+ if (states [spi_num ].drv_ssel ) {
317+ // Setup the slave select
318+ // Activate chosen SS pin
319+ spi -> ctrl0 |= (1 << ssIdx ) << MXC_F_SPI_REVA_CTRL0_SS_ACTIVE_POS ;
320+ // Deactivate all unchosen pins
321+ spi -> ctrl0 &= ~MXC_F_SPI_REVA_CTRL0_SS_ACTIVE | ((1 << ssIdx ) << MXC_F_SPI_REVA_CTRL0_SS_ACTIVE_POS );
322+ }
316323 return E_NO_ERROR ;
317324}
318325
@@ -761,10 +768,12 @@ uint32_t MXC_SPI_RevA_MasterTransHandler (mxc_spi_reva_regs_t *spi, mxc_spi_reva
761768 spi_num = MXC_SPI_GET_IDX ((mxc_spi_regs_t * ) spi );
762769
763770 // Leave slave select asserted at the end of the transaction
764- if (!req -> ssDeassert ) {
765- spi -> ctrl0 |= MXC_F_SPI_REVA_CTRL0_SS_CTRL ;
771+ if (states [spi_num ].drv_ssel ) {
772+ if (!req -> ssDeassert ) {
773+ spi -> ctrl0 |= MXC_F_SPI_REVA_CTRL0_SS_CTRL ;
774+ }
766775 }
767-
776+
768777 retval = MXC_SPI_RevA_TransHandler (spi , req );
769778
770779 if (!states [spi_num ].started ) {
@@ -773,10 +782,12 @@ uint32_t MXC_SPI_RevA_MasterTransHandler (mxc_spi_reva_regs_t *spi, mxc_spi_reva
773782 }
774783
775784 // Deassert slave select at the end of the transaction
776- if (req -> ssDeassert ) {
777- spi -> ctrl0 &= ~MXC_F_SPI_REVA_CTRL0_SS_CTRL ;
785+ if (states [spi_num ].drv_ssel ) {
786+ if (req -> ssDeassert ) {
787+ spi -> ctrl0 &= ~MXC_F_SPI_REVA_CTRL0_SS_CTRL ;
788+ }
778789 }
779-
790+
780791 return retval ;
781792}
782793
0 commit comments