embox

Форк
0
/
btm_bluetooth.c 
133 строки · 3.7 Кб
1
/**
2
 * @file
3
 * @brief Implements BTM 112 Bluetooth driver.
4
 *
5
 * @date 15.07.11
6
 * @author Anton Kozlov
7
 */
8

9
#include <stdint.h>
10
#include <string.h>
11

12
#include <hal/reg.h>
13
#include <hal/system.h>
14

15
#include <kernel/time/ktime.h>
16
#include <drivers/at91sam7s256.h>
17
#include <drivers/pins.h>
18
#include <drivers/bluetooth/bluetooth.h>
19
#include <drivers/bluetooth/btm/btm112.h>
20
#include <kernel/time/timer.h>
21

22
#include <embox/unit.h>
23

24
extern void bt_handle(uint8_t *buff);
25

26
#define BTM_BT_RX_PIN  ((uint32_t) (1 << OPTION_GET(NUMBER,rx_pin)))
27
#define BTM_BT_TX_PIN  ((uint32_t) (1 << OPTION_GET(NUMBER,tx_pin)))
28
#define BTM_BT_SCK_PIN ((uint32_t) (1 << OPTION_GET(NUMBER,sck_pin)))
29
#define BTM_BT_RTS_PIN ((uint32_t) (1 << OPTION_GET(NUMBER,rts_pin)))
30
#define BTM_BT_CTS_PIN ((uint32_t) (1 << OPTION_GET(NUMBER,cts_pin)))
31

32
#define BTM_BT_RST_PIN   ((uint32_t) (1 << OPTION_GET(NUMBER,rst_pin)))
33
#define BTM_BT_LINK_PIN  ((uint32_t) (1 << OPTION_GET(NUMBER,link_pin)))
34

35

36
static volatile AT91PS_USART us_dev_regs = ((AT91PS_USART) OPTION_GET(NUMBER,serial_port_offset));
37

38
#define BTM_BT_BAUD_RATE 19200
39

40
EMBOX_UNIT_INIT(btm_bluetooth_init);
41

42
#define BUFF_SIZE 27
43

44
static uint8_t btm_bt_read_buff[BUFF_SIZE];
45
static int btm_bt_read_len;
46

47
static int nop_rx(int len, void *data) {
48
	return 0;
49
}
50
static int nop(void) {
51
	return 0;
52
}
53

54
CALLBACK_INIT_DEF(btm_bt_rx_handle_t, __bt_rx, nop_rx);
55
CALLBACK_INIT_DEF(nxt_bt_state_handle_t, bt_state, nop);
56

57
static irq_return_t btm_bt_us_handler(unsigned int irq_num, void *dev_id) {
58

59
	CALLBACK(__bt_rx)(btm_bt_read_len, btm_bt_read_buff);
60

61
	return IRQ_HANDLED;
62
}
63

64
static void init_usart(void) {
65
	/* Configure the usart */
66
	REG_STORE(AT91C_PMC_PCER, (1 << OPTION_GET(NUMBER,dev_id)));
67

68
	REG_STORE(AT91C_PIOA_PDR, BTM_BT_RX_PIN | BTM_BT_TX_PIN |
69
			BTM_BT_SCK_PIN | BTM_BT_RTS_PIN | BTM_BT_CTS_PIN);
70
	REG_STORE(AT91C_PIOA_ASR, BTM_BT_RX_PIN | BTM_BT_TX_PIN |
71
			BTM_BT_SCK_PIN | BTM_BT_RTS_PIN | BTM_BT_CTS_PIN);
72

73
	REG_STORE(&(us_dev_regs->US_PTCR), (AT91C_PDC_RXTDIS | AT91C_PDC_TXTDIS));
74

75
	REG_STORE(&(us_dev_regs->US_CR),  AT91C_US_RXDIS | AT91C_US_TXDIS);
76
	REG_STORE(&(us_dev_regs->US_CR),  AT91C_US_RSTSTA | AT91C_US_RSTRX | AT91C_US_RSTTX);
77
	REG_STORE(&(us_dev_regs->US_CR), AT91C_US_STTTO);
78

79
	REG_STORE(&(us_dev_regs->US_MR), AT91C_US_USMODE_HWHSH
80
			| AT91C_US_CLKS_CLOCK | AT91C_US_CHRL_8_BITS | AT91C_US_PAR_NONE
81
			| AT91C_US_NBSTOP_1_BIT);
82
	REG_STORE(&(us_dev_regs->US_BRGR), SYS_CLOCK / (16 * BTM_BT_BAUD_RATE));
83

84
	REG_STORE(&(us_dev_regs->US_IDR), ~0);
85

86
	REG_STORE(&(us_dev_regs->US_RCR), 0);
87
	REG_STORE(&(us_dev_regs->US_TCR), 0);
88
	REG_STORE(&(us_dev_regs->US_RNPR), 0);
89
	REG_STORE(&(us_dev_regs->US_TNPR), 0);
90
	REG_LOAD(&(us_dev_regs->US_RHR));
91
	REG_LOAD(&(us_dev_regs->US_CSR));
92

93
	REG_STORE(&(us_dev_regs->US_CR), AT91C_US_RXEN | AT91C_US_TXEN);
94
	REG_STORE(&(us_dev_regs->US_PTCR), AT91C_PDC_RXTEN | AT91C_PDC_TXTEN);
95
	REG_STORE(&(us_dev_regs->US_IER), AT91C_US_ENDRX);
96
}
97

98
void bluetooth_hw_hard_reset(void) {
99
	pin_config_output(BTM_BT_RST_PIN);
100
	pin_set_output(BTM_BT_RST_PIN);
101
	ksleep(1000);
102

103
	pin_clear_output(BTM_BT_RST_PIN);
104
	ksleep(5000);
105

106
	pin_config_input(BTM_BT_LINK_PIN);
107
	REG_STORE(AT91C_PIOA_PPUER, BTM_BT_LINK_PIN);
108
	REG_STORE(AT91C_PIOA_MDDR, BTM_BT_LINK_PIN);
109
}
110

111
static int btm_bluetooth_init(void) {
112
	irq_attach(OPTION_GET(NUMBER,irq_num), btm_bt_us_handler, 0, NULL, "bt reader");
113
	// TODO error handling?
114

115
	init_usart();
116
	return 0;
117
}
118

119
size_t bluetooth_write(uint8_t *buff, size_t len) {
120
	while (!(REG_LOAD(&(us_dev_regs->US_CSR)) & AT91C_US_ENDTX)) {
121
	}
122
	REG_STORE(&(us_dev_regs->US_TPR), (uint32_t) buff);
123
	REG_STORE(&(us_dev_regs->US_TCR), len);
124
	return len;
125
}
126

127
size_t bluetooth_read(size_t len) {
128
	btm_bt_read_len = len;
129
	REG_STORE(&(us_dev_regs->US_RPR), (uint32_t) btm_bt_read_buff);
130
	REG_STORE(&(us_dev_regs->US_RCR), len);
131

132
	return 0;
133
}
134

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

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

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

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