| uint32_t ctar = SPI0_CTAR0; | uint32_t ctar = SPI0_CTAR0; | ||||
| if (val & (1<<DORD)) ctar |= SPI_CTAR_LSBFE; // TODO: use bitband | if (val & (1<<DORD)) ctar |= SPI_CTAR_LSBFE; // TODO: use bitband | ||||
| if (val & (1<<CPOL)) ctar |= SPI_CTAR_CPOL; | if (val & (1<<CPOL)) ctar |= SPI_CTAR_CPOL; | ||||
| if ((val & 3) == 1) { | |||||
| // TODO: implement - is this ever really needed | |||||
| } else if ((val & 3) == 2) { | |||||
| // TODO: implement - is this ever really needed | |||||
| } else if ((val & 3) == 3) { | |||||
| // TODO: implement - is this ever really needed | |||||
| } | |||||
| if (val & (1<<CPHA) && !(ctar & SPI_CTAR_CPHA)) { | if (val & (1<<CPHA) && !(ctar & SPI_CTAR_CPHA)) { | ||||
| ctar |= SPI_CTAR_CPHA; | ctar |= SPI_CTAR_CPHA; | ||||
| // TODO: clear SPI_CTAR_CSSCK, set SPI_CTAR_ASC | |||||
| ctar &= 0xFFFF00FF; | |||||
| ctar |= SPI_CTAR_ASC(ctar & 15); | |||||
| } | |||||
| if ((val & 3) != 0) { | |||||
| uint32_t br = ctar & 15; | |||||
| uint32_t priorval; | |||||
| if (br <= 1) priorval = 0; | |||||
| else if (br <= 4) priorval = 1; | |||||
| else if (br <= 6) priorval = 2; | |||||
| else priorval = 3; | |||||
| uint32_t newval = priorval | (val & 3); | |||||
| if (newval != priorval) { | |||||
| if (newval == 0) br = 1; | |||||
| else if (newval == 0) br = 4; | |||||
| else if (newval == 0) br = 6; | |||||
| else br = 7; | |||||
| ctar &= 0xFFFF00F0; // clear BR, ASC, CSSCK | |||||
| if ((ctar & SPI_CTAR_CPHA)) { | |||||
| ctar |= SPI_CTAR_BR(br) | SPI_CTAR_ASC(br); | |||||
| } else { | |||||
| ctar |= SPI_CTAR_BR(br) | SPI_CTAR_CSSCK(br); | |||||
| } | |||||
| } | |||||
| } | } | ||||
| update_ctar(ctar); | update_ctar(ctar); | ||||
| } | } | ||||
| uint32_t ctar = SPI0_CTAR0; | uint32_t ctar = SPI0_CTAR0; | ||||
| if (!(val & (1<<DORD))) ctar &= ~SPI_CTAR_LSBFE; // TODO: use bitband | if (!(val & (1<<DORD))) ctar &= ~SPI_CTAR_LSBFE; // TODO: use bitband | ||||
| if (!(val & (1<<CPOL))) ctar &= ~SPI_CTAR_CPOL; | if (!(val & (1<<CPOL))) ctar &= ~SPI_CTAR_CPOL; | ||||
| if ((val & 3) == 0) { | |||||
| // TODO: implement - is this ever really needed | |||||
| } else if ((val & 3) == 1) { | |||||
| // TODO: implement - is this ever really needed | |||||
| } else if ((val & 3) == 2) { | |||||
| // TODO: implement - is this ever really needed | |||||
| } | |||||
| if (!(val & (1<<CPHA)) && (ctar & SPI_CTAR_CPHA)) { | if (!(val & (1<<CPHA)) && (ctar & SPI_CTAR_CPHA)) { | ||||
| ctar &= ~SPI_CTAR_CPHA; | ctar &= ~SPI_CTAR_CPHA; | ||||
| // TODO: set SPI_CTAR_ASC, clear SPI_CTAR_CSSCK | |||||
| ctar &= 0xFFFF00FF; | |||||
| ctar |= SPI_CTAR_CSSCK(ctar & 15); | |||||
| } | |||||
| if ((val & 3) != 3) { | |||||
| uint32_t br = ctar & 15; | |||||
| uint32_t priorval; | |||||
| if (br <= 1) priorval = 0; | |||||
| else if (br <= 4) priorval = 1; | |||||
| else if (br <= 6) priorval = 2; | |||||
| else priorval = 3; | |||||
| uint32_t newval = priorval & (val & 3); | |||||
| if (newval != priorval) { | |||||
| if (newval == 0) br = 1; | |||||
| else if (newval == 0) br = 4; | |||||
| else if (newval == 0) br = 6; | |||||
| else br = 7; | |||||
| ctar &= 0xFFFF00F0; // clear BR, ASC, CSSCK | |||||
| if ((ctar & SPI_CTAR_CPHA)) { | |||||
| ctar |= SPI_CTAR_BR(br) | SPI_CTAR_ASC(br); | |||||
| } else { | |||||
| ctar |= SPI_CTAR_BR(br) | SPI_CTAR_CSSCK(br); | |||||
| } | |||||
| } | |||||
| } | } | ||||
| update_ctar(ctar); | update_ctar(ctar); | ||||
| } | } | ||||
| if ((val & (1<<DORD)) && (SPI0_CTAR0 & SPI_CTAR_LSBFE)) ret |= (1<<DORD); | if ((val & (1<<DORD)) && (SPI0_CTAR0 & SPI_CTAR_LSBFE)) ret |= (1<<DORD); | ||||
| if ((val & (1<<CPOL)) && (SPI0_CTAR0 & SPI_CTAR_CPOL)) ret |= (1<<CPOL); | if ((val & (1<<CPOL)) && (SPI0_CTAR0 & SPI_CTAR_CPOL)) ret |= (1<<CPOL); | ||||
| if ((val & (1<<CPHA)) && (SPI0_CTAR0 & SPI_CTAR_CPHA)) ret |= (1<<CPHA); | if ((val & (1<<CPHA)) && (SPI0_CTAR0 & SPI_CTAR_CPHA)) ret |= (1<<CPHA); | ||||
| if ((val & 3) == 3) { | |||||
| if ((val & 3) != 0) { | |||||
| uint32_t dbr = SPI0_CTAR0 & 15; | uint32_t dbr = SPI0_CTAR0 & 15; | ||||
| uint32_t spr10; | |||||
| if (dbr <= 1) { | if (dbr <= 1) { | ||||
| spr10 = 0; | |||||
| } else if (dbr <= 4) { | } else if (dbr <= 4) { | ||||
| ret |= (1<<SPR0); | |||||
| spr10 |= (1<<SPR0); | |||||
| } else if (dbr <= 6) { | } else if (dbr <= 6) { | ||||
| ret |= (1<<SPR1); | |||||
| spr10 |= (1<<SPR1); | |||||
| } else { | } else { | ||||
| ret |= (1<<SPR1)|(1<<SPR0); | |||||
| spr10 |= (1<<SPR1)|(1<<SPR0); | |||||
| } | } | ||||
| } else if ((val & 3) == 1) { | |||||
| // TODO: implement - is this ever really needed | |||||
| } else if ((val & 3) == 2) { | |||||
| // TODO: implement - is this ever really needed | |||||
| ret |= spr10 & (val & 3); | |||||
| } | } | ||||
| if (val & (1<<SPE) && (!(SPI0_MCR & SPI_MCR_MDIS))) ret |= (1<<SPE); | if (val & (1<<SPE) && (!(SPI0_MCR & SPI_MCR_MDIS))) ret |= (1<<SPE); | ||||
| if (val & (1<<MSTR) && (SPI0_MCR & SPI_MCR_MSTR)) ret |= (1<<MSTR); | if (val & (1<<MSTR) && (SPI0_MCR & SPI_MCR_MSTR)) ret |= (1<<MSTR); |