3 * Stefan Strobl, GERSYS GmbH, stefan.strobl@gersys.de
6 * Martin Krause, TQ-Systems GmbH, martin.krause@tqs.de.
8 * See file CREDITS for list of people who contributed to this
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU General Public License as
13 * published by the Free Software Foundation; either version 2 of
14 * the License, or (at your option) any later version.
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
31 * BC3450 specific commands
33 #if (CONFIG_COMMANDS & CFG_CMD_BSP)
37 # define dprintf(fmt,args...) printf(fmt, ##args)
39 # define dprintf(fmt,args...)
43 * Definitions for DS1620 chip
45 #define THERM_START_CONVERT 0xee
46 #define THERM_RESET 0xaf
47 #define THERM_READ_CONFIG 0xac
48 #define THERM_READ_TEMP 0xaa
49 #define THERM_READ_TL 0xa2
50 #define THERM_READ_TH 0xa1
51 #define THERM_WRITE_CONFIG 0x0c
52 #define THERM_WRITE_TL 0x02
53 #define THERM_WRITE_TH 0x01
57 #define CFG_STANDALONE 0
67 #define SM501_GPIO_CTRL_LOW 0x00000008UL /* gpio pins 0..31 */
68 #define SM501_GPIO_CTRL_HIGH 0x0000000CUL /* gpio pins 32..63 */
69 #define SM501_POWER_MODE0_GATE 0x00000040UL
70 #define SM501_POWER_MODE1_GATE 0x00000048UL
71 #define POWER_MODE_GATE_GPIO_PWM_I2C 0x00000040UL
72 #define SM501_GPIO_DATA_LOW 0x00010000UL
73 #define SM501_GPIO_DATA_HIGH 0x00010004UL
74 #define SM501_GPIO_DATA_DIR_LOW 0x00010008UL
75 #define SM501_GPIO_DATA_DIR_HIGH 0x0001000CUL
76 #define SM501_PANEL_DISPLAY_CONTROL 0x00080000UL
77 #define SM501_CRT_DISPLAY_CONTROL 0x00080200UL
79 /* SM501 CRT Display Control Bits */
80 #define SM501_CDC_SEL (1 << 9)
81 #define SM501_CDC_TE (1 << 8)
82 #define SM501_CDC_E (1 << 2)
84 /* SM501 Panel Display Control Bits */
85 #define SM501_PDC_FPEN (1 << 27)
86 #define SM501_PDC_BIAS (1 << 26)
87 #define SM501_PDC_DATA (1 << 25)
88 #define SM501_PDC_VDDEN (1 << 24)
90 /* SM501 GPIO Data LOW Bits */
91 #define SM501_GPIO24 0x01000000
92 #define SM501_GPIO25 0x02000000
93 #define SM501_GPIO26 0x04000000
94 #define SM501_GPIO27 0x08000000
95 #define SM501_GPIO28 0x10000000
96 #define SM501_GPIO29 0x20000000
97 #define SM501_GPIO30 0x40000000
98 #define SM501_GPIO31 0x80000000
100 /* SM501 GPIO Data HIGH Bits */
101 #define SM501_GPIO46 0x00004000
102 #define SM501_GPIO47 0x00008000
103 #define SM501_GPIO48 0x00010000
104 #define SM501_GPIO49 0x00020000
105 #define SM501_GPIO50 0x00040000
106 #define SM501_GPIO51 0x00080000
108 /* BC3450 GPIOs @ SM501 Data LOW */
109 #define DIP (SM501_GPIO24 | SM501_GPIO25 | SM501_GPIO26 | SM501_GPIO27)
110 #define DS1620_DQ SM501_GPIO29 /* I/O */
111 #define DS1620_CLK SM501_GPIO30 /* High active O/P */
112 #define DS1620_RES SM501_GPIO31 /* Low active O/P */
113 /* BC3450 GPIOs @ SM501 Data HIGH */
114 #define BUZZER SM501_GPIO47 /* Low active O/P */
115 #define DS1620_TLOW SM501_GPIO48 /* High active I/P */
116 #define PWR_OFF SM501_GPIO49 /* Low active O/P */
117 #define FP_DATA_TRI SM501_GPIO50 /* High active O/P */
121 * Initialise GPIO on SM501
123 * This function may be called from several other functions.
124 * Yet, the initialisation sequence is executed only the first
125 * time the function is called.
127 int sm501_gpio_init(void)
129 static int init_done
= 0;
132 /* dprintf("sm501_gpio_init: nothing to be done.\n"); */
136 /* enable SM501 GPIO control (in both power modes) */
137 *(vu_long
*) (SM501_MMIO_BASE
+ SM501_POWER_MODE0_GATE
) |= POWER_MODE_GATE_GPIO_PWM_I2C
;
138 *(vu_long
*) (SM501_MMIO_BASE
+ SM501_POWER_MODE1_GATE
) |= POWER_MODE_GATE_GPIO_PWM_I2C
;
140 /* set up default O/Ps */
141 *(vu_long
*) (SM501_MMIO_BASE
+ SM501_GPIO_DATA_LOW
) &= ~(DS1620_RES
| DS1620_CLK
);
142 *(vu_long
*) (SM501_MMIO_BASE
+ SM501_GPIO_DATA_LOW
) |= DS1620_DQ
;
143 *(vu_long
*) (SM501_MMIO_BASE
+ SM501_GPIO_DATA_HIGH
) &= ~(FP_DATA_TRI
);
144 *(vu_long
*) (SM501_MMIO_BASE
+ SM501_GPIO_DATA_HIGH
) |= (BUZZER
| PWR_OFF
);
146 /* configure directions for SM501 GPIO pins */
147 *(vu_long
*) (SM501_MMIO_BASE
+ SM501_GPIO_CTRL_LOW
) &= ~(0xFF << 24);
148 *(vu_long
*) (SM501_MMIO_BASE
+ SM501_GPIO_CTRL_HIGH
) &= ~(0x3F << 14);
149 *(vu_long
*) (SM501_MMIO_BASE
+ SM501_GPIO_DATA_DIR_LOW
) &= ~(DIP
| DS1620_DQ
);
150 *(vu_long
*) (SM501_MMIO_BASE
+ SM501_GPIO_DATA_DIR_LOW
) |= (DS1620_RES
| DS1620_CLK
);
151 *(vu_long
*) (SM501_MMIO_BASE
+ SM501_GPIO_DATA_DIR_HIGH
) &= ~DS1620_TLOW
;
152 *(vu_long
*) (SM501_MMIO_BASE
+ SM501_GPIO_DATA_DIR_HIGH
) |= (PWR_OFF
| BUZZER
| FP_DATA_TRI
);
155 /* dprintf("sm501_gpio_init: done.\n"); */
161 * dip - read Config Inputs
163 * read and prints the dip switch
164 * and/or external config inputs (4bits) 0...0x0F
166 int cmd_dip (cmd_tbl_t
*cmdtp
, int flag
, int argc
, char *argv
[])
172 /* read dip switch */
173 rc
= *(vu_long
*) (SM501_MMIO_BASE
+ SM501_GPIO_DATA_LOW
);
176 rc
= (int)(rc
>> 24);
178 /* plausibility check */
182 printf ("0x%x\n", rc
);
188 "dip - read dip switch and config inputs\n",
190 " - prints the state of the dip switch and/or\n"
191 " external configuration inputs as hex value.\n"
192 " - \"Config 1\" is the LSB\n"
197 * buz - turns Buzzer on/off
199 #ifdef CONFIG_BC3450_BUZZER
200 static int cmd_buz (cmd_tbl_t
*cmdtp
, int flag
, int argc
, char *argv
[])
203 printf ("Usage:\nspecify one argument: \"on\" or \"off\"\n");
209 if (strncmp (argv
[1], "on", 2) == 0) {
210 *(vu_long
*) (SM501_MMIO_BASE
+ SM501_GPIO_DATA_HIGH
) &= ~(BUZZER
);
213 else if (strncmp (argv
[1], "off", 3) == 0) {
214 *(vu_long
*) (SM501_MMIO_BASE
+ SM501_GPIO_DATA_HIGH
) |= BUZZER
;
217 printf ("Usage:\nspecify one argument: \"on\" or \"off\"\n");
223 "buz - turns buzzer on/off\n",
226 " - turns the buzzer on or off\n"
228 #endif /* CONFIG_BC3450_BUZZER */
232 * fp - front panel commands
234 static int cmd_fp (cmd_tbl_t
*cmdtp
, int flag
, int argc
, char *argv
[])
238 if (strncmp (argv
[1], "on", 2) == 0) {
239 /* turn on VDD first */
240 *(vu_long
*)(SM501_MMIO_BASE
+ SM501_PANEL_DISPLAY_CONTROL
) |= SM501_PDC_VDDEN
;
242 /* then put data on */
243 *(vu_long
*)(SM501_MMIO_BASE
+ SM501_PANEL_DISPLAY_CONTROL
) |= SM501_PDC_DATA
;
244 /* wait some time and enable backlight */
246 *(vu_long
*)(SM501_MMIO_BASE
+ SM501_PANEL_DISPLAY_CONTROL
) |= SM501_PDC_BIAS
;
248 *(vu_long
*)(SM501_MMIO_BASE
+ SM501_PANEL_DISPLAY_CONTROL
) |= SM501_PDC_FPEN
;
251 else if (strncmp (argv
[1], "off", 3) == 0) {
252 /* turn off the backlight first */
253 *(vu_long
*)(SM501_MMIO_BASE
+ SM501_PANEL_DISPLAY_CONTROL
) &= ~SM501_PDC_FPEN
;
255 *(vu_long
*)(SM501_MMIO_BASE
+ SM501_PANEL_DISPLAY_CONTROL
) &= ~SM501_PDC_BIAS
;
257 /* wait some time, then remove data */
258 *(vu_long
*)(SM501_MMIO_BASE
+ SM501_PANEL_DISPLAY_CONTROL
) &= ~SM501_PDC_DATA
;
260 /* and remove VDD last */
261 *(vu_long
*)(SM501_MMIO_BASE
+ SM501_PANEL_DISPLAY_CONTROL
) &= ~SM501_PDC_VDDEN
;
264 else if (strncmp (argv
[1], "bl", 2) == 0) {
265 /* turn on/off backlight only */
266 if (strncmp (argv
[2], "on", 2) == 0) {
267 *(vu_long
*)(SM501_MMIO_BASE
+ SM501_PANEL_DISPLAY_CONTROL
) |= SM501_PDC_BIAS
;
269 *(vu_long
*)(SM501_MMIO_BASE
+ SM501_PANEL_DISPLAY_CONTROL
) |= SM501_PDC_FPEN
;
272 else if (strncmp (argv
[2], "off", 3) == 0) {
273 *(vu_long
*)(SM501_MMIO_BASE
+ SM501_PANEL_DISPLAY_CONTROL
) &= ~SM501_PDC_FPEN
;
275 *(vu_long
*)(SM501_MMIO_BASE
+ SM501_PANEL_DISPLAY_CONTROL
) &= ~SM501_PDC_BIAS
;
279 #ifdef CONFIG_BC3450_CRT
280 else if (strncmp (argv
[1], "crt", 3) == 0) {
281 /* enables/disables the crt output (debug only) */
282 if(strncmp (argv
[2], "on", 2) == 0) {
283 *(vu_long
*)(SM501_MMIO_BASE
+ SM501_CRT_DISPLAY_CONTROL
) |=
284 (SM501_CDC_TE
| SM501_CDC_E
);
285 *(vu_long
*)(SM501_MMIO_BASE
+ SM501_CRT_DISPLAY_CONTROL
) &=
289 else if (strncmp (argv
[2], "off", 3) == 0) {
290 *(vu_long
*)(SM501_MMIO_BASE
+ SM501_CRT_DISPLAY_CONTROL
) &=
291 ~(SM501_CDC_TE
| SM501_CDC_E
);
292 *(vu_long
*)(SM501_MMIO_BASE
+ SM501_CRT_DISPLAY_CONTROL
) |=
297 #endif /* CONFIG_BC3450_CRT */
298 printf("Usage:%s\n", cmdtp
->help
);
304 "fp - front panes access functions\n",
307 " - turns the CCFL backlight of the display on/off\n"
309 " - turns the whole display on/off\n"
310 #ifdef CONFIG_BC3450_CRT
312 " - enables/disables the crt output (debug only)\n"
313 #endif /* CONFIG_BC3450_CRT */
318 * temp - DS1620 thermometer
320 /* GERSYS BC3450 specific functions */
321 static inline void bc_ds1620_set_clk(int clk
)
324 *(vu_long
*) (SM501_MMIO_BASE
+ SM501_GPIO_DATA_LOW
) |= DS1620_CLK
;
326 *(vu_long
*) (SM501_MMIO_BASE
+ SM501_GPIO_DATA_LOW
) &= ~DS1620_CLK
;
329 static inline void bc_ds1620_set_data(int dat
)
332 *(vu_long
*) (SM501_MMIO_BASE
+ SM501_GPIO_DATA_LOW
) |= DS1620_DQ
;
334 *(vu_long
*) (SM501_MMIO_BASE
+ SM501_GPIO_DATA_LOW
) &= ~DS1620_DQ
;
337 static inline int bc_ds1620_get_data(void)
340 rc
= *(vu_long
*) (SM501_MMIO_BASE
+ SM501_GPIO_DATA_LOW
);
347 static inline void bc_ds1620_set_data_dir(int dir
)
350 *(vu_long
*) (SM501_MMIO_BASE
+ SM501_GPIO_DATA_DIR_LOW
) &= ~DS1620_DQ
;
352 *(vu_long
*) (SM501_MMIO_BASE
+ SM501_GPIO_DATA_DIR_LOW
) |= DS1620_DQ
;
355 static inline void bc_ds1620_set_reset(int res
)
358 *(vu_long
*) (SM501_MMIO_BASE
+ SM501_GPIO_DATA_LOW
) |= DS1620_RES
;
360 *(vu_long
*) (SM501_MMIO_BASE
+ SM501_GPIO_DATA_LOW
) &= ~DS1620_RES
;
363 /* hardware independent functions */
364 static void ds1620_send_bits(int nr
, int value
)
368 for (i
= 0; i
< nr
; i
++) {
369 bc_ds1620_set_data(value
& 1);
370 bc_ds1620_set_clk(0);
372 bc_ds1620_set_clk(1);
379 static unsigned int ds1620_recv_bits(int nr
)
381 unsigned int value
= 0, mask
= 1;
384 bc_ds1620_set_data(0);
386 for (i
= 0; i
< nr
; i
++) {
387 bc_ds1620_set_clk(0);
390 if (bc_ds1620_get_data())
395 bc_ds1620_set_clk(1);
402 static void ds1620_out(int cmd
, int bits
, int value
)
404 bc_ds1620_set_clk(1);
405 bc_ds1620_set_data_dir(0);
407 bc_ds1620_set_reset(0);
409 bc_ds1620_set_reset(1);
413 ds1620_send_bits(8, cmd
);
415 ds1620_send_bits(bits
, value
);
420 bc_ds1620_set_data_dir(1);
421 bc_ds1620_set_reset(0);
422 bc_ds1620_set_clk(0);
427 static unsigned int ds1620_in(int cmd
, int bits
)
431 bc_ds1620_set_clk(1);
432 bc_ds1620_set_data_dir(0);
434 bc_ds1620_set_reset(0);
436 bc_ds1620_set_reset(1);
440 ds1620_send_bits(8, cmd
);
442 bc_ds1620_set_data_dir(1);
443 value
= ds1620_recv_bits(bits
);
446 bc_ds1620_set_data_dir(1);
447 bc_ds1620_set_reset(0);
448 bc_ds1620_set_clk(0);
453 static int cvt_9_to_int(unsigned int val
)
461 /* set thermostate thresholds */
462 static void ds1620_write_state(struct therm
*therm
)
464 ds1620_out(THERM_WRITE_TL
, 9, therm
->lo
);
465 ds1620_out(THERM_WRITE_TH
, 9, therm
->hi
);
466 ds1620_out(THERM_START_CONVERT
, 0, 0);
469 static int cmd_temp (cmd_tbl_t
*cmdtp
, int flag
, int argc
, char *argv
[])
476 /* print temperature */
478 i
= cvt_9_to_int(ds1620_in(THERM_READ_TEMP
, 9));
479 printf("%d.%d C\n", i
>> 1, i
& 1 ? 5 : 0);
483 /* set to default operation */
484 if (strncmp (argv
[1], "set", 3) == 0) {
485 if(strncmp (argv
[2], "default", 3) == 0) {
490 ds1620_write_state(&therm
);
491 ds1620_out(THERM_WRITE_CONFIG
, 8, CFG_STANDALONE
);
496 printf ("Usage:%s\n", cmdtp
->help
);
501 temp
, 3, 1, cmd_temp
,
502 "temp - print current temperature\n",
505 " - print current temperature\n"
508 #ifdef CONFIG_BC3450_CAN
510 * Initialise CAN interface
512 * return 1 on CAN initialization failure
513 * return 0 if no failure
517 static int init_done
= 0;
519 struct mpc5xxx_mscan
*can1
=
520 (struct mpc5xxx_mscan
*)(CFG_MBAR
+ 0x0900);
521 struct mpc5xxx_mscan
*can2
=
522 (struct mpc5xxx_mscan
*)(CFG_MBAR
+ 0x0980);
524 /* GPIO configuration of the CAN pins is done in BC3450.h */
528 can1
->canctl1
|= 0x80; /* CAN enable */
532 can1
->canctl0
|= 0x02; /* sleep mode */
533 /* wait until sleep mode reached */
534 while (!(can1
->canctl1
& 0x02)) {
538 printf ("%s: CAN1 initialize error, "
539 "can not enter sleep mode!\n",
545 can1
->canctl0
= 0x01; /* enter init mode */
546 /* wait until init mode reached */
547 while (!(can1
->canctl1
& 0x01)) {
551 printf ("%s: CAN1 initialize error, "
552 "can not enter init mode!\n",
557 can1
->canctl1
= 0x80;
558 can1
->canctl1
|= 0x40;
559 can1
->canbtr0
= 0x0F;
560 can1
->canbtr1
= 0x7F;
561 can1
->canidac
&= ~(0x30);
562 can1
->canidar1
= 0x00;
563 can1
->canidar3
= 0x00;
564 can1
->canidar5
= 0x00;
565 can1
->canidar7
= 0x00;
566 can1
->canidmr0
= 0xFF;
567 can1
->canidmr1
= 0xFF;
568 can1
->canidmr2
= 0xFF;
569 can1
->canidmr3
= 0xFF;
570 can1
->canidmr4
= 0xFF;
571 can1
->canidmr5
= 0xFF;
572 can1
->canidmr6
= 0xFF;
573 can1
->canidmr7
= 0xFF;
576 can1
->canctl0
&= ~(0x01); /* leave init mode */
577 can1
->canctl0
&= ~(0x02);
578 /* wait until init and sleep mode left */
579 while ((can1
->canctl1
& 0x01) || (can1
->canctl1
& 0x02)) {
583 printf ("%s: CAN1 initialize error, "
584 "can not leave init/sleep mode!\n",
591 can2
->canctl1
|= 0x80; /* CAN enable */
595 can2
->canctl0
|= 0x02; /* sleep mode */
596 /* wait until sleep mode reached */
597 while (!(can2
->canctl1
& 0x02)) {
601 printf ("%s: CAN2 initialize error, "
602 "can not enter sleep mode!\n",
608 can2
->canctl0
= 0x01; /* enter init mode */
609 /* wait until init mode reached */
610 while (!(can2
->canctl1
& 0x01)) {
614 printf ("%s: CAN2 initialize error, "
615 "can not enter init mode!\n",
620 can2
->canctl1
= 0x80;
621 can2
->canctl1
|= 0x40;
622 can2
->canbtr0
= 0x0F;
623 can2
->canbtr1
= 0x7F;
624 can2
->canidac
&= ~(0x30);
625 can2
->canidar1
= 0x00;
626 can2
->canidar3
= 0x00;
627 can2
->canidar5
= 0x00;
628 can2
->canidar7
= 0x00;
629 can2
->canidmr0
= 0xFF;
630 can2
->canidmr1
= 0xFF;
631 can2
->canidmr2
= 0xFF;
632 can2
->canidmr3
= 0xFF;
633 can2
->canidmr4
= 0xFF;
634 can2
->canidmr5
= 0xFF;
635 can2
->canidmr6
= 0xFF;
636 can2
->canidmr7
= 0xFF;
637 can2
->canctl0
&= ~(0x01); /* leave init mode */
638 can2
->canctl0
&= ~(0x02);
641 /* wait until init mode left */
642 while ((can2
->canctl1
& 0x01) || (can2
->canctl1
& 0x02)) {
646 printf ("%s: CAN2 initialize error, "
647 "can not leave init/sleep mode!\n",
659 * by sending message between CAN1 and CAN2
661 * return 1 on CAN failure
662 * return 0 if no failure
664 int do_can(char *argv
[])
667 struct mpc5xxx_mscan
*can1
=
668 (struct mpc5xxx_mscan
*)(CFG_MBAR
+ 0x0900);
669 struct mpc5xxx_mscan
*can2
=
670 (struct mpc5xxx_mscan
*)(CFG_MBAR
+ 0x0980);
672 /* send a message on CAN1 */
673 can1
->cantbsel
= 0x01;
674 can1
->cantxfg
.idr
[0] = 0x55;
675 can1
->cantxfg
.idr
[1] = 0x00;
676 can1
->cantxfg
.idr
[1] &= ~0x8;
677 can1
->cantxfg
.idr
[1] &= ~0x10;
678 can1
->cantxfg
.dsr
[0] = 0xCC;
679 can1
->cantxfg
.dlr
= 1;
680 can1
->cantxfg
.tbpr
= 0;
681 can1
->cantflg
= 0x01;
684 while ((can1
->cantflg
& 0x01) == 0) {
687 printf ("%s: CAN1 send timeout, "
688 "can not send message!\n",
697 while (!(can2
->canrflg
& 0x01)) {
700 printf ("%s: CAN2 receive timeout, "
701 "no message received!\n",
708 if (can2
->canrxfg
.dsr
[0] != 0xCC) {
709 printf ("%s: CAN2 receive error, "
715 /* send a message on CAN2 */
716 can2
->cantbsel
= 0x01;
717 can2
->cantxfg
.idr
[0] = 0x55;
718 can2
->cantxfg
.idr
[1] = 0x00;
719 can2
->cantxfg
.idr
[1] &= ~0x8;
720 can2
->cantxfg
.idr
[1] &= ~0x10;
721 can2
->cantxfg
.dsr
[0] = 0xCC;
722 can2
->cantxfg
.dlr
= 1;
723 can2
->cantxfg
.tbpr
= 0;
724 can2
->cantflg
= 0x01;
727 while ((can2
->cantflg
& 0x01) == 0) {
730 printf ("%s: CAN2 send error, "
731 "can not send message!\n",
740 while (!(can1
->canrflg
& 0x01)) {
743 printf ("%s: CAN1 receive timeout, "
744 "no message received!\n",
751 if (can1
->canrxfg
.dsr
[0] != 0xCC) {
752 printf ("%s: CAN1 receive error 0x%02x\n",
753 __FUNCTION__
, (can1
->canrxfg
.dsr
[0]));
759 #endif /* CONFIG_BC3450_CAN */
762 * test - BC3450 HW test routines
764 int cmd_test(cmd_tbl_t
*cmdtp
, int flag
, int argc
, char *argv
[])
766 #ifdef CONFIG_BC3450_CAN
769 #endif /* CONFIG_BC3450_CAN */
774 printf ("Usage:%s\n", cmdtp
->help
);
778 if (strncmp (argv
[1], "unit-off", 8) == 0) {
779 printf ("waiting 2 seconds...\n");
781 *(vu_long
*) (SM501_MMIO_BASE
+ SM501_GPIO_DATA_HIGH
) &= ~PWR_OFF
;
784 #ifdef CONFIG_BC3450_CAN
785 else if (strncmp (argv
[1], "can", 2) == 0) {
786 rcode
= do_can (argv
);
787 if (simple_strtoul(argv
[2], NULL
, 10) == 2) {
795 #endif /* CONFIG_BC3450_CAN */
797 printf ("Usage:%s\n", cmdtp
->help
);
802 test
, 2, 1, cmd_test
,
803 "test - unit test routines\n",
805 #ifdef CONFIG_BC3450_CAN
807 " - connect CAN1 (X8) with CAN2 (X9) for this test\n"
808 #endif /* CONFIG_BC3450_CAN */
810 " - turns off the BC3450 unit\n"
811 " WARNING: Unsaved environment variables will be lost!\n"
813 #endif /* CFG_CMD_BSP */