OSDN Git Service

cd3918cd89c3677c21e82cdad274c70a95c29a97
[nxt-jsp/lejos_nxj.git] / nxtOSEK / lejos_nxj / src / nxtvm / platform / nxt / bt.c
1 #include "mytypes.h"
2 #include "AT91SAM7.h"
3 #include "uart.h"
4 #include "bt.h"
5 #include "aic.h"
6 #include  <string.h>
7
8 static U8 in_buf[2][128];
9 static U8 in_buf_in_ptr, out_buf_ptr;
10 static U8 out_buf[2][256];
11
12 static U8* buf_ptr;
13
14 static int in_buf_idx = 0;
15
16 #define BAUD_RATE 460800
17 #define CLOCK_RATE 48054850
18         
19 void bt_init(void)
20 {
21   U8 trash;
22   
23   in_buf_in_ptr = out_buf_ptr = 0; 
24   in_buf_idx = 0;
25   
26   *AT91C_PMC_PCER = (1 << AT91C_PERIPHERAL_ID_US1); 
27   
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; 
30   
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); 
38   *AT91C_US1_RCR  = 0; 
39   *AT91C_US1_TCR  = 0; 
40   *AT91C_US1_RNPR = 0;
41   *AT91C_US1_TNPR = 0;
42   
43   aic_mask_off(AT91C_PERIPHERAL_ID_US1);
44   aic_clear(AT91C_PERIPHERAL_ID_US1);
45
46   trash = *AT91C_US1_RHR;
47   trash = *AT91C_US1_CSR;
48   
49   *AT91C_US1_RPR  = (unsigned int)&(in_buf[0][0]); 
50   *AT91C_US1_RCR  = 128;
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); 
55   
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; 
65
66   *AT91C_ADC_MR  = 0;
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; 
71   
72   buf_ptr = &(in_buf[0][0]);
73 }
74
75 void bt_start_ad_converter()
76 {
77   *AT91C_ADC_CR = AT91C_ADC_START;
78 }
79
80 U32 bt_get_mode()
81 {
82   return (U32) *AT91C_ADC_CDR6;
83 }
84
85 void bt_send(U8 *buf, U32 len)
86 {
87   if (*AT91C_US1_TNCR == 0)
88   {     
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;
93   }
94 }
95
96 void bt_clear_arm7_cmd(void)
97 {
98   *AT91C_PIOA_CODR  = BT_ARM7_CMD_PIN;
99 }
100
101 void bt_set_arm7_cmd(void)
102 {
103   *AT91C_PIOA_SODR  = BT_ARM7_CMD_PIN;
104 }
105
106 void bt_set_reset_high(void)
107 {
108   *AT91C_PIOA_SODR = BT_RST_PIN;
109 }
110
111 void bt_receive(U8 * buf)
112 {
113   int bytes_ready, total_bytes_ready;
114   int cmd_len, i;
115   U8* tmp_ptr;
116   
117   buf[0] = 0;
118   buf[1] = 0;
119   
120   if (*AT91C_US1_RNCR == 0) {
121         bytes_ready = 128;
122         total_bytes_ready = 256 - *AT91C_US1_RCR;
123   }
124   else total_bytes_ready = bytes_ready = 128 - *AT91C_US1_RCR;
125   
126   // At least 2 bytes ready to be processed?
127   
128   if (total_bytes_ready > in_buf_idx + 1)
129   {
130         cmd_len = (int) buf_ptr[in_buf_idx];
131         
132         // Data mode kludge - data cannot be more than 255 bytes
133         
134         if (in_buf_idx < 127)
135         {
136                 if (buf_ptr[in_buf_idx+1] == 0) cmd_len++;
137         } 
138         else
139         {
140           tmp_ptr = &(in_buf[(in_buf_in_ptr+1)%2][0]);
141       if (tmp_ptr[0] == 0) cmd_len++;
142         }
143
144     // Is whole command in the buffer?
145   
146     if (bytes_ready >= in_buf_idx + cmd_len + 1)
147     {   
148           for(i=0;i<cmd_len+1;i++) buf[i] = buf_ptr[in_buf_idx++];
149     }
150     else
151     {
152       if (total_bytes_ready >= in_buf_idx + cmd_len + 1)
153       {
154         for(i=0;i<cmd_len+1 && in_buf_idx < 128;i++) buf[i] = buf_ptr[in_buf_idx++];
155         in_buf_idx = 0;
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++];
158         in_buf_idx += 128;
159       }
160       else return; // wait for all bytes to be ready
161     } 
162   }
163   
164   // Current buffer full and fully processed
165   
166   if (in_buf_idx >= 128 && *AT91C_US1_RNCR == 0)
167   {     
168         // Switch current buffer, and set up next 
169         
170         in_buf_idx -= 128;
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]);
175   }   
176 }
177
178 void bt_set_reset_low(void)
179 {
180   *AT91C_PIOA_CODR = BT_RST_PIN;
181 }
182