8 static U8 in_buf[2][128];
9 static U8 in_buf_in_ptr, out_buf_ptr;
10 static U8 out_buf[2][256];
14 static int in_buf_idx = 0;
16 #define BAUD_RATE 460800
17 #define CLOCK_RATE 48054850
23 in_buf_in_ptr = out_buf_ptr = 0;
26 *AT91C_PMC_PCER = (1 << AT91C_PERIPHERAL_ID_US1);
28 *AT91C_PIOA_PDR = BT_RX_PIN | BT_TX_PIN | BT_SCK_PIN | BT_RTS_PIN | BT_CTS_PIN;
29 *AT91C_PIOA_ASR = BT_RX_PIN | BT_TX_PIN | BT_SCK_PIN | BT_RTS_PIN | BT_CTS_PIN;
31 *AT91C_US1_CR = AT91C_US_RSTSTA;
32 *AT91C_US1_CR = AT91C_US_STTTO;
33 *AT91C_US1_RTOR = 10000;
34 *AT91C_US1_IDR = AT91C_US_TIMEOUT;
35 *AT91C_US1_MR = (AT91C_US_USMODE_HWHSH & ~AT91C_US_SYNC) | AT91C_US_CLKS_CLOCK | AT91C_US_CHRL_8_BITS | AT91C_US_PAR_NONE | AT91C_US_NBSTOP_1_BIT | AT91C_US_OVER;
36 *AT91C_US1_BRGR = ((CLOCK_RATE/8/BAUD_RATE) | (((CLOCK_RATE/8) - ((CLOCK_RATE/8/BAUD_RATE) * BAUD_RATE)) / ((BAUD_RATE + 4)/8)) << 16);
37 *AT91C_US1_PTCR = (AT91C_PDC_RXTDIS | AT91C_PDC_TXTDIS);
43 aic_mask_off(AT91C_PERIPHERAL_ID_US1);
44 aic_clear(AT91C_PERIPHERAL_ID_US1);
46 trash = *AT91C_US1_RHR;
47 trash = *AT91C_US1_CSR;
49 *AT91C_US1_RPR = (unsigned int)&(in_buf[0][0]);
51 *AT91C_US1_RNPR = (unsigned int)&(in_buf[1][0]);
52 *AT91C_US1_RNCR = 128;
53 *AT91C_US1_CR = AT91C_US_RXEN | AT91C_US_TXEN;
54 *AT91C_US1_PTCR = (AT91C_PDC_RXTEN | AT91C_PDC_TXTEN);
56 *AT91C_PIOA_PDR = BT_RX_PIN | BT_TX_PIN | BT_SCK_PIN | BT_RTS_PIN | BT_CTS_PIN;
57 *AT91C_PIOA_ASR = BT_RX_PIN | BT_TX_PIN | BT_SCK_PIN | BT_RTS_PIN | BT_CTS_PIN;
58 *AT91C_PIOA_PER = BT_CS_PIN | BT_RST_PIN;
59 *AT91C_PIOA_OER = BT_CS_PIN | BT_RST_PIN;
60 *AT91C_PIOA_SODR = BT_CS_PIN | BT_RST_PIN;
61 *AT91C_PIOA_PPUDR = BT_ARM7_CMD_PIN;
62 *AT91C_PIOA_PER = BT_ARM7_CMD_PIN;
63 *AT91C_PIOA_CODR = BT_ARM7_CMD_PIN;
64 *AT91C_PIOA_OER = BT_ARM7_CMD_PIN;
67 *AT91C_ADC_MR |= 0x00003F00;
68 *AT91C_ADC_MR |= 0x00020000;
69 *AT91C_ADC_MR |= 0x09000000;
70 *AT91C_ADC_CHER = AT91C_ADC_CH6 | AT91C_ADC_CH4;
72 buf_ptr = &(in_buf[0][0]);
75 void bt_start_ad_converter()
77 *AT91C_ADC_CR = AT91C_ADC_START;
82 return (U32) *AT91C_ADC_CDR6;
85 void bt_send(U8 *buf, U32 len)
87 if (*AT91C_US1_TNCR == 0)
89 memcpy(&(out_buf[out_buf_ptr][0]), buf, len);
90 *AT91C_US1_TNPR = (unsigned int) &(out_buf[out_buf_ptr][0]);
91 *AT91C_US1_TNCR = len;
92 out_buf_ptr = (out_buf_ptr+1) % 2;
96 void bt_clear_arm7_cmd(void)
98 *AT91C_PIOA_CODR = BT_ARM7_CMD_PIN;
101 void bt_set_arm7_cmd(void)
103 *AT91C_PIOA_SODR = BT_ARM7_CMD_PIN;
106 void bt_set_reset_high(void)
108 *AT91C_PIOA_SODR = BT_RST_PIN;
111 void bt_receive(U8 * buf)
113 int bytes_ready, total_bytes_ready;
120 if (*AT91C_US1_RNCR == 0) {
122 total_bytes_ready = 256 - *AT91C_US1_RCR;
124 else total_bytes_ready = bytes_ready = 128 - *AT91C_US1_RCR;
126 // At least 2 bytes ready to be processed?
128 if (total_bytes_ready > in_buf_idx + 1)
130 cmd_len = (int) buf_ptr[in_buf_idx];
132 // Data mode kludge - data cannot be more than 255 bytes
134 if (in_buf_idx < 127)
136 if (buf_ptr[in_buf_idx+1] == 0) cmd_len++;
140 tmp_ptr = &(in_buf[(in_buf_in_ptr+1)%2][0]);
141 if (tmp_ptr[0] == 0) cmd_len++;
144 // Is whole command in the buffer?
146 if (bytes_ready >= in_buf_idx + cmd_len + 1)
148 for(i=0;i<cmd_len+1;i++) buf[i] = buf_ptr[in_buf_idx++];
152 if (total_bytes_ready >= in_buf_idx + cmd_len + 1)
154 for(i=0;i<cmd_len+1 && in_buf_idx < 128;i++) buf[i] = buf_ptr[in_buf_idx++];
156 tmp_ptr = &(in_buf[(in_buf_in_ptr+1)%2][0]);
157 for(;i<cmd_len+1;i++) buf[i] = tmp_ptr[in_buf_idx++];
160 else return; // wait for all bytes to be ready
164 // Current buffer full and fully processed
166 if (in_buf_idx >= 128 && *AT91C_US1_RNCR == 0)
168 // Switch current buffer, and set up next
171 *AT91C_US1_RNPR = (unsigned int) buf_ptr;
172 *AT91C_US1_RNCR = 128;
173 in_buf_in_ptr = (in_buf_in_ptr+1) % 2;
174 buf_ptr = &(in_buf[in_buf_in_ptr][0]);
178 void bt_set_reset_low(void)
180 *AT91C_PIOA_CODR = BT_RST_PIN;