
On 22:03 Tue 30 Jun , Darius Augulis wrote:
This board is based on Cortina Systems networking processor CS3516. It has FA526 core, which is ARMv4 compatible. Many SoC specific definitions may be used for similar processors CS3512 and dual-core CS3518. This processor family has Gemini name.
do you boot linux?
Signed-off-by: Darius Augulis augulis.darius@gmail.com
MAINTAINERS | 4 + MAKEALL | 1 Makefile | 3 board/nas4220/Makefile | 43 +++++ board/nas4220/config.mk | 14 ++ board/nas4220/lowlevel_init.S | 96 ++++++++++++ board/nas4220/nas4220.c | 75 +++++++++ board/nas4220/u-boot.lds | 48 ++++++ cpu/arm920t/gemini/Makefile | 38 +++++ cpu/arm920t/gemini/timer.c | 93 ++++++++++++ cpu/arm920t/start.S | 11 + include/asm-arm/arch-gemini/gemini.h | 271 ++++++++++++++++++++++++++++++++++ include/configs/nas4220.h | 116 +++++++++++++++ 13 files changed, 811 insertions(+), 2 deletions(-) create mode 100644 board/nas4220/Makefile create mode 100644 board/nas4220/config.mk create mode 100644 board/nas4220/lowlevel_init.S create mode 100644 board/nas4220/nas4220.c create mode 100644 board/nas4220/u-boot.lds create mode 100644 cpu/arm920t/gemini/Makefile create mode 100644 cpu/arm920t/gemini/timer.c create mode 100644 include/asm-arm/arch-gemini/gemini.h create mode 100644 include/configs/nas4220.h
diff --git a/MAINTAINERS b/MAINTAINERS index 9379c7e..ade43ed 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -671,6 +671,10 @@ Sergey Lapin slapin@ossfans.org
afeb9260 ARM926EJS (AT91SAM9260 SoC)
+Darius Augulis augulis.darius@gmail.com
- nas4220 CS3516
<snip>
diff --git a/board/nas4220/config.mk b/board/nas4220/config.mk new file mode 100644 index 0000000..5b418ba --- /dev/null +++ b/board/nas4220/config.mk @@ -0,0 +1,14 @@ +# +# (c) Copyright 2009 +# Linkodas, Inc. +# http://www.linkodas.com +# +# Author: Darius Augulis daugulis@linkodas.com augulis.darius@gmail.com +# +# 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.
+TEXT_BASE = 0x10400000 +LDSCRIPT := $(SRCTREE)/board/$(BOARDDIR)/u-boot.lds diff --git a/board/nas4220/lowlevel_init.S b/board/nas4220/lowlevel_init.S new file mode 100644 index 0000000..d51a5a2 --- /dev/null +++ b/board/nas4220/lowlevel_init.S @@ -0,0 +1,96 @@ +/*
- (c) Copyright 2009
- Linkodas, Inc.
- Author: Darius Augulis daugulis@linkodas.com augulis.darius@gmail.com
- 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.
- */
+#include <config.h> +#include <version.h> +#include <asm/arch/gemini.h>
+#define DRAM_SET_MODE GEMINI_SET_MODE | GEMINI_MODE_DDRAM | \
GEMINI_CAS_3 | GEMINI_BL_4
+#define DRAM_SET_TYPE GEMINI_BUS_32b | GEMINI_RAM_15x10_16x10
+#define DRAM_IOCAP GEMINI_IOCAP_DRAM_CLOCK | GEMINI_IOCAP_DRAM_DATA | \
GEMINI_IOCAP_DRAM_CTRL
+#define DRAM_TIMING GEMINI_RRATE_AREF8 | GEMINI_RTIMER(195) | \
GEMINI_TRFC(11) | GEMINI_TRAS(6) | GEMINI_TWR(3) | \
GEMINI_TRP(3) | GEMINI_TRCD(3) | GEMINI_TCAS(3)
+#define DRAM_READ_DLL GEMINI_RDLL_BYTE3(8) | GEMINI_RDLL_BYTE2(8) | \
GEMINI_RDLL_BYTE1(8) | GEMINI_RDLL_BYTE0(8)
+#define DRAM_WRITE_DLL GEMINI_WDLL(26) +#define DRAM_MEM_CTRL GEMINI_TRAINING_MODE | GEMINI_DQS_N_FALLING | \
GEMINI_BUF_IN_4rd | (1 << 6)
please move this to config header and add CONFIG_SYS_ in the name
+.globl lowlevel_init +lowlevel_init:
- /* DRAM init */
- ldr r0, =GEMINI_DRAM_TYPE /* DRAM set type */
- ldr r1, =DRAM_SET_TYPE /* 32bit, 64 Mbytes total */
- str r1, [r0]
please use write32
- ldr r0, =GEMINI_DRAM_MODE /* DRAM set mode */
- ldr r1, =DRAM_SET_MODE /* DDRAM, CAS 3, Burst 4 */
- str r1, [r0]
ditto etc...
- ldr r3, =GEMINI_GLOBAL_ID /* Global ID reg */
- ldr r4, [r3]
- ldr r5, =0xFF /* Chip revision mask */
- and r4, r4, r5
please create a function for this and call it
- cmp r4, #0xc0 /* Test if chip rev. is 'c0' */
- bne end_prefetch
- /* Fix for rev. 'c0' chip */
- ldr r0, =GEMINI_DRAM_AHB_CTRL /* AHB control */
- ldr r5, =GEMINI_WRITE_FLUSH_READ
- str r5, [r0]
<snip>
- ldr r2, =GEMINI_DRAM_BASE
- mov r4, #0xa0
+read_loop:
- ldr r3, [r2] /* Read data */
- subs r4, r4, #1 /* Decrement loop count */
- bge read_loop
- bic r1, r1, #GEMINI_TRAINING_MODE /* Disable train mode */
what is train mode?
- str r1, [r0]
- mov pc, lr
diff --git a/board/nas4220/nas4220.c b/board/nas4220/nas4220.c new file mode 100644 index 0000000..784a249 --- /dev/null +++ b/board/nas4220/nas4220.c @@ -0,0 +1,75 @@ +/*
- (c) Copyright 2009
- Linkodas, Inc.
- Author: Darius Augulis daugulis@linkodas.com augulis.darius@gmail.com
- 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.
- */
+#include <common.h> +#include <asm/arch/gemini.h>
+DECLARE_GLOBAL_DATA_PTR;
+#define UART_PINS (GEMINI_PIN_UART_RX | GEMINI_PIN_UART_TX) +#define MISC_CTRL (GEMINI_PAD_SFLASH_DIS | GEMINI_PAD_NAND_DIS)
+int board_init(void) +{
- /* Bypass UART pins */
- GEMINI_GPIO_BYPASS(0) |= UART_PINS;
- /* Enable: parallel flash pins, disable: serial, nand pins */
- GEMINI_GLOBAL_MISC = MISC_CTRL;
- /* Enable parallel flash direct write mode */
- GEMINI_FLASH_PAR_ACCESS |= GEMINI_PFLASH_DWR;
please use proper acess : writex
please create an api such as at91, davinci and other to manage this kind of config
- return 0;
+}
+int board_late_init(void) +{
- int cpu_id, cpu_rev, cpu_clk, ahb_clk;
- cpu_id = GEMINI_CHIP_ID;
- cpu_rev = GEMINI_CHIP_REV;
- ahb_clk = GEMINI_AHB_CLK;
- switch (GEMINI_CPU_AHB_RATIO) {
- case 0:
cpu_clk = ahb_clk;
break;
- case 1:
cpu_clk = (ahb_clk * 3) / 2;
break;
- case 2:
cpu_clk = (ahb_clk * 24) / 13;
break;
- case 3:
cpu_clk = ahb_clk * 2;
break;
- default:
cpu_clk = 0;
break;
- }
please create a clk api such as at91 please take a look on cpu/arm926ejs/at91/clock.c include/asm-arm/arch-at91/clk.h
- printf("\nRaidsonic ICYBOX NAS4220 board\n");
- printf("CPU: Gemini CS%X, REV: %X\n", cpu_id, cpu_rev);
- printf("CPU Speed: %d MHz, AHB Speed: %d MHz, APB Speed: %d MHz\n\n", cpu_clk / 1000000, ahb_clk / 1000000, ahb_clk / 6000000);
please implement print_cpuinfo and checkboard and for clock string conversion please use strmhz
- return 0;
+}
+int dram_init(void) +{
- gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
- gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE;
- return 0;
+} diff --git a/board/nas4220/u-boot.lds b/board/nas4220/u-boot.lds new file mode 100644 index 0000000..7d249c3 --- /dev/null +++ b/board/nas4220/u-boot.lds
I do not understand why you need a specific lds?
@@ -0,0 +1,48 @@ +/*
- (c) Copyright 2009
- Linkodas, Inc.
- Author: Darius Augulis daugulis@linkodas.com augulis.darius@gmail.com
- 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.
- */
+OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") +OUTPUT_ARCH(arm) +ENTRY(_start) +SECTIONS +{
- . = 0x00000000;
- . = ALIGN(4);
- .text :
- {
cpu/arm920t/start.o (.text)
board/nas4220/libnas4220.a (.text)
lib_arm/libarm.a (.text)
*(.text)
- }
- . = ALIGN(4);
- .rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }
- . = ALIGN(4);
- .data : { *(.data) }
- . = ALIGN(4);
- .got : { *(.got) }
- . = .;
- __u_boot_cmd_start = .;
- .u_boot_cmd : { *(.u_boot_cmd) }
- __u_boot_cmd_end = .;
- . = ALIGN(4);
- __bss_start = .;
- .bss : { *(.bss) . = ALIGN(4); }
- _end = .;
+}
<snip>
+++ b/cpu/arm920t/gemini/timer.c @@ -0,0 +1,93 @@ +/*
- (c) Copyright 2009
- Linkodas, Inc.
- Author: Darius Augulis daugulis@linkodas.com augulis.darius@gmail.com
- 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.
- */
+#include <common.h>
+#ifdef CONFIG_GEMINI
no need please remove
+#include <asm/arch/gemini.h>
+static ulong gemini_usec; +static ulong timestamp; +static ulong extraticks;
+int timer_init(void) +{
- gemini_usec = GEMINI_APB_CLK / 1000000;
please clk framework as at91
- timestamp = extraticks = 0;
- GEMINI_TIMER_COUNT(0) = 0;
please use proprer accessor : writex/readx etc...
- GEMINI_TIMER_LOAD(0) = 0;
- GEMINI_TIMER_CR = TIMER_CR_UP(0) | TIMER_CR_ENABLE(0);
- return 0;
+}
+void reset_timer(void) +{
- GEMINI_TIMER_CR &= ~TIMER_CR_ENABLE(0);
- GEMINI_TIMER_COUNT(0) = 0x0;
- GEMINI_TIMER_LOAD(0) = 0x0;
- GEMINI_TIMER_CR = TIMER_CR_UP(0) | TIMER_CR_ENABLE(0);
- timestamp = extraticks = 0;
+}
+unsigned long long get_usecs(void) +{
- ulong timenow = GEMINI_TIMER_COUNT(0);
- if (timenow >= timestamp)
timestamp += timenow - extraticks;
- else
timestamp += 0xFFFFFFFF - extraticks + timenow;
- extraticks = timenow;
- return timestamp / gemini_usec;
+}
+ulong get_timer(ulong base) +{
- return (get_usecs() / 1000) - base;
+}
+void set_timer(ulong t) +{ +}
+void udelay(unsigned long usec) +{
- signed long elapsed;
- ulong timestart = get_usecs();
- do {
ulong timenow = get_usecs();
elapsed = timenow - timestart;
- } while (elapsed < usec);
+}
+ulong get_tbclk(void) +{
- ulong tbclk;
- tbclk = CONFIG_SYS_HZ;
- return tbclk;
please retunr CONFIG_SYS_HZ directly
+}
+void reset_cpu(ulong ignored) +{
- GEMINI_GLOBAL_RESET = GEMINI_SOFT_RESET | GEMINI_CPU1_RESET;
+}
please move in reset.c or cpu.c
+#endif /* defined (CONFIG_GEMINI) */ diff --git a/cpu/arm920t/start.S b/cpu/arm920t/start.S index 475cdaf..761753e 100644 --- a/cpu/arm920t/start.S +++ b/cpu/arm920t/start.S @@ -115,8 +115,10 @@ start_code: orr r0,r0,#0xd3 msr cpsr,r0
- bl coloured_LED_init
- bl red_LED_on
+#ifndef CONFIG_GEMINI
- bl coloured_LED_init
- bl red_LED_on
+#endif
no need please remove
#if defined(CONFIG_AT91RM9200DK) || defined(CONFIG_AT91RM9200EK) /* @@ -189,6 +191,11 @@ relocate: /* relocate U-Boot to RAM */ sub r2, r3, r2 /* r2 <- size of armboot */ add r2, r0, r2 /* r2 <- source end address */
+#ifdef CONFIG_GEMINI
- orr r0, r0, #CONFIG_SYS_FLASH_BASE
- orr r2, r2, #CONFIG_SYS_FLASH_BASE
+#endif
why? and NACK the start.S MUST be generic I'll rework the RM9200 code for this too
copy_loop: ldmia r0!, {r3-r10} /* copy from source address [r0] */ stmia r1!, {r3-r10} /* copy to target address [r1] */ diff --git a/include/asm-arm/arch-gemini/gemini.h b/include/asm-arm/arch-gemini/gemini.h new file mode 100644 index 0000000..e4fa91a --- /dev/null +++ b/include/asm-arm/arch-gemini/gemini.h @@ -0,0 +1,271 @@ +/*
- (c) Copyright 2009
- Linkodas, Inc.
- Author: Darius Augulis daugulis@linkodas.com augulis.darius@gmail.com
- 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.
- */
+#ifndef __ASSEMBLY__ +# define REG8(x) (*(volatile u8 *)(x)) +# define REG16(x) (*(volatile u16 *)(x)) +# define REG32(x) (*(volatile u32 *)(x)) +#else +# define REG8(x) (x) +# define REG16(x) (x) +# define REG32(x) (x)
NACK please use propoer accessor and please split this file by functionnality such as usb, timer etc... and keep it here only global information
diff --git a/include/configs/nas4220.h b/include/configs/nas4220.h new file mode 100644 index 0000000..7f089c6 --- /dev/null +++ b/include/configs/nas4220.h @@ -0,0 +1,116 @@ +/*
- (c) Copyright 2009
- Linkodas, Inc.
- Author: Darius Augulis daugulis@linkodas.com augulis.darius@gmail.com
- 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 is U-boot configuration for Raidsonic ICYBOX NAS4220 board.
- More information about this device is available on websites:
- */
+#ifndef __CONFIG_H +#define __CONFIG_H
+#include <asm/arch/gemini.h> +#include <asm-arm/sizes.h>
+/* High Level Configuration Options */ +#define CONFIG_ARM920T 1 +#define CONFIG_GEMINI 1 +#define CONFIG_NAS4220 1 +#undef CONFIG_USE_IRQ
+/* NS16550 Configuration */ +#define CONFIG_SYS_NS16550 1 +#define CONFIG_SYS_NS16550_SERIAL 1 +#define CONFIG_SYS_NS16550_REG_SIZE (-4) +#define CONFIG_SYS_NS16550_CLK GEMINI_UART_CLK +#define CONFIG_SYS_NS16550_COM1 GEMINI_UART_BASE +#define CONFIG_CONS_INDEX 1
+/* Select serial console configuration */ +#define CONFIG_BAUDRATE 115200 +#define CONFIG_SYS_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200 }
please include config_cmd_default
+/* Command line configuration */ +#define CONFIG_CMD_BDI /* bdinfo */ +#define CONFIG_CMD_BOOTD /* bootd */ +#define CONFIG_CMD_CONSOLE /* coninfo */ +#define CONFIG_CMD_ECHO /* echo arguments */ +#define CONFIG_CMD_SAVEENV /* saveenv */ +#define CONFIG_CMD_FLASH /* flinfo, erase, protect */ +#define CONFIG_CMD_IMLS /* List all found images */ +#define CONFIG_CMD_ITEST /* Integer (and string) test */ +#define CONFIG_CMD_LOADB /* loadb */ +#define CONFIG_CMD_LOADS /* loads */ +#define CONFIG_CMD_MEMORY /* md mm nm mw cp cmp crc base loop mtest */ +#define CONFIG_CMD_MISC /* Misc functions like sleep etc */ +#define CONFIG_CMD_RUN /* run command in env variable */ +#define CONFIG_CMD_SOURCE /* "source" command support */ +#define CONFIG_CMD_XIMG /* Load part of Multi Image */
Best Regards, J.