|
|
@ -12,13 +12,14 @@ |
|
|
|
/** Private data structure */ |
|
|
|
/** Private data structure */ |
|
|
|
struct priv { |
|
|
|
struct priv { |
|
|
|
uint8_t periph_num; //!< 1 or 2
|
|
|
|
uint8_t periph_num; //!< 1 or 2
|
|
|
|
uint16_t prescaller; //!< Clock prescaller, stored as the dividing factor
|
|
|
|
uint8_t remap; //!< SPI remap option
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
uint16_t prescaller; //!< Clock prescaller, stored as the dividing factor
|
|
|
|
bool cpol; //!< CPOL setting
|
|
|
|
bool cpol; //!< CPOL setting
|
|
|
|
bool cpha; //!< CPHA setting
|
|
|
|
bool cpha; //!< CPHA setting
|
|
|
|
bool tx_only; //!< If true, Enable only the MOSI line
|
|
|
|
bool tx_only; //!< If true, Enable only the MOSI line
|
|
|
|
bool lsb_first; //!< Option to send LSB first
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool lsb_first; //!< Option to send LSB first
|
|
|
|
char ssn_port_name; //!< SSN port
|
|
|
|
char ssn_port_name; //!< SSN port
|
|
|
|
uint16_t ssn_pins; //!< SSN pin mask
|
|
|
|
uint16_t ssn_pins; //!< SSN pin mask
|
|
|
|
|
|
|
|
|
|
|
@ -43,6 +44,7 @@ static void USPI_loadBinary(Unit *unit, PayloadParser *pp) |
|
|
|
|
|
|
|
|
|
|
|
priv->periph_num = pp_u8(pp); |
|
|
|
priv->periph_num = pp_u8(pp); |
|
|
|
priv->prescaller = pp_u16(pp); |
|
|
|
priv->prescaller = pp_u16(pp); |
|
|
|
|
|
|
|
priv->remap = pp_u8(pp); |
|
|
|
|
|
|
|
|
|
|
|
priv->cpol = pp_bool(pp); |
|
|
|
priv->cpol = pp_bool(pp); |
|
|
|
priv->cpha = pp_bool(pp); |
|
|
|
priv->cpha = pp_bool(pp); |
|
|
@ -62,6 +64,7 @@ static void USPI_writeBinary(Unit *unit, PayloadBuilder *pb) |
|
|
|
|
|
|
|
|
|
|
|
pb_u8(pb, priv->periph_num); |
|
|
|
pb_u8(pb, priv->periph_num); |
|
|
|
pb_u16(pb, priv->prescaller); |
|
|
|
pb_u16(pb, priv->prescaller); |
|
|
|
|
|
|
|
pb_u8(pb, priv->remap); |
|
|
|
|
|
|
|
|
|
|
|
pb_bool(pb, priv->cpol); |
|
|
|
pb_bool(pb, priv->cpol); |
|
|
|
pb_bool(pb, priv->cpha); |
|
|
|
pb_bool(pb, priv->cpha); |
|
|
@ -83,6 +86,9 @@ static error_t USPI_loadIni(Unit *unit, const char *key, const char *value) |
|
|
|
if (streq(key, "device")) { |
|
|
|
if (streq(key, "device")) { |
|
|
|
priv->periph_num = (uint8_t) avr_atoi(value); |
|
|
|
priv->periph_num = (uint8_t) avr_atoi(value); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (streq(key, "remap")) { |
|
|
|
|
|
|
|
priv->remap = (uint8_t) avr_atoi(value); |
|
|
|
|
|
|
|
} |
|
|
|
else if (streq(key, "prescaller")) { |
|
|
|
else if (streq(key, "prescaller")) { |
|
|
|
priv->prescaller = (uint16_t ) avr_atoi(value); |
|
|
|
priv->prescaller = (uint16_t ) avr_atoi(value); |
|
|
|
} |
|
|
|
} |
|
|
@ -117,9 +123,14 @@ static void USPI_writeIni(Unit *unit, IniWriter *iw) |
|
|
|
{ |
|
|
|
{ |
|
|
|
struct priv *priv = unit->data; |
|
|
|
struct priv *priv = unit->data; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// TODO show a legend for peripherals and remaps
|
|
|
|
|
|
|
|
|
|
|
|
iw_comment(iw, "Peripheral number (SPIx)"); |
|
|
|
iw_comment(iw, "Peripheral number (SPIx)"); |
|
|
|
iw_entry(iw, "device", "%d", (int)priv->periph_num); |
|
|
|
iw_entry(iw, "device", "%d", (int)priv->periph_num); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
iw_comment(iw, "SPI port remap (0,1,...)"); |
|
|
|
|
|
|
|
iw_entry(iw, "remap", "%d", (int)priv->remap); |
|
|
|
|
|
|
|
|
|
|
|
iw_comment(iw, "Prescaller: 2,4,8,...,256"); |
|
|
|
iw_comment(iw, "Prescaller: 2,4,8,...,256"); |
|
|
|
iw_entry(iw, "prescaller", "%d", (int)priv->prescaller); |
|
|
|
iw_entry(iw, "prescaller", "%d", (int)priv->prescaller); |
|
|
|
|
|
|
|
|
|
|
@ -154,6 +165,7 @@ static error_t USPI_preInit(Unit *unit) |
|
|
|
// some defaults
|
|
|
|
// some defaults
|
|
|
|
priv->periph_num = 1; |
|
|
|
priv->periph_num = 1; |
|
|
|
priv->prescaller = 64; |
|
|
|
priv->prescaller = 64; |
|
|
|
|
|
|
|
priv->remap = 0; |
|
|
|
|
|
|
|
|
|
|
|
priv->cpol = 0; |
|
|
|
priv->cpol = 0; |
|
|
|
priv->cpha = 0; |
|
|
|
priv->cpha = 0; |
|
|
@ -201,7 +213,60 @@ static error_t USPI_init(Unit *unit) |
|
|
|
|
|
|
|
|
|
|
|
// TODO
|
|
|
|
// TODO
|
|
|
|
#if GEX_PLAT_F072_DISCOVERY |
|
|
|
#if GEX_PLAT_F072_DISCOVERY |
|
|
|
#error "NO IMPL" |
|
|
|
|
|
|
|
|
|
|
|
// SPI1 - many options
|
|
|
|
|
|
|
|
// sck, miso, mosi, af
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (priv->periph_num == 1) { |
|
|
|
|
|
|
|
// SPI1
|
|
|
|
|
|
|
|
if (priv->remap == 0) { |
|
|
|
|
|
|
|
spi_portname = 'A'; |
|
|
|
|
|
|
|
af_spi = LL_GPIO_AF_0; |
|
|
|
|
|
|
|
pin_sck = 5; |
|
|
|
|
|
|
|
pin_miso = 6; |
|
|
|
|
|
|
|
pin_mosi = 7; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else if (priv->remap == 1) { |
|
|
|
|
|
|
|
spi_portname = 'B'; |
|
|
|
|
|
|
|
af_spi = LL_GPIO_AF_0; |
|
|
|
|
|
|
|
pin_sck = 3; |
|
|
|
|
|
|
|
pin_miso = 4; |
|
|
|
|
|
|
|
pin_mosi = 5; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else if (priv->remap == 2) { |
|
|
|
|
|
|
|
// large packages only
|
|
|
|
|
|
|
|
spi_portname = 'E'; |
|
|
|
|
|
|
|
af_spi = LL_GPIO_AF_1; |
|
|
|
|
|
|
|
pin_sck = 13; |
|
|
|
|
|
|
|
pin_miso = 14; |
|
|
|
|
|
|
|
pin_mosi = 15; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else { |
|
|
|
|
|
|
|
return E_BAD_CONFIG; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else { |
|
|
|
|
|
|
|
// SPI2
|
|
|
|
|
|
|
|
if (priv->remap == 0) { |
|
|
|
|
|
|
|
spi_portname = 'B'; |
|
|
|
|
|
|
|
af_spi = LL_GPIO_AF_0; |
|
|
|
|
|
|
|
pin_sck = 13; |
|
|
|
|
|
|
|
pin_miso = 14; |
|
|
|
|
|
|
|
pin_mosi = 15; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else if (priv->remap == 1) { |
|
|
|
|
|
|
|
// NOTE: the's also a incomplete remap in PB and PC
|
|
|
|
|
|
|
|
spi_portname = 'D'; |
|
|
|
|
|
|
|
af_spi = LL_GPIO_AF_0; |
|
|
|
|
|
|
|
pin_sck = 1; |
|
|
|
|
|
|
|
pin_miso = 3; |
|
|
|
|
|
|
|
pin_mosi = 4; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else { |
|
|
|
|
|
|
|
return E_BAD_CONFIG; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
#elif GEX_PLAT_F103_BLUEPILL |
|
|
|
#elif GEX_PLAT_F103_BLUEPILL |
|
|
|
#error "NO IMPL" |
|
|
|
#error "NO IMPL" |
|
|
|
#elif GEX_PLAT_F303_DISCOVERY |
|
|
|
#elif GEX_PLAT_F303_DISCOVERY |
|
|
|