diff mbox

[U-Boot,2/2] ORIGEN: Add MMC SPL support

Message ID 1309163861-2969-3-git-send-email-chander.kashyap@linaro.org
State Changes Requested
Delegated to: Minkyu Kang
Headers show

Commit Message

Chander Kashyap June 27, 2011, 8:37 a.m. UTC
Adds mmc boot support.

Signed-off-by: Chander Kashyap <chander.kashyap@linaro.org>
---
 mmc_spl/board/samsung/origen/Makefile             |  105 ++++++++++++++++
 mmc_spl/board/samsung/origen/mmc_boot.c           |   75 +++++++++++
 mmc_spl/board/samsung/origen/tools/mkv310_image.c |  139 +++++++++++++++++++++
 mmc_spl/board/samsung/origen/u-boot.lds           |   86 +++++++++++++
 4 files changed, 405 insertions(+), 0 deletions(-)
 create mode 100644 mmc_spl/board/samsung/origen/Makefile
 create mode 100644 mmc_spl/board/samsung/origen/mmc_boot.c
 create mode 100644 mmc_spl/board/samsung/origen/tools/mkv310_image.c
 create mode 100644 mmc_spl/board/samsung/origen/u-boot.lds

Comments

Minkyu Kang July 12, 2011, 6:07 a.m. UTC | #1
Dear Chander Kashyap ,

On 27 June 2011 17:37, Chander Kashyap <chander.kashyap@linaro.org> wrote:
> Adds mmc boot support.
>
> Signed-off-by: Chander Kashyap <chander.kashyap@linaro.org>
> ---
>  mmc_spl/board/samsung/origen/Makefile             |  105 ++++++++++++++++
>  mmc_spl/board/samsung/origen/mmc_boot.c           |   75 +++++++++++
>  mmc_spl/board/samsung/origen/tools/mkv310_image.c |  139 +++++++++++++++++++++
>  mmc_spl/board/samsung/origen/u-boot.lds           |   86 +++++++++++++
>  4 files changed, 405 insertions(+), 0 deletions(-)
>  create mode 100644 mmc_spl/board/samsung/origen/Makefile
>  create mode 100644 mmc_spl/board/samsung/origen/mmc_boot.c
>  create mode 100644 mmc_spl/board/samsung/origen/tools/mkv310_image.c
>  create mode 100644 mmc_spl/board/samsung/origen/u-boot.lds
>
> diff --git a/mmc_spl/board/samsung/origen/tools/mkv310_image.c b/mmc_spl/board/samsung/origen/tools/mkv310_image.c
> new file mode 100644
> index 0000000..51f16f2
> --- /dev/null
> +++ b/mmc_spl/board/samsung/origen/tools/mkv310_image.c
> @@ -0,0 +1,139 @@
> +/*
> + * Copyright (C) 2011 Samsung Electronics
> + *
> + * See file CREDITS for list of people who contributed to this
> + * project.
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License as
> + * published by the Free Software Foundation; either version 2 of
> + * the License, or (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
> + * MA 02111-1307 USA
> + */
> +
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <unistd.h>
> +#include <fcntl.h>
> +#include <errno.h>
> +#include <string.h>

please apply Dirk Behme's patch here.
http://patchwork.ozlabs.org/patch/104270/

> +
> +#define BUFSIZE                        (16*1024)
> +#define IMG_SIZE               (16*1024)
> +#define HEADER_SIZE            16
> +#define FILE_PERM              (S_IRUSR | S_IWUSR | S_IRGRP \
> +                               | S_IWGRP | S_IROTH | S_IWOTH)
> +/*
> +* Requirement:
> +* IROM code reads first 14K bytes from boot device.
> +* It then calculates the checksum of 14K-4 bytes and compare with data at
> +* 14K-4 offset.
> +*
> +* This function takes two filenames:
> +* IN  "u-boot-spl.bin" and
> +* OUT "u-boot-mmc-spl.bin" as filenames.
> +* It reads the "u-boot-spl.bin" in 16K buffer.
> +* It calculates checksum of 14K-4 Bytes and stores at 14K-4 offset in buffer.
> +* It writes the buffer to "u-boot-mmc-spl.bin" file.
> +*/
> +

Thanks
Minkyu Kang
Chander Kashyap July 12, 2011, 7:22 a.m. UTC | #2
On 12 July 2011 11:37, Minkyu Kang <promsoft@gmail.com> wrote:
> Dear Chander Kashyap ,
>
> On 27 June 2011 17:37, Chander Kashyap <chander.kashyap@linaro.org> wrote:
>> Adds mmc boot support.
>>
>> Signed-off-by: Chander Kashyap <chander.kashyap@linaro.org>
>> ---
>>  mmc_spl/board/samsung/origen/Makefile             |  105 ++++++++++++++++
>>  mmc_spl/board/samsung/origen/mmc_boot.c           |   75 +++++++++++
>>  mmc_spl/board/samsung/origen/tools/mkv310_image.c |  139 +++++++++++++++++++++
>>  mmc_spl/board/samsung/origen/u-boot.lds           |   86 +++++++++++++
>>  4 files changed, 405 insertions(+), 0 deletions(-)
>>  create mode 100644 mmc_spl/board/samsung/origen/Makefile
>>  create mode 100644 mmc_spl/board/samsung/origen/mmc_boot.c
>>  create mode 100644 mmc_spl/board/samsung/origen/tools/mkv310_image.c
>>  create mode 100644 mmc_spl/board/samsung/origen/u-boot.lds
>>
>> diff --git a/mmc_spl/board/samsung/origen/tools/mkv310_image.c b/mmc_spl/board/samsung/origen/tools/mkv310_image.c
>> new file mode 100644
>> index 0000000..51f16f2
>> --- /dev/null
>> +++ b/mmc_spl/board/samsung/origen/tools/mkv310_image.c
>> @@ -0,0 +1,139 @@
>> +/*
>> + * Copyright (C) 2011 Samsung Electronics
>> + *
>> + * See file CREDITS for list of people who contributed to this
>> + * project.
>> + *
>> + * This program is free software; you can redistribute it and/or
>> + * modify it under the terms of the GNU General Public License as
>> + * published by the Free Software Foundation; either version 2 of
>> + * the License, or (at your option) any later version.
>> + *
>> + * This program is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + * GNU General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU General Public License
>> + * along with this program; if not, write to the Free Software
>> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
>> + * MA 02111-1307 USA
>> + */
>> +
>> +#include <stdio.h>
>> +#include <stdlib.h>
>> +#include <unistd.h>
>> +#include <fcntl.h>
>> +#include <errno.h>
>> +#include <string.h>
>
> please apply Dirk Behme's patch here.
> http://patchwork.ozlabs.org/patch/104270/
done
>
>> +
>> +#define BUFSIZE                        (16*1024)
>> +#define IMG_SIZE               (16*1024)
>> +#define HEADER_SIZE            16
>> +#define FILE_PERM              (S_IRUSR | S_IWUSR | S_IRGRP \
>> +                               | S_IWGRP | S_IROTH | S_IWOTH)
>> +/*
>> +* Requirement:
>> +* IROM code reads first 14K bytes from boot device.
>> +* It then calculates the checksum of 14K-4 bytes and compare with data at
>> +* 14K-4 offset.
>> +*
>> +* This function takes two filenames:
>> +* IN  "u-boot-spl.bin" and
>> +* OUT "u-boot-mmc-spl.bin" as filenames.
>> +* It reads the "u-boot-spl.bin" in 16K buffer.
>> +* It calculates checksum of 14K-4 Bytes and stores at 14K-4 offset in buffer.
>> +* It writes the buffer to "u-boot-mmc-spl.bin" file.
>> +*/
>> +
>
> Thanks
> Minkyu Kang
> --
> from. prom.
> www.promsoft.net
>
diff mbox

Patch

diff --git a/mmc_spl/board/samsung/origen/Makefile b/mmc_spl/board/samsung/origen/Makefile
new file mode 100644
index 0000000..7b62684
--- /dev/null
+++ b/mmc_spl/board/samsung/origen/Makefile
@@ -0,0 +1,105 @@ 
+#
+# (C) Copyright 2006-2007
+# Stefan Roese, DENX Software Engineering, sr@denx.de.
+#
+# (C) Copyright 2008
+# Guennadi Liakhovetki, DENX Software Engineering, <lg@denx.de>
+#
+# (C) Copyright 2011
+# Chander Kashyap, Samsung Electronics, <k.chander@samsung.com>
+#
+# See file CREDITS for list of people who contributed to this
+# project.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+# MA 02111-1307 USA
+#
+
+CONFIG_MMC_SPL	= y
+
+include $(TOPDIR)/config.mk
+
+LDSCRIPT= $(TOPDIR)/mmc_spl/board/$(BOARDDIR)/u-boot.lds
+LDFLAGS	= -Bstatic -T $(mmcobj)u-boot.lds -Ttext $(CONFIG_SYS_TEXT_BASE) $(PLATFORM_LDFLAGS)
+AFLAGS	+= -DCONFIG_MMC_SPL
+CFLAGS	+= -DCONFIG_MMC_SPL
+CFLAGS	+= -DCONFIG_PRELOADER
+
+SOBJS	= start.o mem_setup.o lowlevel_init.o
+COBJS	= mmc_boot.o
+
+SRCS	:= $(SOBJS:.o=.S) $(COBJS:.o=.c)
+OBJS	:= $(addprefix $(obj),$(SOBJS) $(COBJS))
+__OBJS	:= $(SOBJS) $(COBJS)
+LNDIR	:= $(OBJTREE)/mmc_spl/board/$(BOARDDIR)
+
+mmcobj	:= $(OBJTREE)/mmc_spl/
+
+
+MKV310_MMC_SPL_EXEC = mkv310_mmc_spl_exec
+MMC_SPL_BIN = u-boot-mmc-spl.bin
+
+ALL = $(mmcobj)u-boot-spl $(mmcobj)u-boot-spl.bin $(mmcobj)$(MMC_SPL_BIN)
+
+all:    $(obj).depend $(ALL)
+
+$(mmcobj)$(MMC_SPL_BIN):  $(mmcobj)u-boot-spl.bin tools/$(MKV310_MMC_SPL_EXEC)
+	./tools/$(MKV310_MMC_SPL_EXEC) $(mmcobj)u-boot-spl.bin $(mmcobj)$(MMC_SPL_BIN)
+	rm -f tools/$(MKV310_MMC_SPL_EXEC)
+
+tools/$(MKV310_MMC_SPL_EXEC): tools/mkv310_image.c
+	$(HOSTCC) tools/mkv310_image.c -o tools/$(MKV310_MMC_SPL_EXEC)
+
+$(mmcobj)u-boot-spl.bin:	$(mmcobj)u-boot-spl
+	$(OBJCOPY) ${OBJCFLAGS} -O binary $< $@
+
+$(mmcobj)u-boot-spl:	$(OBJS) $(mmcobj)u-boot.lds
+	cd $(LNDIR) && $(LD) $(LDFLAGS) $(__OBJS) \
+		-Map $(mmcobj)u-boot-spl.map \
+		-o $(mmcobj)u-boot-spl
+
+$(mmcobj)u-boot.lds: $(LDSCRIPT)
+	$(CPP) $(CPPFLAGS) $(LDPPFLAGS) -ansi -D__ASSEMBLY__ -P - <$^ >$@
+
+# create symbolic links for common files
+
+# from cpu directory
+start.S:
+	@rm -f $@
+	@ln -s $(TOPDIR)/arch/arm/cpu/armv7/start.S $@
+
+# from board directory
+mem_setup.S:
+	@rm -f $@
+	@ln -s $(TOPDIR)/board/samsung/origen/mem_setup.S $@
+
+lowlevel_init.S:
+	@rm -f $@
+	@ln -s $(TOPDIR)/board/samsung/origen/lowlevel_init.S $@
+
+#########################################################################
+
+$(obj)%.o:	%.S
+	$(CC) $(AFLAGS) -c -o $@ $<
+
+$(obj)%.o:	%.c
+	$(CC) $(CFLAGS) -c -o $@ $<
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+#########################################################################
diff --git a/mmc_spl/board/samsung/origen/mmc_boot.c b/mmc_spl/board/samsung/origen/mmc_boot.c
new file mode 100644
index 0000000..459d27d
--- /dev/null
+++ b/mmc_spl/board/samsung/origen/mmc_boot.c
@@ -0,0 +1,75 @@ 
+/*
+ * Copyright (C) 2011 Samsung Electronics
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include<common.h>
+#include<config.h>
+
+typedef u32(*copy_sd_mmc_to_mem) \
+	(u32 start_block, u32 block_count, u32 *dest_addr);
+
+
+void copy_uboot_to_ram(void)
+{
+#ifdef CONFIG_EVT1
+	copy_sd_mmc_to_mem copy_bl2 = (copy_sd_mmc_to_mem)*(u32 *)(0x02020030);
+#else
+	copy_sd_mmc_to_mem copy_bl2 = (copy_sd_mmc_to_mem)(0x00002488);
+#endif
+	copy_bl2(BL2_START_OFFSET,\
+		BL2_SIZE_BLOC_COUNT, (u32 *)CONFIG_SYS_TEXT_BASE);
+}
+
+void board_init_f(unsigned long bootflag)
+{
+	__attribute__((noreturn)) void (*uboot)(void);
+	copy_uboot_to_ram();
+
+	/* Jump to U-Boot image */
+	uboot = (void *)CONFIG_SYS_TEXT_BASE;
+	(*uboot)();
+	/* Never returns Here */
+}
+
+/* Place Holders */
+void board_init_r(gd_t *id, ulong dest_addr)
+{
+	/* Function attribute is no-return */
+	/* This Function never executes */
+	while (1)
+		;
+}
+
+void do_undefined_instruction(struct pt_regs *pt_regs) {}
+
+void do_software_interrupt(struct pt_regs *pt_regs) {}
+
+void do_prefetch_abort(struct pt_regs *pt_regs) {}
+
+void do_data_abort(struct pt_regs *pt_regs) {}
+
+void do_not_used(struct pt_regs *pt_regs) {}
+
+void do_fiq(struct pt_regs *pt_regs) {}
+
+#ifndef CONFIG_USE_IRQ
+void do_irq(struct pt_regs *pt_regs) {}
+#endif
diff --git a/mmc_spl/board/samsung/origen/tools/mkv310_image.c b/mmc_spl/board/samsung/origen/tools/mkv310_image.c
new file mode 100644
index 0000000..51f16f2
--- /dev/null
+++ b/mmc_spl/board/samsung/origen/tools/mkv310_image.c
@@ -0,0 +1,139 @@ 
+/*
+ * Copyright (C) 2011 Samsung Electronics
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <string.h>
+
+#define BUFSIZE			(16*1024)
+#define IMG_SIZE		(16*1024)
+#define HEADER_SIZE		16
+#define FILE_PERM		(S_IRUSR | S_IWUSR | S_IRGRP \
+				| S_IWGRP | S_IROTH | S_IWOTH)
+/*
+* Requirement:
+* IROM code reads first 14K bytes from boot device.
+* It then calculates the checksum of 14K-4 bytes and compare with data at
+* 14K-4 offset.
+*
+* This function takes two filenames:
+* IN  "u-boot-spl.bin" and
+* OUT "u-boot-mmc-spl.bin" as filenames.
+* It reads the "u-boot-spl.bin" in 16K buffer.
+* It calculates checksum of 14K-4 Bytes and stores at 14K-4 offset in buffer.
+* It writes the buffer to "u-boot-mmc-spl.bin" file.
+*/
+
+int main(int argc, char **argv)
+{
+	int i, len;
+	unsigned char buffer[BUFSIZE] = {0};
+	int ifd, ofd;
+	unsigned int checksum = 0, count;
+
+	if (argc != 3) {
+		printf(" %d Wrong number of arguments\n", argc);
+		exit(EXIT_FAILURE);
+	}
+
+	ifd = open(argv[1], O_RDONLY);
+	if (ifd < 0) {
+		fprintf(stderr, "%s: Can't open %s: %s\n",
+			argv[0], argv[1], strerror(errno));
+		exit(EXIT_FAILURE);
+	}
+
+	ofd = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, FILE_PERM);
+	if (ifd < 0) {
+		fprintf(stderr, "%s: Can't open %s: %s\n",
+			argv[0], argv[2], strerror(errno));
+		if (ifd)
+			close(ifd);
+		exit(EXIT_FAILURE);
+	}
+
+	len = lseek(ifd, 0, SEEK_END);
+	lseek(ifd, 0, SEEK_SET);
+
+	count = (len < (IMG_SIZE - HEADER_SIZE))
+		? len : (IMG_SIZE - HEADER_SIZE);
+
+	if (read(ifd, buffer + HEADER_SIZE, count) != count) {
+		fprintf(stderr, "%s: Can't read %s: %s\n",
+			argv[0], argv[1], strerror(errno));
+
+		if (ifd)
+			close(ifd);
+		if (ofd)
+			close(ofd);
+
+		exit(EXIT_FAILURE);
+	}
+
+	for (i = 0; i < IMG_SIZE - HEADER_SIZE; i++)
+		checksum += buffer[i+16];
+
+	*(ulong *)buffer = 0x1f;
+	*(ulong *)(buffer+4) = checksum;
+
+	buffer[0] ^= 0x53;
+	buffer[1] ^= 0x35;
+	buffer[2] ^= 0x50;
+	buffer[3] ^= 0x43;
+	buffer[4] ^= 0x32;
+	buffer[5] ^= 0x31;
+	buffer[6] ^= 0x30;
+	buffer[7] ^= 0x20;
+	buffer[8] ^= 0x48;
+	buffer[9] ^= 0x45;
+	buffer[10] ^= 0x41;
+	buffer[11] ^= 0x44;
+	buffer[12] ^= 0x45;
+	buffer[13] ^= 0x52;
+	buffer[14] ^= 0x20;
+	buffer[15] ^= 0x20;
+
+	for (i = 1; i < HEADER_SIZE; i++)
+		buffer[i] ^= buffer[i-1];
+
+	if (write(ofd, buffer, BUFSIZE) != BUFSIZE) {
+		fprintf(stderr, "%s: Can't write %s: %s\n",
+			argv[0], argv[2], strerror(errno));
+
+		if (ifd)
+			close(ifd);
+		if (ofd)
+			close(ofd);
+
+		exit(EXIT_FAILURE);
+	}
+
+	if (ifd)
+		close(ifd);
+	if (ofd)
+		close(ofd);
+
+	return EXIT_SUCCESS;
+}
diff --git a/mmc_spl/board/samsung/origen/u-boot.lds b/mmc_spl/board/samsung/origen/u-boot.lds
new file mode 100644
index 0000000..61cd16a
--- /dev/null
+++ b/mmc_spl/board/samsung/origen/u-boot.lds
@@ -0,0 +1,86 @@ 
+/*
+ * (C) Copyright 2011
+ * Chander Kashyap, Samsung Electronics, <k.chander@samsung.com>
+ *
+ * January 2004 - Changed to support H4 device
+ * Copyright (c) 2004-2008 Texas Instruments
+ *
+ * (C) Copyright 2002
+ * Gary Jennejohn, DENX Software Engineering, <garyj@denx.de>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
+OUTPUT_ARCH(arm)
+ENTRY(_start)
+SECTIONS
+{
+	. = 0x00000000;
+
+	. = ALIGN(4);
+	.text	:
+	{
+		start.o	(.text)
+		*(.text)
+	}
+
+	. = ALIGN(4);
+	.rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }
+
+	. = ALIGN(4);
+	.data : {
+		*(.data)
+	}
+
+	. = ALIGN(4);
+
+	. = .;
+	__u_boot_cmd_start = .;
+	.u_boot_cmd : { *(.u_boot_cmd) }
+	__u_boot_cmd_end = .;
+
+	. = ALIGN(4);
+
+	.rel.dyn : {
+		__rel_dyn_start = .;
+		*(.rel*)
+		__rel_dyn_end = .;
+	}
+
+	.dynsym : {
+		__dynsym_start = .;
+		*(.dynsym)
+	}
+
+	_end = .;
+
+	.bss __rel_dyn_start (OVERLAY) : {
+		__bss_start = .;
+		*(.bss)
+		 . = ALIGN(4);
+		__bss_end__ = .;
+	}
+
+	/DISCARD/ : { *(.dynstr*) }
+	/DISCARD/ : { *(.dynamic*) }
+	/DISCARD/ : { *(.plt*) }
+	/DISCARD/ : { *(.interp*) }
+	/DISCARD/ : { *(.gnu*) }
+}