mirror of https://github.com/ARMmbed/mbed-os.git
				
				
				
			Support SPI CPP objects with different pinouts sharing the same peripheral
							parent
							
								
									632586e940
								
							
						
					
					
						commit
						680feb439e
					
				| 
						 | 
				
			
			@ -117,7 +117,8 @@ struct serial_s {
 | 
			
		|||
#if DEVICE_SPI
 | 
			
		||||
struct spi_s {
 | 
			
		||||
    USART_TypeDef *spi;
 | 
			
		||||
    int location;
 | 
			
		||||
    uint32_t location;
 | 
			
		||||
    uint32_t route;
 | 
			
		||||
    uint8_t bits;
 | 
			
		||||
    uint8_t master;
 | 
			
		||||
#if DEVICE_SPI_ASYNCH
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -213,10 +213,12 @@ void spi_enable_pins(spi_t *obj, uint8_t enable, PinName mosi, PinName miso, Pin
 | 
			
		|||
        obj->spi.spi->ROUTELOC0 &= ~_USART_ROUTELOC0_CSLOC_MASK;
 | 
			
		||||
        obj->spi.spi->ROUTELOC0 |= pin_location(cs, PinMap_SPI_MOSI)<<_USART_ROUTELOC0_CSLOC_SHIFT;
 | 
			
		||||
    }
 | 
			
		||||
    obj->spi.location = obj->spi.spi->ROUTELOC0;
 | 
			
		||||
    obj->spi.route = route;
 | 
			
		||||
    obj->spi.spi->ROUTEPEN = route;
 | 
			
		||||
}
 | 
			
		||||
#else
 | 
			
		||||
    uint32_t route = USART_ROUTE_CLKPEN | (obj->spi.location << _USART_ROUTE_LOCATION_SHIFT);
 | 
			
		||||
    uint32_t route = USART_ROUTE_CLKPEN;
 | 
			
		||||
 | 
			
		||||
    if (mosi != NC) {
 | 
			
		||||
        route |= USART_ROUTE_TXPEN;
 | 
			
		||||
| 
						 | 
				
			
			@ -227,7 +229,9 @@ void spi_enable_pins(spi_t *obj, uint8_t enable, PinName mosi, PinName miso, Pin
 | 
			
		|||
    if (!obj->spi.master) {
 | 
			
		||||
        route |= USART_ROUTE_CSPEN;
 | 
			
		||||
    }
 | 
			
		||||
    route |= obj->spi.location << _USART_ROUTE_LOCATION_SHIFT;
 | 
			
		||||
    obj->spi.spi->ROUTE = route;
 | 
			
		||||
    obj->spi.route = route;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
void spi_enable(spi_t *obj, uint8_t enable)
 | 
			
		||||
| 
						 | 
				
			
			@ -324,14 +328,6 @@ void spi_format(spi_t *obj, int bits, int mode, int slave)
 | 
			
		|||
        default:
 | 
			
		||||
            clockMode = usartClockMode0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    //save state
 | 
			
		||||
#ifdef _USART_ROUTEPEN_RESETVALUE
 | 
			
		||||
    uint32_t route = obj->spi.spi->ROUTEPEN;
 | 
			
		||||
    uint32_t loc = obj->spi.spi->ROUTELOC0;
 | 
			
		||||
#else
 | 
			
		||||
    uint32_t route = obj->spi.spi->ROUTE;
 | 
			
		||||
#endif
 | 
			
		||||
    uint32_t iflags = obj->spi.spi->IEN;
 | 
			
		||||
    bool enabled = (obj->spi.spi->STATUS & (USART_STATUS_RXENS | USART_STATUS_TXENS)) != 0;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -339,10 +335,10 @@ void spi_format(spi_t *obj, int bits, int mode, int slave)
 | 
			
		|||
 | 
			
		||||
    //restore state
 | 
			
		||||
#ifdef _USART_ROUTEPEN_RESETVALUE
 | 
			
		||||
    obj->spi.spi->ROUTEPEN = route;
 | 
			
		||||
    obj->spi.spi->ROUTELOC0 = loc;
 | 
			
		||||
    obj->spi.spi->ROUTEPEN = obj->spi.route;
 | 
			
		||||
    obj->spi.spi->ROUTELOC0 = obj->spi.location;
 | 
			
		||||
#else
 | 
			
		||||
    obj->spi.spi->ROUTE = route;
 | 
			
		||||
    obj->spi.spi->ROUTE = obj->spi.route;
 | 
			
		||||
#endif
 | 
			
		||||
    obj->spi.spi->IEN = iflags;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue