All of lore.kernel.org
 help / color / mirror / Atom feed
From: 张忠山 <zzs213@126.com>
To: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
Cc: barebox <barebox@lists.infradead.org>
Subject: Re: [PATCH 4/4] Revert "mtd: atmel_nand: optimize read/write buffer functions"
Date: Mon, 26 Nov 2012 10:17:35 +0800	[thread overview]
Message-ID: <20121126021735.GC19824@greatfirst.com> (raw)
In-Reply-To: <20121125193208.GZ8327@game.jcrosoft.org>

In message <20121125193208.GZ8327@game.jcrosoft.org> Jean-Christophe PLAGNIOL-VILLARD wrote:
> On 16:11 Sun 25 Nov     , 张忠山 wrote:
> > > >
> > > > This patch resolves my problem
> > > I'm expecting to see your patches
> > >
> >
> > My first patch very simple:
> your board patch
>
The flowing is my board patch, sorry for some chinese comments.
But my board patch had nothing about drivers!

------------------------------------
diff --git a/Makefile b/Makefile
index 05b8be5..eedad07 100644
--- a/Makefile
+++ b/Makefile
@@ -681,10 +681,29 @@ endef
 quiet_cmd_objcopy = OBJCOPY $@
       cmd_objcopy = $(OBJCOPY) $(OBJCOPYFLAGS) $(OBJCOPYFLAGS_$(@F)) $< $@

+ifeq ($(CONFIG_GREATFIRST),y)
+MD5SUM_VARNAME=__md5sum__
+quiet_cmd_md5sum = MD5SUM $@
+      cmd_md5sum = (addr=$$($(NM) $(basename $@) | grep $(MD5SUM_VARNAME) | sed -e 's%\([0-9a-fA-F]\+\) \+.*%0x\1%'); \
+                    if [ "$$addr" = "" ]; then echo Can\'t find $(MD5SUM_VARNAME); exit 1; fi; \
+                    addr=$$(($$addr - $(TEXT_BASE))); \
+                    sum=$$(md5sum -b $@ | sed -e 's%\(.*\) \+\*$@%\1%') && \
+                    dd ibs=1 count=$$addr status=noxfer < $@ > $@.md5; \
+		    echo -n $$sum >> $@.md5; \
+		    addr=$$(($$addr + 32)); \
+		    dd ibs=1 skip=$$addr status=noxfer < $@ >> $@.md5; \
+		    mv $@.md5 $@; \
+                    echo -n $$sum > $@.md5 )
+else
+cmd_md5sum =
+endif
+
 OBJCOPYFLAGS_barebox.bin = -O binary

 barebox.bin: barebox FORCE
 	$(call if_changed,objcopy)
+	$(call cmd,md5sum)
+
 ifndef CONFIG_PBL_IMAGE
 	$(call cmd,check_file_size,$(CONFIG_BAREBOX_MAX_IMAGE_SIZE))
 endif
diff --git a/arch/arm/boards/greatfirst/com9200/Makefile b/arch/arm/boards/greatfirst/com9200/Makefile
new file mode 100644
index 0000000..eafb716
--- /dev/null
+++ b/arch/arm/boards/greatfirst/com9200/Makefile
@@ -0,0 +1,4 @@
+# EXTRA_CFLAGS += -DPROJECT_NAME="$(PROJECT_NAME)" -DPROJECT_VERSION="$(PROJECT_VERSION)"
+
+obj-$(CONFIG_MACH_SSR600T) += basic_init.o tiny_init.o
+obj-$(CONFIG_MACH_SSR600)  += basic_init.o init.o
diff --git a/arch/arm/boards/greatfirst/com9200/basic_init.c b/arch/arm/boards/greatfirst/com9200/basic_init.c
new file mode 100644
index 0000000..3b21b5f
--- /dev/null
+++ b/arch/arm/boards/greatfirst/com9200/basic_init.c
@@ -0,0 +1,55 @@
+#include <common.h>
+#include <net.h>
+#include <init.h>
+#include <environment.h>
+#include <asm/armlinux.h>
+#include <generated/mach-types.h>
+#include <partition.h>
+#include <fs.h>
+#include <fcntl.h>
+#include <io.h>
+#include <sizes.h>
+#include <asm/hardware.h>
+#include <mach/at91_pmc.h>
+#include <mach/board.h>
+#include <mach/gpio.h>
+#include <mach/io.h>
+
+
+static int mem_init(void)
+{
+	at91_add_device_sdram(64 * 1024 * 1024);
+
+	return 0;
+}
+mem_initcall(mem_init);
+
+static int console_init(void)
+{
+	at91_register_uart(0, 0);
+	return 0;
+}
+console_initcall(console_init);
+
+static struct at91_ether_platform_data ether_pdata = {
+	.flags = AT91SAM_ETHER_RMII,
+	.phy_addr = 0,
+};
+
+void init_eth_device(void)
+{
+	at91_add_device_eth(0, &ether_pdata);
+}
+
+/* 此数组名至少要被引用一次,nm 才能在文件 barebox 找到它 */
+const char __md5sum__[33] = {0};
+
+void init_ip(void)
+{
+	setenv("eth0.ipaddr", "192.168.0.13");
+	setenv("eth0.serverip", "192.168.0.12");
+
+	/* 保证引用 __md5sum__ */
+	printf("md5sum=%s\n", __md5sum__);
+}
+
diff --git a/arch/arm/boards/greatfirst/com9200/basic_init.h b/arch/arm/boards/greatfirst/com9200/basic_init.h
new file mode 100644
index 0000000..087f376
--- /dev/null
+++ b/arch/arm/boards/greatfirst/com9200/basic_init.h
@@ -0,0 +1,17 @@
+/* ---------------------------------------- HEADER GUARD ---------------------------------------- */
+#ifndef __BASIC_INIT__H__
+#define __BASIC_INIT__H__
+#ifdef __cplusplus
+extern "C" {
+#endif
+/* ---------------------------------------- HEADER GUARD ---------------------------------------- */
+
+void init_eth_device(void);
+void init_ip(void);
+
+/* ---------------------------------------- HEADER GUARD ---------------------------------------- */
+#ifdef __cplusplus
+}
+#endif
+#endif
+/* ---------------------------------------- HEADER GUARD ---------------------------------------- */
diff --git a/arch/arm/boards/greatfirst/com9200/config.h b/arch/arm/boards/greatfirst/com9200/config.h
new file mode 100644
index 0000000..bb66654
--- /dev/null
+++ b/arch/arm/boards/greatfirst/com9200/config.h
@@ -0,0 +1,71 @@
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+#define AT91_MAIN_CLOCK		18432000	/* 18.432 MHz crystal */
+
+#define MASTER_PLL_MUL		39
+#define MASTER_PLL_DIV		4
+
+/* clocks */
+#define CONFIG_SYS_MOR_VAL						\
+		(AT91_PMC_MOSCEN |					\
+		 (255 << 8))		/* Main Oscillator Start-up Time */
+#define CONFIG_SYS_PLLAR_VAL						\
+		(AT91_PMC_PLLA_WR_ERRATA | /* Bit 29 must be 1 when prog */ \
+		 (0x3e << 8) |		/* PLL Counter */		\
+		 (0 << 14) |		/* Divider A */			\
+		 ((MASTER_PLL_MUL - 1) << 16) | (MASTER_PLL_DIV))
+
+#define CONFIG_SYS_PLLBR_VAL	0x10483E0E /* 48.054857 MHz (divider by 2 for USB) */
+/* PCK/2 = MCK Master Clock from SLOW */
+#define	CONFIG_SYS_MCKR2_VAL1		\
+		(AT91_PMC_CSS_SLOW |	\
+		 AT91RM9200_PMC_MDIV_2) \
+
+/* PCK/3 = MCK Master Clock = 59.904000MHz from PLLA */
+#define	CONFIG_SYS_MCKR2_VAL2		\
+		(AT91_PMC_CSS_PLLA |	\
+		 AT91_PMC_PRES_1 |	\
+		 AT91RM9200_PMC_MDIV_3 |\
+		 AT91_PMC_PDIV_1)
+
+/* flash */
+#define CONFIG_SYS_EBI_CFGR_VAL	0x00000000
+#define CONFIG_SYS_SMC_CSR0_VAL							\
+		(AT91_SMC_NWS_(4) |	/* Number of Wait States */		\
+		 AT91_SMC_WSEN |	/* Wait State Enable */			\
+		 AT91_SMC_TDF_(2) |	/* Data Float Time */			\
+		 AT91_SMC_BAT |		/* Byte Access Type */			\
+		 AT91_SMC_DBW_16)	/* Data Bus Width */
+
+/* sdram */
+#define CONFIG_SYS_PIOC_ASR_VAL	0xFFFF0000 /* Configure PIOC as peripheral (D16/D31) */
+#define CONFIG_SYS_PIOC_BSR_VAL	0x00000000
+#define CONFIG_SYS_PIOC_PDR_VAL	0xFFFF0000
+#define CONFIG_SYS_EBI_CSA_VAL							\
+		(AT91_EBI_CS0A_SMC |						\
+		 AT91_EBI_CS1A_SDRAMC |						\
+		 AT91_EBI_CS3A_SMC |						\
+		 AT91_EBI_CS4A_SMC)						\
+
+/* SDRAM */
+/* SDRAMC_MR Mode register */
+/* SDRAMC_CR - Configuration register*/
+#define CONFIG_SYS_SDRC_CR_VAL							\
+		(AT91_SDRAMC_NC_9 |						\
+		 AT91_SDRAMC_NR_13 |						\
+		 AT91_SDRAMC_NB_4 |						\
+		 AT91_SDRAMC_CAS_2 |						\
+		 (1 <<  8) |		/* Write Recovery Delay */		\
+		 (12 << 12) |		/* Row Cycle Delay */			\
+		 (8 << 16) |		/* Row Precharge Delay */		\
+		 (8 << 20) |		/* Row to Column Delay */		\
+		 (1 << 24) |		/* Active to Precharge Delay */		\
+		 (2 << 28))		/* Exit Self Refresh to Active Delay */
+
+#define CONFIG_SYS_SDRC_TR_VAL	0x000002E0 /* Write refresh rate */
+
+#define BOARD_NOR_FLASH_SIZE SZ_8M
+#define TEMP_MEM_BASE 0x20100000
+#define TEMP_MEM_SIZE SZ_16M
+#endif	/* __CONFIG_H */
diff --git a/arch/arm/boards/greatfirst/com9200/env/bin/dlrun b/arch/arm/boards/greatfirst/com9200/env/bin/dlrun
new file mode 100644
index 0000000..ff6da4d
--- /dev/null
+++ b/arch/arm/boards/greatfirst/com9200/env/bin/dlrun
@@ -0,0 +1,14 @@
+#!/bin/sh
+
+if [ $# -ge 1 ]; then
+	name="$1"
+else
+	name=zbarebox.bin
+fi
+
+cd /
+if [ -e "/dev/tempmem" ]; then
+	tftp ${global.prj.name}-${global.prj.ver}/$name /dev/tempmem && go /dev/tempmem
+else
+	tftp ${global.prj.name}-${global.prj.ver}/$name && ./$name
+fi
diff --git a/arch/arm/boards/greatfirst/com9200/env/bin/init b/arch/arm/boards/greatfirst/com9200/env/bin/init
new file mode 100644
index 0000000..5086357
--- /dev/null
+++ b/arch/arm/boards/greatfirst/com9200/env/bin/init
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+export PATH=/env/bin
+
+# automount tftp server based on $eth0.serverip
+mkdir -p /mnt/tftp
+automount /mnt/tftp 'mount -t tftp $eth0.serverip /mnt/tftp'
+
+nor_parts="256k(barebox),128k(bareboxenv),3M(kernel),-(root)"
+if [ -e /dev/nor0 -a -n "$nor_parts" ]; then
+	addpart /dev/nor0 $nor_parts
+fi
+
+# set a fancy prompt (if support is compiled in)
+PS1="\e[1;31m[barebox@\h]:\w\e[0m\n# "
diff --git a/arch/arm/boards/greatfirst/com9200/env/bin/update b/arch/arm/boards/greatfirst/com9200/env/bin/update
new file mode 100644
index 0000000..29bb990
--- /dev/null
+++ b/arch/arm/boards/greatfirst/com9200/env/bin/update
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+cd /
+target="/dev/nor0.barebox"
+if [ ! -e $target ]; then
+	echo error update $target not exist!
+	exit 1
+else
+	erase $target && tftp ${global.prj.name}-${global.prj.ver}/zbarebox.bin $target && echo Update OK
+	exit 0
+fi
+echo Update Fail
+exit 1
diff --git a/arch/arm/boards/greatfirst/com9200/init.c b/arch/arm/boards/greatfirst/com9200/init.c
new file mode 100644
index 0000000..73107bf
--- /dev/null
+++ b/arch/arm/boards/greatfirst/com9200/init.c
@@ -0,0 +1,164 @@
+#include <common.h>
+#include <net.h>
+#include <init.h>
+#include <environment.h>
+#include <asm/armlinux.h>
+#include <generated/mach-types.h>
+#include <partition.h>
+#include <fs.h>
+#include <fcntl.h>
+#include <io.h>
+#include <sizes.h>
+#include <asm/hardware.h>
+#include <mach/at91_pmc.h>
+#include <mach/board.h>
+#include <mach/gpio.h>
+#include <mach/io.h>
+
+#include <globalvar.h>
+#include <linux/stringify.h>
+#include <mach/at91rm9200_mc.h>
+
+#include "basic_init.h"
+
+static void nor_hw_init(void)
+{
+	/* 如果 barebox 在 flash 中启动,这里的代码重复了
+	 * arch/arm/mach-at91/at91rm9200_lowlevel_init.c:reset() 中的工作,但是如果使用
+	 * boot.bin->boot-zbarebox.bin 引导话,因为这两个程序中没有初始化 flash(ncs0) 的代码,所以这
+	 * 里的代码就是必需的了
+	 */
+	/* EBI Chip Select Assignment Register
+	 * 将 cs0 置为静态存储器控制器
+	 */
+	at91_sys_write(AT91_EBI_CSA, (at91_sys_read(AT91_EBI_CSA) & ~AT91_EBI_CS0A) | AT91_EBI_CS0A_SMC);
+
+	/* EBI Configuration Register
+	 * 设置 D15..0 上拉电阻
+	 */
+	at91_sys_write(AT91_EBI_CFGR, CONFIG_SYS_EBI_CFGR_VAL);
+
+	/* SMC2_CSR[0]: 16bit, 2 TDF, 4 WS */
+	at91_sys_write(AT91_SMC_CSR(0), CONFIG_SYS_SMC_CSR0_VAL);
+}
+
+static void add_nor_device(void)
+{
+	nor_hw_init();
+
+	add_cfi_flash_device(0, AT91_CHIPSELECT_0, BOARD_NOR_FLASH_SIZE, 0);
+
+/* 	if (IS_ENABLED(CONFIG_DRIVER_CFI) && cdev_by_name("nor0")) {
+ * 		devfs_add_partition("nor0", 0x00000, 0x40000, DEVFS_PARTITION_FIXED, "self");
+ * 		devfs_add_partition("nor0", 0x40000, 0x20000, DEVFS_PARTITION_FIXED, "env0");
+ * 	}
+ */
+}
+
+#ifdef CONFIG_LED_GPIO
+struct gpio_led ek_leds[] = {
+	{
+		.gpio		= AT91_PIN_PC14,
+		.active_low	= 1,
+		.led = {
+			.name = "DS2-green",
+		},
+	}, {
+		.gpio		= AT91_PIN_PC15,
+		.active_low	= 1,
+		.led = {
+			.name = "DS3-yellow",
+		},
+	}, {
+		.gpio		= AT91_PIN_PC13,
+		.active_low	= 1,
+		.led = {
+			.name = "DS4-red",
+		},
+	}, {
+		.gpio		= AT91_PIN_PC12,
+		.active_low	= 1,
+		.led = {
+			.name = "DS5-yellow",
+		},
+	},
+};
+
+static void add_led_device(void)
+{
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(ek_leds); i++) {
+		at91_set_gpio_output(ek_leds[i].gpio, ek_leds[i].active_low);
+		led_gpio_register(&ek_leds[i]);
+	}
+	led_set_trigger(LED_TRIGGER_HEARTBEAT, &ek_leds[0].led);
+}
+#else
+static void add_led_device(void) {}
+#endif
+
+static struct atmel_nand_data nand_pdata = {
+	.ale		= 7,
+	.cle		= 6,
+/*	.det_pin	= ... not connected */
+	.rdy_pin	= AT91_PIN_PC2,
+	.enable_pin	= AT91_PIN_PC0,
+#if defined(CONFIG_MTD_NAND_ATMEL_BUSWIDTH_16)
+	.bus_width_16	= 1,
+#else
+	.bus_width_16	= 0,
+#endif
+	/* on flash bad block table */
+/* 	.on_flash_bbt	= 1,
+ */
+};
+
+static void add_nand_device(void)
+{
+	at91_add_device_nand(&nand_pdata);
+}
+
+
+static int devices_init(void)
+{
+	init_eth_device();
+
+	add_led_device();
+	add_nor_device();
+	add_nand_device();
+
+	armlinux_set_bootparams((void *)(AT91_CHIPSELECT_1 + 0x100));
+	armlinux_set_architecture(MACH_TYPE_SSR600);
+
+	return 0;
+}
+device_initcall(devices_init);
+
+static int my_init_env(void)
+{
+	globalvar_add_simple("prj.name");
+	globalvar_add_simple("prj.ver");
+	globalvar_add_simple("tmpmem.base");
+	globalvar_add_simple("tmpmem.size");
+	setenv("global.prj.name", __stringify(PROJECT_NAME));
+	setenv("global.prj.ver", __stringify(PROJECT_VERSION));
+	setenv("global.tmpmem.base", __stringify(TEMP_MEM_BASE));
+	setenv("global.tmpmem.size", __stringify(TEMP_MEM_SIZE));
+
+	/* 也可以在脚本中用 ``addpart -n /dev/mem 16M@0x20100000(tempmem)'' 添加此设备 */
+	add_mem_device("tempmem", TEMP_MEM_BASE, TEMP_MEM_SIZE, IORESOURCE_MEM_WRITEABLE);
+
+	return 0;
+}
+late_initcall(my_init_env);
+
+/* 注意: barebox 按照声明的逆序来调用同一段中的函数, 所以将其放在最后面 */
+static int late_init(void)
+{
+	init_ip();
+
+	return 0;
+}
+late_initcall(late_init);
+
diff --git a/arch/arm/boards/greatfirst/com9200/tiny_init.c b/arch/arm/boards/greatfirst/com9200/tiny_init.c
new file mode 100644
index 0000000..9cdc5d7
--- /dev/null
+++ b/arch/arm/boards/greatfirst/com9200/tiny_init.c
@@ -0,0 +1,50 @@
+#include <common.h>
+#include <net.h>
+#include <init.h>
+#include <environment.h>
+#include <asm/armlinux.h>
+#include <generated/mach-types.h>
+#include <partition.h>
+#include <fs.h>
+#include <fcntl.h>
+#include <io.h>
+#include <sizes.h>
+#include <asm/hardware.h>
+#include <mach/at91_pmc.h>
+#include <mach/board.h>
+#include <mach/gpio.h>
+#include <mach/io.h>
+
+#include <linux/stringify.h>
+#include "basic_init.h"
+
+static int devices_init(void)
+{
+	init_eth_device();
+
+	return 0;
+}
+device_initcall(devices_init);
+
+#define FILENAME "zbarebox.bin"
+#define RUNADDR "0x21000000"
+#define DL "tftp "__stringify(PROJECT_NAME)"-"__stringify(PROJECT_VERSION)"/"FILENAME
+#define CP "memcpy -s"FILENAME" 0 "RUNADDR
+#define RUN "go "RUNADDR
+/* 注意: barebox 按照声明的逆序来调用同一段中的函数 */
+static int late_init(void)
+{
+	int ret;
+
+	init_ip();
+
+	ret = run_command(DL, 0);
+	if(!ret)
+		ret = run_command(CP, 0);
+	if(!ret)
+		ret = run_command(RUN, 0);
+
+	return 0;
+}
+late_initcall(late_init);
+
diff --git a/arch/arm/pbl/Makefile b/arch/arm/pbl/Makefile
index 2999473..ff5e682 100644
--- a/arch/arm/pbl/Makefile
+++ b/arch/arm/pbl/Makefile
@@ -12,6 +12,9 @@ targets := zbarebox.lds zbarebox zbarebox.bin zbarebox.S \
 extra-y       += piggy.gzip piggy.lzo piggy.lzma piggy.xzkern zbarebox.map

 ifeq ($(CONFIG_GREATFIRST),y)
+quiet_cmd_addmd5sum = ADDMD5SUM $@
+      cmd_addmd5sum = ( cp $@ $@.bak; cat $(objtree)/barebox.bin.md5 >> $@ )
+
 CPFILENAME = $(TFTP_ROOT_DIR)/$(PROJECT_NAME)-$(PROJECT_VERSION)/$(if $(CONFIG_TINY),boot-)$(notdir $@)
 DEFCFGNAME = $(PROJECT_NAME)$(if $(CONFIG_TINY),t)$(if $(CONFIG_BOARD_CPU),-$(CONFIG_BOARD_CPU))_defconfig
 GFPOSTPROC = \
@@ -21,11 +24,13 @@ GFPOSTPROC = \
 	   echo "  FILE-SIZE: $$actual bytes" 1>&2
 else
 GFPOSTPROC  = :
+cmd_addmd5sum =
 endif

 $(obj)/zbarebox.bin:	$(obj)/zbarebox FORCE
 	$(call if_changed,objcopy)
 	$(call cmd,check_file_size,$(CONFIG_BAREBOX_MAX_IMAGE_SIZE))
+	$(call cmd,addmd5sum)
 	@$(GFPOSTPROC)
 	$(Q)$(kecho) '  Barebox: $@ is ready'
------------------------------------

-- 
Best Regards,
zzs



_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

  reply	other threads:[~2012-11-26  2:19 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-11-23 15:52 [PATCH 0/4] at91: some fixes Jean-Christophe PLAGNIOL-VILLARD
2012-11-23 15:55 ` [PATCH 1/4] at91: fix timer rate Jean-Christophe PLAGNIOL-VILLARD
2012-11-23 15:55   ` [PATCH 2/4] atmel_nand: fix pmecc timeout Jean-Christophe PLAGNIOL-VILLARD
2012-11-23 15:55   ` [PATCH 3/4] at91: clock: check overclock for sam9260/9261/9263/9rl Jean-Christophe PLAGNIOL-VILLARD
2012-11-23 15:55   ` [PATCH 4/4] Revert "mtd: atmel_nand: optimize read/write buffer functions" Jean-Christophe PLAGNIOL-VILLARD
2012-11-24  3:42     ` 张忠山
2012-11-24  8:45       ` Jean-Christophe PLAGNIOL-VILLARD
2012-11-25  8:11         ` 张忠山
2012-11-25 19:32           ` Jean-Christophe PLAGNIOL-VILLARD
2012-11-26  2:17             ` 张忠山 [this message]
2012-11-26  7:31 ` [PATCH 0/4] at91: some fixes Sascha Hauer

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20121126021735.GC19824@greatfirst.com \
    --to=zzs213@126.com \
    --cc=barebox@lists.infradead.org \
    --cc=plagnioj@jcrosoft.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.