embox

Форк
0
/
omap3_spi_poll.c 
86 строк · 3.1 Кб
1
/**
2
 * @file
3
 *
4
 * @date 21.02.13
5
 * @author Pavel Cherstvov
6
 */
7

8
#include <embox/unit.h>
9
#include <sys/types.h>
10
#include <stdio.h>
11
#include <hal/reg.h>
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"
16

17

18
EMBOX_UNIT_INIT(omap3_spi_poll_init);
19

20

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)) {
24
	}
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 */
37
	return 0;
38
}
39

40
static int omap3_spi_poll_init(void) {
41
	REG_ORIN(CM_FCLKEN1_CORE, (1 << 18));
42
	REG_ORIN(CM_ICLKEN1_CORE, (1 << 18));
43

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 */
48

49
	REG_SET_BIT(CM_ICLKEN_PER,17);
50
	REG_SET_BIT(CM_FCLKEN_PER,17);
51

52
	REG_ORIN(GPIO6_SYSCONFIG, GPIO6_SYSCONFIG_SOFTRESET);
53
	while (!(REG_LOAD(GPIO6_SYSSTATUS) & GPIO6_SYSSTATUS_RESETDONE)) {
54
	}
55

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 */
59
	return 0;
60
}
61

62
#if 0
63
/* IRQ is coming soon */
64
static irq_return_t my_isr(unsigned int my_irq_nr, void *my_dev_id) {
65
	return IRQ_HANDLED;
66
}
67
#endif
68

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));
72
	while (nBytes) {
73
		REG_STORE(MCSPI1_TX(SPI_CHANNEL_NR), *outdata);
74
		while (!(REG_LOAD(MCSPI1_IRQSTATUS) & MCSPI_IRQSTATUS_TXEMPTY(SPI_CHANNEL_NR))) {
75
				}
76
		while (!(REG_LOAD(MCSPI1_IRQSTATUS) & MCSPI_IRQSTATUS_RXFULL(SPI_CHANNEL_NR))) {
77
				}
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));
81
		nBytes--;
82
		outdata++;
83
		indata++;
84
	}
85
	return 0;
86
}
87

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.