?? wdp_host.lst
字號:
C51 COMPILER V7.50 WDP_HOST 04/09/2009 10:12:50 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE WDP_HOST
OBJECT MODULE PLACED IN .\build\wdp_host.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ..\..\..\..\comp\protocol\wdp\host\wdp_host.c LARGE OMF2 OPTIMIZE(9,SPEED)
-BROWSE INCDIR(..\common;..\..\..\..\comp\protocol\wdp\common\;..\..\..\..\comp\protocol\wdp\host\;..\..\..\..\arch\hal\i
-nclude;..\..\..\..\arch\hal\nrf24lu1;..\..\..\..\arch\nrf24lu1;..\common;..\..\..\..\comp\protocol\fap) DEBUG PRINT(.\ls
-t\wdp_host.lst) OBJECT(.\build\wdp_host.obj)
line level source
1 /* Copyright (c) 2007 Nordic Semiconductor. All Rights Reserved.
2 *
3 * The information contained herein is property of Nordic Semiconductor ASA.
4 * Terms and conditions of usage are described in detail in NORDIC
5 * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT.
6 *
7 * Licensees are granted free, non-transferable use of the information. NO
8 * WARRENTY of ANY KIND is provided. This heading must NOT be removed from
9 * the file.
10 *
11 * $LastChangedRevision: 2290 $
12 */
13
14 /** @file
15 *
16 * Host source file for the Wireless Desktop Protocol.
17 *
18 * @author Lasse Olsen
19 *
20 */
21
22 #include <stdint.h>
23 #include <string.h>
24 #include "wdp_host.h"
25
26 /**
27 Device parameter struct type definition.
28 */
29 typedef struct
30 {
31 uint16_t dev_keep_alive_interval;
32 uint8_t dev_b0_address;
33 } wdp_dev_params_t;
34
35 const wdp_dev_params_t wdp_dev_params[WDP_DEVICE_SUPPORT_SIZE]=
36 {
37 {WDP_MOUSE_KA_INTERVAL, WDP_MOUSE_ADR_B0},
38 {WDP_KEYBOARD_KA_INTERVAL, WDP_KEYBOARD_ADR_B0},
39 {WDP_REMOTE_KA_INTERVAL, WDP_REMOTE_ADR_B0}
40 };
41
42 typedef struct
43 {
44 uint8_t pairing[FAP_ADDRESS_WIDTH];
45 uint8_t master[FAP_ADDRESS_WIDTH-1];
46 } wdp_addresses_t;
47
48 static wdp_addresses_t wdp_addresses =
49 {
50 WDP_PAIRING_ADDRESS,
51 WDP_INIT_MASTER_ADDRESS
52 };
C51 COMPILER V7.50 WDP_HOST 04/09/2009 10:12:50 PAGE 2
53
54 /**
55 WDP status register flag.
56 */
57 #define WDP_EN_ADR_GEN 0
58
59 /**
60 WDP status register flag.
61 */
62 #define WDP_PAIRING_EXECUTED 1
63 /**
64 WDP status register flag.
65 */
66 #define WDP_APP_DATA_RDY 2
67
68 //*****************************************************************************
69 // Misc. macros
70 //*****************************************************************************
71
72 #define WDP_GET_BIT(a, b) ((a >> b) & 0x01)
73 #define WDP_CLEAR_BIT(a, b) (a &= ~(1 << b))
74 #define WDP_SET_BIT(a, b) (a |= (1 << b))
75
76 static xdata uint8_t wdp_status_reg;
77
78 static xdata fap_tx_rx_struct_t wdp_rx_struct;
79 static xdata fap_tx_rx_struct_t wdp_gen_purp_struct;
80
81 static xdata uint16_t wdp_device_alive_array[WDP_DEVICE_SUPPORT_SIZE];
82 static const uint8_t wdp_pairing_ch_tab[FAP_CH_TAB_SIZE] = WDP_PAIRING_CHANNELS;
83
84 bool wdp_host_get_rx_data(uint8_t *dst, uint8_t* length, wdp_dev_types_t* origin)
85 {
86 1 if(WDP_GET_BIT(wdp_status_reg, WDP_APP_DATA_RDY))
87 1 {
88 2 *length = (wdp_rx_struct.pl_length - WDP_APP_PL_START);
89 2 *origin = (wdp_dev_types_t) wdp_rx_struct.pipe;
90 2 memcpy(dst, &wdp_rx_struct.pl[WDP_APP_PL_START], *length);
91 2 WDP_CLEAR_BIT(wdp_status_reg, WDP_APP_DATA_RDY);
92 2 return true;
93 2 }
94 1 else
95 1 {
96 2 return false;
97 2 }
98 1 }
99
100 void wdp_host_init(void)
101 {
102 1 uint8_t temp_adr;
103 1 fap_init();
104 1 fap_select_radio_idle_mode(FAP_PDOWN_IDLE);
105 1
106 1 fap_set_address(FAP_DEVICE0, (uint8_t*) &wdp_addresses.pairing[0]);
107 1
108 1 temp_adr = WDP_KEYBOARD_ADR_B0;
109 1 fap_set_address(FAP_DEVICE2, &temp_adr);
110 1
111 1 temp_adr = WDP_REMOTE_ADR_B0;
112 1 fap_set_address(FAP_DEVICE3, &temp_adr);
113 1
114 1 WDP_SET_BIT(wdp_status_reg, WDP_EN_ADR_GEN);
C51 COMPILER V7.50 WDP_HOST 04/09/2009 10:12:50 PAGE 3
115 1 WDP_CLEAR_BIT(wdp_status_reg, WDP_PAIRING_EXECUTED);
116 1 }
117
118 void wdp_host_get_master_adr(uint8_t *adr)
119 {
120 1 memcpy(adr, &wdp_addresses.master[0], (FAP_ADDRESS_WIDTH-1));
121 1 }
122
123 void wdp_host_enable_random_adr_gen(void)
124 {
125 1 WDP_SET_BIT(wdp_status_reg, WDP_EN_ADR_GEN);
126 1 }
127
128 bool wdp_host_set_master_adr(uint8_t *adr)
129 {
130 1 if(fap_get_mode() == FAP_IDLE)
131 1 {
132 2 memcpy(&wdp_addresses.master[0], adr, (FAP_ADDRESS_WIDTH-1));
133 2
134 2 wdp_gen_purp_struct.pl[0] = wdp_dev_params[0].dev_b0_address;
135 2 memcpy(&wdp_gen_purp_struct.pl[1], adr, (FAP_ADDRESS_WIDTH-1));
136 2
137 2 WDP_CLEAR_BIT(wdp_status_reg, WDP_EN_ADR_GEN);
138 2
139 2 fap_set_address(FAP_DEVICE1, &wdp_gen_purp_struct.pl[0]);
140 2
141 2 return true;
142 2 }
143 1 else
144 1 {
145 2 return false;
146 2 }
147 1 }
148
149 void wdp_host_rx_setup(wdp_rx_setup_t setup)
150 {
151 1 fap_goto_idle_mode();
152 1
153 1 fap_flush_rx_fifo();
154 1 fap_flush_tx_fifo();
155 1
156 1 if(setup == WDP_RX_PAIRING)
157 1 {
158 2 WDP_CLEAR_BIT(wdp_status_reg, WDP_PAIRING_EXECUTED);
159 2
160 2 // Setup pairing receive channels
161 2 fap_set_channels(wdp_pairing_ch_tab);
162 2
163 2 // Note: Pipe 0 (pairing) address setup by wdp_host_init()
164 2 fap_rx_data( (uint8_t) setup, 0);
165 2 }
166 1 else
167 1 if(setup == WDP_RX_NORMAL)
168 1 {
169 2 // Setup receive channels
170 2 wdp_extract_channels(wdp_addresses.master[0], &wdp_gen_purp_struct.pl[0]);
171 2 fap_set_channels(&wdp_gen_purp_struct.pl[0]);
172 2
173 2 // Setup pipe 1 address (master)
174 2 wdp_gen_purp_struct.pl[0] = wdp_dev_params[0].dev_b0_address; // Mouse address on pipe 1
-
175 2 memcpy(&wdp_gen_purp_struct.pl[1], &wdp_addresses.master[0], FAP_ADDRESS_WIDTH -1);
C51 COMPILER V7.50 WDP_HOST 04/09/2009 10:12:50 PAGE 4
176 2 fap_set_address(FAP_DEVICE1, &wdp_gen_purp_struct.pl[0]);
177 2
178 2 fap_rx_data( (uint8_t) setup, 0);
179 2 }
180 1 else
181 1 if(setup == WDP_RX_SUSPEND)
182 1 {
183 2 fap_rx_data( (uint8_t) setup, FAP_RX_SINGLE_CH_REV);
184 2 }
185 1 }
186
187 bool wdp_host_get_clear_pairing_result(void)
188 {
189 1 bool retbit;
190 1 retbit = WDP_GET_BIT(wdp_status_reg, WDP_PAIRING_EXECUTED);
191 1 WDP_CLEAR_BIT(wdp_status_reg, WDP_PAIRING_EXECUTED);
192 1 return retbit;
193 1 }
194
195 bool wdp_host_process_events(void)
196 {
197 1 uint8_t temp_dev_index;
198 1
199 1 // Random address counter
200 1 if(WDP_GET_BIT(wdp_status_reg, WDP_EN_ADR_GEN))
201 1 {
202 2 (*((uint16_t*)(&wdp_addresses.master[2]))) += 4;
203 2 (*((uint16_t*)(&wdp_addresses.master[0])))++;
204 2 }
205 1
206 1 // Check if received data
207 1 if(fap_read_rx_fifo(&wdp_rx_struct))
208 1 {
209 2 WDP_CLEAR_BIT(wdp_status_reg, WDP_APP_DATA_RDY);
210 2
211 2 if(wdp_rx_struct.pipe == WDP_PAIRING_PIPE)
212 2 {
213 3 switch(wdp_rx_struct.pl[WDP_TYPE_ID])
214 3 {
215 4 case PAIRING_REQ:
216 4 temp_dev_index = wdp_rx_struct.pl[DEV_TYPE] - 1;
217 4
218 4 if(!(temp_dev_index < WDP_DEVICE_SUPPORT_SIZE))
219 4 {
220 5 break;
221 5 }
222 4
223 4 WDP_CLEAR_BIT(wdp_status_reg, WDP_EN_ADR_GEN); // Stop address generator
224 4
225 4 // Assemble pairing return payload
226 4 wdp_gen_purp_struct.pl[WDP_TYPE_ID] = PAIRING_RESP;
227 4 wdp_gen_purp_struct.pl[DEV_TYPE] = wdp_rx_struct.pl[DEV_TYPE];
228 4
229 4 wdp_gen_purp_struct.pl[ADDRESS_B0] = wdp_dev_params[temp_dev_index].dev_b0_address;
-
230 4
231 4 memcpy(&wdp_gen_purp_struct.pl[MASTER_ADDRESS_START], wdp_addresses.master, FAP_ADDRESS_WIDTH -1
- );
232 4 wdp_gen_purp_struct.pipe = WDP_PAIRING_PIPE;
233 4 wdp_gen_purp_struct.pl_length = WDP_PAIRING_PL_LENGTH;
234 4
235 4 // Write pairing return payload to downlink buffer (ack payload)
C51 COMPILER V7.50 WDP_HOST 04/09/2009 10:12:50 PAGE 5
236 4
237 4 fap_write_ack_pload(&wdp_gen_purp_struct);
238 4
239 4 break;
240 4 case PAIRING_COMPL:
241 4 WDP_SET_BIT(wdp_status_reg, WDP_PAIRING_EXECUTED);
242 4 break;
243 4 default:
244 4 break;
245 4 }
246 3 }
247 2 else
248 2 {
249 3 temp_dev_index = wdp_rx_struct.pipe - 1;
250 3
251 3 if(temp_dev_index < WDP_DEVICE_SUPPORT_SIZE) // If data received on device address (not pairing addr
-ess)
252 3 {
253 4 wdp_device_alive_array[temp_dev_index]= wdp_dev_params[temp_dev_index].dev_keep_alive_interval*2;
254 4 }
255 3
256 3 switch(wdp_rx_struct.pl[WDP_TYPE_ID])
257 3 {
258 4 case KEEP_ALIVE:
259 4 break;
260 4 case USER_DATA:
261 4 WDP_SET_BIT(wdp_status_reg, WDP_APP_DATA_RDY);
262 4 break;
263 4 default:
264 4 break;
265 4 }
266 3 }
267 2 return true;
268 2 }
269 1
270 1 return false;
271 1 }
272
273 void wdp_timer_isr_function(void)
274 {
275 1 uint8_t index;
276 1 for(index=0; index<WDP_DEVICE_SUPPORT_SIZE; index++)
277 1 {
278 2 if(wdp_device_alive_array[index]>1) // Stops at 1 when going from connect to disconnect
279 2 {
280 3 wdp_device_alive_array[index]--;
281 3 }
282 2 }
283 1 return;
284 1 }
285
286 bool wdp_host_write_downlink_data(wdp_dev_types_t dev_type, uint8_t *src, uint8_t length)
287 {
288 1 if(!(length > WDP_MAX_DL_PL_LENGTH))
289 1 {
290 2 memcpy(&wdp_gen_purp_struct.pl[0], src, length);
291 2 wdp_gen_purp_struct.pipe = dev_type;
292 2 wdp_gen_purp_struct.pl_length = length;
293 2
294 2 return fap_write_ack_pload(&wdp_gen_purp_struct);
295 2 }
296 1 else
C51 COMPILER V7.50 WDP_HOST 04/09/2009 10:12:50 PAGE 6
297 1 {
298 2 return false;
299 2 }
300 1 }
301
302 bool wdp_host_get_connection_status(wdp_dev_types_t dev_type)
303 {
304 1 if(wdp_device_alive_array[dev_type-1] == 1)
305 1 {
306 2 wdp_device_alive_array[dev_type-1] = 0;
307 2 return false;
308 2 }
309 1 else
310 1 {
311 2 return true;
312 2 }
313 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 813 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 64 23
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
EDATA SIZE = ---- ----
HDATA SIZE = ---- ----
XDATA CONST SIZE = ---- ----
FAR CONST SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -