5
* @author Pavel Cherstvov
12
//#include <kernel/irq.h> /* IRQ is coming soon */
13
//#include <drivers/irqctrl.h> /* IRQ is coming soon */
14
#include <drivers/dm37xx_mux.h>
15
#include "omap3_spi_poll.h"
18
EMBOX_UNIT_INIT(omap3_spi_poll_init);
21
int spi_poll_switch_master_mode(void) {
22
REG_ORIN(MCSPI1_SYSCONFIG, MCSPI_SYSCONFIG_SOFTRESET);
23
while (!(REG_LOAD(MCSPI1_SYSSTATUS) & MCSPI_SYSSTATUS_RESETDONE)) {
25
REG_CLEAR_BIT(MCSPI1_CHxCONF(SPI_CHANNEL_NR), 18); /* IS, somi reception*/
26
REG_SET_BIT(MCSPI1_CHxCONF(SPI_CHANNEL_NR), 16); /* DPE0, no trans on somi */
27
REG_CLEAR_BIT(MCSPI1_CHxCONF(SPI_CHANNEL_NR), 17); /* DPE1 1, transmission on simo */
28
REG_CLEAR_BIT(MCSPI1_CHxCONF(SPI_CHANNEL_NR), 12); /* TRM, transmit and receive mode */
29
REG_CLEAR_BIT(MCSPI1_CHxCONF(SPI_CHANNEL_NR), 13); /* TRM, transmit and receive mode */
30
REG_ORIN(MCSPI1_CHxCONF(SPI_CHANNEL_NR), ( 0x7 << 7)); /* WL, word length 8 bits*/
31
REG_SET_BIT(MCSPI1_CHxCONF(SPI_CHANNEL_NR), 6); /* EPOL, cs active polarity low */
32
REG_ORIN(MCSPI1_CHxCONF(SPI_CHANNEL_NR), ( 0x8 << 2)); /* CLKD, divider 256 (~187 kHz) */
33
REG_CLEAR_BIT(MCSPI1_CHxCONF(SPI_CHANNEL_NR), 1); /* POL, 0 */
34
REG_CLEAR_BIT(MCSPI1_CHxCONF(SPI_CHANNEL_NR), 0); /* PHA, 0 */
35
REG_CLEAR_BIT(MCSPI1_MODULCTRL, 2); /* MS, Master mode */
36
REG_SET_BIT(MCSPI1_CHxCTRL(SPI_CHANNEL_NR), 0); /* EN, channel SPI_CHANNEL_NR enabled */
40
static int omap3_spi_poll_init(void) {
41
REG_ORIN(CM_FCLKEN1_CORE, (1 << 18));
42
REG_ORIN(CM_ICLKEN1_CORE, (1 << 18));
44
MUX_VAL(CONTROL_PADCONF_MCSPI1_CLK, (IEN | PD | M0 )); /* mcspi1_clk */
45
MUX_VAL(CONTROL_PADCONF_MCSPI1_CS0, (IEN | PD | M0 )); /* mcspi1_cs0 */
46
MUX_VAL(CONTROL_PADCONF_MCSPI1_SIMO, (IEN | PD | M0 )); /* mcspi1_simo */
47
MUX_VAL(CONTROL_PADCONF_MCSPI1_SOMI, (IEN | PD | M0 )); /* mcspi1_somi */
49
REG_SET_BIT(CM_ICLKEN_PER,17);
50
REG_SET_BIT(CM_FCLKEN_PER,17);
52
REG_ORIN(GPIO6_SYSCONFIG, GPIO6_SYSCONFIG_SOFTRESET);
53
while (!(REG_LOAD(GPIO6_SYSSTATUS) & GPIO6_SYSSTATUS_RESETDONE)) {
56
MUX_VAL(CONTROL_PADCONF_MCBSP1_CLKX, (IEN | PU | M4 )); /* gpio_162 */
57
REG_CLEAR_BIT(GPIO6_OE,2);
58
REG_SET_BIT(GPIO6_CLEARDATAOUT,2); /* switch on-module chip select muxing to CS1 */
63
/* IRQ is coming soon */
64
static irq_return_t my_isr(unsigned int my_irq_nr, void *my_dev_id) {
69
int spi_poll_send(const char *outdata, __u8 *indata, __u32 nBytes) {
70
REG_ORIN(MCSPI1_IRQSTATUS, MCSPI_IRQSTATUS_TXEMPTY(SPI_CHANNEL_NR));
71
REG_ORIN(MCSPI1_IRQSTATUS, MCSPI_IRQSTATUS_RXFULL(SPI_CHANNEL_NR));
73
REG_STORE(MCSPI1_TX(SPI_CHANNEL_NR), *outdata);
74
while (!(REG_LOAD(MCSPI1_IRQSTATUS) & MCSPI_IRQSTATUS_TXEMPTY(SPI_CHANNEL_NR))) {
76
while (!(REG_LOAD(MCSPI1_IRQSTATUS) & MCSPI_IRQSTATUS_RXFULL(SPI_CHANNEL_NR))) {
78
*indata = REG_LOAD(MCSPI1_RX(SPI_CHANNEL_NR));
79
REG_ORIN(MCSPI1_IRQSTATUS, MCSPI_IRQSTATUS_RXFULL(SPI_CHANNEL_NR));
80
REG_ORIN(MCSPI1_IRQSTATUS, MCSPI_IRQSTATUS_TXEMPTY(SPI_CHANNEL_NR));