13
#include <hal/system.h>
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>
22
#include <embox/unit.h>
24
extern void bt_handle(uint8_t *buff);
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)))
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)))
36
static volatile AT91PS_USART us_dev_regs = ((AT91PS_USART) OPTION_GET(NUMBER,serial_port_offset));
38
#define BTM_BT_BAUD_RATE 19200
40
EMBOX_UNIT_INIT(btm_bluetooth_init);
44
static uint8_t btm_bt_read_buff[BUFF_SIZE];
45
static int btm_bt_read_len;
47
static int nop_rx(int len, void *data) {
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);
57
static irq_return_t btm_bt_us_handler(unsigned int irq_num, void *dev_id) {
59
CALLBACK(__bt_rx)(btm_bt_read_len, btm_bt_read_buff);
64
static void init_usart(void) {
66
REG_STORE(AT91C_PMC_PCER, (1 << OPTION_GET(NUMBER,dev_id)));
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);
73
REG_STORE(&(us_dev_regs->US_PTCR), (AT91C_PDC_RXTDIS | AT91C_PDC_TXTDIS));
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);
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));
84
REG_STORE(&(us_dev_regs->US_IDR), ~0);
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));
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);
98
void bluetooth_hw_hard_reset(void) {
99
pin_config_output(BTM_BT_RST_PIN);
100
pin_set_output(BTM_BT_RST_PIN);
103
pin_clear_output(BTM_BT_RST_PIN);
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);
111
static int btm_bluetooth_init(void) {
112
irq_attach(OPTION_GET(NUMBER,irq_num), btm_bt_us_handler, 0, NULL, "bt reader");
119
size_t bluetooth_write(uint8_t *buff, size_t len) {
120
while (!(REG_LOAD(&(us_dev_regs->US_CSR)) & AT91C_US_ENDTX)) {
122
REG_STORE(&(us_dev_regs->US_TPR), (uint32_t) buff);
123
REG_STORE(&(us_dev_regs->US_TCR), len);
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);