Contiki 3.x
contiki-conf.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2014, OpenMote Technologies, S.L.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  * notice, this list of conditions and the following disclaimer in the
12  * documentation and/or other materials provided with the distribution.
13  * 3. Neither the name of the Institute nor the names of its contributors
14  * may be used to endorse or promote products derived from this software
15  * without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  *
29  * This file is part of the Contiki operating system.
30  *
31  */
32 /*---------------------------------------------------------------------------*/
33 /**
34  * \addtogroup openmote-cc2538
35  * @{
36  *
37  * \defgroup openmote-cc2538-platforms OpenMote-CC2538 platform
38  *
39  * The OpenMote-CC2538 platform was designed at UC Berkeley in 2013 and
40  * is comercialized by OpenMote Technologies since 2014. It is the first
41  * commercial platform based on the powerful TI CC2538 SoC. It uses a
42  * XBee form-factor to ease prototyping.
43  *
44  * \file
45  * Configuration for the OpenMote-CC2538 platform
46  */
47 #ifndef CONTIKI_CONF_H_
48 #define CONTIKI_CONF_H_
49 
50 #include <stdint.h>
51 #include <string.h>
52 /*---------------------------------------------------------------------------*/
53 /* Include Project Specific conf */
54 #ifdef PROJECT_CONF_H
55 #include PROJECT_CONF_H
56 #endif /* PROJECT_CONF_H */
57 /*---------------------------------------------------------------------------*/
58 /**
59  * \name Compiler configuration and platform-specific type definitions
60  *
61  * Those values are not meant to be modified by the user
62  * @{
63  */
64 #define CLOCK_CONF_SECOND 128
65 
66 /* Compiler configurations */
67 #define CCIF
68 #define CLIF
69 
70 /* Platform typedefs */
71 typedef uint32_t clock_time_t;
72 typedef uint32_t uip_stats_t;
73 
74 /*
75  * rtimer.h typedefs rtimer_clock_t as unsigned short. We need to define
76  * RTIMER_CLOCK_DIFF to override this
77  */
78 typedef uint32_t rtimer_clock_t;
79 #define RTIMER_CLOCK_DIFF(a, b) ((int32_t)((a) - (b)))
80 /** @} */
81 /*---------------------------------------------------------------------------*/
82 /**
83  * \name Serial Boot Loader Backdoor configuration
84  *
85  * @{
86  */
87 #ifndef FLASH_CCA_CONF_BOOTLDR_BACKDOOR
88 #define FLASH_CCA_CONF_BOOTLDR_BACKDOOR 1 /**<Enable the boot loader backdoor */
89 #endif
90 
91 #ifndef FLASH_CCA_CONF_BOOTLDR_BACKDOOR_PORT_A_PIN
92 #define FLASH_CCA_CONF_BOOTLDR_BACKDOOR_PORT_A_PIN 6 /**< Pin PA6 (ON/SLEEP on the OpenBase), activates the boot loader */
93 #endif
94 
95 #ifndef FLASH_CCA_CONF_BOOTLDR_BACKDOOR_ACTIVE_HIGH
96 #define FLASH_CCA_CONF_BOOTLDR_BACKDOOR_ACTIVE_HIGH 0 /**< A logic low level activates the boot loader */
97 #endif
98 /** @} */
99 
100 /*---------------------------------------------------------------------------*/
101 /**
102  * \name CFS configuration
103  *
104  * @{
105  */
106 #ifndef COFFEE_CONF_SIZE
107 #define COFFEE_CONF_SIZE (4 * COFFEE_SECTOR_SIZE)
108 #endif
109 /** @} */
110 /*---------------------------------------------------------------------------*/
111 /**
112  * \name Watchdog Timer configuration
113  *
114  * @{
115  */
116 #ifndef WATCHDOG_CONF_ENABLE
117 #define WATCHDOG_CONF_ENABLE 1 /**< Enable the watchdog timer */
118 #endif
119 /** @} */
120 /*---------------------------------------------------------------------------*/
121 /**
122  * \name USB 'core' configuration
123  *
124  * Those values are not meant to be modified by the user, except where stated
125  * otherwise
126  * @{
127  */
128 #define CTRL_EP_SIZE 8
129 #define USB_EP1_SIZE 32
130 #define USB_EP2_SIZE 64
131 #define USB_EP3_SIZE 64
132 #define USB_ARCH_WRITE_NOTIFY 0
133 
134 #ifndef USB_ARCH_CONF_DMA
135 #define USB_ARCH_CONF_DMA 1 /**< Change to Enable/Disable USB DMA */
136 
137 #endif
138 /** @} */
139 /*---------------------------------------------------------------------------*/
140 /**
141  * \name Generic Configuration directives
142  *
143  * @{
144  */
145 #ifndef ENERGEST_CONF_ON
146 #define ENERGEST_CONF_ON 0 /**< Energest Module */
147 #endif
148 
149 #ifndef STARTUP_CONF_VERBOSE
150 #define STARTUP_CONF_VERBOSE 1 /**< Set to 0 to decrease startup verbosity */
151 #endif
152 /** @} */
153 /*---------------------------------------------------------------------------*/
154 /**
155  * \name uDMA Configuration and channel allocations
156  *
157  * @{
158  */
159 #define USB_ARCH_CONF_RX_DMA_CHAN 0 /**< USB -> RAM DMA channel */
160 #define USB_ARCH_CONF_TX_DMA_CHAN 1 /**< RAM -> USB DMA channel */
161 #define CC2538_RF_CONF_TX_DMA_CHAN 2 /**< RF -> RAM DMA channel */
162 #define CC2538_RF_CONF_RX_DMA_CHAN 3 /**< RAM -> RF DMA channel */
163 #define UDMA_CONF_MAX_CHANNEL CC2538_RF_CONF_RX_DMA_CHAN
164 /** @} */
165 /*---------------------------------------------------------------------------*/
166 /**
167  * \name Character I/O Configuration
168  *
169  * @{
170  */
171 #ifndef UART_CONF_ENABLE
172 #define UART_CONF_ENABLE 1 /**< Enable/Disable UART I/O */
173 #endif
174 
175 #ifndef UART0_CONF_BAUD_RATE
176 #define UART0_CONF_BAUD_RATE 115200 /**< Default UART0 baud rate */
177 #endif
178 
179 #ifndef UART1_CONF_BAUD_RATE
180 #define UART1_CONF_BAUD_RATE 115200 /**< Default UART1 baud rate */
181 #endif
182 
183 #ifndef SLIP_ARCH_CONF_USB
184 #define SLIP_ARCH_CONF_USB 0 /**< SLIP over UART by default */
185 #endif
186 
187 #ifndef CC2538_RF_CONF_SNIFFER_USB
188 #define CC2538_RF_CONF_SNIFFER_USB 0 /**< Sniffer out over UART by default */
189 #endif
190 
191 #ifndef DBG_CONF_USB
192 #define DBG_CONF_USB 0 /**< All debugging over UART by default */
193 #endif
194 
195 #ifndef SERIAL_LINE_CONF_UART
196 #define SERIAL_LINE_CONF_UART 0 /**< UART to use with serial line */
197 #endif
198 
199 #if !SLIP_ARCH_CONF_USB
200 #ifndef SLIP_ARCH_CONF_UART
201 #define SLIP_ARCH_CONF_UART 0 /**< UART to use with SLIP */
202 #endif
203 #endif
204 
205 #if !CC2538_RF_CONF_SNIFFER_USB
206 #ifndef CC2538_RF_CONF_SNIFFER_UART
207 #define CC2538_RF_CONF_SNIFFER_UART 0 /**< UART to use with sniffer */
208 #endif
209 #endif
210 
211 #if !DBG_CONF_USB
212 #ifndef DBG_CONF_UART
213 #define DBG_CONF_UART 0 /**< UART to use for debugging */
214 #endif
215 #endif
216 
217 #ifndef UART1_CONF_UART
218 #define UART1_CONF_UART 0 /**< UART to use for examples relying on
219  the uart1_* API */
220 #endif
221 
222 /* Turn off example-provided putchars */
223 #define SLIP_BRIDGE_CONF_NO_PUTCHAR 1
224 #define SLIP_RADIO_CONF_NO_PUTCHAR 1
225 
226 #ifndef SLIP_ARCH_CONF_ENABLED
227 /*
228  * Determine whether we need SLIP
229  * This will keep working while UIP_FALLBACK_INTERFACE and CMD_CONF_OUTPUT
230  * keep using SLIP
231  */
232 #if defined(UIP_FALLBACK_INTERFACE) || defined(CMD_CONF_OUTPUT)
233 #define SLIP_ARCH_CONF_ENABLED 1
234 #endif
235 #endif
236 
237 /*
238  * When set, the radio turns off address filtering and sends all captured
239  * frames down a peripheral (UART or USB, depending on the value of
240  * CC2538_RF_CONF_SNIFFER_USB)
241  */
242 #ifndef CC2538_RF_CONF_SNIFFER
243 #define CC2538_RF_CONF_SNIFFER 0
244 #endif
245 
246 /**
247  * \brief Define this as 1 to build a headless node.
248  *
249  * The UART will not be initialised its clock will be gated, offering some
250  * energy savings. The USB will not be initialised either
251  */
252 #ifndef CC2538_CONF_QUIET
253 #define CC2538_CONF_QUIET 0
254 #endif
255 
256 /* CC2538_CONF_QUIET is hard and overrides all other related defines */
257 #if CC2538_CONF_QUIET
258 #undef USB_SERIAL_CONF_ENABLE
259 #define USB_SERIAL_CONF_ENABLE 0
260 
261 #undef UART_CONF_ENABLE
262 #define UART_CONF_ENABLE 0
263 
264 #undef STARTUP_CONF_VERBOSE
265 #define STARTUP_CONF_VERBOSE 0
266 
267 /* Little sanity check: We can't have quiet sniffers */
268 #if CC2538_RF_CONF_SNIFFER
269 #error "CC2538_RF_CONF_SNIFFER == 1 and CC2538_CONF_QUIET == 1"
270 #error "These values are conflicting. Please set either to 0"
271 #endif
272 #endif /* CC2538_CONF_QUIET */
273 
274 /**
275  * \brief Enable the USB core only if we need it
276  */
277 #ifndef USB_SERIAL_CONF_ENABLE
278 #define USB_SERIAL_CONF_ENABLE \
279  ((SLIP_ARCH_CONF_USB & SLIP_ARCH_CONF_ENABLED) | \
280  DBG_CONF_USB | \
281  (CC2538_RF_CONF_SNIFFER & CC2538_RF_CONF_SNIFFER_USB))
282 #endif
283 
284 /*
285  * If debugging and SLIP use the same peripheral, this will be 1. Don't modify
286  * this
287  */
288 #if SLIP_ARCH_CONF_ENABLED
289 #define DBG_CONF_SLIP_MUX (SLIP_ARCH_CONF_USB == DBG_CONF_USB && \
290  (SLIP_ARCH_CONF_USB || \
291  SLIP_ARCH_CONF_UART == DBG_CONF_UART))
292 #endif
293 
294 /*
295  * Automatic detection of whether a specific UART is in use
296  */
297 #define UART_IN_USE_BY_SERIAL_LINE(u) (SERIAL_LINE_CONF_UART == (u))
298 #define UART_IN_USE_BY_SLIP(u) (SLIP_ARCH_CONF_ENABLED && \
299  !SLIP_ARCH_CONF_USB && \
300  SLIP_ARCH_CONF_UART == (u))
301 #define UART_IN_USE_BY_RF_SNIFFER(u) (CC2538_RF_CONF_SNIFFER && \
302  !CC2538_RF_CONF_SNIFFER_USB && \
303  CC2538_RF_CONF_SNIFFER_UART == (u))
304 #define UART_IN_USE_BY_DBG(u) (!DBG_CONF_USB && DBG_CONF_UART == (u))
305 #define UART_IN_USE_BY_UART1(u) (UART1_CONF_UART == (u))
306 
307 #define UART_IN_USE(u) ( \
308  UART_CONF_ENABLE && \
309  (UART_IN_USE_BY_SERIAL_LINE(u) || \
310  UART_IN_USE_BY_SLIP(u) || \
311  UART_IN_USE_BY_RF_SNIFFER(u) || \
312  UART_IN_USE_BY_DBG(u) || \
313  UART_IN_USE_BY_UART1(u)) \
314  )
315 /** @} */
316 /*---------------------------------------------------------------------------*/
317 /* board.h assumes that basic configuration is done */
318 #include "board.h"
319 /*---------------------------------------------------------------------------*/
320 /**
321  * \name Network Stack Configuration
322  *
323  * @{
324  */
325 #ifndef NETSTACK_CONF_NETWORK
326 #if NETSTACK_CONF_WITH_IPV6
327 #define NETSTACK_CONF_NETWORK sicslowpan_driver
328 #else
329 #define NETSTACK_CONF_NETWORK rime_driver
330 #endif /* NETSTACK_CONF_WITH_IPV6 */
331 #endif /* NETSTACK_CONF_NETWORK */
332 
333 #ifndef NETSTACK_CONF_MAC
334 #define NETSTACK_CONF_MAC csma_driver
335 #endif
336 
337 #ifndef NETSTACK_CONF_RDC
338 #define NETSTACK_CONF_RDC contikimac_driver
339 #endif
340 
341 /* Configure NullRDC for when it's selected */
342 #define NULLRDC_802154_AUTOACK 1
343 #define NULLRDC_802154_AUTOACK_HW 1
344 
345 /* Configure ContikiMAC for when it's selected */
346 #define CONTIKIMAC_CONF_WITH_PHASE_OPTIMIZATION 0
347 #define WITH_FAST_SLEEP 1
348 
349 #ifndef NETSTACK_CONF_RDC_CHANNEL_CHECK_RATE
350 #define NETSTACK_CONF_RDC_CHANNEL_CHECK_RATE 8
351 #endif
352 
353 #ifndef NETSTACK_CONF_FRAMER
354 #if NETSTACK_CONF_WITH_IPV6
355 #define NETSTACK_CONF_FRAMER framer_802154
356 #else /* NETSTACK_CONF_WITH_IPV6 */
357 #define NETSTACK_CONF_FRAMER contikimac_framer
358 #endif /* NETSTACK_CONF_WITH_IPV6 */
359 #endif /* NETSTACK_CONF_FRAMER */
360 
361 #ifndef NETSTACK_CONF_RADIO
362 #define NETSTACK_CONF_RADIO cc2538_rf_driver
363 #endif
364 
365 /** @} */
366 /*---------------------------------------------------------------------------*/
367 /**
368  * \name LPM configuration
369  * @{
370  */
371 #ifndef LPM_CONF_ENABLE
372 #define LPM_CONF_ENABLE 1 /**< Set to 0 to disable LPM entirely */
373 #endif
374 
375 /**
376  * \brief Maximum PM
377  *
378  * The SoC will never drop to a Power Mode deeper than the one specified here.
379  * 0 for PM0, 1 for PM1 and 2 for PM2
380  */
381 #ifndef LPM_CONF_MAX_PM
382 #define LPM_CONF_MAX_PM 1
383 #endif
384 
385 #ifndef LPM_CONF_STATS
386 #define LPM_CONF_STATS 0 /**< Set to 1 to enable LPM-related stats */
387 #endif
388 /** @} */
389 /*---------------------------------------------------------------------------*/
390 /**
391  * \name IEEE address configuration
392  *
393  * Used to generate our RIME & IPv6 address
394  * @{
395  */
396 /**
397  * \brief Location of the IEEE address
398  * 0 => Read from InfoPage,
399  * 1 => Use a hardcoded address, configured by IEEE_ADDR_CONF_ADDRESS
400  */
401 #ifndef IEEE_ADDR_CONF_HARDCODED
402 #define IEEE_ADDR_CONF_HARDCODED 0
403 #endif
404 
405 /**
406  * \brief The hardcoded IEEE address to be used when IEEE_ADDR_CONF_HARDCODED
407  * is defined as 1
408  */
409 #ifndef IEEE_ADDR_CONF_ADDRESS
410 #define IEEE_ADDR_CONF_ADDRESS { 0x00, 0x12, 0x4B, 0x00, 0x89, 0xAB, 0xCD, 0xEF }
411 #endif
412 
413 /**
414  * \brief Location of the IEEE address in the InfoPage when
415  * IEEE_ADDR_CONF_HARDCODED is defined as 0
416  * 0 => Use the primary address location
417  * 1 => Use the secondary address location
418  */
419 #ifndef IEEE_ADDR_CONF_USE_SECONDARY_LOCATION
420 #define IEEE_ADDR_CONF_USE_SECONDARY_LOCATION 0
421 #endif
422 /** @} */
423 /*---------------------------------------------------------------------------*/
424 /**
425  * \name RF configuration
426  *
427  * @{
428  */
429 /* RF Config */
430 #ifndef IEEE802154_CONF_PANID
431 #define IEEE802154_CONF_PANID 0xABCD
432 #endif
433 
434 #ifndef CC2538_RF_CONF_CHANNEL
435 #define CC2538_RF_CONF_CHANNEL 26
436 #endif /* CC2538_RF_CONF_CHANNEL */
437 
438 #ifndef CC2538_RF_CONF_AUTOACK
439 #define CC2538_RF_CONF_AUTOACK 1 /**< RF H/W generates ACKs */
440 #endif /* CC2538_CONF_AUTOACK */
441 
442 #ifndef CC2538_RF_CONF_TX_USE_DMA
443 #define CC2538_RF_CONF_TX_USE_DMA 1 /**< RF TX over DMA */
444 #endif
445 
446 #ifndef CC2538_RF_CONF_RX_USE_DMA
447 #define CC2538_RF_CONF_RX_USE_DMA 1 /**< RF RX over DMA */
448 #endif
449 /** @} */
450 /*---------------------------------------------------------------------------*/
451 /**
452  * \name IPv6, RIME and network buffer configuration
453  *
454  * @{
455  */
456 
457 /* Don't let contiki-default-conf.h decide if we are an IPv6 build */
458 #ifndef NETSTACK_CONF_WITH_IPV6
459 #define NETSTACK_CONF_WITH_IPV6 0
460 #endif
461 
462 #if NETSTACK_CONF_WITH_IPV6
463 /* Addresses, Sizes and Interfaces */
464 /* 8-byte addresses here, 2 otherwise */
465 #define LINKADDR_CONF_SIZE 8
466 #define UIP_CONF_LL_802154 1
467 #define UIP_CONF_LLH_LEN 0
468 #define UIP_CONF_NETIF_MAX_ADDRESSES 3
469 
470 /* TCP, UDP, ICMP */
471 #ifndef UIP_CONF_TCP
472 #define UIP_CONF_TCP 1
473 #endif
474 #ifndef UIP_CONF_TCP_MSS
475 #define UIP_CONF_TCP_MSS 64
476 #endif
477 #define UIP_CONF_UDP 1
478 #define UIP_CONF_UDP_CHECKSUMS 1
479 #define UIP_CONF_ICMP6 1
480 
481 /* ND and Routing */
482 #ifndef UIP_CONF_ROUTER
483 #define UIP_CONF_ROUTER 1
484 #endif
485 
486 #define UIP_CONF_ND6_SEND_RA 0
487 #define UIP_CONF_IP_FORWARD 0
488 #define RPL_CONF_STATS 0
489 
490 #ifndef RPL_CONF_OF
491 #define RPL_CONF_OF rpl_mrhof
492 #endif
493 
494 #define UIP_CONF_ND6_REACHABLE_TIME 600000
495 #define UIP_CONF_ND6_RETRANS_TIMER 10000
496 
497 #ifndef NBR_TABLE_CONF_MAX_NEIGHBORS
498 #define NBR_TABLE_CONF_MAX_NEIGHBORS 20
499 #endif
500 #ifndef UIP_CONF_MAX_ROUTES
501 #define UIP_CONF_MAX_ROUTES 20
502 #endif
503 
504 /* uIP */
505 #ifndef UIP_CONF_BUFFER_SIZE
506 #define UIP_CONF_BUFFER_SIZE 1300
507 #endif
508 
509 #define UIP_CONF_IPV6_QUEUE_PKT 0
510 #define UIP_CONF_IPV6_CHECKS 1
511 #define UIP_CONF_IPV6_REASSEMBLY 0
512 #define UIP_CONF_MAX_LISTENPORTS 8
513 
514 /* 6lowpan */
515 #define SICSLOWPAN_CONF_COMPRESSION SICSLOWPAN_COMPRESSION_HC06
516 #ifndef SICSLOWPAN_CONF_COMPRESSION_THRESHOLD
517 #define SICSLOWPAN_CONF_COMPRESSION_THRESHOLD 63
518 #endif
519 #ifndef SICSLOWPAN_CONF_FRAG
520 #define SICSLOWPAN_CONF_FRAG 1
521 #endif
522 #define SICSLOWPAN_CONF_MAXAGE 8
523 
524 /* Define our IPv6 prefixes/contexts here */
525 #define SICSLOWPAN_CONF_MAX_ADDR_CONTEXTS 1
526 #ifndef SICSLOWPAN_CONF_ADDR_CONTEXT_0
527 #define SICSLOWPAN_CONF_ADDR_CONTEXT_0 { \
528  addr_contexts[0].prefix[0] = UIP_DS6_DEFAULT_PREFIX_0; \
529  addr_contexts[0].prefix[1] = UIP_DS6_DEFAULT_PREFIX_1; \
530 }
531 #endif
532 
533 #define MAC_CONF_CHANNEL_CHECK_RATE 8
534 
535 #ifndef QUEUEBUF_CONF_NUM
536 #define QUEUEBUF_CONF_NUM 8
537 #endif
538 /*---------------------------------------------------------------------------*/
539 #else /* NETSTACK_CONF_WITH_IPV6 */
540 /* Network setup for non-IPv6 (rime). */
541 #define UIP_CONF_IP_FORWARD 1
542 
543 #ifndef UIP_CONF_BUFFER_SIZE
544 #define UIP_CONF_BUFFER_SIZE 108
545 #endif
546 
547 #define RIME_CONF_NO_POLITE_ANNOUCEMENTS 0
548 
549 #ifndef QUEUEBUF_CONF_NUM
550 #define QUEUEBUF_CONF_NUM 8
551 #endif
552 
553 #endif /* NETSTACK_CONF_WITH_IPV6 */
554 /** @} */
555 /*---------------------------------------------------------------------------*/
556 /**
557  * \name Security
558  *
559  * @{
560  */
561 #ifndef CRYPTO_CONF_INIT
562 #define CRYPTO_CONF_INIT 1 /**< Whether to init cryptoprocessor */
563 #endif
564 
565 #ifndef AES_128_CONF
566 #define AES_128_CONF cc2538_aes_128_driver /**< AES-128 driver */
567 #endif
568 
569 #ifndef CCM_STAR_CONF
570 #define CCM_STAR_CONF cc2538_ccm_star_driver /**< AES-CCM* driver */
571 #endif
572 
573 /*---------------------------------------------------------------------------*/
574 #endif /* CONTIKI_CONF_H_ */
575 /*---------------------------------------------------------------------------*/
576 /**
577  * @}
578  * @}
579  */
This file provides connectivity information on LEDs, Buttons, UART and other OpenMote-CC2538 peripher...