mirror of
git://projects.qi-hardware.com/openwrt-xburst.git
synced 2025-04-21 12:27:27 +03:00
[boot] move boot related packages to their own folder
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@33781 3c298f89-4303-0410-b956-a3cf2f4a3e73
This commit is contained in:
45
package/boot/fconfig/Makefile
Normal file
45
package/boot/fconfig/Makefile
Normal file
@@ -0,0 +1,45 @@
|
||||
#
|
||||
# Copyright (C) 2006-2008 OpenWrt.org
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=fconfig
|
||||
PKG_VERSION:=20080329
|
||||
PKG_RELEASE:=1
|
||||
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
||||
PKG_SOURCE_URL:=http://andrzejekiert.ovh.org/software/fconfig/
|
||||
PKG_MD5SUM:=dac355e9f2a0f48c414c52e2034b6346
|
||||
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define Package/fconfig
|
||||
SECTION:=utils
|
||||
CATEGORY:=Utilities
|
||||
TITLE:=RedBoot configuration editor
|
||||
URL:=http://andrzejekiert.ovh.org/software.html.en
|
||||
endef
|
||||
|
||||
define Package/fconfig/description
|
||||
displays and (if writable) also edits the RedBoot configuration.
|
||||
endef
|
||||
|
||||
define Build/Configure
|
||||
endef
|
||||
|
||||
define Build/Compile
|
||||
$(call Build/Compile/Default)
|
||||
endef
|
||||
|
||||
define Package/fconfig/install
|
||||
$(INSTALL_DIR) $(1)/usr/sbin
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/fconfig $(1)/usr/sbin/
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,fconfig))
|
||||
51
package/boot/grub2/Makefile
Normal file
51
package/boot/grub2/Makefile
Normal file
@@ -0,0 +1,51 @@
|
||||
#
|
||||
# Copyright (C) 2006-2010 OpenWrt.org
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
include $(INCLUDE_DIR)/kernel.mk
|
||||
|
||||
PKG_NAME:=grub
|
||||
PKG_VERSION:=2.00
|
||||
PKG_RELEASE:=1
|
||||
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
||||
PKG_SOURCE_URL:=@GNU/grub
|
||||
PKG_MD5SUM:=e927540b6eda8b024fb0391eeaa4091c
|
||||
|
||||
PKG_HOST_ONLY:=1
|
||||
HOST_BUILD_PARALLEL:=1
|
||||
PKG_BUILD_DEPENDS:=grub2/host
|
||||
|
||||
include $(INCLUDE_DIR)/host-build.mk
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define Package/grub2
|
||||
SUBMENU:=Boot Loaders
|
||||
CATEGORY:=Utilities
|
||||
SECTION:=utils
|
||||
TITLE:=GRand Unified Bootloader
|
||||
URL:=http://www.gnu.org/software/grub/
|
||||
DEPENDS:=@TARGET_x86
|
||||
endef
|
||||
|
||||
HOST_CONFIGURE_ARGS += \
|
||||
--target=$(REAL_GNU_TARGET_NAME) \
|
||||
--sbindir="$(STAGING_DIR_HOST)/bin" \
|
||||
--disable-werror \
|
||||
--disable-nls
|
||||
|
||||
HOST_MAKE_FLAGS += \
|
||||
TARGET_RANLIB=$(TARGET_RANLIB) \
|
||||
LIBLZMA=$(STAGING_DIR_HOST)/lib/liblzma.a
|
||||
|
||||
define Host/Configure
|
||||
$(SED) 's,(RANLIB),(TARGET_RANLIB),' $(HOST_BUILD_DIR)/grub-core/Makefile.in
|
||||
$(Host/Configure/Default)
|
||||
endef
|
||||
|
||||
$(eval $(call HostBuild))
|
||||
$(eval $(call BuildPackage,grub2))
|
||||
77
package/boot/grub2/patches/100-grub_setup_root.patch
Normal file
77
package/boot/grub2/patches/100-grub_setup_root.patch
Normal file
@@ -0,0 +1,77 @@
|
||||
--- a/util/grub-setup.c
|
||||
+++ b/util/grub-setup.c
|
||||
@@ -141,12 +141,11 @@ write_rootdev (char *core_img, grub_devi
|
||||
static void
|
||||
setup (const char *dir,
|
||||
const char *boot_file, const char *core_file,
|
||||
- const char *dest, int force,
|
||||
+ const char *root, const char *dest, int force,
|
||||
int fs_probe, int allow_floppy)
|
||||
{
|
||||
char *boot_path, *core_path, *core_path_dev, *core_path_dev_full;
|
||||
char *boot_img, *core_img;
|
||||
- char *root = 0;
|
||||
size_t boot_size, core_size;
|
||||
grub_uint16_t core_sectors;
|
||||
grub_device_t root_dev = 0, dest_dev, core_dev;
|
||||
@@ -253,7 +252,10 @@ setup (const char *dir,
|
||||
|
||||
core_dev = dest_dev;
|
||||
|
||||
- {
|
||||
+ if (root)
|
||||
+ root_dev = grub_device_open(root);
|
||||
+
|
||||
+ if (!root_dev) {
|
||||
char **root_devices = grub_guess_root_devices (dir);
|
||||
char **cur;
|
||||
int found = 0;
|
||||
@@ -263,6 +265,8 @@ setup (const char *dir,
|
||||
char *drive;
|
||||
grub_device_t try_dev;
|
||||
|
||||
+ if (root_dev)
|
||||
+ break;
|
||||
drive = grub_util_get_grub_dev (*cur);
|
||||
if (!drive)
|
||||
continue;
|
||||
@@ -956,6 +960,8 @@ static struct argp_option options[] = {
|
||||
N_("install even if problems are detected"), 0},
|
||||
{"skip-fs-probe",'s',0, 0,
|
||||
N_("do not probe for filesystems in DEVICE"), 0},
|
||||
+ {"root-device", 'r', N_("DEVICE"), 0,
|
||||
+ N_("use DEVICE as the root device"), 0},
|
||||
{"verbose", 'v', 0, 0, N_("print verbose messages."), 0},
|
||||
{"allow-floppy", 'a', 0, 0,
|
||||
/* TRANSLATORS: The potential breakage isn't limited to floppies but it's
|
||||
@@ -993,6 +999,7 @@ struct arguments
|
||||
char *core_file;
|
||||
char *dir;
|
||||
char *dev_map;
|
||||
+ char *root_dev;
|
||||
int force;
|
||||
int fs_probe;
|
||||
int allow_floppy;
|
||||
@@ -1040,6 +1047,13 @@ argp_parser (int key, char *arg, struct
|
||||
arguments->dev_map = xstrdup (arg);
|
||||
break;
|
||||
|
||||
+ case 'r':
|
||||
+ if (arguments->root_dev)
|
||||
+ free (arguments->root_dev);
|
||||
+
|
||||
+ arguments->root_dev = xstrdup (arg);
|
||||
+ break;
|
||||
+
|
||||
case 'f':
|
||||
arguments->force = 1;
|
||||
break;
|
||||
@@ -1172,7 +1186,7 @@ main (int argc, char *argv[])
|
||||
setup (arguments.dir ? : DEFAULT_DIRECTORY,
|
||||
arguments.boot_file ? : DEFAULT_BOOT_FILE,
|
||||
arguments.core_file ? : DEFAULT_CORE_FILE,
|
||||
- dest_dev, arguments.force,
|
||||
+ arguments.root_dev, dest_dev, arguments.force,
|
||||
arguments.fs_probe, arguments.allow_floppy);
|
||||
|
||||
/* Free resources. */
|
||||
21
package/boot/kexec-tools/Config.in
Normal file
21
package/boot/kexec-tools/Config.in
Normal file
@@ -0,0 +1,21 @@
|
||||
menu "Configuration"
|
||||
depends on PACKAGE_kexec-tools
|
||||
|
||||
config KEXEC_TOOLS_TARGET_NAME
|
||||
string
|
||||
prompt "Target name for kexec kernel"
|
||||
default EXTRA_TARGET_ARCH_NAME if powerpc64
|
||||
default ARCH
|
||||
help
|
||||
Defines the target type of the kernels that kexec deals
|
||||
with. This should be the target specification of
|
||||
the kernel you're booting.
|
||||
|
||||
config KEXEC_TOOLS_kdump
|
||||
bool
|
||||
prompt "kdump support"
|
||||
default n
|
||||
help
|
||||
Include the kdump utility.
|
||||
|
||||
endmenu
|
||||
80
package/boot/kexec-tools/Makefile
Normal file
80
package/boot/kexec-tools/Makefile
Normal file
@@ -0,0 +1,80 @@
|
||||
#
|
||||
# Copyright (C) 2006-2012 OpenWrt.org
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=kexec-tools
|
||||
PKG_VERSION:=2.0.3
|
||||
PKG_RELEASE:=1
|
||||
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
|
||||
PKG_SOURCE_URL:=@KERNEL/linux/utils/kernel/kexec
|
||||
PKG_MD5SUM:=b3ced2097ce3981abba38ceedc84f939
|
||||
|
||||
PKG_FIXUP:=autoreconf
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define Package/kexec-tools
|
||||
SECTION:=utils
|
||||
CATEGORY:=Utilities
|
||||
DEPENDS:=@armeb||@arm||@i386||@powerpc64||@mipsel||@mips +zlib
|
||||
TITLE:=Kernel boots kernel
|
||||
URL:=http://kernel.org/pub/linux/kernel/people/horms/kexec-tools/
|
||||
MAINTAINER:=Florian Fainelli <florian@openwrt.org>
|
||||
MENU:=1
|
||||
endef
|
||||
|
||||
define Package/kexec-tools/description
|
||||
kexec is a set of systems call that allows you to load
|
||||
another kernel from the currently executing Linux kernel.
|
||||
endef
|
||||
|
||||
define Package/kexec-tools/config
|
||||
source "$(SOURCE)/Config.in"
|
||||
endef
|
||||
|
||||
KEXEC_TARGET_NAME:=$(call qstrip,$(CONFIG_KEXEC_TOOLS_TARGET_NAME))-linux-$(TARGET_SUFFIX)
|
||||
|
||||
CONFIGURE_ARGS = \
|
||||
--target=$(KEXEC_TARGET_NAME) \
|
||||
--host=$(REAL_GNU_TARGET_NAME) \
|
||||
--build=$(GNU_HOST_NAME) \
|
||||
--program-prefix="" \
|
||||
--program-suffix="" \
|
||||
--prefix=/usr \
|
||||
--exec-prefix=/usr \
|
||||
--bindir=/usr/bin \
|
||||
--sbindir=/usr/sbin \
|
||||
--libexecdir=/usr/lib \
|
||||
--sysconfdir=/etc
|
||||
|
||||
CONFIGURE_VARS += \
|
||||
BUILD_CC="$(HOSTCC)" \
|
||||
TARGET_CC="$(TARGET_CC)"
|
||||
|
||||
kexec-extra-sbin-$(CONFIG_KEXEC_TOOLS_kdump) += kdump
|
||||
|
||||
define Build/Compile
|
||||
$(MAKE) -C $(PKG_BUILD_DIR) DESTDIR="$(PKG_INSTALL_DIR)" all install
|
||||
endef
|
||||
|
||||
define Package/kexec-tools/install
|
||||
$(INSTALL_DIR) $(1)/usr/sbin
|
||||
$(INSTALL_BIN) \
|
||||
$(addprefix $(PKG_INSTALL_DIR)/usr/sbin/, \
|
||||
$(kexec-extra-sbin-y)) \
|
||||
$(kexec-extra-bin-y) \
|
||||
$(PKG_INSTALL_DIR)/usr/sbin/kexec \
|
||||
$(1)/usr/sbin
|
||||
|
||||
# make a link for compatability with other distros
|
||||
$(INSTALL_DIR) $(1)/sbin
|
||||
ln -s /usr/sbin/kexec $(1)/sbin/kexec
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,kexec-tools))
|
||||
103
package/boot/kexec-tools/patches/0004-mips_regdefs.patch
Normal file
103
package/boot/kexec-tools/patches/0004-mips_regdefs.patch
Normal file
@@ -0,0 +1,103 @@
|
||||
--- /dev/null
|
||||
+++ b/kexec/arch/mips/regdef.h
|
||||
@@ -0,0 +1,100 @@
|
||||
+/*
|
||||
+ * This file is subject to the terms and conditions of the GNU General Public
|
||||
+ * License. See the file "COPYING" in the main directory of this archive
|
||||
+ * for more details.
|
||||
+ *
|
||||
+ * Copyright (C) 1985 MIPS Computer Systems, Inc.
|
||||
+ * Copyright (C) 1994, 95, 99, 2003 by Ralf Baechle
|
||||
+ * Copyright (C) 1990 - 1992, 1999 Silicon Graphics, Inc.
|
||||
+ */
|
||||
+#ifndef _ASM_REGDEF_H
|
||||
+#define _ASM_REGDEF_H
|
||||
+
|
||||
+#include <asm/sgidefs.h>
|
||||
+
|
||||
+#if _MIPS_SIM == _MIPS_SIM_ABI32
|
||||
+
|
||||
+/*
|
||||
+ * Symbolic register names for 32 bit ABI
|
||||
+ */
|
||||
+#define zero $0 /* wired zero */
|
||||
+#define AT $1 /* assembler temp - uppercase because of ".set at" */
|
||||
+#define v0 $2 /* return value */
|
||||
+#define v1 $3
|
||||
+#define a0 $4 /* argument registers */
|
||||
+#define a1 $5
|
||||
+#define a2 $6
|
||||
+#define a3 $7
|
||||
+#define t0 $8 /* caller saved */
|
||||
+#define t1 $9
|
||||
+#define t2 $10
|
||||
+#define t3 $11
|
||||
+#define t4 $12
|
||||
+#define t5 $13
|
||||
+#define t6 $14
|
||||
+#define t7 $15
|
||||
+#define s0 $16 /* callee saved */
|
||||
+#define s1 $17
|
||||
+#define s2 $18
|
||||
+#define s3 $19
|
||||
+#define s4 $20
|
||||
+#define s5 $21
|
||||
+#define s6 $22
|
||||
+#define s7 $23
|
||||
+#define t8 $24 /* caller saved */
|
||||
+#define t9 $25
|
||||
+#define jp $25 /* PIC jump register */
|
||||
+#define k0 $26 /* kernel scratch */
|
||||
+#define k1 $27
|
||||
+#define gp $28 /* global pointer */
|
||||
+#define sp $29 /* stack pointer */
|
||||
+#define fp $30 /* frame pointer */
|
||||
+#define s8 $30 /* same like fp! */
|
||||
+#define ra $31 /* return address */
|
||||
+
|
||||
+#endif /* _MIPS_SIM == _MIPS_SIM_ABI32 */
|
||||
+
|
||||
+#if _MIPS_SIM == _MIPS_SIM_ABI64 || _MIPS_SIM == _MIPS_SIM_NABI32
|
||||
+
|
||||
+#define zero $0 /* wired zero */
|
||||
+#define AT $at /* assembler temp - uppercase because of ".set at" */
|
||||
+#define v0 $2 /* return value - caller saved */
|
||||
+#define v1 $3
|
||||
+#define a0 $4 /* argument registers */
|
||||
+#define a1 $5
|
||||
+#define a2 $6
|
||||
+#define a3 $7
|
||||
+#define a4 $8 /* arg reg 64 bit; caller saved in 32 bit */
|
||||
+#define ta0 $8
|
||||
+#define a5 $9
|
||||
+#define ta1 $9
|
||||
+#define a6 $10
|
||||
+#define ta2 $10
|
||||
+#define a7 $11
|
||||
+#define ta3 $11
|
||||
+#define t0 $12 /* caller saved */
|
||||
+#define t1 $13
|
||||
+#define t2 $14
|
||||
+#define t3 $15
|
||||
+#define s0 $16 /* callee saved */
|
||||
+#define s1 $17
|
||||
+#define s2 $18
|
||||
+#define s3 $19
|
||||
+#define s4 $20
|
||||
+#define s5 $21
|
||||
+#define s6 $22
|
||||
+#define s7 $23
|
||||
+#define t8 $24 /* caller saved */
|
||||
+#define t9 $25 /* callee address for PIC/temp */
|
||||
+#define jp $25 /* PIC jump register */
|
||||
+#define k0 $26 /* kernel temporary */
|
||||
+#define k1 $27
|
||||
+#define gp $28 /* global pointer - caller saved for PIC */
|
||||
+#define sp $29 /* stack pointer */
|
||||
+#define fp $30 /* frame pointer */
|
||||
+#define s8 $30 /* callee saved */
|
||||
+#define ra $31 /* return address */
|
||||
+
|
||||
+#endif /* _MIPS_SIM == _MIPS_SIM_ABI64 || _MIPS_SIM == _MIPS_SIM_NABI32 */
|
||||
+
|
||||
+#endif /* _ASM_REGDEF_H */
|
||||
90
package/boot/uboot-ar71xx/Makefile
Normal file
90
package/boot/uboot-ar71xx/Makefile
Normal file
@@ -0,0 +1,90 @@
|
||||
#
|
||||
# Copyright (C) 2010 OpenWrt.org
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
include $(INCLUDE_DIR)/kernel.mk
|
||||
|
||||
PKG_NAME:=u-boot
|
||||
PKG_VERSION:=2010.03
|
||||
PKG_RELEASE:=1
|
||||
|
||||
PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
|
||||
PKG_SOURCE_URL:=ftp://ftp.denx.de/pub/u-boot
|
||||
PKG_MD5SUM:=
|
||||
PKG_TARGETS:=bin
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define uboot/Default
|
||||
TITLE:=
|
||||
CONFIG:=
|
||||
IMAGE:=
|
||||
endef
|
||||
|
||||
define uboot/nbg460n_550n_550nh
|
||||
TITLE:=U-boot for the NBG460N/550N/550NH routers
|
||||
endef
|
||||
|
||||
UBOOTS:=nbg460n_550n_550nh
|
||||
|
||||
define Package/uboot/template
|
||||
define Package/uboot-ar71xx-$(1)
|
||||
SECTION:=boot
|
||||
CATEGORY:=Boot Loaders
|
||||
TITLE:=$(2)
|
||||
DEPENDS:=@TARGET_ar71xx
|
||||
URL:=http://www.denx.de/wiki/U-Boot
|
||||
DEFAULT:=y if (TARGET_ar71xx_generic_NBG_460N_550N_550NH || TARGET_ar71xx_generic_Default || CONFIG_TARGET_ar71xx_generic_Minimal)
|
||||
VARIANT:=$(1)
|
||||
endef
|
||||
endef
|
||||
|
||||
define BuildUbootPackage
|
||||
$(eval $(uboot/Default))
|
||||
$(eval $(uboot/$(1)))
|
||||
$(call Package/uboot/template,$(1),$(TITLE))
|
||||
endef
|
||||
|
||||
|
||||
ifdef BUILD_VARIANT
|
||||
$(eval $(call uboot/$(BUILD_VARIANT)))
|
||||
UBOOT_CONFIG:=$(if $(CONFIG),$(CONFIG),$(BUILD_VARIANT))
|
||||
UBOOT_IMAGE:=$(if $(IMAGE),$(IMAGE),openwrt-$(BOARD)-$(BUILD_VARIANT)-u-boot.bin)
|
||||
endif
|
||||
|
||||
define Build/Prepare
|
||||
$(call Build/Prepare/Default)
|
||||
$(CP) ./files/* $(PKG_BUILD_DIR)
|
||||
find $(PKG_BUILD_DIR) -name .svn | $(XARGS) rm -rf
|
||||
endef
|
||||
|
||||
define Build/Configure
|
||||
$(MAKE) -C $(PKG_BUILD_DIR) \
|
||||
$(UBOOT_CONFIG)_config
|
||||
endef
|
||||
|
||||
define Build/Compile
|
||||
$(MAKE) -C $(PKG_BUILD_DIR) \
|
||||
CROSS_COMPILE=$(TARGET_CROSS)
|
||||
endef
|
||||
|
||||
define Package/uboot/install/template
|
||||
define Package/uboot-ar71xx-$(1)/install
|
||||
$(INSTALL_DIR) $$(1)
|
||||
$(CP) $(PKG_BUILD_DIR)/u-boot.bin $(BIN_DIR)/$(2)
|
||||
endef
|
||||
endef
|
||||
|
||||
$(foreach u,$(UBOOTS), \
|
||||
$(eval $(call Package/uboot/install/template,$(u),openwrt-$(BOARD)-$(SUBTARGET)-$(u)-u-boot.bin)) \
|
||||
)
|
||||
|
||||
$(foreach u,$(UBOOTS), \
|
||||
$(eval $(call BuildUbootPackage,$(u))) \
|
||||
$(eval $(call BuildPackage,uboot-ar71xx-$(u))) \
|
||||
)
|
||||
46
package/boot/uboot-ar71xx/files/board/zyxel/nbg460n/Makefile
Normal file
46
package/boot/uboot-ar71xx/files/board/zyxel/nbg460n/Makefile
Normal file
@@ -0,0 +1,46 @@
|
||||
#
|
||||
# (C) Copyright 2003-2008
|
||||
# Wolfgang Denk, DENX Software Engineering, wd@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
|
||||
#
|
||||
|
||||
include $(TOPDIR)/config.mk
|
||||
|
||||
LIB = $(obj)lib$(BOARD).a
|
||||
|
||||
COBJS-y += $(BOARD).o
|
||||
SOBJS-y += lowlevel_init.o
|
||||
|
||||
SRCS := $(SOBJS-y:.o=.S) $(COBJS-y:.o=.c)
|
||||
OBJS := $(addprefix $(obj),$(COBJS-y))
|
||||
SOBJS := $(addprefix $(obj),$(SOBJS-y))
|
||||
|
||||
$(LIB): $(obj).depend $(OBJS) $(SOBJS)
|
||||
$(AR) $(ARFLAGS) $@ $(OBJS) $(SOBJS)
|
||||
|
||||
|
||||
#########################################################################
|
||||
|
||||
# defines $(obj).depend target
|
||||
include $(SRCTREE)/rules.mk
|
||||
|
||||
sinclude $(obj).depend
|
||||
|
||||
#########################################################################
|
||||
@@ -0,0 +1 @@
|
||||
TEXT_BASE = 0x81E00000
|
||||
@@ -0,0 +1,39 @@
|
||||
/*
|
||||
* (C) Copyright 2010
|
||||
* Michael Kurz <michi.kurz@googlemail.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
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <version.h>
|
||||
#include <asm/regdef.h>
|
||||
#include <asm/mipsregs.h>
|
||||
#include <asm/addrspace.h>
|
||||
|
||||
|
||||
|
||||
.globl lowlevel_init
|
||||
/*
|
||||
All done by Bootbase, nothing to do
|
||||
*/
|
||||
lowlevel_init:
|
||||
jr ra
|
||||
nop
|
||||
|
||||
@@ -0,0 +1,96 @@
|
||||
/*
|
||||
* (C) Copyright 2010
|
||||
* Michael Kurz <michi.kurz@googlemail.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
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <netdev.h>
|
||||
#include <asm/mipsregs.h>
|
||||
#include <asm/addrspace.h>
|
||||
#include <asm/reboot.h>
|
||||
#include <asm/ar71xx.h>
|
||||
#include <asm/ar71xx_gpio.h>
|
||||
|
||||
#define NBG460N_WAN_LED 19
|
||||
|
||||
phys_size_t initdram(int board_type)
|
||||
{
|
||||
return (32*1024*1024);
|
||||
}
|
||||
|
||||
int checkboard(void)
|
||||
{
|
||||
// Set pin 19 to 1, to stop WAN LED blinking
|
||||
ar71xx_setpindir(NBG460N_WAN_LED, 1);
|
||||
ar71xx_setpin(NBG460N_WAN_LED, 1);
|
||||
|
||||
printf("U-boot on Zyxel NBG460N\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
void _machine_restart(void)
|
||||
{
|
||||
for (;;) {
|
||||
writel((RESET_MODULE_FULL_CHIP | RESET_MODULE_DDR),
|
||||
KSEG1ADDR(AR71XX_RESET_BASE + AR91XX_RESET_REG_RESET_MODULE));
|
||||
readl(KSEG1ADDR(AR71XX_RESET_BASE + AR91XX_RESET_REG_RESET_MODULE));
|
||||
}
|
||||
}
|
||||
|
||||
int board_eth_init(bd_t *bis)
|
||||
{
|
||||
char *phynames[] = {RTL8366_DEVNAME, RTL8366_DEVNAME};
|
||||
u16 phyids[] = {RTL8366_LANPHY_ID, RTL8366_WANPHY_ID};
|
||||
u16 phyfixed[] = {1, 0};
|
||||
|
||||
if (ag71xx_register(bis, phynames, phyids, phyfixed) <= 0)
|
||||
return -1;
|
||||
|
||||
if (rtl8366s_initialize())
|
||||
return -1;
|
||||
|
||||
if (rtl8366_mii_register(bis))
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int misc_init_r(void) {
|
||||
uint8_t macaddr[6];
|
||||
uint8_t enetaddr[6];
|
||||
|
||||
debug("Testing mac addresses\n");
|
||||
|
||||
memcpy(macaddr, (uint8_t *) CONFIG_ETHADDR_ADDR, 6);
|
||||
|
||||
if (!eth_getenv_enetaddr("ethaddr", enetaddr)) {
|
||||
debug("Setting eth0 mac addr to %pM\n", macaddr);
|
||||
eth_setenv_enetaddr("ethaddr", macaddr);
|
||||
}
|
||||
|
||||
if (!eth_getenv_enetaddr("eth1addr", enetaddr)) {
|
||||
macaddr[5] += 1;
|
||||
debug("Setting eth1 mac addr to %pM\n", macaddr);
|
||||
eth_setenv_enetaddr("eth1addr", macaddr);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
OUTPUT_FORMAT("elf32-tradbigmips", "elf32-tradbigmips", "elf32-tradbigmips")
|
||||
OUTPUT_ARCH(mips)
|
||||
ENTRY(_start)
|
||||
SECTIONS
|
||||
{
|
||||
. = 0x00000000;
|
||||
|
||||
. = ALIGN(4);
|
||||
.text :
|
||||
{
|
||||
*(.text)
|
||||
}
|
||||
|
||||
. = ALIGN(4);
|
||||
.rodata : { *(.rodata) }
|
||||
|
||||
. = ALIGN(4);
|
||||
.data : { *(.data) }
|
||||
|
||||
. = ALIGN(4);
|
||||
.sdata : { *(.sdata) }
|
||||
|
||||
_gp = ALIGN(16);
|
||||
|
||||
__got_start = .;
|
||||
.got : { *(.got) }
|
||||
__got_end = .;
|
||||
|
||||
.sdata : { *(.sdata) }
|
||||
|
||||
__u_boot_cmd_start = .;
|
||||
.u_boot_cmd : { *(.u_boot_cmd) }
|
||||
__u_boot_cmd_end = .;
|
||||
|
||||
uboot_end_data = .;
|
||||
num_got_entries = (__got_end - __got_start) >> 2;
|
||||
|
||||
. = ALIGN(4);
|
||||
.sbss : { *(.sbss) }
|
||||
.bss : { *(.bss) }
|
||||
uboot_end = .;
|
||||
}
|
||||
177
package/boot/uboot-ar71xx/files/cpu/mips/ar71xx_serial.c
Normal file
177
package/boot/uboot-ar71xx/files/cpu/mips/ar71xx_serial.c
Normal file
@@ -0,0 +1,177 @@
|
||||
/*
|
||||
* (C) Copyright 2010
|
||||
* Michael Kurz <michi.kurz@googlemail.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
|
||||
*/
|
||||
|
||||
#include <asm/addrspace.h>
|
||||
#include <asm/types.h>
|
||||
#include <config.h>
|
||||
#include <asm/ar71xx.h>
|
||||
|
||||
#define REG_SIZE 4
|
||||
|
||||
/* === END OF CONFIG === */
|
||||
|
||||
/* register offset */
|
||||
#define OFS_RCV_BUFFER (0*REG_SIZE)
|
||||
#define OFS_TRANS_HOLD (0*REG_SIZE)
|
||||
#define OFS_SEND_BUFFER (0*REG_SIZE)
|
||||
#define OFS_INTR_ENABLE (1*REG_SIZE)
|
||||
#define OFS_INTR_ID (2*REG_SIZE)
|
||||
#define OFS_DATA_FORMAT (3*REG_SIZE)
|
||||
#define OFS_LINE_CONTROL (3*REG_SIZE)
|
||||
#define OFS_MODEM_CONTROL (4*REG_SIZE)
|
||||
#define OFS_RS232_OUTPUT (4*REG_SIZE)
|
||||
#define OFS_LINE_STATUS (5*REG_SIZE)
|
||||
#define OFS_MODEM_STATUS (6*REG_SIZE)
|
||||
#define OFS_RS232_INPUT (6*REG_SIZE)
|
||||
#define OFS_SCRATCH_PAD (7*REG_SIZE)
|
||||
|
||||
#define OFS_DIVISOR_LSB (0*REG_SIZE)
|
||||
#define OFS_DIVISOR_MSB (1*REG_SIZE)
|
||||
|
||||
#define UART16550_READ(y) readl(KSEG1ADDR(AR71XX_UART_BASE+y))
|
||||
#define UART16550_WRITE(x, z) writel(z, KSEG1ADDR((AR71XX_UART_BASE+x)))
|
||||
|
||||
void
|
||||
ar71xx_sys_frequency(u32 *cpu_freq, u32 *ddr_freq, u32 *ahb_freq)
|
||||
{
|
||||
#ifndef CONFIG_AR91XX
|
||||
u32 pll, pll_div, cpu_div, ahb_div, ddr_div, freq;
|
||||
|
||||
pll = readl(KSEG1ADDR(AR71XX_PLL_REG_CPU_CONFIG + AR71XX_PLL_BASE));
|
||||
|
||||
pll_div =
|
||||
((pll & AR71XX_PLL_DIV_MASK) >> AR71XX_PLL_DIV_SHIFT) + 1;
|
||||
|
||||
cpu_div =
|
||||
((pll & AR71XX_CPU_DIV_MASK) >> AR71XX_CPU_DIV_SHIFT) + 1;
|
||||
|
||||
ddr_div =
|
||||
((pll & AR71XX_DDR_DIV_MASK) >> AR71XX_DDR_DIV_SHIFT) + 1;
|
||||
|
||||
ahb_div =
|
||||
(((pll & AR71XX_AHB_DIV_MASK) >> AR71XX_AHB_DIV_SHIFT) + 1)*2;
|
||||
|
||||
freq = pll_div * 40000000;
|
||||
|
||||
if (cpu_freq)
|
||||
*cpu_freq = freq/cpu_div;
|
||||
|
||||
if (ddr_freq)
|
||||
*ddr_freq = freq/ddr_div;
|
||||
|
||||
if (ahb_freq)
|
||||
*ahb_freq = (freq/cpu_div)/ahb_div;
|
||||
|
||||
#else
|
||||
u32 pll, pll_div, ahb_div, ddr_div, freq;
|
||||
|
||||
pll = readl(KSEG1ADDR(AR91XX_PLL_REG_CPU_CONFIG + AR71XX_PLL_BASE));
|
||||
|
||||
pll_div =
|
||||
((pll & AR91XX_PLL_DIV_MASK) >> AR91XX_PLL_DIV_SHIFT);
|
||||
|
||||
ddr_div =
|
||||
((pll & AR91XX_DDR_DIV_MASK) >> AR91XX_DDR_DIV_SHIFT) + 1;
|
||||
|
||||
ahb_div =
|
||||
(((pll & AR91XX_AHB_DIV_MASK) >> AR91XX_AHB_DIV_SHIFT) + 1)*2;
|
||||
|
||||
freq = pll_div * 5000000;
|
||||
|
||||
if (cpu_freq)
|
||||
*cpu_freq = freq;
|
||||
|
||||
if (ddr_freq)
|
||||
*ddr_freq = freq/ddr_div;
|
||||
|
||||
if (ahb_freq)
|
||||
*ahb_freq = freq/ahb_div;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
int serial_init(void)
|
||||
{
|
||||
u32 div;
|
||||
u32 ahb_freq = 100000000;
|
||||
|
||||
ar71xx_sys_frequency (0, 0, &ahb_freq);
|
||||
div = ahb_freq/(16 * CONFIG_BAUDRATE);
|
||||
|
||||
// enable uart pins
|
||||
#ifndef CONFIG_AR91XX
|
||||
writel(AR71XX_GPIO_FUNC_UART_EN, KSEG1ADDR(AR71XX_GPIO_BASE + GPIO_REG_FUNC));
|
||||
#else
|
||||
writel(AR91XX_GPIO_FUNC_UART_EN, KSEG1ADDR(AR71XX_GPIO_BASE + GPIO_REG_FUNC));
|
||||
#endif
|
||||
|
||||
/* set DIAB bit */
|
||||
UART16550_WRITE(OFS_LINE_CONTROL, 0x80);
|
||||
|
||||
/* set divisor */
|
||||
UART16550_WRITE(OFS_DIVISOR_LSB, (div & 0xff));
|
||||
UART16550_WRITE(OFS_DIVISOR_MSB, ((div >> 8) & 0xff));
|
||||
|
||||
/* clear DIAB bit*/
|
||||
UART16550_WRITE(OFS_LINE_CONTROL, 0x00);
|
||||
|
||||
/* set data format */
|
||||
UART16550_WRITE(OFS_DATA_FORMAT, 0x3);
|
||||
|
||||
UART16550_WRITE(OFS_INTR_ENABLE, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int serial_tstc (void)
|
||||
{
|
||||
return(UART16550_READ(OFS_LINE_STATUS) & 0x1);
|
||||
}
|
||||
|
||||
int serial_getc(void)
|
||||
{
|
||||
while(!serial_tstc());
|
||||
|
||||
return UART16550_READ(OFS_RCV_BUFFER);
|
||||
}
|
||||
|
||||
|
||||
void serial_putc(const char byte)
|
||||
{
|
||||
if (byte == '\n') serial_putc ('\r');
|
||||
|
||||
while (((UART16550_READ(OFS_LINE_STATUS)) & 0x20) == 0x0);
|
||||
UART16550_WRITE(OFS_SEND_BUFFER, byte);
|
||||
}
|
||||
|
||||
void serial_setbrg (void)
|
||||
{
|
||||
}
|
||||
|
||||
void serial_puts (const char *s)
|
||||
{
|
||||
while (*s)
|
||||
{
|
||||
serial_putc (*s++);
|
||||
}
|
||||
}
|
||||
809
package/boot/uboot-ar71xx/files/drivers/net/ag71xx.c
Normal file
809
package/boot/uboot-ar71xx/files/drivers/net/ag71xx.c
Normal file
@@ -0,0 +1,809 @@
|
||||
/*
|
||||
* Atheros AR71xx built-in ethernet mac driver
|
||||
*
|
||||
* Copyright (C) 2010 Michael Kurz <michi.kurz@googlemail.com>
|
||||
* Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org>
|
||||
* Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
|
||||
*
|
||||
* Based on Atheros' AG7100 driver
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 as published
|
||||
* by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <malloc.h>
|
||||
#include <net.h>
|
||||
#include <miiphy.h>
|
||||
|
||||
#include <asm/ar71xx.h>
|
||||
|
||||
#include "ag71xx.h"
|
||||
|
||||
#ifdef AG71XX_DEBUG
|
||||
#define DBG(fmt,args...) printf(fmt ,##args)
|
||||
#else
|
||||
#define DBG(fmt,args...)
|
||||
#endif
|
||||
|
||||
|
||||
static struct ag71xx agtable[] = {
|
||||
{
|
||||
.mac_base = KSEG1ADDR(AR71XX_GE0_BASE),
|
||||
.mii_ctrl = KSEG1ADDR(AR71XX_MII_BASE + MII_REG_MII0_CTRL),
|
||||
.mii_if = CONFIG_AG71XX_MII0_IIF,
|
||||
} , {
|
||||
.mac_base = KSEG1ADDR(AR71XX_GE1_BASE),
|
||||
.mii_ctrl = KSEG1ADDR(AR71XX_MII_BASE + MII_REG_MII1_CTRL),
|
||||
.mii_if = CONFIG_AG71XX_MII1_IIF,
|
||||
}
|
||||
};
|
||||
|
||||
static int ag71xx_ring_alloc(struct ag71xx_ring *ring, unsigned int size)
|
||||
{
|
||||
int err;
|
||||
int i;
|
||||
int rsize;
|
||||
|
||||
ring->desc_size = sizeof(struct ag71xx_desc);
|
||||
if (ring->desc_size % (CONFIG_SYS_CACHELINE_SIZE)) {
|
||||
rsize = roundup(ring->desc_size, CONFIG_SYS_CACHELINE_SIZE);
|
||||
DBG("ag71xx: ring %p, desc size %u rounded to %u\n",
|
||||
ring, ring->desc_size,
|
||||
rsize);
|
||||
ring->desc_size = rsize;
|
||||
}
|
||||
|
||||
ring->descs_cpu = (u8 *) malloc((size * ring->desc_size)
|
||||
+ CONFIG_SYS_CACHELINE_SIZE - 1);
|
||||
if (!ring->descs_cpu) {
|
||||
err = -1;
|
||||
goto err;
|
||||
}
|
||||
ring->descs_cpu = (u8 *) UNCACHED_SDRAM((((u32) ring->descs_cpu +
|
||||
CONFIG_SYS_CACHELINE_SIZE - 1) & ~(CONFIG_SYS_CACHELINE_SIZE - 1)));
|
||||
ring->descs_dma = (u8 *) virt_to_phys(ring->descs_cpu);
|
||||
|
||||
ring->size = size;
|
||||
|
||||
ring->buf = malloc(size * sizeof(*ring->buf));
|
||||
if (!ring->buf) {
|
||||
err = -1;
|
||||
goto err;
|
||||
}
|
||||
memset(ring->buf, 0, size * sizeof(*ring->buf));
|
||||
|
||||
for (i = 0; i < size; i++) {
|
||||
ring->buf[i].desc =
|
||||
(struct ag71xx_desc *)&ring->descs_cpu[i * ring->desc_size];
|
||||
DBG("ag71xx: ring %p, desc %d at %p\n",
|
||||
ring, i, ring->buf[i].desc);
|
||||
}
|
||||
|
||||
flush_cache( (u32) ring->buf, size * sizeof(*ring->buf));
|
||||
|
||||
return 0;
|
||||
|
||||
err:
|
||||
return err;
|
||||
}
|
||||
|
||||
static void ag71xx_ring_tx_init(struct ag71xx *ag)
|
||||
{
|
||||
struct ag71xx_ring *ring = &ag->tx_ring;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < AG71XX_TX_RING_SIZE; i++) {
|
||||
ring->buf[i].desc->next = (u32) virt_to_phys((ring->descs_dma +
|
||||
ring->desc_size * ((i + 1) % AG71XX_TX_RING_SIZE)));
|
||||
|
||||
ring->buf[i].desc->ctrl = DESC_EMPTY;
|
||||
ring->buf[i].skb = NULL;
|
||||
}
|
||||
|
||||
ring->curr = 0;
|
||||
}
|
||||
|
||||
static void ag71xx_ring_rx_clean(struct ag71xx *ag)
|
||||
{
|
||||
struct ag71xx_ring *ring = &ag->rx_ring;
|
||||
int i;
|
||||
|
||||
if (!ring->buf)
|
||||
return;
|
||||
|
||||
for (i = 0; i < AG71XX_RX_RING_SIZE; i++) {
|
||||
ring->buf[i].desc->data = (u32) virt_to_phys(NetRxPackets[i]);
|
||||
flush_cache((u32) NetRxPackets[i], PKTSIZE_ALIGN);
|
||||
ring->buf[i].desc->ctrl = DESC_EMPTY;
|
||||
}
|
||||
|
||||
ring->curr = 0;
|
||||
}
|
||||
|
||||
static int ag71xx_ring_rx_init(struct ag71xx *ag)
|
||||
{
|
||||
struct ag71xx_ring *ring = &ag->rx_ring;
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < AG71XX_RX_RING_SIZE; i++) {
|
||||
ring->buf[i].desc->next = (u32) virt_to_phys((ring->descs_dma +
|
||||
ring->desc_size * ((i + 1) % AG71XX_RX_RING_SIZE)));
|
||||
|
||||
DBG("ag71xx: RX desc at %p, next is %08x\n",
|
||||
ring->buf[i].desc,
|
||||
ring->buf[i].desc->next);
|
||||
}
|
||||
|
||||
for (i = 0; i < AG71XX_RX_RING_SIZE; i++) {
|
||||
ring->buf[i].desc->data = (u32) virt_to_phys(NetRxPackets[i]);
|
||||
ring->buf[i].desc->ctrl = DESC_EMPTY;
|
||||
}
|
||||
|
||||
ring->curr = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ag71xx_rings_init(struct ag71xx *ag)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = ag71xx_ring_alloc(&ag->tx_ring, AG71XX_TX_RING_SIZE);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ag71xx_ring_tx_init(ag);
|
||||
|
||||
ret = ag71xx_ring_alloc(&ag->rx_ring, AG71XX_RX_RING_SIZE);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = ag71xx_ring_rx_init(ag);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void ar71xx_set_pll(u32 cfg_reg, u32 pll_reg, u32 pll_val, u32 shift)
|
||||
{
|
||||
uint32_t base = KSEG1ADDR(AR71XX_PLL_BASE);
|
||||
u32 t;
|
||||
|
||||
t = readl(base + cfg_reg);
|
||||
t &= ~(3 << shift);
|
||||
t |= (2 << shift);
|
||||
writel(t, base + cfg_reg);
|
||||
udelay(100);
|
||||
|
||||
writel(pll_val, base + pll_reg);
|
||||
|
||||
t |= (3 << shift);
|
||||
writel(t, base + cfg_reg);
|
||||
udelay(100);
|
||||
|
||||
t &= ~(3 << shift);
|
||||
writel(t, base + cfg_reg);
|
||||
udelay(100);
|
||||
|
||||
debug("ar71xx: pll_reg %#x: %#x\n", (unsigned int)(base + pll_reg),
|
||||
readl(base + pll_reg));
|
||||
}
|
||||
|
||||
static void ar91xx_set_pll_ge0(int speed)
|
||||
{
|
||||
//u32 val = ar71xx_get_eth_pll(0, speed);
|
||||
u32 pll_val;
|
||||
|
||||
switch (speed) {
|
||||
case SPEED_10:
|
||||
pll_val = 0x00441099;
|
||||
break;
|
||||
case SPEED_100:
|
||||
pll_val = 0x13000a44;
|
||||
break;
|
||||
case SPEED_1000:
|
||||
pll_val = 0x1a000000;
|
||||
break;
|
||||
default:
|
||||
BUG();
|
||||
}
|
||||
|
||||
ar71xx_set_pll(AR91XX_PLL_REG_ETH_CONFIG, AR91XX_PLL_REG_ETH0_INT_CLOCK,
|
||||
pll_val, AR91XX_ETH0_PLL_SHIFT);
|
||||
}
|
||||
|
||||
static void ar91xx_set_pll_ge1(int speed)
|
||||
{
|
||||
//u32 val = ar71xx_get_eth_pll(1, speed);
|
||||
u32 pll_val;
|
||||
|
||||
switch (speed) {
|
||||
case SPEED_10:
|
||||
pll_val = 0x00441099;
|
||||
break;
|
||||
case SPEED_100:
|
||||
pll_val = 0x13000a44;
|
||||
break;
|
||||
case SPEED_1000:
|
||||
pll_val = 0x1a000000;
|
||||
break;
|
||||
default:
|
||||
BUG();
|
||||
}
|
||||
|
||||
ar71xx_set_pll(AR91XX_PLL_REG_ETH_CONFIG, AR91XX_PLL_REG_ETH1_INT_CLOCK,
|
||||
pll_val, AR91XX_ETH1_PLL_SHIFT);
|
||||
}
|
||||
|
||||
static void ag71xx_hw_set_macaddr(struct ag71xx *ag, unsigned char *mac)
|
||||
{
|
||||
u32 t;
|
||||
|
||||
t = (((u32) mac[5]) << 24) | (((u32) mac[4]) << 16)
|
||||
| (((u32) mac[3]) << 8) | ((u32) mac[2]);
|
||||
|
||||
ag71xx_wr(ag, AG71XX_REG_MAC_ADDR1, t);
|
||||
|
||||
t = (((u32) mac[1]) << 24) | (((u32) mac[0]) << 16);
|
||||
ag71xx_wr(ag, AG71XX_REG_MAC_ADDR2, t);
|
||||
}
|
||||
|
||||
static void ag71xx_dma_reset(struct ag71xx *ag)
|
||||
{
|
||||
u32 val;
|
||||
int i;
|
||||
|
||||
DBG("%s: txdesc reg: 0x%08x rxdesc reg: 0x%08x\n",
|
||||
ag->dev->name,
|
||||
ag71xx_rr(ag, AG71XX_REG_TX_DESC),
|
||||
ag71xx_rr(ag, AG71XX_REG_RX_DESC));
|
||||
|
||||
/* stop RX and TX */
|
||||
ag71xx_wr(ag, AG71XX_REG_RX_CTRL, 0);
|
||||
ag71xx_wr(ag, AG71XX_REG_TX_CTRL, 0);
|
||||
|
||||
/* clear descriptor addresses */
|
||||
ag71xx_wr(ag, AG71XX_REG_TX_DESC, 0);
|
||||
ag71xx_wr(ag, AG71XX_REG_RX_DESC, 0);
|
||||
|
||||
/* clear pending RX/TX interrupts */
|
||||
for (i = 0; i < 256; i++) {
|
||||
ag71xx_wr(ag, AG71XX_REG_RX_STATUS, RX_STATUS_PR);
|
||||
ag71xx_wr(ag, AG71XX_REG_TX_STATUS, TX_STATUS_PS);
|
||||
}
|
||||
|
||||
/* clear pending errors */
|
||||
ag71xx_wr(ag, AG71XX_REG_RX_STATUS, RX_STATUS_BE | RX_STATUS_OF);
|
||||
ag71xx_wr(ag, AG71XX_REG_TX_STATUS, TX_STATUS_BE | TX_STATUS_UR);
|
||||
|
||||
val = ag71xx_rr(ag, AG71XX_REG_RX_STATUS);
|
||||
if (val)
|
||||
printf("%s: unable to clear DMA Rx status: %08x\n",
|
||||
ag->dev->name, val);
|
||||
|
||||
val = ag71xx_rr(ag, AG71XX_REG_TX_STATUS);
|
||||
|
||||
/* mask out reserved bits */
|
||||
val &= ~0xff000000;
|
||||
|
||||
if (val)
|
||||
printf("%s: unable to clear DMA Tx status: %08x\n",
|
||||
ag->dev->name, val);
|
||||
}
|
||||
|
||||
static void ag71xx_halt(struct eth_device *dev)
|
||||
{
|
||||
struct ag71xx *ag = (struct ag71xx *) dev->priv;
|
||||
|
||||
/* stop RX engine */
|
||||
ag71xx_wr(ag, AG71XX_REG_RX_CTRL, 0);
|
||||
|
||||
ag71xx_dma_reset(ag);
|
||||
}
|
||||
|
||||
#define MAX_WAIT 1000
|
||||
|
||||
static int ag71xx_send(struct eth_device *dev, volatile void *packet,
|
||||
int length)
|
||||
{
|
||||
struct ag71xx *ag = (struct ag71xx *) dev->priv;
|
||||
struct ag71xx_ring *ring = &ag->tx_ring;
|
||||
struct ag71xx_desc *desc;
|
||||
int i;
|
||||
|
||||
i = ring->curr % AG71XX_TX_RING_SIZE;
|
||||
desc = ring->buf[i].desc;
|
||||
|
||||
if (!ag71xx_desc_empty(desc)) {
|
||||
printf("%s: tx buffer full\n", ag->dev->name);
|
||||
return 1;
|
||||
}
|
||||
|
||||
flush_cache((u32) packet, length);
|
||||
desc->data = (u32) virt_to_phys(packet);
|
||||
desc->ctrl = (length & DESC_PKTLEN_M);
|
||||
|
||||
DBG("%s: sending %#08x length %#08x\n",
|
||||
ag->dev->name, desc->data, desc->ctrl);
|
||||
|
||||
ring->curr++;
|
||||
if (ring->curr >= AG71XX_TX_RING_SIZE){
|
||||
ring->curr = 0;
|
||||
}
|
||||
|
||||
/* enable TX engine */
|
||||
ag71xx_wr(ag, AG71XX_REG_TX_CTRL, TX_CTRL_TXE);
|
||||
|
||||
for (i = 0; i < MAX_WAIT; i++)
|
||||
{
|
||||
if (ag71xx_desc_empty(desc))
|
||||
break;
|
||||
udelay(10);
|
||||
}
|
||||
if (i == MAX_WAIT) {
|
||||
printf("%s: tx timed out!\n", ag->dev->name);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* disable TX engine */
|
||||
ag71xx_wr(ag, AG71XX_REG_TX_CTRL, 0);
|
||||
desc->data = 0;
|
||||
desc->ctrl = DESC_EMPTY;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ag71xx_recv(struct eth_device *dev)
|
||||
{
|
||||
struct ag71xx *ag = (struct ag71xx *) dev->priv;
|
||||
struct ag71xx_ring *ring = &ag->rx_ring;
|
||||
|
||||
for (;;) {
|
||||
unsigned int i = ring->curr % AG71XX_RX_RING_SIZE;
|
||||
struct ag71xx_desc *desc = ring->buf[i].desc;
|
||||
int pktlen;
|
||||
|
||||
if (ag71xx_desc_empty(desc))
|
||||
break;
|
||||
|
||||
DBG("%s: rx packets, curr=%u\n", dev->name, ring->curr);
|
||||
|
||||
pktlen = ag71xx_desc_pktlen(desc);
|
||||
pktlen -= ETH_FCS_LEN;
|
||||
|
||||
|
||||
NetReceive(NetRxPackets[i] , pktlen);
|
||||
flush_cache( (u32) NetRxPackets[i], PKTSIZE_ALIGN);
|
||||
|
||||
ring->buf[i].desc->ctrl = DESC_EMPTY;
|
||||
ring->curr++;
|
||||
if (ring->curr >= AG71XX_RX_RING_SIZE){
|
||||
ring->curr = 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if ((ag71xx_rr(ag, AG71XX_REG_RX_CTRL) & RX_CTRL_RXE) == 0) {
|
||||
/* start RX engine */
|
||||
ag71xx_wr(ag, AG71XX_REG_RX_CTRL, RX_CTRL_RXE);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef AG71XX_DEBUG
|
||||
static char *ag71xx_speed_str(struct ag71xx *ag)
|
||||
{
|
||||
switch (ag->speed) {
|
||||
case SPEED_1000:
|
||||
return "1000";
|
||||
case SPEED_100:
|
||||
return "100";
|
||||
case SPEED_10:
|
||||
return "10";
|
||||
}
|
||||
|
||||
return "?";
|
||||
}
|
||||
#endif
|
||||
|
||||
void ag71xx_link_adjust(struct ag71xx *ag)
|
||||
{
|
||||
u32 cfg2;
|
||||
u32 ifctl;
|
||||
u32 fifo5;
|
||||
u32 mii_speed;
|
||||
|
||||
if (!ag->link) {
|
||||
DBG("%s: link down\n", ag->dev->name);
|
||||
return;
|
||||
}
|
||||
|
||||
cfg2 = ag71xx_rr(ag, AG71XX_REG_MAC_CFG2);
|
||||
cfg2 &= ~(MAC_CFG2_IF_1000 | MAC_CFG2_IF_10_100 | MAC_CFG2_FDX);
|
||||
cfg2 |= (ag->duplex) ? MAC_CFG2_FDX : 0;
|
||||
|
||||
ifctl = ag71xx_rr(ag, AG71XX_REG_MAC_IFCTL);
|
||||
ifctl &= ~(MAC_IFCTL_SPEED);
|
||||
|
||||
fifo5 = ag71xx_rr(ag, AG71XX_REG_FIFO_CFG5);
|
||||
fifo5 &= ~FIFO_CFG5_BM;
|
||||
|
||||
switch (ag->speed) {
|
||||
case SPEED_1000:
|
||||
mii_speed = MII_CTRL_SPEED_1000;
|
||||
cfg2 |= MAC_CFG2_IF_1000;
|
||||
fifo5 |= FIFO_CFG5_BM;
|
||||
break;
|
||||
case SPEED_100:
|
||||
mii_speed = MII_CTRL_SPEED_100;
|
||||
cfg2 |= MAC_CFG2_IF_10_100;
|
||||
ifctl |= MAC_IFCTL_SPEED;
|
||||
break;
|
||||
case SPEED_10:
|
||||
mii_speed = MII_CTRL_SPEED_10;
|
||||
cfg2 |= MAC_CFG2_IF_10_100;
|
||||
break;
|
||||
default:
|
||||
BUG();
|
||||
return;
|
||||
}
|
||||
|
||||
ag71xx_wr(ag, AG71XX_REG_FIFO_CFG3, 0x00780fff);
|
||||
|
||||
if (ag->macNum == 0)
|
||||
ar91xx_set_pll_ge0(ag->speed);
|
||||
else
|
||||
ar91xx_set_pll_ge1(ag->speed);
|
||||
|
||||
ag71xx_mii_ctrl_set_speed(ag, mii_speed);
|
||||
|
||||
ag71xx_wr(ag, AG71XX_REG_MAC_CFG2, cfg2);
|
||||
ag71xx_wr(ag, AG71XX_REG_FIFO_CFG5, fifo5);
|
||||
ag71xx_wr(ag, AG71XX_REG_MAC_IFCTL, ifctl);
|
||||
|
||||
DBG("%s: link up (%sMbps/%s duplex)\n",
|
||||
ag->dev->name,
|
||||
ag71xx_speed_str(ag),
|
||||
(1 == ag->duplex) ? "Full" : "Half");
|
||||
|
||||
DBG("%s: fifo_cfg0=%#x, fifo_cfg1=%#x, fifo_cfg2=%#x\n",
|
||||
ag->dev->name,
|
||||
ag71xx_rr(ag, AG71XX_REG_FIFO_CFG0),
|
||||
ag71xx_rr(ag, AG71XX_REG_FIFO_CFG1),
|
||||
ag71xx_rr(ag, AG71XX_REG_FIFO_CFG2));
|
||||
|
||||
DBG("%s: fifo_cfg3=%#x, fifo_cfg4=%#x, fifo_cfg5=%#x\n",
|
||||
ag->dev->name,
|
||||
ag71xx_rr(ag, AG71XX_REG_FIFO_CFG3),
|
||||
ag71xx_rr(ag, AG71XX_REG_FIFO_CFG4),
|
||||
ag71xx_rr(ag, AG71XX_REG_FIFO_CFG5));
|
||||
|
||||
DBG("%s: mac_cfg2=%#x, mac_ifctl=%#x, mii_ctrl=%#x\n",
|
||||
ag->dev->name,
|
||||
ag71xx_rr(ag, AG71XX_REG_MAC_CFG2),
|
||||
ag71xx_rr(ag, AG71XX_REG_MAC_IFCTL),
|
||||
ag71xx_mii_ctrl_rr(ag));
|
||||
}
|
||||
|
||||
#if defined(CONFIG_MII) || defined(CONFIG_CMD_MII)
|
||||
static int ag71xx_getMiiSpeed(struct ag71xx *ag)
|
||||
{
|
||||
uint16_t phyreg, cap;
|
||||
|
||||
if (miiphy_read(ag->phyname, ag->phyid,
|
||||
PHY_BMSR, &phyreg)) {
|
||||
puts("PHY_BMSR read failed, assuming no link\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ((phyreg & PHY_BMSR_LS) == 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (miiphy_read(ag->phyname, ag->phyid,
|
||||
PHY_1000BTSR, &phyreg))
|
||||
return -1;
|
||||
|
||||
if (phyreg & PHY_1000BTSR_1000FD) {
|
||||
ag->speed = SPEED_1000;
|
||||
ag->duplex = 1;
|
||||
} else if (phyreg & PHY_1000BTSR_1000HD) {
|
||||
ag->speed = SPEED_1000;
|
||||
ag->duplex = 0;
|
||||
} else {
|
||||
if (miiphy_read(ag->phyname, ag->phyid,
|
||||
PHY_ANAR, &cap))
|
||||
return -1;
|
||||
|
||||
if (miiphy_read(ag->phyname, ag->phyid,
|
||||
PHY_ANLPAR, &phyreg))
|
||||
return -1;
|
||||
|
||||
cap &= phyreg;
|
||||
if (cap & PHY_ANLPAR_TXFD) {
|
||||
ag->speed = SPEED_100;
|
||||
ag->duplex = 1;
|
||||
} else if (cap & PHY_ANLPAR_TX) {
|
||||
ag->speed = SPEED_100;
|
||||
ag->duplex = 0;
|
||||
} else if (cap & PHY_ANLPAR_10FD) {
|
||||
ag->speed = SPEED_10;
|
||||
ag->duplex = 1;
|
||||
} else {
|
||||
ag->speed = SPEED_10;
|
||||
ag->duplex = 0;
|
||||
}
|
||||
}
|
||||
|
||||
ag->link = 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int ag71xx_hw_start(struct eth_device *dev, bd_t * bd)
|
||||
{
|
||||
struct ag71xx *ag = (struct ag71xx *) dev->priv;
|
||||
|
||||
ag71xx_dma_reset(ag);
|
||||
|
||||
ag71xx_ring_rx_clean(ag);
|
||||
ag71xx_ring_tx_init(ag);
|
||||
|
||||
ag71xx_wr(ag, AG71XX_REG_TX_DESC,
|
||||
(u32) virt_to_phys(ag->tx_ring.descs_dma));
|
||||
ag71xx_wr(ag, AG71XX_REG_RX_DESC,
|
||||
(u32) virt_to_phys(ag->rx_ring.descs_dma));
|
||||
|
||||
ag71xx_hw_set_macaddr(ag, ag->dev->enetaddr);
|
||||
|
||||
if (ag->phyfixed) {
|
||||
ag->link = 1;
|
||||
ag->duplex = 1;
|
||||
ag->speed = SPEED_1000;
|
||||
} else {
|
||||
|
||||
#if (defined(CONFIG_MII) || defined(CONFIG_CMD_MII))
|
||||
if (ag71xx_getMiiSpeed(ag))
|
||||
return -1;
|
||||
#else
|
||||
/* only fixed, without mii */
|
||||
return -1;
|
||||
#endif
|
||||
|
||||
}
|
||||
ag71xx_link_adjust(ag);
|
||||
|
||||
DBG("%s: txdesc reg: %#08x rxdesc reg: %#08x\n",
|
||||
ag->dev->name,
|
||||
ag71xx_rr(ag, AG71XX_REG_TX_DESC),
|
||||
ag71xx_rr(ag, AG71XX_REG_RX_DESC));
|
||||
|
||||
/* start RX engine */
|
||||
ag71xx_wr(ag, AG71XX_REG_RX_CTRL, RX_CTRL_RXE);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define FIFO_CFG0_INIT (FIFO_CFG0_ALL << FIFO_CFG0_ENABLE_SHIFT)
|
||||
|
||||
#define FIFO_CFG4_INIT (FIFO_CFG4_DE | FIFO_CFG4_DV | FIFO_CFG4_FC | \
|
||||
FIFO_CFG4_CE | FIFO_CFG4_CR | FIFO_CFG4_LM | \
|
||||
FIFO_CFG4_LO | FIFO_CFG4_OK | FIFO_CFG4_MC | \
|
||||
FIFO_CFG4_BC | FIFO_CFG4_DR | FIFO_CFG4_LE | \
|
||||
FIFO_CFG4_CF | FIFO_CFG4_PF | FIFO_CFG4_UO | \
|
||||
FIFO_CFG4_VT)
|
||||
|
||||
#define FIFO_CFG5_INIT (FIFO_CFG5_DE | FIFO_CFG5_DV | FIFO_CFG5_FC | \
|
||||
FIFO_CFG5_CE | FIFO_CFG5_LO | FIFO_CFG5_OK | \
|
||||
FIFO_CFG5_MC | FIFO_CFG5_BC | FIFO_CFG5_DR | \
|
||||
FIFO_CFG5_CF | FIFO_CFG5_PF | FIFO_CFG5_VT | \
|
||||
FIFO_CFG5_LE | FIFO_CFG5_FT | FIFO_CFG5_16 | \
|
||||
FIFO_CFG5_17 | FIFO_CFG5_SF)
|
||||
|
||||
static int ag71xx_hw_init(struct ag71xx *ag)
|
||||
{
|
||||
int ret = 0;
|
||||
uint32_t reg;
|
||||
uint32_t mask, mii_type;
|
||||
|
||||
if (ag->macNum == 0) {
|
||||
mask = (RESET_MODULE_GE0_MAC | RESET_MODULE_GE0_PHY);
|
||||
mii_type = 0x13;
|
||||
} else {
|
||||
mask = (RESET_MODULE_GE1_MAC | RESET_MODULE_GE1_PHY);
|
||||
mii_type = 0x11;
|
||||
}
|
||||
|
||||
// mac soft reset
|
||||
ag71xx_sb(ag, AG71XX_REG_MAC_CFG1, MAC_CFG1_SR);
|
||||
udelay(20);
|
||||
|
||||
// device stop
|
||||
reg = ar71xx_reset_rr(AR91XX_RESET_REG_RESET_MODULE);
|
||||
ar71xx_reset_wr(AR91XX_RESET_REG_RESET_MODULE, reg | mask);
|
||||
udelay(100 * 1000);
|
||||
|
||||
// device start
|
||||
reg = ar71xx_reset_rr(AR91XX_RESET_REG_RESET_MODULE);
|
||||
ar71xx_reset_wr(AR91XX_RESET_REG_RESET_MODULE, reg & ~mask);
|
||||
udelay(100 * 1000);
|
||||
|
||||
/* setup MAC configuration registers */
|
||||
ag71xx_wr(ag, AG71XX_REG_MAC_CFG1, (MAC_CFG1_RXE | MAC_CFG1_TXE));
|
||||
|
||||
ag71xx_sb(ag, AG71XX_REG_MAC_CFG2,
|
||||
MAC_CFG2_PAD_CRC_EN | MAC_CFG2_LEN_CHECK);
|
||||
|
||||
/* setup FIFO configuration register 0 */
|
||||
ag71xx_wr(ag, AG71XX_REG_FIFO_CFG0, FIFO_CFG0_INIT);
|
||||
|
||||
/* setup MII interface type */
|
||||
ag71xx_mii_ctrl_set_if(ag, ag->mii_if);
|
||||
|
||||
/* setup mdio clock divisor */
|
||||
ag71xx_wr(ag, AG71XX_REG_MII_CFG, MII_CFG_CLK_DIV_20);
|
||||
|
||||
/* setup FIFO configuration registers */
|
||||
ag71xx_sb(ag, AG71XX_REG_FIFO_CFG4, FIFO_CFG4_INIT);
|
||||
ag71xx_wr(ag, AG71XX_REG_FIFO_CFG1, 0x0fff0000);
|
||||
ag71xx_wr(ag, AG71XX_REG_FIFO_CFG2, 0x00001fff);
|
||||
ag71xx_wr(ag, AG71XX_REG_FIFO_CFG5, FIFO_CFG5_INIT);
|
||||
|
||||
ag71xx_dma_reset(ag);
|
||||
|
||||
ret = ag71xx_rings_init(ag);
|
||||
if (ret)
|
||||
return -1;
|
||||
|
||||
ag71xx_wr(ag, AG71XX_REG_TX_DESC,
|
||||
(u32) virt_to_phys(ag->tx_ring.descs_dma));
|
||||
ag71xx_wr(ag, AG71XX_REG_RX_DESC,
|
||||
(u32) virt_to_phys(ag->rx_ring.descs_dma));
|
||||
|
||||
ag71xx_hw_set_macaddr(ag, ag->dev->enetaddr);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_MII) || defined(CONFIG_CMD_MII)
|
||||
#define AG71XX_MDIO_RETRY 1000
|
||||
#define AG71XX_MDIO_DELAY 5
|
||||
|
||||
static inline struct ag71xx *ag71xx_name2mac(char *devname)
|
||||
{
|
||||
if (strcmp(devname, agtable[0].dev->name) == 0)
|
||||
return &agtable[0];
|
||||
else if (strcmp(devname, agtable[1].dev->name) == 0)
|
||||
return &agtable[1];
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline void ag71xx_mdio_wr(struct ag71xx *ag, unsigned reg,
|
||||
u32 value)
|
||||
{
|
||||
uint32_t r;
|
||||
|
||||
r = ag->mac_base + reg;
|
||||
writel(value, r);
|
||||
|
||||
/* flush write */
|
||||
(void) readl(r);
|
||||
}
|
||||
|
||||
static inline u32 ag71xx_mdio_rr(struct ag71xx *ag, unsigned reg)
|
||||
{
|
||||
return readl(ag->mac_base + reg);
|
||||
}
|
||||
|
||||
static int ag71xx_mdio_read(char *devname, unsigned char addr,
|
||||
unsigned char reg, unsigned short *val)
|
||||
{
|
||||
struct ag71xx *ag = ag71xx_name2mac(devname);
|
||||
uint16_t regData;
|
||||
int i;
|
||||
|
||||
ag71xx_mdio_wr(ag, AG71XX_REG_MII_CMD, MII_CMD_WRITE);
|
||||
ag71xx_mdio_wr(ag, AG71XX_REG_MII_ADDR,
|
||||
((addr & 0xff) << MII_ADDR_SHIFT) | (reg & 0xff));
|
||||
ag71xx_mdio_wr(ag, AG71XX_REG_MII_CMD, MII_CMD_READ);
|
||||
|
||||
i = AG71XX_MDIO_RETRY;
|
||||
while (ag71xx_mdio_rr(ag, AG71XX_REG_MII_IND) & MII_IND_BUSY) {
|
||||
if (i-- == 0) {
|
||||
printf("%s: mii_read timed out\n",
|
||||
ag->dev->name);
|
||||
return -1;
|
||||
}
|
||||
udelay(AG71XX_MDIO_DELAY);
|
||||
}
|
||||
|
||||
regData = (uint16_t) ag71xx_mdio_rr(ag, AG71XX_REG_MII_STATUS) & 0xffff;
|
||||
ag71xx_mdio_wr(ag, AG71XX_REG_MII_CMD, MII_CMD_WRITE);
|
||||
|
||||
DBG("mii_read: addr=%04x, reg=%04x, value=%04x\n", addr, reg, regData);
|
||||
|
||||
if (val)
|
||||
*val = regData;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ag71xx_mdio_write(char *devname, unsigned char addr,
|
||||
unsigned char reg, unsigned short val)
|
||||
{
|
||||
struct ag71xx *ag = ag71xx_name2mac(devname);
|
||||
int i;
|
||||
|
||||
if (ag == NULL)
|
||||
return 1;
|
||||
|
||||
DBG("mii_write: addr=%04x, reg=%04x, value=%04x\n", addr, reg, val);
|
||||
|
||||
ag71xx_mdio_wr(ag, AG71XX_REG_MII_ADDR,
|
||||
((addr & 0xff) << MII_ADDR_SHIFT) | (reg & 0xff));
|
||||
ag71xx_mdio_wr(ag, AG71XX_REG_MII_CTRL, val);
|
||||
|
||||
i = AG71XX_MDIO_RETRY;
|
||||
while (ag71xx_mdio_rr(ag, AG71XX_REG_MII_IND) & MII_IND_BUSY) {
|
||||
if (i-- == 0) {
|
||||
printf("%s: mii_write timed out\n",
|
||||
ag->dev->name);
|
||||
break;
|
||||
}
|
||||
udelay(AG71XX_MDIO_DELAY);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
int ag71xx_register(bd_t * bis, char *phyname[], uint16_t phyid[], uint16_t phyfixed[])
|
||||
{
|
||||
int i, num = 0;
|
||||
u8 used_ports[MAX_AG71XX_DEVS] = CONFIG_AG71XX_PORTS;
|
||||
|
||||
for (i = 0; i < MAX_AG71XX_DEVS; i++) {
|
||||
/*skip if port is configured not to use */
|
||||
if (used_ports[i] == 0)
|
||||
continue;
|
||||
|
||||
agtable[i].dev = malloc(sizeof(struct eth_device));
|
||||
if (agtable[i].dev == NULL) {
|
||||
puts("malloc failed\n");
|
||||
return 0;
|
||||
}
|
||||
memset(agtable[i].dev, 0, sizeof(struct eth_device));
|
||||
sprintf(agtable[i].dev->name, "eth%d", i);
|
||||
|
||||
agtable[i].dev->iobase = 0;
|
||||
agtable[i].dev->init = ag71xx_hw_start;
|
||||
agtable[i].dev->halt = ag71xx_halt;
|
||||
agtable[i].dev->send = ag71xx_send;
|
||||
agtable[i].dev->recv = ag71xx_recv;
|
||||
agtable[i].dev->priv = (void *) (&agtable[i]);
|
||||
agtable[i].macNum = i;
|
||||
eth_register(agtable[i].dev);
|
||||
#if defined(CONFIG_MII) || defined(CONFIG_CMD_MII)
|
||||
|
||||
if ((phyname == NULL) || (phyid == NULL) || (phyfixed == NULL))
|
||||
return -1;
|
||||
|
||||
agtable[i].phyname = strdup(phyname[i]);
|
||||
agtable[i].phyid = phyid[i];
|
||||
agtable[i].phyfixed = phyfixed[i];
|
||||
|
||||
miiphy_register(agtable[i].dev->name, ag71xx_mdio_read,
|
||||
ag71xx_mdio_write);
|
||||
#endif
|
||||
|
||||
if (ag71xx_hw_init(&agtable[i]))
|
||||
continue;
|
||||
|
||||
num++;
|
||||
}
|
||||
|
||||
return num;
|
||||
}
|
||||
374
package/boot/uboot-ar71xx/files/drivers/net/ag71xx.h
Normal file
374
package/boot/uboot-ar71xx/files/drivers/net/ag71xx.h
Normal file
@@ -0,0 +1,374 @@
|
||||
/*
|
||||
* Atheros AR71xx built-in ethernet mac driver
|
||||
*
|
||||
* Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org>
|
||||
* Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
|
||||
*
|
||||
* Based on Atheros' AG7100 driver
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 as published
|
||||
* by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#ifndef __AG71XX_H
|
||||
#define __AG71XX_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/bitops.h>
|
||||
|
||||
#include <asm/ar71xx.h>
|
||||
|
||||
// controller has 2 ports
|
||||
#define MAX_AG71XX_DEVS 2
|
||||
|
||||
#define ETH_FCS_LEN 4
|
||||
|
||||
#define SPEED_10 10
|
||||
#define SPEED_100 100
|
||||
#define SPEED_1000 1000
|
||||
|
||||
|
||||
#define AG71XX_INT_ERR (AG71XX_INT_RX_BE | AG71XX_INT_TX_BE)
|
||||
#define AG71XX_INT_TX (AG71XX_INT_TX_PS)
|
||||
#define AG71XX_INT_RX (AG71XX_INT_RX_PR | AG71XX_INT_RX_OF)
|
||||
|
||||
#define AG71XX_INT_POLL (AG71XX_INT_RX | AG71XX_INT_TX)
|
||||
#define AG71XX_INT_INIT (AG71XX_INT_ERR | AG71XX_INT_POLL)
|
||||
|
||||
#define AG71XX_TX_FIFO_LEN 2048
|
||||
#define AG71XX_TX_MTU_LEN 1536
|
||||
#define AG71XX_RX_PKT_RESERVE 64
|
||||
#define AG71XX_RX_PKT_SIZE \
|
||||
(AG71XX_RX_PKT_RESERVE + ETH_HLEN + ETH_FRAME_LEN + ETH_FCS_LEN)
|
||||
|
||||
#ifndef CONFIG_SYS_RX_ETH_BUFFER
|
||||
#define AG71XX_TX_RING_SIZE 4
|
||||
#define AG71XX_RX_RING_SIZE 4
|
||||
#else
|
||||
#define AG71XX_TX_RING_SIZE CONFIG_SYS_RX_ETH_BUFFER
|
||||
#define AG71XX_RX_RING_SIZE CONFIG_SYS_RX_ETH_BUFFER
|
||||
#endif
|
||||
|
||||
#define AG71XX_TX_THRES_STOP (AG71XX_TX_RING_SIZE - 4)
|
||||
#define AG71XX_TX_THRES_WAKEUP \
|
||||
(AG71XX_TX_RING_SIZE - (AG71XX_TX_RING_SIZE / 4))
|
||||
|
||||
|
||||
|
||||
|
||||
struct ag71xx_desc {
|
||||
u32 data;
|
||||
u32 ctrl;
|
||||
#define DESC_EMPTY BIT(31)
|
||||
#define DESC_MORE BIT(24)
|
||||
#define DESC_PKTLEN_M 0xfff
|
||||
u32 next;
|
||||
u32 pad;
|
||||
} __attribute__((aligned(4)));
|
||||
|
||||
struct ag71xx_buf {
|
||||
struct sk_buff *skb;
|
||||
struct ag71xx_desc *desc;
|
||||
dma_addr_t dma_addr;
|
||||
u32 pad;
|
||||
};
|
||||
|
||||
struct ag71xx_ring {
|
||||
struct ag71xx_buf *buf;
|
||||
u8 *descs_cpu;
|
||||
u8 *descs_dma;
|
||||
unsigned int desc_size;
|
||||
unsigned int curr;
|
||||
unsigned int size;
|
||||
};
|
||||
|
||||
struct ag71xx {
|
||||
uint32_t mac_base;
|
||||
uint32_t mii_ctrl;
|
||||
|
||||
struct eth_device *dev;
|
||||
|
||||
struct ag71xx_ring rx_ring;
|
||||
struct ag71xx_ring tx_ring;
|
||||
|
||||
char *phyname;
|
||||
u16 phyid;
|
||||
u16 phyfixed;
|
||||
uint32_t link;
|
||||
uint32_t speed;
|
||||
int32_t duplex;
|
||||
uint32_t macNum;
|
||||
uint32_t mii_if;
|
||||
};
|
||||
|
||||
void ag71xx_link_adjust(struct ag71xx *ag);
|
||||
|
||||
int ag71xx_phy_connect(struct ag71xx *ag);
|
||||
void ag71xx_phy_disconnect(struct ag71xx *ag);
|
||||
void ag71xx_phy_start(struct ag71xx *ag);
|
||||
void ag71xx_phy_stop(struct ag71xx *ag);
|
||||
|
||||
static inline int ag71xx_desc_empty(struct ag71xx_desc *desc)
|
||||
{
|
||||
return ((desc->ctrl & DESC_EMPTY) != 0);
|
||||
}
|
||||
|
||||
static inline int ag71xx_desc_pktlen(struct ag71xx_desc *desc)
|
||||
{
|
||||
return (desc->ctrl & DESC_PKTLEN_M);
|
||||
}
|
||||
|
||||
/* Register offsets */
|
||||
#define AG71XX_REG_MAC_CFG1 0x0000
|
||||
#define AG71XX_REG_MAC_CFG2 0x0004
|
||||
#define AG71XX_REG_MAC_IPG 0x0008
|
||||
#define AG71XX_REG_MAC_HDX 0x000c
|
||||
#define AG71XX_REG_MAC_MFL 0x0010
|
||||
#define AG71XX_REG_MII_CFG 0x0020
|
||||
#define AG71XX_REG_MII_CMD 0x0024
|
||||
#define AG71XX_REG_MII_ADDR 0x0028
|
||||
#define AG71XX_REG_MII_CTRL 0x002c
|
||||
#define AG71XX_REG_MII_STATUS 0x0030
|
||||
#define AG71XX_REG_MII_IND 0x0034
|
||||
#define AG71XX_REG_MAC_IFCTL 0x0038
|
||||
#define AG71XX_REG_MAC_ADDR1 0x0040
|
||||
#define AG71XX_REG_MAC_ADDR2 0x0044
|
||||
#define AG71XX_REG_FIFO_CFG0 0x0048
|
||||
#define AG71XX_REG_FIFO_CFG1 0x004c
|
||||
#define AG71XX_REG_FIFO_CFG2 0x0050
|
||||
#define AG71XX_REG_FIFO_CFG3 0x0054
|
||||
#define AG71XX_REG_FIFO_CFG4 0x0058
|
||||
#define AG71XX_REG_FIFO_CFG5 0x005c
|
||||
#define AG71XX_REG_FIFO_RAM0 0x0060
|
||||
#define AG71XX_REG_FIFO_RAM1 0x0064
|
||||
#define AG71XX_REG_FIFO_RAM2 0x0068
|
||||
#define AG71XX_REG_FIFO_RAM3 0x006c
|
||||
#define AG71XX_REG_FIFO_RAM4 0x0070
|
||||
#define AG71XX_REG_FIFO_RAM5 0x0074
|
||||
#define AG71XX_REG_FIFO_RAM6 0x0078
|
||||
#define AG71XX_REG_FIFO_RAM7 0x007c
|
||||
|
||||
#define AG71XX_REG_TX_CTRL 0x0180
|
||||
#define AG71XX_REG_TX_DESC 0x0184
|
||||
#define AG71XX_REG_TX_STATUS 0x0188
|
||||
#define AG71XX_REG_RX_CTRL 0x018c
|
||||
#define AG71XX_REG_RX_DESC 0x0190
|
||||
#define AG71XX_REG_RX_STATUS 0x0194
|
||||
#define AG71XX_REG_INT_ENABLE 0x0198
|
||||
#define AG71XX_REG_INT_STATUS 0x019c
|
||||
|
||||
#define MAC_CFG1_TXE BIT(0) /* Tx Enable */
|
||||
#define MAC_CFG1_STX BIT(1) /* Synchronize Tx Enable */
|
||||
#define MAC_CFG1_RXE BIT(2) /* Rx Enable */
|
||||
#define MAC_CFG1_SRX BIT(3) /* Synchronize Rx Enable */
|
||||
#define MAC_CFG1_TFC BIT(4) /* Tx Flow Control Enable */
|
||||
#define MAC_CFG1_RFC BIT(5) /* Rx Flow Control Enable */
|
||||
#define MAC_CFG1_LB BIT(8) /* Loopback mode */
|
||||
#define MAC_CFG1_SR BIT(31) /* Soft Reset */
|
||||
|
||||
#define MAC_CFG2_FDX BIT(0)
|
||||
#define MAC_CFG2_CRC_EN BIT(1)
|
||||
#define MAC_CFG2_PAD_CRC_EN BIT(2)
|
||||
#define MAC_CFG2_LEN_CHECK BIT(4)
|
||||
#define MAC_CFG2_HUGE_FRAME_EN BIT(5)
|
||||
#define MAC_CFG2_IF_1000 BIT(9)
|
||||
#define MAC_CFG2_IF_10_100 BIT(8)
|
||||
|
||||
#define FIFO_CFG0_WTM BIT(0) /* Watermark Module */
|
||||
#define FIFO_CFG0_RXS BIT(1) /* Rx System Module */
|
||||
#define FIFO_CFG0_RXF BIT(2) /* Rx Fabric Module */
|
||||
#define FIFO_CFG0_TXS BIT(3) /* Tx System Module */
|
||||
#define FIFO_CFG0_TXF BIT(4) /* Tx Fabric Module */
|
||||
#define FIFO_CFG0_ALL (FIFO_CFG0_WTM | FIFO_CFG0_RXS | FIFO_CFG0_RXF \
|
||||
| FIFO_CFG0_TXS | FIFO_CFG0_TXF)
|
||||
|
||||
#define FIFO_CFG0_ENABLE_SHIFT 8
|
||||
|
||||
#define FIFO_CFG4_DE BIT(0) /* Drop Event */
|
||||
#define FIFO_CFG4_DV BIT(1) /* RX_DV Event */
|
||||
#define FIFO_CFG4_FC BIT(2) /* False Carrier */
|
||||
#define FIFO_CFG4_CE BIT(3) /* Code Error */
|
||||
#define FIFO_CFG4_CR BIT(4) /* CRC error */
|
||||
#define FIFO_CFG4_LM BIT(5) /* Length Mismatch */
|
||||
#define FIFO_CFG4_LO BIT(6) /* Length out of range */
|
||||
#define FIFO_CFG4_OK BIT(7) /* Packet is OK */
|
||||
#define FIFO_CFG4_MC BIT(8) /* Multicast Packet */
|
||||
#define FIFO_CFG4_BC BIT(9) /* Broadcast Packet */
|
||||
#define FIFO_CFG4_DR BIT(10) /* Dribble */
|
||||
#define FIFO_CFG4_LE BIT(11) /* Long Event */
|
||||
#define FIFO_CFG4_CF BIT(12) /* Control Frame */
|
||||
#define FIFO_CFG4_PF BIT(13) /* Pause Frame */
|
||||
#define FIFO_CFG4_UO BIT(14) /* Unsupported Opcode */
|
||||
#define FIFO_CFG4_VT BIT(15) /* VLAN tag detected */
|
||||
#define FIFO_CFG4_FT BIT(16) /* Frame Truncated */
|
||||
#define FIFO_CFG4_UC BIT(17) /* Unicast Packet */
|
||||
|
||||
#define FIFO_CFG5_DE BIT(0) /* Drop Event */
|
||||
#define FIFO_CFG5_DV BIT(1) /* RX_DV Event */
|
||||
#define FIFO_CFG5_FC BIT(2) /* False Carrier */
|
||||
#define FIFO_CFG5_CE BIT(3) /* Code Error */
|
||||
#define FIFO_CFG5_LM BIT(4) /* Length Mismatch */
|
||||
#define FIFO_CFG5_LO BIT(5) /* Length Out of Range */
|
||||
#define FIFO_CFG5_OK BIT(6) /* Packet is OK */
|
||||
#define FIFO_CFG5_MC BIT(7) /* Multicast Packet */
|
||||
#define FIFO_CFG5_BC BIT(8) /* Broadcast Packet */
|
||||
#define FIFO_CFG5_DR BIT(9) /* Dribble */
|
||||
#define FIFO_CFG5_CF BIT(10) /* Control Frame */
|
||||
#define FIFO_CFG5_PF BIT(11) /* Pause Frame */
|
||||
#define FIFO_CFG5_UO BIT(12) /* Unsupported Opcode */
|
||||
#define FIFO_CFG5_VT BIT(13) /* VLAN tag detected */
|
||||
#define FIFO_CFG5_LE BIT(14) /* Long Event */
|
||||
#define FIFO_CFG5_FT BIT(15) /* Frame Truncated */
|
||||
#define FIFO_CFG5_16 BIT(16) /* unknown */
|
||||
#define FIFO_CFG5_17 BIT(17) /* unknown */
|
||||
#define FIFO_CFG5_SF BIT(18) /* Short Frame */
|
||||
#define FIFO_CFG5_BM BIT(19) /* Byte Mode */
|
||||
|
||||
#define AG71XX_INT_TX_PS BIT(0)
|
||||
#define AG71XX_INT_TX_UR BIT(1)
|
||||
#define AG71XX_INT_TX_BE BIT(3)
|
||||
#define AG71XX_INT_RX_PR BIT(4)
|
||||
#define AG71XX_INT_RX_OF BIT(6)
|
||||
#define AG71XX_INT_RX_BE BIT(7)
|
||||
|
||||
#define MAC_IFCTL_SPEED BIT(16)
|
||||
|
||||
#define MII_CFG_CLK_DIV_4 0
|
||||
#define MII_CFG_CLK_DIV_6 2
|
||||
#define MII_CFG_CLK_DIV_8 3
|
||||
#define MII_CFG_CLK_DIV_10 4
|
||||
#define MII_CFG_CLK_DIV_14 5
|
||||
#define MII_CFG_CLK_DIV_20 6
|
||||
#define MII_CFG_CLK_DIV_28 7
|
||||
#define MII_CFG_RESET BIT(31)
|
||||
|
||||
#define MII_CMD_WRITE 0x0
|
||||
#define MII_CMD_READ 0x1
|
||||
#define MII_ADDR_SHIFT 8
|
||||
#define MII_IND_BUSY BIT(0)
|
||||
#define MII_IND_INVALID BIT(2)
|
||||
|
||||
#define TX_CTRL_TXE BIT(0) /* Tx Enable */
|
||||
|
||||
#define TX_STATUS_PS BIT(0) /* Packet Sent */
|
||||
#define TX_STATUS_UR BIT(1) /* Tx Underrun */
|
||||
#define TX_STATUS_BE BIT(3) /* Bus Error */
|
||||
|
||||
#define RX_CTRL_RXE BIT(0) /* Rx Enable */
|
||||
|
||||
#define RX_STATUS_PR BIT(0) /* Packet Received */
|
||||
#define RX_STATUS_OF BIT(2) /* Rx Overflow */
|
||||
#define RX_STATUS_BE BIT(3) /* Bus Error */
|
||||
|
||||
#define MII_CTRL_IF_MASK 3
|
||||
#define MII_CTRL_SPEED_SHIFT 4
|
||||
#define MII_CTRL_SPEED_MASK 3
|
||||
#define MII_CTRL_SPEED_10 0
|
||||
#define MII_CTRL_SPEED_100 1
|
||||
#define MII_CTRL_SPEED_1000 2
|
||||
|
||||
static inline void ag71xx_wr(struct ag71xx *ag, unsigned reg, u32 value)
|
||||
{
|
||||
__raw_writel(value, ag->mac_base + reg);
|
||||
/* flush write */
|
||||
(void) __raw_readl(ag->mac_base + reg);
|
||||
}
|
||||
|
||||
static inline u32 ag71xx_rr(struct ag71xx *ag, unsigned reg)
|
||||
{
|
||||
return __raw_readl(ag->mac_base + reg);
|
||||
}
|
||||
|
||||
static inline void ag71xx_sb(struct ag71xx *ag, unsigned reg, u32 mask)
|
||||
{
|
||||
uint32_t r;
|
||||
|
||||
r = ag->mac_base + reg;
|
||||
__raw_writel(__raw_readl(r) | mask, r);
|
||||
/* flush write */
|
||||
(void)__raw_readl(r);
|
||||
}
|
||||
|
||||
static inline void ag71xx_cb(struct ag71xx *ag, unsigned reg, u32 mask)
|
||||
{
|
||||
uint32_t r;
|
||||
|
||||
r = ag->mac_base + reg;
|
||||
__raw_writel(__raw_readl(r) & ~mask, r);
|
||||
/* flush write */
|
||||
(void) __raw_readl(r);
|
||||
}
|
||||
|
||||
static inline void ag71xx_int_enable(struct ag71xx *ag, u32 ints)
|
||||
{
|
||||
ag71xx_sb(ag, AG71XX_REG_INT_ENABLE, ints);
|
||||
}
|
||||
|
||||
static inline void ag71xx_int_disable(struct ag71xx *ag, u32 ints)
|
||||
{
|
||||
ag71xx_cb(ag, AG71XX_REG_INT_ENABLE, ints);
|
||||
}
|
||||
|
||||
static inline void ag71xx_mii_ctrl_wr(struct ag71xx *ag, u32 value)
|
||||
{
|
||||
__raw_writel(value, ag->mii_ctrl);
|
||||
|
||||
/* flush write */
|
||||
__raw_readl(ag->mii_ctrl);
|
||||
}
|
||||
|
||||
static inline u32 ag71xx_mii_ctrl_rr(struct ag71xx *ag)
|
||||
{
|
||||
return __raw_readl(ag->mii_ctrl);
|
||||
}
|
||||
|
||||
static void inline ag71xx_mii_ctrl_set_if(struct ag71xx *ag,
|
||||
unsigned int mii_if)
|
||||
{
|
||||
u32 t;
|
||||
|
||||
t = ag71xx_mii_ctrl_rr(ag);
|
||||
t &= ~(MII_CTRL_IF_MASK);
|
||||
t |= (mii_if & MII_CTRL_IF_MASK);
|
||||
ag71xx_mii_ctrl_wr(ag, t);
|
||||
}
|
||||
|
||||
static void inline ag71xx_mii_ctrl_set_speed(struct ag71xx *ag,
|
||||
unsigned int speed)
|
||||
{
|
||||
u32 t;
|
||||
|
||||
t = ag71xx_mii_ctrl_rr(ag);
|
||||
t &= ~(MII_CTRL_SPEED_MASK << MII_CTRL_SPEED_SHIFT);
|
||||
t |= (speed & MII_CTRL_SPEED_MASK) << MII_CTRL_SPEED_SHIFT;
|
||||
ag71xx_mii_ctrl_wr(ag, t);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_AG71XX_AR8216_SUPPORT
|
||||
void ag71xx_add_ar8216_header(struct ag71xx *ag, struct sk_buff *skb);
|
||||
int ag71xx_remove_ar8216_header(struct ag71xx *ag, struct sk_buff *skb,
|
||||
int pktlen);
|
||||
static inline int ag71xx_has_ar8216(struct ag71xx *ag)
|
||||
{
|
||||
return ag71xx_get_pdata(ag)->has_ar8216;
|
||||
}
|
||||
#else
|
||||
static inline void ag71xx_add_ar8216_header(struct ag71xx *ag,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
}
|
||||
|
||||
static inline int ag71xx_remove_ar8216_header(struct ag71xx *ag,
|
||||
struct sk_buff *skb,
|
||||
int pktlen)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline int ag71xx_has_ar8216(struct ag71xx *ag)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _AG71XX_H */
|
||||
188
package/boot/uboot-ar71xx/files/drivers/net/phy/rtl8366.h
Normal file
188
package/boot/uboot-ar71xx/files/drivers/net/phy/rtl8366.h
Normal file
@@ -0,0 +1,188 @@
|
||||
/*
|
||||
* (C) Copyright 2010
|
||||
* Michael Kurz <michi.kurz@googlemail.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
|
||||
*/
|
||||
|
||||
#ifndef RTL8366_MII_H
|
||||
#define RTL8366_MII_H
|
||||
|
||||
#define MII_CONTROL_REG 0
|
||||
#define MII_STATUS_REG 1
|
||||
#define MII_PHY_ID0 2
|
||||
#define MII_PHY_ID1 3
|
||||
#define MII_LOCAL_CAP 4
|
||||
#define MII_REMOTE_CAP 5
|
||||
#define MII_EXT_AUTONEG 6
|
||||
#define MII_LOCAL_NEXT_PAGE 7
|
||||
#define MII_REMOTE_NEXT_PAGE 8
|
||||
#define MII_GIGA_CONTROL 9
|
||||
#define MII_GIGA_STATUS 10
|
||||
#define MII_EXT_STATUS_REG 15
|
||||
|
||||
/* Control register */
|
||||
#define MII_CONTROL_1000MBPS 6
|
||||
#define MII_CONTROL_COLL_TEST 7
|
||||
#define MII_CONTROL_FULLDUPLEX 8
|
||||
#define MII_CONTROL_RENEG 9
|
||||
#define MII_CONTROL_ISOLATE 10
|
||||
#define MII_CONTROL_POWERDOWN 11
|
||||
#define MII_CONTROL_AUTONEG 12
|
||||
#define MII_CONTROL_100MBPS 13
|
||||
#define MII_CONTROL_LOOPBACK 14
|
||||
#define MII_CONTROL_RESET 15
|
||||
|
||||
/* Status/Extended status register */
|
||||
/* Basic status */
|
||||
#define MII_STATUS_CAPABILITY 0
|
||||
#define MII_STATUS_JABBER 1
|
||||
#define MII_STATUS_LINK_UP 2
|
||||
#define MII_STATUS_AUTONEG_ABLE 3
|
||||
#define MII_STATUS_REMOTE_FAULT 4
|
||||
#define MII_STATUS_AUTONEG_DONE 5
|
||||
#define MII_STATUS_NO_PREAMBLE 6
|
||||
#define MII_STATUS_RESERVED 7
|
||||
#define MII_STATUS_EXTENDED 8
|
||||
#define MII_STATUS_100_T2_HALF 9
|
||||
#define MII_STATUS_100_T2_FULL 10
|
||||
#define MII_STATUS_10_TX_HALF 11
|
||||
#define MII_STATUS_10_TX_FULL 12
|
||||
#define MII_STATUS_100_TX_HALF 13
|
||||
#define MII_STATUS_100_TX_FULL 14
|
||||
#define MII_STATUS_100_T4 15
|
||||
|
||||
#define MII_GIGA_CONTROL_HALF 8
|
||||
#define MII_GIGA_CONTROL_FULL 9
|
||||
#define MII_GIGA_STATUS_HALF 10
|
||||
#define MII_GIGA_STATUS_FULL 11
|
||||
|
||||
/* Extended status */
|
||||
#define MII_STATUS_1000_T_HALF 12
|
||||
#define MII_STATUS_1000_T_FULL 13
|
||||
#define MII_STATUS_1000_X_HALF 14
|
||||
#define MII_STATUS_1000_X_FULL 15
|
||||
|
||||
/* Local/Remmote capability register */
|
||||
#define MII_CAP_10BASE_TX 5
|
||||
#define MII_CAP_10BASE_TX_FULL 6
|
||||
#define MII_CAP_100BASE_TX 7
|
||||
#define MII_CAP_100BASE_TX_FULL 8
|
||||
#define MII_CAP_100BASE_T4 9
|
||||
#define MII_CAP_SYMM_PAUSE 10
|
||||
#define MII_CAP_ASYMM_PAUSE 11
|
||||
#define MII_CAP_RESERVED 12
|
||||
#define MII_CAP_REMOTE_FAULT 13
|
||||
#define MII_CAP_ACKNOWLEDGE 14
|
||||
#define MII_CAP_NEXT_PAGE 15
|
||||
#define MII_CAP_IEEE_802_3 0x0001
|
||||
|
||||
#define MII_LINK_MODE_MASK 0x1f
|
||||
|
||||
#define REALTEK_RTL8366_CHIP_ID0 0x001C
|
||||
#define REALTEK_RTL8366_CHIP_ID1 0xC940
|
||||
#define REALTEK_RTL8366_CHIP_ID1_MP 0xC960
|
||||
|
||||
#define REALTEK_MIN_PORT_ID 0
|
||||
#define REALTEK_MAX_PORT_ID 5
|
||||
#define REALTEK_MIN_PHY_ID REALTEK_MIN_PORT_ID
|
||||
#define REALTEK_MAX_PHY_ID 4
|
||||
#define REALTEK_CPU_PORT_ID REALTEK_MAX_PORT_ID
|
||||
#define REALTEK_PHY_PORT_MASK ((1<<(REALTEK_MAX_PHY_ID+1)) - (1<<REALTEK_MIN_PHY_ID))
|
||||
#define REALTEK_CPU_PORT_MASK (1<<REALTEK_CPU_PORT_ID)
|
||||
#define REALTEK_ALL_PORT_MASK (REALTEK_PHY_PORT_MASK | REALTEK_CPU_PORT_MASK)
|
||||
|
||||
/* port ability */
|
||||
#define RTL8366S_PORT_ABILITY_BASE 0x0011
|
||||
|
||||
/* port vlan control register */
|
||||
#define RTL8366S_PORT_VLAN_CTRL_BASE 0x0058
|
||||
|
||||
/* port linking status */
|
||||
#define RTL8366S_PORT_LINK_STATUS_BASE 0x0060
|
||||
#define RTL8366S_PORT_STATUS_SPEED_BIT 0
|
||||
#define RTL8366S_PORT_STATUS_SPEED_MSK 0x0003
|
||||
#define RTL8366S_PORT_STATUS_DUPLEX_BIT 2
|
||||
#define RTL8366S_PORT_STATUS_DUPLEX_MSK 0x0004
|
||||
#define RTL8366S_PORT_STATUS_LINK_BIT 4
|
||||
#define RTL8366S_PORT_STATUS_LINK_MSK 0x0010
|
||||
#define RTL8366S_PORT_STATUS_TXPAUSE_BIT 5
|
||||
#define RTL8366S_PORT_STATUS_TXPAUSE_MSK 0x0020
|
||||
#define RTL8366S_PORT_STATUS_RXPAUSE_BIT 6
|
||||
#define RTL8366S_PORT_STATUS_RXPAUSE_MSK 0x0040
|
||||
#define RTL8366S_PORT_STATUS_AN_BIT 7
|
||||
#define RTL8366S_PORT_STATUS_AN_MSK 0x0080
|
||||
|
||||
/* internal control */
|
||||
#define RTL8366S_RESET_CONTROL_REG 0x0100
|
||||
#define RTL8366S_RESET_QUEUE_BIT 2
|
||||
|
||||
#define RTL8366S_CHIP_ID_REG 0x0105
|
||||
|
||||
/* MAC control */
|
||||
#define RTL8366S_MAC_FORCE_CTRL0_REG 0x0F04
|
||||
#define RTL8366S_MAC_FORCE_CTRL1_REG 0x0F05
|
||||
|
||||
|
||||
/* PHY registers control */
|
||||
#define RTL8366S_PHY_ACCESS_CTRL_REG 0x8028
|
||||
#define RTL8366S_PHY_ACCESS_DATA_REG 0x8029
|
||||
|
||||
#define RTL8366S_PHY_CTRL_READ 1
|
||||
#define RTL8366S_PHY_CTRL_WRITE 0
|
||||
|
||||
#define RTL8366S_PHY_REG_MASK 0x1F
|
||||
#define RTL8366S_PHY_PAGE_OFFSET 5
|
||||
#define RTL8366S_PHY_PAGE_MASK (0x7<<5)
|
||||
#define RTL8366S_PHY_NO_OFFSET 9
|
||||
#define RTL8366S_PHY_NO_MASK (0x1F<<9)
|
||||
|
||||
#define RTL8366S_PHY_NO_MAX 4
|
||||
#define RTL8366S_PHY_PAGE_MAX 7
|
||||
#define RTL8366S_PHY_ADDR_MAX 31
|
||||
|
||||
/* cpu port control reg */
|
||||
#define RTL8366S_CPU_CTRL_REG 0x004F
|
||||
#define RTL8366S_CPU_DRP_BIT 14
|
||||
#define RTL8366S_CPU_DRP_MSK 0x4000
|
||||
#define RTL8366S_CPU_INSTAG_BIT 15
|
||||
#define RTL8366S_CPU_INSTAG_MSK 0x8000
|
||||
|
||||
/* LED registers*/
|
||||
#define RTL8366S_LED_BLINK_REG 0x420
|
||||
#define RTL8366S_LED_BLINKRATE_BIT 0
|
||||
#define RTL8366S_LED_BLINKRATE_MSK 0x0007
|
||||
#define RTL8366S_LED_INDICATED_CONF_REG 0x421
|
||||
#define RTL8366S_LED_0_1_FORCE_REG 0x422
|
||||
#define RTL8366S_LED_2_3_FORCE_REG 0x423
|
||||
#define RTL8366S_LEDCONF_LEDFORCE 0x1F
|
||||
#define RTL8366S_LED_GROUP_MAX 4
|
||||
|
||||
#define RTL8366S_GREEN_FEATURE_REG 0x000A
|
||||
#define RTL8366S_GREEN_FEATURE_TX_BIT 3
|
||||
#define RTL8366S_GREEN_FEATURE_TX_MSK 0x0008
|
||||
#define RTL8366S_GREEN_FEATURE_RX_BIT 4
|
||||
#define RTL8366S_GREEN_FEATURE_RX_MSK 0x0010
|
||||
|
||||
#define RTL8366S_MODEL_ID_REG 0x5C
|
||||
#define RTL8366S_REV_ID_REG 0x5D
|
||||
#define RTL8366S_MODEL_8366SR 0x6027
|
||||
#define RTL8366S_MODEL_8366RB 0x5937
|
||||
|
||||
#endif
|
||||
786
package/boot/uboot-ar71xx/files/drivers/net/phy/rtl8366_mii.c
Normal file
786
package/boot/uboot-ar71xx/files/drivers/net/phy/rtl8366_mii.c
Normal file
@@ -0,0 +1,786 @@
|
||||
/*
|
||||
* (C) Copyright 2010
|
||||
* Michael Kurz <michi.kurz@googlemail.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
|
||||
*/
|
||||
|
||||
|
||||
#include <common.h>
|
||||
#include <net.h>
|
||||
#include <netdev.h>
|
||||
#include <miiphy.h>
|
||||
#include MII_GPIOINCLUDE
|
||||
|
||||
#include "rtl8366.h"
|
||||
|
||||
#ifdef DEBUG_RTL8366
|
||||
#define DBG(fmt,args...) printf (fmt ,##args)
|
||||
#else
|
||||
#define DBG(fmt,args...)
|
||||
#endif
|
||||
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Soft SMI functions
|
||||
//-------------------------------------------------------------------
|
||||
|
||||
#define DELAY 2
|
||||
|
||||
static void smi_init(void)
|
||||
{
|
||||
MII_SDAINPUT;
|
||||
MII_SCKINPUT;
|
||||
|
||||
MII_SETSDA(1);
|
||||
MII_SETSCK(1);
|
||||
|
||||
udelay(20);
|
||||
}
|
||||
|
||||
static void smi_start(void)
|
||||
{
|
||||
/*
|
||||
* rtl8366 chip needs a extra clock with
|
||||
* SDA high before start condition
|
||||
*/
|
||||
|
||||
/* set gpio pins output */
|
||||
MII_SDAOUTPUT;
|
||||
MII_SCKOUTPUT;
|
||||
udelay(DELAY);
|
||||
|
||||
/* set initial state: SCK:0, SDA:1 */
|
||||
MII_SETSCK(0);
|
||||
MII_SETSDA(1);
|
||||
udelay(DELAY);
|
||||
|
||||
/* toggle clock */
|
||||
MII_SETSCK(1);
|
||||
udelay(DELAY);
|
||||
MII_SETSCK(0);
|
||||
udelay(DELAY);
|
||||
|
||||
/* start condition */
|
||||
MII_SETSCK(1);
|
||||
udelay(DELAY);
|
||||
MII_SETSDA(0);
|
||||
udelay(DELAY);
|
||||
MII_SETSCK(0);
|
||||
udelay(DELAY);
|
||||
MII_SETSDA(1);
|
||||
}
|
||||
|
||||
static void smi_stop(void)
|
||||
{
|
||||
/*
|
||||
* rtl8366 chip needs a extra clock with
|
||||
* SDA high after stop condition
|
||||
*/
|
||||
|
||||
/* stop condition */
|
||||
udelay(DELAY);
|
||||
MII_SETSDA(0);
|
||||
MII_SETSCK(1);
|
||||
udelay(DELAY);
|
||||
MII_SETSDA(1);
|
||||
udelay(DELAY);
|
||||
MII_SETSCK(1);
|
||||
udelay(DELAY);
|
||||
MII_SETSCK(0);
|
||||
udelay(DELAY);
|
||||
|
||||
/* toggle clock */
|
||||
MII_SETSCK(1);
|
||||
udelay(DELAY);
|
||||
MII_SETSCK(0);
|
||||
udelay(DELAY);
|
||||
MII_SETSCK(1);
|
||||
|
||||
/* set gpio pins input */
|
||||
MII_SDAINPUT;
|
||||
MII_SCKINPUT;
|
||||
}
|
||||
|
||||
static void smi_writeBits(uint32_t data, uint8_t length)
|
||||
{
|
||||
uint8_t test;
|
||||
|
||||
for( ; length > 0; length--) {
|
||||
udelay(DELAY);
|
||||
|
||||
/* output data */
|
||||
test = (((data & (1 << (length - 1))) != 0) ? 1 : 0);
|
||||
MII_SETSDA(test);
|
||||
udelay(DELAY);
|
||||
|
||||
/* toogle clock */
|
||||
MII_SETSCK(1);
|
||||
udelay(DELAY);
|
||||
MII_SETSCK(0);
|
||||
}
|
||||
}
|
||||
|
||||
static uint32_t smi_readBits(uint8_t length)
|
||||
{
|
||||
uint32_t ret;
|
||||
|
||||
MII_SDAINPUT;
|
||||
|
||||
for(ret = 0 ; length > 0; length--) {
|
||||
udelay(DELAY);
|
||||
|
||||
ret <<= 1;
|
||||
|
||||
/* toogle clock */
|
||||
MII_SETSCK(1);
|
||||
udelay(DELAY);
|
||||
ret |= MII_GETSDA;
|
||||
MII_SETSCK(0);
|
||||
}
|
||||
|
||||
MII_SDAOUTPUT;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int smi_waitAck(void)
|
||||
{
|
||||
uint32_t retry = 0;
|
||||
|
||||
while (smi_readBits(1)) {
|
||||
if (retry++ == 5)
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
static int smi_read(uint32_t reg, uint32_t *data)
|
||||
{
|
||||
uint32_t rawData;
|
||||
|
||||
/* send start condition */
|
||||
smi_start();
|
||||
/* send CTRL1 code: 0b1010*/
|
||||
smi_writeBits(0x0a, 4);
|
||||
/* send CTRL2 code: 0b100 */
|
||||
smi_writeBits(0x04, 3);
|
||||
/* send READ command */
|
||||
smi_writeBits(0x01, 1);
|
||||
|
||||
/* wait for ACK */
|
||||
if (smi_waitAck())
|
||||
return -1;
|
||||
|
||||
/* send address low */
|
||||
smi_writeBits(reg & 0xFF, 8);
|
||||
/* wait for ACK */
|
||||
if (smi_waitAck())
|
||||
return -1;
|
||||
/* send address high */
|
||||
smi_writeBits((reg & 0xFF00) >> 8, 8);
|
||||
/* wait for ACK */
|
||||
if (smi_waitAck())
|
||||
return -1;
|
||||
|
||||
/* read data low */
|
||||
rawData = (smi_readBits(8) & 0xFF);
|
||||
/* send ACK */
|
||||
smi_writeBits(0, 1);
|
||||
/* read data high */
|
||||
rawData |= (smi_readBits(8) & 0xFF) << 8;
|
||||
/* send NACK */
|
||||
smi_writeBits(1, 1);
|
||||
|
||||
/* send stop condition */
|
||||
smi_stop();
|
||||
|
||||
if (data)
|
||||
*data = rawData;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int smi_write(uint32_t reg, uint32_t data)
|
||||
{
|
||||
/* send start condition */
|
||||
smi_start();
|
||||
/* send CTRL1 code: 0b1010*/
|
||||
smi_writeBits(0x0a, 4);
|
||||
/* send CTRL2 code: 0b100 */
|
||||
smi_writeBits(0x04, 3);
|
||||
/* send WRITE command */
|
||||
smi_writeBits(0x00, 1);
|
||||
|
||||
/* wait for ACK */
|
||||
if (smi_waitAck())
|
||||
return -1;
|
||||
|
||||
/* send address low */
|
||||
smi_writeBits(reg & 0xFF, 8);
|
||||
/* wait for ACK */
|
||||
if (smi_waitAck())
|
||||
return -1;
|
||||
/* send address high */
|
||||
smi_writeBits((reg & 0xFF00) >> 8, 8);
|
||||
/* wait for ACK */
|
||||
if (smi_waitAck())
|
||||
return -1;
|
||||
|
||||
/* send data low */
|
||||
smi_writeBits(data & 0xFF, 8);
|
||||
/* wait for ACK */
|
||||
if (smi_waitAck())
|
||||
return -1;
|
||||
/* send data high */
|
||||
smi_writeBits((data & 0xFF00) >> 8, 8);
|
||||
/* wait for ACK */
|
||||
if (smi_waitAck())
|
||||
return -1;
|
||||
|
||||
/* send stop condition */
|
||||
smi_stop();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Switch register read / write functions
|
||||
//-------------------------------------------------------------------
|
||||
static int rtl8366_readRegister(uint32_t reg, uint16_t *data)
|
||||
{
|
||||
uint32_t regData;
|
||||
|
||||
DBG("rtl8366: read register=%#04x, data=", reg);
|
||||
|
||||
if (smi_read(reg, ®Data)) {
|
||||
printf("\nrtl8366 smi read failed!\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (data)
|
||||
*data = regData;
|
||||
|
||||
DBG("%#04x\n", regData);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rtl8366_writeRegister(uint32_t reg, uint16_t data)
|
||||
{
|
||||
DBG("rtl8366: write register=%#04x, data=%#04x\n", reg, data);
|
||||
|
||||
if (smi_write(reg, data)) {
|
||||
printf("rtl8366 smi write failed!\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rtl8366_setRegisterBit(uint32_t reg, uint32_t bitNum, uint32_t value)
|
||||
{
|
||||
uint16_t regData;
|
||||
|
||||
if (bitNum >= 16)
|
||||
return -1;
|
||||
|
||||
if (rtl8366_readRegister(reg, ®Data))
|
||||
return -1;
|
||||
|
||||
if (value)
|
||||
regData |= (1 << bitNum);
|
||||
else
|
||||
regData &= ~(1 << bitNum);
|
||||
|
||||
if (rtl8366_writeRegister(reg, regData))
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// MII PHY read / write functions
|
||||
//-------------------------------------------------------------------
|
||||
static int rtl8366_getPhyReg(uint32_t phyNum, uint32_t reg, uint16_t *data)
|
||||
{
|
||||
uint16_t phyAddr, regData;
|
||||
|
||||
if (phyNum > RTL8366S_PHY_NO_MAX) {
|
||||
printf("rtl8366s: invalid phy number!\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (phyNum > RTL8366S_PHY_ADDR_MAX) {
|
||||
printf("rtl8366s: invalid phy register number!\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (rtl8366_writeRegister(RTL8366S_PHY_ACCESS_CTRL_REG,
|
||||
RTL8366S_PHY_CTRL_READ))
|
||||
return -1;
|
||||
|
||||
phyAddr = 0x8000 | (1 << (phyNum + RTL8366S_PHY_NO_OFFSET))
|
||||
| (reg & RTL8366S_PHY_REG_MASK);
|
||||
if (rtl8366_writeRegister(phyAddr, 0))
|
||||
return -1;
|
||||
|
||||
if (rtl8366_readRegister(RTL8366S_PHY_ACCESS_DATA_REG, ®Data))
|
||||
return -1;
|
||||
|
||||
if (data)
|
||||
*data = regData;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rtl8366_setPhyReg(uint32_t phyNum, uint32_t reg, uint16_t data)
|
||||
{
|
||||
uint16_t phyAddr;
|
||||
|
||||
if (phyNum > RTL8366S_PHY_NO_MAX) {
|
||||
printf("rtl8366s: invalid phy number!\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (phyNum > RTL8366S_PHY_ADDR_MAX) {
|
||||
printf("rtl8366s: invalid phy register number!\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (rtl8366_writeRegister(RTL8366S_PHY_ACCESS_CTRL_REG,
|
||||
RTL8366S_PHY_CTRL_WRITE))
|
||||
return -1;
|
||||
|
||||
phyAddr = 0x8000 | (1 << (phyNum + RTL8366S_PHY_NO_OFFSET))
|
||||
| (reg & RTL8366S_PHY_REG_MASK);
|
||||
if (rtl8366_writeRegister(phyAddr, data))
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rtl8366_miiread(char *devname, uchar phy_adr, uchar reg, ushort *data)
|
||||
{
|
||||
uint16_t regData;
|
||||
|
||||
DBG("rtl8366_miiread: devname=%s, addr=%#02x, reg=%#02x\n",
|
||||
devname, phy_adr, reg);
|
||||
|
||||
if (strcmp(devname, RTL8366_DEVNAME) != 0)
|
||||
return -1;
|
||||
|
||||
if (rtl8366_getPhyReg(phy_adr, reg, ®Data)) {
|
||||
printf("rtl8366_miiread: write failed!\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (data)
|
||||
*data = regData;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rtl8366_miiwrite(char *devname, uchar phy_adr, uchar reg, ushort data)
|
||||
{
|
||||
DBG("rtl8366_miiwrite: devname=%s, addr=%#02x, reg=%#02x, data=%#04x\n",
|
||||
devname, phy_adr, reg, data);
|
||||
|
||||
if (strcmp(devname, RTL8366_DEVNAME) != 0)
|
||||
return -1;
|
||||
|
||||
if (rtl8366_setPhyReg(phy_adr, reg, data)) {
|
||||
printf("rtl8366_miiwrite: write failed!\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int rtl8366_mii_register(bd_t *bis)
|
||||
{
|
||||
miiphy_register(strdup(RTL8366_DEVNAME), rtl8366_miiread,
|
||||
rtl8366_miiwrite);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Switch management functions
|
||||
//-------------------------------------------------------------------
|
||||
|
||||
int rtl8366s_setGreenFeature(uint32_t tx, uint32_t rx)
|
||||
{
|
||||
if (rtl8366_setRegisterBit(RTL8366S_GREEN_FEATURE_REG,
|
||||
RTL8366S_GREEN_FEATURE_TX_BIT, tx))
|
||||
return -1;
|
||||
|
||||
if (rtl8366_setRegisterBit(RTL8366S_GREEN_FEATURE_REG,
|
||||
RTL8366S_GREEN_FEATURE_RX_BIT, rx))
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int rtl8366s_setPowerSaving(uint32_t phyNum, uint32_t enabled)
|
||||
{
|
||||
uint16_t regData;
|
||||
|
||||
if (phyNum > RTL8366S_PHY_NO_MAX)
|
||||
return -1;
|
||||
|
||||
if (rtl8366_getPhyReg(phyNum, 12, ®Data))
|
||||
return -1;
|
||||
|
||||
if (enabled)
|
||||
regData |= (1 << 12);
|
||||
else
|
||||
regData &= ~(1 << 12);
|
||||
|
||||
if (rtl8366_setPhyReg(phyNum, 12, regData))
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int rtl8366s_setGreenEthernet(uint32_t greenFeature, uint32_t powerSaving)
|
||||
{
|
||||
uint32_t phyNum, i;
|
||||
uint16_t regData;
|
||||
|
||||
const uint16_t greenSettings[][2] =
|
||||
{
|
||||
{0xBE5B,0x3500},
|
||||
{0xBE5C,0xB975},
|
||||
{0xBE5D,0xB9B9},
|
||||
{0xBE77,0xA500},
|
||||
{0xBE78,0x5A78},
|
||||
{0xBE79,0x6478}
|
||||
};
|
||||
|
||||
if (rtl8366_readRegister(RTL8366S_MODEL_ID_REG, ®Data))
|
||||
return -1;
|
||||
|
||||
switch (regData)
|
||||
{
|
||||
case 0x0000:
|
||||
for (i = 0; i < 6; i++) {
|
||||
if (rtl8366_writeRegister(RTL8366S_PHY_ACCESS_CTRL_REG, RTL8366S_PHY_CTRL_WRITE))
|
||||
return -1;
|
||||
if (rtl8366_writeRegister(greenSettings[i][0], greenSettings[i][1]))
|
||||
return -1;
|
||||
}
|
||||
break;
|
||||
|
||||
case RTL8366S_MODEL_8366SR:
|
||||
if (rtl8366_writeRegister(RTL8366S_PHY_ACCESS_CTRL_REG, RTL8366S_PHY_CTRL_WRITE))
|
||||
return -1;
|
||||
if (rtl8366_writeRegister(greenSettings[0][0], greenSettings[0][1]))
|
||||
return -1;
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("rtl8366s_initChip: unsupported chip found!\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (rtl8366s_setGreenFeature(greenFeature, powerSaving))
|
||||
return -1;
|
||||
|
||||
for (phyNum = 0; phyNum <= RTL8366S_PHY_NO_MAX; phyNum++) {
|
||||
if (rtl8366s_setPowerSaving(phyNum, powerSaving))
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int rtl8366s_setCPUPortMask(uint8_t port, uint32_t enabled)
|
||||
{
|
||||
if(port >= 6){
|
||||
printf("rtl8366s_setCPUPortMask: invalid port number\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return rtl8366_setRegisterBit(RTL8366S_CPU_CTRL_REG, port, enabled);
|
||||
}
|
||||
|
||||
int rtl8366s_setCPUDisableInsTag(uint32_t enable)
|
||||
{
|
||||
return rtl8366_setRegisterBit(RTL8366S_CPU_CTRL_REG,
|
||||
RTL8366S_CPU_INSTAG_BIT, enable);
|
||||
}
|
||||
|
||||
int rtl8366s_setCPUDropUnda(uint32_t enable)
|
||||
{
|
||||
return rtl8366_setRegisterBit(RTL8366S_CPU_CTRL_REG,
|
||||
RTL8366S_CPU_DRP_BIT, enable);
|
||||
}
|
||||
|
||||
int rtl8366s_setCPUPort(uint8_t port, uint32_t noTag, uint32_t dropUnda)
|
||||
{
|
||||
uint32_t i;
|
||||
|
||||
if(port >= 6){
|
||||
printf("rtl8366s_setCPUPort: invalid port number\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* reset register */
|
||||
for(i = 0; i < 6; i++)
|
||||
{
|
||||
if(rtl8366s_setCPUPortMask(i, 0)){
|
||||
printf("rtl8366s_setCPUPort: rtl8366s_setCPUPortMask failed\n");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
if(rtl8366s_setCPUPortMask(port, 1)){
|
||||
printf("rtl8366s_setCPUPort: rtl8366s_setCPUPortMask failed\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(rtl8366s_setCPUDisableInsTag(noTag)){
|
||||
printf("rtl8366s_setCPUPort: rtl8366s_setCPUDisableInsTag fail\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(rtl8366s_setCPUDropUnda(dropUnda)){
|
||||
printf("rtl8366s_setCPUPort: rtl8366s_setCPUDropUnda fail\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int rtl8366s_setLedConfig(uint32_t ledNum, uint8_t config)
|
||||
{
|
||||
uint16_t regData;
|
||||
|
||||
if(ledNum >= RTL8366S_LED_GROUP_MAX) {
|
||||
DBG("rtl8366s_setLedConfig: invalid led group\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(config > RTL8366S_LEDCONF_LEDFORCE) {
|
||||
DBG("rtl8366s_setLedConfig: invalid led config\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (rtl8366_readRegister(RTL8366S_LED_INDICATED_CONF_REG, ®Data)) {
|
||||
printf("rtl8366s_setLedConfig: failed to get led register!\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
regData &= ~(0xF << (ledNum * 4));
|
||||
regData |= config << (ledNum * 4);
|
||||
|
||||
if (rtl8366_writeRegister(RTL8366S_LED_INDICATED_CONF_REG, regData)) {
|
||||
printf("rtl8366s_setLedConfig: failed to set led register!\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int rtl8366s_getLedConfig(uint32_t ledNum, uint8_t *config)
|
||||
{
|
||||
uint16_t regData;
|
||||
|
||||
if(ledNum >= RTL8366S_LED_GROUP_MAX) {
|
||||
DBG("rtl8366s_getLedConfig: invalid led group\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (rtl8366_readRegister(RTL8366S_LED_INDICATED_CONF_REG, ®Data)) {
|
||||
printf("rtl8366s_getLedConfig: failed to get led register!\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (config)
|
||||
*config = (regData >> (ledNum * 4)) & 0xF;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int rtl8366s_setLedForceValue(uint32_t group0, uint32_t group1,
|
||||
uint32_t group2, uint32_t group3)
|
||||
{
|
||||
uint16_t regData;
|
||||
|
||||
regData = (group0 & 0x3F) | ((group1 & 0x3F) << 6);
|
||||
if (rtl8366_writeRegister(RTL8366S_LED_0_1_FORCE_REG, regData)) {
|
||||
printf("rtl8366s_setLedForceValue: failed to set led register!\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
regData = (group2 & 0x3F) | ((group3 & 0x3F) << 6);
|
||||
if (rtl8366_writeRegister(RTL8366S_LED_2_3_FORCE_REG, regData)) {
|
||||
printf("rtl8366s_setLedForceValue: failed to set led register!\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int rtl8366s_initChip(void)
|
||||
{
|
||||
uint32_t ledGroup, i = 0;
|
||||
uint16_t regData;
|
||||
uint8_t ledData[RTL8366S_LED_GROUP_MAX];
|
||||
const uint16_t (*chipData)[2];
|
||||
|
||||
const uint16_t chipB[][2] =
|
||||
{
|
||||
{0x0000, 0x0038},{0x8100, 0x1B37},{0xBE2E, 0x7B9F},{0xBE2B, 0xA4C8},
|
||||
{0xBE74, 0xAD14},{0xBE2C, 0xDC00},{0xBE69, 0xD20F},{0xBE3B, 0xB414},
|
||||
{0xBE24, 0x0000},{0xBE23, 0x00A1},{0xBE22, 0x0008},{0xBE21, 0x0120},
|
||||
{0xBE20, 0x1000},{0xBE24, 0x0800},{0xBE24, 0x0000},{0xBE24, 0xF000},
|
||||
{0xBE23, 0xDF01},{0xBE22, 0xDF20},{0xBE21, 0x101A},{0xBE20, 0xA0FF},
|
||||
{0xBE24, 0xF800},{0xBE24, 0xF000},{0x0242, 0x02BF},{0x0245, 0x02BF},
|
||||
{0x0248, 0x02BF},{0x024B, 0x02BF},{0x024E, 0x02BF},{0x0251, 0x02BF},
|
||||
{0x0230, 0x0A32},{0x0233, 0x0A32},{0x0236, 0x0A32},{0x0239, 0x0A32},
|
||||
{0x023C, 0x0A32},{0x023F, 0x0A32},{0x0254, 0x0A3F},{0x0255, 0x0064},
|
||||
{0x0256, 0x0A3F},{0x0257, 0x0064},{0x0258, 0x0A3F},{0x0259, 0x0064},
|
||||
{0x025A, 0x0A3F},{0x025B, 0x0064},{0x025C, 0x0A3F},{0x025D, 0x0064},
|
||||
{0x025E, 0x0A3F},{0x025F, 0x0064},{0x0260, 0x0178},{0x0261, 0x01F4},
|
||||
{0x0262, 0x0320},{0x0263, 0x0014},{0x021D, 0x9249},{0x021E, 0x0000},
|
||||
{0x0100, 0x0004},{0xBE4A, 0xA0B4},{0xBE40, 0x9C00},{0xBE41, 0x501D},
|
||||
{0xBE48, 0x3602},{0xBE47, 0x8051},{0xBE4C, 0x6465},{0x8000, 0x1F00},
|
||||
{0x8001, 0x000C},{0x8008, 0x0000},{0x8007, 0x0000},{0x800C, 0x00A5},
|
||||
{0x8101, 0x02BC},{0xBE53, 0x0005},{0x8E45, 0xAFE8},{0x8013, 0x0005},
|
||||
{0xBE4B, 0x6700},{0x800B, 0x7000},{0xBE09, 0x0E00},
|
||||
{0xFFFF, 0xABCD}
|
||||
};
|
||||
|
||||
const uint16_t chipDefault[][2] =
|
||||
{
|
||||
{0x0242, 0x02BF},{0x0245, 0x02BF},{0x0248, 0x02BF},{0x024B, 0x02BF},
|
||||
{0x024E, 0x02BF},{0x0251, 0x02BF},
|
||||
{0x0254, 0x0A3F},{0x0256, 0x0A3F},{0x0258, 0x0A3F},{0x025A, 0x0A3F},
|
||||
{0x025C, 0x0A3F},{0x025E, 0x0A3F},
|
||||
{0x0263, 0x007C},{0x0100, 0x0004},
|
||||
{0xBE5B, 0x3500},{0x800E, 0x200F},{0xBE1D, 0x0F00},{0x8001, 0x5011},
|
||||
{0x800A, 0xA2F4},{0x800B, 0x17A3},{0xBE4B, 0x17A3},{0xBE41, 0x5011},
|
||||
{0xBE17, 0x2100},{0x8000, 0x8304},{0xBE40, 0x8304},{0xBE4A, 0xA2F4},
|
||||
{0x800C, 0xA8D5},{0x8014, 0x5500},{0x8015, 0x0004},{0xBE4C, 0xA8D5},
|
||||
{0xBE59, 0x0008},{0xBE09, 0x0E00},{0xBE36, 0x1036},{0xBE37, 0x1036},
|
||||
{0x800D, 0x00FF},{0xBE4D, 0x00FF},
|
||||
{0xFFFF, 0xABCD}
|
||||
};
|
||||
|
||||
DBG("rtl8366s_initChip\n");
|
||||
|
||||
/* save current led config and set to led force */
|
||||
for (ledGroup = 0; ledGroup < RTL8366S_LED_GROUP_MAX; ledGroup++) {
|
||||
if (rtl8366s_getLedConfig(ledGroup, &ledData[ledGroup]))
|
||||
return -1;
|
||||
|
||||
if (rtl8366s_setLedConfig(ledGroup, RTL8366S_LEDCONF_LEDFORCE))
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (rtl8366s_setLedForceValue(0,0,0,0))
|
||||
return -1;
|
||||
|
||||
if (rtl8366_readRegister(RTL8366S_MODEL_ID_REG, ®Data))
|
||||
return -1;
|
||||
|
||||
switch (regData)
|
||||
{
|
||||
case 0x0000:
|
||||
chipData = chipB;
|
||||
break;
|
||||
|
||||
case RTL8366S_MODEL_8366SR:
|
||||
chipData = chipDefault;
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("rtl8366s_initChip: unsupported chip found!\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
DBG("rtl8366s_initChip: found %x chip\n", regData);
|
||||
|
||||
while ((chipData[i][0] != 0xFFFF) && (chipData[i][1] != 0xABCD)) {
|
||||
|
||||
/* phy settings*/
|
||||
if ((chipData[i][0] & 0xBE00) == 0xBE00) {
|
||||
if (rtl8366_writeRegister(RTL8366S_PHY_ACCESS_CTRL_REG,
|
||||
RTL8366S_PHY_CTRL_WRITE))
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (rtl8366_writeRegister(chipData[i][0], chipData[i][1]))
|
||||
return -1;
|
||||
|
||||
i++;
|
||||
}
|
||||
|
||||
/* chip needs some time */
|
||||
udelay(100 * 1000);
|
||||
|
||||
/* restore led config */
|
||||
for (ledGroup = 0; ledGroup < RTL8366S_LED_GROUP_MAX; ledGroup++) {
|
||||
if (rtl8366s_setLedConfig(ledGroup, ledData[ledGroup]))
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int rtl8366s_initialize(void)
|
||||
{
|
||||
uint16_t regData;
|
||||
|
||||
DBG("rtl8366s_initialize: start setup\n");
|
||||
|
||||
smi_init();
|
||||
|
||||
rtl8366_readRegister(RTL8366S_CHIP_ID_REG, ®Data);
|
||||
DBG("Realtek 8366SR switch ID %#04x\n", regData);
|
||||
|
||||
if (regData != 0x8366) {
|
||||
printf("rtl8366s_initialize: found unsupported switch\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (rtl8366s_initChip()) {
|
||||
printf("rtl8366s_initialize: init chip failed\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (rtl8366s_setGreenEthernet(1, 1)) {
|
||||
printf("rtl8366s_initialize: set green ethernet failed\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Set port 5 noTag and don't dropUnda */
|
||||
if (rtl8366s_setCPUPort(5, 1, 0)) {
|
||||
printf("rtl8366s_initialize: set CPU port failed\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
191
package/boot/uboot-ar71xx/files/drivers/spi/ar71xx_spi.c
Normal file
191
package/boot/uboot-ar71xx/files/drivers/spi/ar71xx_spi.c
Normal file
@@ -0,0 +1,191 @@
|
||||
/*
|
||||
* (C) Copyright 2010
|
||||
* Michael Kurz <michi.kurz@googlemail.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
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <malloc.h>
|
||||
#include <spi.h>
|
||||
|
||||
#include <asm/addrspace.h>
|
||||
#include <asm/types.h>
|
||||
#include <asm/ar71xx.h>
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* Definitions
|
||||
*/
|
||||
|
||||
#ifdef DEBUG_SPI
|
||||
#define PRINTD(fmt,args...) printf (fmt ,##args)
|
||||
#else
|
||||
#define PRINTD(fmt,args...)
|
||||
#endif
|
||||
|
||||
struct ar71xx_spi_slave {
|
||||
struct spi_slave slave;
|
||||
unsigned int mode;
|
||||
};
|
||||
|
||||
static inline struct ar71xx_spi_slave *to_ar71xx_spi(struct spi_slave *slave)
|
||||
{
|
||||
return container_of(slave, struct ar71xx_spi_slave, slave);
|
||||
}
|
||||
|
||||
/*=====================================================================*/
|
||||
/* Public Functions */
|
||||
/*=====================================================================*/
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* Initialization
|
||||
*/
|
||||
|
||||
void spi_init()
|
||||
{
|
||||
PRINTD("ar71xx_spi: spi_init");
|
||||
|
||||
// Init SPI Hardware, disable remap, set clock
|
||||
__raw_writel(0x43, KSEG1ADDR(AR71XX_SPI_BASE + SPI_REG_CTRL));
|
||||
|
||||
PRINTD(" ---> out\n");
|
||||
}
|
||||
|
||||
struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
|
||||
unsigned int max_hz, unsigned int mode)
|
||||
{
|
||||
struct ar71xx_spi_slave *ss;
|
||||
|
||||
PRINTD("ar71xx_spi: spi_setup_slave");
|
||||
|
||||
if ((bus != 0) || (cs > 2))
|
||||
return NULL;
|
||||
|
||||
ss = malloc(sizeof(struct ar71xx_spi_slave));
|
||||
if (!ss)
|
||||
return NULL;
|
||||
|
||||
ss->slave.bus = bus;
|
||||
ss->slave.cs = cs;
|
||||
ss->mode = mode;
|
||||
|
||||
/* TODO: Use max_hz to limit the SCK rate */
|
||||
|
||||
PRINTD(" ---> out\n");
|
||||
|
||||
return &ss->slave;
|
||||
}
|
||||
|
||||
void spi_free_slave(struct spi_slave *slave)
|
||||
{
|
||||
struct ar71xx_spi_slave *ss = to_ar71xx_spi(slave);
|
||||
|
||||
free(ss);
|
||||
}
|
||||
|
||||
int spi_claim_bus(struct spi_slave *slave)
|
||||
{
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void spi_release_bus(struct spi_slave *slave)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
int spi_xfer(struct spi_slave *slave, unsigned int bitlen, const void *dout,
|
||||
void *din, unsigned long flags)
|
||||
{
|
||||
struct ar71xx_spi_slave *ss = to_ar71xx_spi(slave);
|
||||
uint8_t *rx = din;
|
||||
const uint8_t *tx = dout;
|
||||
uint8_t curbyte, curbitlen, restbits;
|
||||
uint32_t bytes = bitlen / 8;
|
||||
uint32_t out;
|
||||
uint32_t in;
|
||||
|
||||
PRINTD("ar71xx_spi: spi_xfer: slave:%p bitlen:%08x dout:%p din:%p flags:%08x\n", slave, bitlen, dout, din, flags);
|
||||
|
||||
if (flags & SPI_XFER_BEGIN) {
|
||||
__raw_writel(SPI_FS_GPIO, KSEG1ADDR(AR71XX_SPI_BASE + SPI_REG_FS));
|
||||
__raw_writel(SPI_IOC_CS_ALL, KSEG1ADDR(AR71XX_SPI_BASE + SPI_REG_IOC));
|
||||
}
|
||||
|
||||
restbits = (bitlen % 8);
|
||||
if (restbits != 0)
|
||||
bytes++;
|
||||
|
||||
// enable chip select
|
||||
out = SPI_IOC_CS_ALL & ~(SPI_IOC_CS(slave->cs));
|
||||
|
||||
while (bytes--) {
|
||||
|
||||
curbyte = 0;
|
||||
if (tx) {
|
||||
curbyte = *tx++;
|
||||
}
|
||||
|
||||
if (restbits != 0) {
|
||||
curbitlen = restbits;
|
||||
curbyte <<= 8 - restbits;
|
||||
} else {
|
||||
curbitlen = 8;
|
||||
}
|
||||
|
||||
PRINTD("ar71xx_spi: sending: data:%02x length:%d\n", curbyte, curbitlen);
|
||||
|
||||
/* clock starts at inactive polarity */
|
||||
for (curbyte <<= (8 - curbitlen); curbitlen; curbitlen--) {
|
||||
|
||||
if (curbyte & (1 << 7))
|
||||
out |= SPI_IOC_DO;
|
||||
else
|
||||
out &= ~(SPI_IOC_DO);
|
||||
|
||||
/* setup MSB (to slave) on trailing edge */
|
||||
__raw_writel(out, KSEG1ADDR(AR71XX_SPI_BASE + SPI_REG_IOC));
|
||||
|
||||
__raw_writel(out | SPI_IOC_CLK, KSEG1ADDR(AR71XX_SPI_BASE + SPI_REG_IOC));
|
||||
|
||||
curbyte <<= 1;
|
||||
}
|
||||
|
||||
in = __raw_readl(KSEG1ADDR(AR71XX_SPI_BASE + SPI_REG_RDS));
|
||||
PRINTD("ar71xx_spi: received:%02x\n", in);
|
||||
|
||||
if (rx) {
|
||||
if (restbits == 0) {
|
||||
*rx++ = in;
|
||||
} else {
|
||||
*rx++ = (in << (8 - restbits));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (flags & SPI_XFER_END) {
|
||||
__raw_writel(SPI_IOC_CS(slave->cs), KSEG1ADDR(AR71XX_SPI_BASE + SPI_REG_IOC));
|
||||
__raw_writel(SPI_IOC_CS_ALL, KSEG1ADDR(AR71XX_SPI_BASE + SPI_REG_IOC));
|
||||
__raw_writel(0, KSEG1ADDR(AR71XX_SPI_BASE + SPI_REG_FS));
|
||||
}
|
||||
|
||||
PRINTD(" ---> out\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
515
package/boot/uboot-ar71xx/files/include/asm-mips/ar71xx.h
Normal file
515
package/boot/uboot-ar71xx/files/include/asm-mips/ar71xx.h
Normal file
@@ -0,0 +1,515 @@
|
||||
/*
|
||||
* Atheros AR71xx SoC specific definitions
|
||||
*
|
||||
* Copyright (C) 2008-2009 Gabor Juhos <juhosg@openwrt.org>
|
||||
* Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
|
||||
*
|
||||
* Parts of this file are based on Atheros' 2.6.15 BSP
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 as published
|
||||
* by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_MACH_AR71XX_H
|
||||
#define __ASM_MACH_AR71XX_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <asm/io.h>
|
||||
#include <linux/bitops.h>
|
||||
|
||||
#ifndef __ASSEMBLER__
|
||||
|
||||
#define BIT(x) (1<<(x))
|
||||
|
||||
#define AR71XX_PCI_MEM_BASE 0x10000000
|
||||
#define AR71XX_PCI_MEM_SIZE 0x08000000
|
||||
#define AR71XX_APB_BASE 0x18000000
|
||||
#define AR71XX_GE0_BASE 0x19000000
|
||||
#define AR71XX_GE0_SIZE 0x01000000
|
||||
#define AR71XX_GE1_BASE 0x1a000000
|
||||
#define AR71XX_GE1_SIZE 0x01000000
|
||||
#define AR71XX_EHCI_BASE 0x1b000000
|
||||
#define AR71XX_EHCI_SIZE 0x01000000
|
||||
#define AR71XX_OHCI_BASE 0x1c000000
|
||||
#define AR71XX_OHCI_SIZE 0x01000000
|
||||
#define AR7240_OHCI_BASE 0x1b000000
|
||||
#define AR7240_OHCI_SIZE 0x01000000
|
||||
#define AR71XX_SPI_BASE 0x1f000000
|
||||
#define AR71XX_SPI_SIZE 0x01000000
|
||||
|
||||
#define AR71XX_DDR_CTRL_BASE (AR71XX_APB_BASE + 0x00000000)
|
||||
#define AR71XX_DDR_CTRL_SIZE 0x10000
|
||||
#define AR71XX_CPU_BASE (AR71XX_APB_BASE + 0x00010000)
|
||||
#define AR71XX_UART_BASE (AR71XX_APB_BASE + 0x00020000)
|
||||
#define AR71XX_UART_SIZE 0x10000
|
||||
#define AR71XX_USB_CTRL_BASE (AR71XX_APB_BASE + 0x00030000)
|
||||
#define AR71XX_USB_CTRL_SIZE 0x10000
|
||||
#define AR71XX_GPIO_BASE (AR71XX_APB_BASE + 0x00040000)
|
||||
#define AR71XX_GPIO_SIZE 0x10000
|
||||
#define AR71XX_PLL_BASE (AR71XX_APB_BASE + 0x00050000)
|
||||
#define AR71XX_PLL_SIZE 0x10000
|
||||
#define AR71XX_RESET_BASE (AR71XX_APB_BASE + 0x00060000)
|
||||
#define AR71XX_RESET_SIZE 0x10000
|
||||
#define AR71XX_MII_BASE (AR71XX_APB_BASE + 0x00070000)
|
||||
#define AR71XX_MII_SIZE 0x10000
|
||||
#define AR71XX_SLIC_BASE (AR71XX_APB_BASE + 0x00090000)
|
||||
#define AR71XX_SLIC_SIZE 0x10000
|
||||
#define AR71XX_DMA_BASE (AR71XX_APB_BASE + 0x000A0000)
|
||||
#define AR71XX_DMA_SIZE 0x10000
|
||||
#define AR71XX_STEREO_BASE (AR71XX_APB_BASE + 0x000B0000)
|
||||
#define AR71XX_STEREO_SIZE 0x10000
|
||||
|
||||
#define AR724X_PCI_CRP_BASE (AR71XX_APB_BASE + 0x000C0000)
|
||||
#define AR724X_PCI_CRP_SIZE 0x100
|
||||
|
||||
#define AR724X_PCI_CTRL_BASE (AR71XX_APB_BASE + 0x000F0000)
|
||||
#define AR724X_PCI_CTRL_SIZE 0x100
|
||||
|
||||
#define AR91XX_WMAC_BASE (AR71XX_APB_BASE + 0x000C0000)
|
||||
#define AR91XX_WMAC_SIZE 0x30000
|
||||
|
||||
#define AR71XX_MEM_SIZE_MIN 0x0200000
|
||||
#define AR71XX_MEM_SIZE_MAX 0x10000000
|
||||
|
||||
#define AR71XX_CPU_IRQ_BASE 0
|
||||
#define AR71XX_MISC_IRQ_BASE 8
|
||||
#define AR71XX_MISC_IRQ_COUNT 8
|
||||
#define AR71XX_GPIO_IRQ_BASE 16
|
||||
#define AR71XX_GPIO_IRQ_COUNT 32
|
||||
#define AR71XX_PCI_IRQ_BASE 48
|
||||
#define AR71XX_PCI_IRQ_COUNT 8
|
||||
|
||||
#define AR71XX_CPU_IRQ_IP2 (AR71XX_CPU_IRQ_BASE + 2)
|
||||
#define AR71XX_CPU_IRQ_USB (AR71XX_CPU_IRQ_BASE + 3)
|
||||
#define AR71XX_CPU_IRQ_GE0 (AR71XX_CPU_IRQ_BASE + 4)
|
||||
#define AR71XX_CPU_IRQ_GE1 (AR71XX_CPU_IRQ_BASE + 5)
|
||||
#define AR71XX_CPU_IRQ_MISC (AR71XX_CPU_IRQ_BASE + 6)
|
||||
#define AR71XX_CPU_IRQ_TIMER (AR71XX_CPU_IRQ_BASE + 7)
|
||||
|
||||
#define AR71XX_MISC_IRQ_TIMER (AR71XX_MISC_IRQ_BASE + 0)
|
||||
#define AR71XX_MISC_IRQ_ERROR (AR71XX_MISC_IRQ_BASE + 1)
|
||||
#define AR71XX_MISC_IRQ_GPIO (AR71XX_MISC_IRQ_BASE + 2)
|
||||
#define AR71XX_MISC_IRQ_UART (AR71XX_MISC_IRQ_BASE + 3)
|
||||
#define AR71XX_MISC_IRQ_WDOG (AR71XX_MISC_IRQ_BASE + 4)
|
||||
#define AR71XX_MISC_IRQ_PERFC (AR71XX_MISC_IRQ_BASE + 5)
|
||||
#define AR71XX_MISC_IRQ_OHCI (AR71XX_MISC_IRQ_BASE + 6)
|
||||
#define AR71XX_MISC_IRQ_DMA (AR71XX_MISC_IRQ_BASE + 7)
|
||||
|
||||
#define AR71XX_GPIO_IRQ(_x) (AR71XX_GPIO_IRQ_BASE + (_x))
|
||||
|
||||
#define AR71XX_PCI_IRQ_DEV0 (AR71XX_PCI_IRQ_BASE + 0)
|
||||
#define AR71XX_PCI_IRQ_DEV1 (AR71XX_PCI_IRQ_BASE + 1)
|
||||
#define AR71XX_PCI_IRQ_DEV2 (AR71XX_PCI_IRQ_BASE + 2)
|
||||
#define AR71XX_PCI_IRQ_CORE (AR71XX_PCI_IRQ_BASE + 4)
|
||||
|
||||
extern u32 ar71xx_ahb_freq;
|
||||
extern u32 ar71xx_cpu_freq;
|
||||
extern u32 ar71xx_ddr_freq;
|
||||
|
||||
enum ar71xx_soc_type {
|
||||
AR71XX_SOC_UNKNOWN,
|
||||
AR71XX_SOC_AR7130,
|
||||
AR71XX_SOC_AR7141,
|
||||
AR71XX_SOC_AR7161,
|
||||
AR71XX_SOC_AR7240,
|
||||
AR71XX_SOC_AR7241,
|
||||
AR71XX_SOC_AR7242,
|
||||
AR71XX_SOC_AR9130,
|
||||
AR71XX_SOC_AR9132
|
||||
};
|
||||
|
||||
extern enum ar71xx_soc_type ar71xx_soc;
|
||||
|
||||
/*
|
||||
* PLL block
|
||||
*/
|
||||
#define AR71XX_PLL_REG_CPU_CONFIG 0x00
|
||||
#define AR71XX_PLL_REG_SEC_CONFIG 0x04
|
||||
#define AR71XX_PLL_REG_ETH0_INT_CLOCK 0x10
|
||||
#define AR71XX_PLL_REG_ETH1_INT_CLOCK 0x14
|
||||
|
||||
#define AR71XX_PLL_DIV_SHIFT 3
|
||||
#define AR71XX_PLL_DIV_MASK 0x1f
|
||||
#define AR71XX_CPU_DIV_SHIFT 16
|
||||
#define AR71XX_CPU_DIV_MASK 0x3
|
||||
#define AR71XX_DDR_DIV_SHIFT 18
|
||||
#define AR71XX_DDR_DIV_MASK 0x3
|
||||
#define AR71XX_AHB_DIV_SHIFT 20
|
||||
#define AR71XX_AHB_DIV_MASK 0x7
|
||||
|
||||
#define AR71XX_ETH0_PLL_SHIFT 17
|
||||
#define AR71XX_ETH1_PLL_SHIFT 19
|
||||
|
||||
#define AR724X_PLL_REG_CPU_CONFIG 0x00
|
||||
#define AR724X_PLL_REG_PCIE_CONFIG 0x18
|
||||
|
||||
#define AR724X_PLL_DIV_SHIFT 0
|
||||
#define AR724X_PLL_DIV_MASK 0x3ff
|
||||
#define AR724X_PLL_REF_DIV_SHIFT 10
|
||||
#define AR724X_PLL_REF_DIV_MASK 0xf
|
||||
#define AR724X_AHB_DIV_SHIFT 19
|
||||
#define AR724X_AHB_DIV_MASK 0x1
|
||||
#define AR724X_DDR_DIV_SHIFT 22
|
||||
#define AR724X_DDR_DIV_MASK 0x3
|
||||
|
||||
#define AR91XX_PLL_REG_CPU_CONFIG 0x00
|
||||
#define AR91XX_PLL_REG_ETH_CONFIG 0x04
|
||||
#define AR91XX_PLL_REG_ETH0_INT_CLOCK 0x14
|
||||
#define AR91XX_PLL_REG_ETH1_INT_CLOCK 0x18
|
||||
|
||||
#define AR91XX_PLL_DIV_SHIFT 0
|
||||
#define AR91XX_PLL_DIV_MASK 0x3ff
|
||||
#define AR91XX_DDR_DIV_SHIFT 22
|
||||
#define AR91XX_DDR_DIV_MASK 0x3
|
||||
#define AR91XX_AHB_DIV_SHIFT 19
|
||||
#define AR91XX_AHB_DIV_MASK 0x1
|
||||
|
||||
#define AR91XX_ETH0_PLL_SHIFT 20
|
||||
#define AR91XX_ETH1_PLL_SHIFT 22
|
||||
|
||||
// extern void __iomem *ar71xx_pll_base;
|
||||
|
||||
// static inline void ar71xx_pll_wr(unsigned reg, u32 val)
|
||||
// {
|
||||
// __raw_writel(val, ar71xx_pll_base + reg);
|
||||
// }
|
||||
|
||||
// static inline u32 ar71xx_pll_rr(unsigned reg)
|
||||
// {
|
||||
// return __raw_readl(ar71xx_pll_base + reg);
|
||||
// }
|
||||
|
||||
/*
|
||||
* USB_CONFIG block
|
||||
*/
|
||||
#define USB_CTRL_REG_FLADJ 0x00
|
||||
#define USB_CTRL_REG_CONFIG 0x04
|
||||
|
||||
// extern void __iomem *ar71xx_usb_ctrl_base;
|
||||
|
||||
// static inline void ar71xx_usb_ctrl_wr(unsigned reg, u32 val)
|
||||
// {
|
||||
// __raw_writel(val, ar71xx_usb_ctrl_base + reg);
|
||||
// }
|
||||
|
||||
// static inline u32 ar71xx_usb_ctrl_rr(unsigned reg)
|
||||
// {
|
||||
// return __raw_readl(ar71xx_usb_ctrl_base + reg);
|
||||
// }
|
||||
|
||||
/*
|
||||
* GPIO block
|
||||
*/
|
||||
#define GPIO_REG_OE 0x00
|
||||
#define GPIO_REG_IN 0x04
|
||||
#define GPIO_REG_OUT 0x08
|
||||
#define GPIO_REG_SET 0x0c
|
||||
#define GPIO_REG_CLEAR 0x10
|
||||
#define GPIO_REG_INT_MODE 0x14
|
||||
#define GPIO_REG_INT_TYPE 0x18
|
||||
#define GPIO_REG_INT_POLARITY 0x1c
|
||||
#define GPIO_REG_INT_PENDING 0x20
|
||||
#define GPIO_REG_INT_ENABLE 0x24
|
||||
#define GPIO_REG_FUNC 0x28
|
||||
|
||||
#define AR71XX_GPIO_FUNC_STEREO_EN BIT(17)
|
||||
#define AR71XX_GPIO_FUNC_SLIC_EN BIT(16)
|
||||
#define AR71XX_GPIO_FUNC_SPI_CS2_EN BIT(13)
|
||||
#define AR71XX_GPIO_FUNC_SPI_CS1_EN BIT(12)
|
||||
#define AR71XX_GPIO_FUNC_UART_EN BIT(8)
|
||||
#define AR71XX_GPIO_FUNC_USB_OC_EN BIT(4)
|
||||
#define AR71XX_GPIO_FUNC_USB_CLK_EN BIT(0)
|
||||
|
||||
#define AR71XX_GPIO_COUNT 16
|
||||
|
||||
#define AR724X_GPIO_FUNC_GE0_MII_CLK_EN BIT(19)
|
||||
#define AR724X_GPIO_FUNC_SPI_EN BIT(18)
|
||||
#define AR724X_GPIO_FUNC_SPI_CS_EN2 BIT(14)
|
||||
#define AR724X_GPIO_FUNC_SPI_CS_EN1 BIT(13)
|
||||
#define AR724X_GPIO_FUNC_CLK_OBS5_EN BIT(12)
|
||||
#define AR724X_GPIO_FUNC_CLK_OBS4_EN BIT(11)
|
||||
#define AR724X_GPIO_FUNC_CLK_OBS3_EN BIT(10)
|
||||
#define AR724X_GPIO_FUNC_CLK_OBS2_EN BIT(9)
|
||||
#define AR724X_GPIO_FUNC_CLK_OBS1_EN BIT(8)
|
||||
#define AR724X_GPIO_FUNC_ETH_SWITCH_LED4_EN BIT(7)
|
||||
#define AR724X_GPIO_FUNC_ETH_SWITCH_LED3_EN BIT(6)
|
||||
#define AR724X_GPIO_FUNC_ETH_SWITCH_LED2_EN BIT(5)
|
||||
#define AR724X_GPIO_FUNC_ETH_SWITCH_LED1_EN BIT(4)
|
||||
#define AR724X_GPIO_FUNC_ETH_SWITCH_LED0_EN BIT(3)
|
||||
#define AR724X_GPIO_FUNC_UART_RTS_CTS_EN BIT(2)
|
||||
#define AR724X_GPIO_FUNC_UART_EN BIT(1)
|
||||
#define AR724X_GPIO_FUNC_JTAG_DISABLE BIT(0)
|
||||
|
||||
#define AR724X_GPIO_COUNT 18
|
||||
|
||||
#define AR91XX_GPIO_FUNC_WMAC_LED_EN BIT(22)
|
||||
#define AR91XX_GPIO_FUNC_EXP_PORT_CS_EN BIT(21)
|
||||
#define AR91XX_GPIO_FUNC_I2S_REFCLKEN BIT(20)
|
||||
#define AR91XX_GPIO_FUNC_I2S_MCKEN BIT(19)
|
||||
#define AR91XX_GPIO_FUNC_I2S1_EN BIT(18)
|
||||
#define AR91XX_GPIO_FUNC_I2S0_EN BIT(17)
|
||||
#define AR91XX_GPIO_FUNC_SLIC_EN BIT(16)
|
||||
#define AR91XX_GPIO_FUNC_UART_RTSCTS_EN BIT(9)
|
||||
#define AR91XX_GPIO_FUNC_UART_EN BIT(8)
|
||||
#define AR91XX_GPIO_FUNC_USB_CLK_EN BIT(4)
|
||||
|
||||
#define AR91XX_GPIO_COUNT 22
|
||||
|
||||
// extern void __iomem *ar71xx_gpio_base;
|
||||
|
||||
// static inline void ar71xx_gpio_wr(unsigned reg, u32 value)
|
||||
// {
|
||||
// __raw_writel(value, ar71xx_gpio_base + reg);
|
||||
// }
|
||||
|
||||
// static inline u32 ar71xx_gpio_rr(unsigned reg)
|
||||
// {
|
||||
// return __raw_readl(ar71xx_gpio_base + reg);
|
||||
// }
|
||||
|
||||
// void ar71xx_gpio_init(void) __init;
|
||||
// void ar71xx_gpio_function_enable(u32 mask);
|
||||
// void ar71xx_gpio_function_disable(u32 mask);
|
||||
// void ar71xx_gpio_function_setup(u32 set, u32 clear);
|
||||
|
||||
/*
|
||||
* DDR_CTRL block
|
||||
*/
|
||||
#define AR71XX_DDR_REG_PCI_WIN0 0x7c
|
||||
#define AR71XX_DDR_REG_PCI_WIN1 0x80
|
||||
#define AR71XX_DDR_REG_PCI_WIN2 0x84
|
||||
#define AR71XX_DDR_REG_PCI_WIN3 0x88
|
||||
#define AR71XX_DDR_REG_PCI_WIN4 0x8c
|
||||
#define AR71XX_DDR_REG_PCI_WIN5 0x90
|
||||
#define AR71XX_DDR_REG_PCI_WIN6 0x94
|
||||
#define AR71XX_DDR_REG_PCI_WIN7 0x98
|
||||
#define AR71XX_DDR_REG_FLUSH_GE0 0x9c
|
||||
#define AR71XX_DDR_REG_FLUSH_GE1 0xa0
|
||||
#define AR71XX_DDR_REG_FLUSH_USB 0xa4
|
||||
#define AR71XX_DDR_REG_FLUSH_PCI 0xa8
|
||||
|
||||
#define AR724X_DDR_REG_FLUSH_GE0 0x7c
|
||||
#define AR724X_DDR_REG_FLUSH_GE1 0x80
|
||||
#define AR724X_DDR_REG_FLUSH_USB 0x84
|
||||
#define AR724X_DDR_REG_FLUSH_PCIE 0x88
|
||||
|
||||
#define AR91XX_DDR_REG_FLUSH_GE0 0x7c
|
||||
#define AR91XX_DDR_REG_FLUSH_GE1 0x80
|
||||
#define AR91XX_DDR_REG_FLUSH_USB 0x84
|
||||
#define AR91XX_DDR_REG_FLUSH_WMAC 0x88
|
||||
|
||||
#define PCI_WIN0_OFFS 0x10000000
|
||||
#define PCI_WIN1_OFFS 0x11000000
|
||||
#define PCI_WIN2_OFFS 0x12000000
|
||||
#define PCI_WIN3_OFFS 0x13000000
|
||||
#define PCI_WIN4_OFFS 0x14000000
|
||||
#define PCI_WIN5_OFFS 0x15000000
|
||||
#define PCI_WIN6_OFFS 0x16000000
|
||||
#define PCI_WIN7_OFFS 0x07000000
|
||||
|
||||
// extern void __iomem *ar71xx_ddr_base;
|
||||
|
||||
// static inline void ar71xx_ddr_wr(unsigned reg, u32 val)
|
||||
// {
|
||||
// __raw_writel(val, ar71xx_ddr_base + reg);
|
||||
// }
|
||||
|
||||
// static inline u32 ar71xx_ddr_rr(unsigned reg)
|
||||
// {
|
||||
// return __raw_readl(ar71xx_ddr_base + reg);
|
||||
// }
|
||||
|
||||
// void ar71xx_ddr_flush(u32 reg);
|
||||
|
||||
/*
|
||||
* PCI block
|
||||
*/
|
||||
#define AR71XX_PCI_CFG_BASE (AR71XX_PCI_MEM_BASE + PCI_WIN7_OFFS + 0x10000)
|
||||
#define AR71XX_PCI_CFG_SIZE 0x100
|
||||
|
||||
#define PCI_REG_CRP_AD_CBE 0x00
|
||||
#define PCI_REG_CRP_WRDATA 0x04
|
||||
#define PCI_REG_CRP_RDDATA 0x08
|
||||
#define PCI_REG_CFG_AD 0x0c
|
||||
#define PCI_REG_CFG_CBE 0x10
|
||||
#define PCI_REG_CFG_WRDATA 0x14
|
||||
#define PCI_REG_CFG_RDDATA 0x18
|
||||
#define PCI_REG_PCI_ERR 0x1c
|
||||
#define PCI_REG_PCI_ERR_ADDR 0x20
|
||||
#define PCI_REG_AHB_ERR 0x24
|
||||
#define PCI_REG_AHB_ERR_ADDR 0x28
|
||||
|
||||
#define PCI_CRP_CMD_WRITE 0x00010000
|
||||
#define PCI_CRP_CMD_READ 0x00000000
|
||||
#define PCI_CFG_CMD_READ 0x0000000a
|
||||
#define PCI_CFG_CMD_WRITE 0x0000000b
|
||||
|
||||
#define PCI_IDSEL_ADL_START 17
|
||||
|
||||
#define AR724X_PCI_CFG_BASE (AR71XX_PCI_MEM_BASE + 0x4000000)
|
||||
#define AR724X_PCI_CFG_SIZE 0x1000
|
||||
|
||||
#define AR724X_PCI_REG_APP 0x00
|
||||
#define AR724X_PCI_REG_RESET 0x18
|
||||
#define AR724X_PCI_REG_INT_STATUS 0x4c
|
||||
#define AR724X_PCI_REG_INT_MASK 0x50
|
||||
|
||||
#define AR724X_PCI_APP_LTSSM_ENABLE BIT(0)
|
||||
#define AR724X_PCI_RESET_LINK_UP BIT(0)
|
||||
|
||||
#define AR724X_PCI_INT_DEV0 BIT(14)
|
||||
|
||||
/*
|
||||
* RESET block
|
||||
*/
|
||||
#define AR71XX_RESET_REG_TIMER 0x00
|
||||
#define AR71XX_RESET_REG_TIMER_RELOAD 0x04
|
||||
#define AR71XX_RESET_REG_WDOG_CTRL 0x08
|
||||
#define AR71XX_RESET_REG_WDOG 0x0c
|
||||
#define AR71XX_RESET_REG_MISC_INT_STATUS 0x10
|
||||
#define AR71XX_RESET_REG_MISC_INT_ENABLE 0x14
|
||||
#define AR71XX_RESET_REG_PCI_INT_STATUS 0x18
|
||||
#define AR71XX_RESET_REG_PCI_INT_ENABLE 0x1c
|
||||
#define AR71XX_RESET_REG_GLOBAL_INT_STATUS 0x20
|
||||
#define AR71XX_RESET_REG_RESET_MODULE 0x24
|
||||
#define AR71XX_RESET_REG_PERFC_CTRL 0x2c
|
||||
#define AR71XX_RESET_REG_PERFC0 0x30
|
||||
#define AR71XX_RESET_REG_PERFC1 0x34
|
||||
#define AR71XX_RESET_REG_REV_ID 0x90
|
||||
|
||||
#define AR91XX_RESET_REG_GLOBAL_INT_STATUS 0x18
|
||||
#define AR91XX_RESET_REG_RESET_MODULE 0x1c
|
||||
#define AR91XX_RESET_REG_PERF_CTRL 0x20
|
||||
#define AR91XX_RESET_REG_PERFC0 0x24
|
||||
#define AR91XX_RESET_REG_PERFC1 0x28
|
||||
|
||||
#define AR724X_RESET_REG_RESET_MODULE 0x1c
|
||||
|
||||
#define WDOG_CTRL_LAST_RESET BIT(31)
|
||||
#define WDOG_CTRL_ACTION_MASK 3
|
||||
#define WDOG_CTRL_ACTION_NONE 0 /* no action */
|
||||
#define WDOG_CTRL_ACTION_GPI 1 /* general purpose interrupt */
|
||||
#define WDOG_CTRL_ACTION_NMI 2 /* NMI */
|
||||
#define WDOG_CTRL_ACTION_FCR 3 /* full chip reset */
|
||||
|
||||
#define MISC_INT_DMA BIT(7)
|
||||
#define MISC_INT_OHCI BIT(6)
|
||||
#define MISC_INT_PERFC BIT(5)
|
||||
#define MISC_INT_WDOG BIT(4)
|
||||
#define MISC_INT_UART BIT(3)
|
||||
#define MISC_INT_GPIO BIT(2)
|
||||
#define MISC_INT_ERROR BIT(1)
|
||||
#define MISC_INT_TIMER BIT(0)
|
||||
|
||||
#define PCI_INT_CORE BIT(4)
|
||||
#define PCI_INT_DEV2 BIT(2)
|
||||
#define PCI_INT_DEV1 BIT(1)
|
||||
#define PCI_INT_DEV0 BIT(0)
|
||||
|
||||
#define RESET_MODULE_EXTERNAL BIT(28)
|
||||
#define RESET_MODULE_FULL_CHIP BIT(24)
|
||||
#define RESET_MODULE_AMBA2WMAC BIT(22)
|
||||
#define RESET_MODULE_CPU_NMI BIT(21)
|
||||
#define RESET_MODULE_CPU_COLD BIT(20)
|
||||
#define RESET_MODULE_DMA BIT(19)
|
||||
#define RESET_MODULE_SLIC BIT(18)
|
||||
#define RESET_MODULE_STEREO BIT(17)
|
||||
#define RESET_MODULE_DDR BIT(16)
|
||||
#define RESET_MODULE_GE1_MAC BIT(13)
|
||||
#define RESET_MODULE_GE1_PHY BIT(12)
|
||||
#define RESET_MODULE_USBSUS_OVERRIDE BIT(10)
|
||||
#define RESET_MODULE_GE0_MAC BIT(9)
|
||||
#define RESET_MODULE_GE0_PHY BIT(8)
|
||||
#define RESET_MODULE_USB_OHCI_DLL BIT(6)
|
||||
#define RESET_MODULE_USB_HOST BIT(5)
|
||||
#define RESET_MODULE_USB_PHY BIT(4)
|
||||
#define RESET_MODULE_USB_OHCI_DLL_7240 BIT(3)
|
||||
#define RESET_MODULE_PCI_BUS BIT(1)
|
||||
#define RESET_MODULE_PCI_CORE BIT(0)
|
||||
|
||||
#define AR724X_RESET_GE1_MDIO BIT(23)
|
||||
#define AR724X_RESET_GE0_MDIO BIT(22)
|
||||
#define AR724X_RESET_PCIE_PHY_SERIAL BIT(10)
|
||||
#define AR724X_RESET_PCIE_PHY BIT(7)
|
||||
#define AR724X_RESET_PCIE BIT(6)
|
||||
|
||||
#define REV_ID_MAJOR_MASK 0xfff0
|
||||
#define REV_ID_MAJOR_AR71XX 0x00a0
|
||||
#define REV_ID_MAJOR_AR913X 0x00b0
|
||||
#define REV_ID_MAJOR_AR7240 0x00c0
|
||||
#define REV_ID_MAJOR_AR7241 0x0100
|
||||
#define REV_ID_MAJOR_AR7242 0x1100
|
||||
|
||||
#define AR71XX_REV_ID_MINOR_MASK 0x3
|
||||
#define AR71XX_REV_ID_MINOR_AR7130 0x0
|
||||
#define AR71XX_REV_ID_MINOR_AR7141 0x1
|
||||
#define AR71XX_REV_ID_MINOR_AR7161 0x2
|
||||
#define AR71XX_REV_ID_REVISION_MASK 0x3
|
||||
#define AR71XX_REV_ID_REVISION_SHIFT 2
|
||||
|
||||
#define AR91XX_REV_ID_MINOR_MASK 0x3
|
||||
#define AR91XX_REV_ID_MINOR_AR9130 0x0
|
||||
#define AR91XX_REV_ID_MINOR_AR9132 0x1
|
||||
#define AR91XX_REV_ID_REVISION_MASK 0x3
|
||||
#define AR91XX_REV_ID_REVISION_SHIFT 2
|
||||
|
||||
#define AR724X_REV_ID_REVISION_MASK 0x3
|
||||
|
||||
// extern void __iomem *ar71xx_reset_base;
|
||||
|
||||
static inline void ar71xx_reset_wr(unsigned reg, u32 val)
|
||||
{
|
||||
__raw_writel(val, KSEG1ADDR(AR71XX_RESET_BASE) + reg);
|
||||
}
|
||||
|
||||
static inline u32 ar71xx_reset_rr(unsigned reg)
|
||||
{
|
||||
return __raw_readl(KSEG1ADDR(AR71XX_RESET_BASE) + reg);
|
||||
}
|
||||
|
||||
// void ar71xx_device_stop(u32 mask);
|
||||
// void ar71xx_device_start(u32 mask);
|
||||
// int ar71xx_device_stopped(u32 mask);
|
||||
|
||||
/*
|
||||
* SPI block
|
||||
*/
|
||||
#define SPI_REG_FS 0x00 /* Function Select */
|
||||
#define SPI_REG_CTRL 0x04 /* SPI Control */
|
||||
#define SPI_REG_IOC 0x08 /* SPI I/O Control */
|
||||
#define SPI_REG_RDS 0x0c /* Read Data Shift */
|
||||
|
||||
#define SPI_FS_GPIO BIT(0) /* Enable GPIO mode */
|
||||
|
||||
#define SPI_CTRL_RD BIT(6) /* Remap Disable */
|
||||
#define SPI_CTRL_DIV_MASK 0x3f
|
||||
|
||||
#define SPI_IOC_DO BIT(0) /* Data Out pin */
|
||||
#define SPI_IOC_CLK BIT(8) /* CLK pin */
|
||||
#define SPI_IOC_CS(n) BIT(16 + (n))
|
||||
#define SPI_IOC_CS0 SPI_IOC_CS(0)
|
||||
#define SPI_IOC_CS1 SPI_IOC_CS(1)
|
||||
#define SPI_IOC_CS2 SPI_IOC_CS(2)
|
||||
#define SPI_IOC_CS_ALL (SPI_IOC_CS0 | SPI_IOC_CS1 | SPI_IOC_CS2)
|
||||
|
||||
// void ar71xx_flash_acquire(void);
|
||||
// void ar71xx_flash_release(void);
|
||||
|
||||
/*
|
||||
* MII_CTRL block
|
||||
*/
|
||||
#define MII_REG_MII0_CTRL 0x00
|
||||
#define MII_REG_MII1_CTRL 0x04
|
||||
|
||||
#define MII0_CTRL_IF_GMII 0
|
||||
#define MII0_CTRL_IF_MII 1
|
||||
#define MII0_CTRL_IF_RGMII 2
|
||||
#define MII0_CTRL_IF_RMII 3
|
||||
|
||||
#define MII1_CTRL_IF_RGMII 0
|
||||
#define MII1_CTRL_IF_RMII 1
|
||||
|
||||
#endif /* __ASSEMBLER__ */
|
||||
|
||||
#endif /* __ASM_MACH_AR71XX_H */
|
||||
@@ -0,0 +1,65 @@
|
||||
/*
|
||||
* (C) Copyright 2010
|
||||
* Michael Kurz <michi.kurz@googlemail.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
|
||||
*/
|
||||
|
||||
#ifndef _AR71XX_GPIO_H
|
||||
#define _AR71XX_GPIO_H
|
||||
|
||||
#include <common.h>
|
||||
#include <asm/ar71xx.h>
|
||||
|
||||
static inline void ar71xx_setpin(uint8_t pin, uint8_t state)
|
||||
{
|
||||
uint32_t reg = readl(KSEG1ADDR(AR71XX_GPIO_BASE + GPIO_REG_OUT));
|
||||
|
||||
if (state != 0) {
|
||||
reg |= (1 << pin);
|
||||
} else {
|
||||
reg &= ~(1 << pin);
|
||||
}
|
||||
|
||||
writel(reg, KSEG1ADDR(AR71XX_GPIO_BASE + GPIO_REG_OUT));
|
||||
readl(KSEG1ADDR(AR71XX_GPIO_BASE + GPIO_REG_OUT));
|
||||
}
|
||||
|
||||
static inline uint32_t ar71xx_getpin(uint8_t pin)
|
||||
{
|
||||
uint32_t reg = readl(KSEG1ADDR(AR71XX_GPIO_BASE + GPIO_REG_IN));
|
||||
return (((reg & (1 << pin)) != 0) ? 1 : 0);
|
||||
}
|
||||
|
||||
static inline void ar71xx_setpindir(uint8_t pin, uint8_t direction)
|
||||
{
|
||||
uint32_t reg = readl(KSEG1ADDR(AR71XX_GPIO_BASE + GPIO_REG_OE));
|
||||
|
||||
if (direction != 0) {
|
||||
reg |= (1 << pin);
|
||||
} else {
|
||||
reg &= ~(1 << pin);
|
||||
}
|
||||
|
||||
writel(reg, KSEG1ADDR(AR71XX_GPIO_BASE + GPIO_REG_OE));
|
||||
readl(KSEG1ADDR(AR71XX_GPIO_BASE + GPIO_REG_OE));
|
||||
}
|
||||
|
||||
|
||||
#endif /* AR71XX_GPIO_H */
|
||||
136
package/boot/uboot-ar71xx/files/include/configs/nbg460n.h
Normal file
136
package/boot/uboot-ar71xx/files/include/configs/nbg460n.h
Normal file
@@ -0,0 +1,136 @@
|
||||
/*
|
||||
* (C) Copyright 2010
|
||||
* Michael Kurz <michi.kurz@googlemail.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
|
||||
*/
|
||||
|
||||
/* This file contains the configuration parameters for the zyxel nbg460n board. */
|
||||
|
||||
#ifndef _NBG460N_CONFIG_H
|
||||
#define _NBG460N_CONFIG_H
|
||||
|
||||
#define CONFIG_MIPS32 1 /* MIPS32 CPU core */
|
||||
#define CONFIG_AR71XX 1
|
||||
#define CONFIG_AR91XX 1
|
||||
#define CONFIG_SYS_HZ 1000
|
||||
#define CONFIG_SYS_MIPS_TIMER_FREQ (400000000/2)
|
||||
|
||||
/* Cache Configuration */
|
||||
#define CONFIG_SYS_DCACHE_SIZE 32768
|
||||
#define CONFIG_SYS_ICACHE_SIZE 65536
|
||||
#define CONFIG_SYS_CACHELINE_SIZE 32
|
||||
/* Cache lock for stack */
|
||||
#define CONFIG_SYS_INIT_SP_OFFSET 0x1000
|
||||
|
||||
#define CONFIG_SYS_MONITOR_BASE (TEXT_BASE)
|
||||
|
||||
#define CONFIG_BAUDRATE 115200
|
||||
#define CONFIG_SYS_BAUDRATE_TABLE {115200}
|
||||
|
||||
#define CONFIG_MISC_INIT_R
|
||||
|
||||
/* SPI-Flash support */
|
||||
#define CONFIG_SPI_FLASH
|
||||
#define CONFIG_AR71XX_SPI
|
||||
#define CONFIG_SPI_FLASH_MACRONIX
|
||||
#define CONFIG_SF_DEFAULT_HZ 25000000
|
||||
|
||||
#define CONFIG_ENV_SPI_MAX_HZ 25000000
|
||||
#define CONFIG_ENV_SPI_BUS 0
|
||||
#define CONFIG_ENV_SPI_CS 0
|
||||
|
||||
#define CONFIG_ENV_IS_IN_SPI_FLASH
|
||||
#define CONFIG_ENV_ADDR 0xbfc20000
|
||||
#define CONFIG_ENV_OFFSET 0x20000
|
||||
#define CONFIG_ENV_SIZE 0x01000
|
||||
#define CONFIG_ENV_SECT_SIZE 0x10000
|
||||
#define CONFIG_SYS_MAX_FLASH_BANKS 1
|
||||
#define CONFIG_SYS_MAX_FLASH_SECT 64
|
||||
#define CONFIG_SYS_FLASH_BASE 0xbfc00000
|
||||
|
||||
/* Net support */
|
||||
#define CONFIG_ETHADDR_ADDR 0xbfc0fff8
|
||||
#define CONFIG_SYS_RX_ETH_BUFFER 16
|
||||
#define CONFIG_AG71XX
|
||||
#define CONFIG_AG71XX_PORTS { 1, 1 }
|
||||
#define CONFIG_AG71XX_MII0_IIF MII0_CTRL_IF_RGMII
|
||||
#define CONFIG_AG71XX_MII1_IIF MII1_CTRL_IF_RGMII
|
||||
#define CONFIG_NET_MULTI
|
||||
#define CONFIG_IPADDR 192.168.1.254
|
||||
#define CONFIG_SERVERIP 192.168.1.42
|
||||
|
||||
/* Switch support */
|
||||
#define CONFIG_MII
|
||||
#define CONFIG_RTL8366_MII
|
||||
#define RTL8366_PIN_SDA 16
|
||||
#define RTL8366_PIN_SCK 18
|
||||
#define MII_GPIOINCLUDE <asm/ar71xx_gpio.h>
|
||||
#define MII_SETSDA(x) ar71xx_setpin(RTL8366_PIN_SDA, x)
|
||||
#define MII_GETSDA ar71xx_getpin(RTL8366_PIN_SDA)
|
||||
#define MII_SETSCK(x) ar71xx_setpin(RTL8366_PIN_SCK, x)
|
||||
#define MII_SDAINPUT ar71xx_setpindir(RTL8366_PIN_SDA, 0)
|
||||
#define MII_SDAOUTPUT ar71xx_setpindir(RTL8366_PIN_SDA, 1)
|
||||
#define MII_SCKINPUT ar71xx_setpindir(RTL8366_PIN_SCK, 0)
|
||||
#define MII_SCKOUTPUT ar71xx_setpindir(RTL8366_PIN_SCK, 1)
|
||||
|
||||
#define CONFIG_BOOTDELAY 3
|
||||
#define CONFIG_BOOTARGS "console=ttyS0,115200 rootfstype==squashfs,jffs2 noinitrd machtype=NBG460N"
|
||||
#define CONFIG_BOOTCOMMAND "bootm 0xbfc70000"
|
||||
#define CONFIG_LZMA
|
||||
|
||||
|
||||
/* Commands */
|
||||
#define CONFIG_SYS_NO_FLASH
|
||||
#include <config_cmd_default.h>
|
||||
#undef CONFIG_CMD_BDI
|
||||
#undef CONFIG_CMD_FPGA
|
||||
#undef CONFIG_CMD_IMI
|
||||
#undef CONFIG_CMD_IMLS
|
||||
#undef CONFIG_CMD_LOADS
|
||||
#define CONFIG_CMD_SF
|
||||
#define CONFIG_CMD_MII
|
||||
#define CONFIG_CMD_PING
|
||||
#define CONFIG_CMD_DHCP
|
||||
#define CONFIG_CMD_SPI
|
||||
|
||||
/* Miscellaneous configurable options */
|
||||
#define CONFIG_SYS_PROMPT "U-Boot> "
|
||||
#define CONFIG_SYS_CBSIZE 256
|
||||
#define CONFIG_SYS_MAXARGS 16
|
||||
#define CONFIG_SYS_PBSIZE (CONFIG_SYS_CBSIZE + sizeof(CONFIG_SYS_PROMPT) + 16)
|
||||
#define CONFIG_SYS_LONGHELP 1
|
||||
#define CONFIG_CMDLINE_EDITING 1
|
||||
#define CONFIG_AUTO_COMPLETE
|
||||
#define CONFIG_SYS_HUSH_PARSER
|
||||
#define CONFIG_SYS_PROMPT_HUSH_PS2 "> "
|
||||
|
||||
/* Size of malloc() pool */
|
||||
#define CONFIG_SYS_MALLOC_LEN ROUND(3 * 0x10000 + 128*1024, 0x1000)
|
||||
#define CONFIG_SYS_GBL_DATA_SIZE 128 /* 128 bytes for initial data */
|
||||
|
||||
#define CONFIG_SYS_BOOTPARAMS_LEN 128*1024
|
||||
|
||||
#define CONFIG_SYS_SDRAM_BASE 0x80000000 /* Cached addr */
|
||||
#define CONFIG_SYS_LOAD_ADDR 0x80060000 /* default load address */
|
||||
|
||||
#define CONFIG_SYS_MEMTEST_START 0x80000800
|
||||
#define CONFIG_SYS_MEMTEST_END 0x81E00000
|
||||
|
||||
#endif /* _NBG460N_CONFIG_H */
|
||||
28
package/boot/uboot-ar71xx/patches/001-ar71xx.patch
Normal file
28
package/boot/uboot-ar71xx/patches/001-ar71xx.patch
Normal file
@@ -0,0 +1,28 @@
|
||||
diff -ur u-boot-2010.03/cpu/mips/Makefile u-boot-nbg/cpu/mips/Makefile
|
||||
--- u-boot-2010.03/cpu/mips/Makefile 2010-03-31 23:54:39.000000000 +0200
|
||||
+++ u-boot-nbg/cpu/mips/Makefile 2010-04-15 18:58:01.000000000 +0200
|
||||
@@ -33,6 +33,7 @@
|
||||
COBJS-$(CONFIG_INCA_IP) += asc_serial.o incaip_clock.o
|
||||
COBJS-$(CONFIG_PURPLE) += asc_serial.o
|
||||
COBJS-$(CONFIG_SOC_AU1X00) += au1x00_eth.o au1x00_serial.o au1x00_usb_ohci.o
|
||||
+COBJS-$(CONFIG_AR71XX) += ar71xx_serial.o
|
||||
|
||||
SRCS := $(START:.o=.S) $(SOBJS-y:.o=.S) $(COBJS-y:.o=.c)
|
||||
OBJS := $(addprefix $(obj),$(SOBJS-y) $(COBJS-y))
|
||||
diff -ur u-boot-2010.03/Makefile u-boot-nbg/Makefile
|
||||
--- u-boot-2010.03/Makefile 2010-03-31 23:54:39.000000000 +0200
|
||||
+++ u-boot-nbg/Makefile 2010-04-11 23:31:29.000000000 +0200
|
||||
@@ -3455,6 +3455,13 @@
|
||||
@$(MKCONFIG) -a qemu-mips mips mips qemu-mips
|
||||
|
||||
#########################################################################
|
||||
+## MIPS32 AR71XX (24K)
|
||||
+#########################################################################
|
||||
+
|
||||
+nbg460n_550n_550nh_config : unconfig
|
||||
+ @$(MKCONFIG) -a nbg460n mips mips nbg460n zyxel
|
||||
+
|
||||
+#########################################################################
|
||||
## MIPS64 5Kc
|
||||
#########################################################################
|
||||
|
||||
11
package/boot/uboot-ar71xx/patches/002-ar71xx-spi.patch
Normal file
11
package/boot/uboot-ar71xx/patches/002-ar71xx-spi.patch
Normal file
@@ -0,0 +1,11 @@
|
||||
diff -ur u-boot-2010.03/drivers/spi/Makefile u-boot-nbg/drivers/spi/Makefile
|
||||
--- u-boot-2010.03/drivers/spi/Makefile 2010-03-31 23:54:39.000000000 +0200
|
||||
+++ u-boot-nbg/drivers/spi/Makefile 2010-04-15 19:31:27.000000000 +0200
|
||||
@@ -25,6 +25,7 @@
|
||||
|
||||
LIB := $(obj)libspi.a
|
||||
|
||||
+COBJS-$(CONFIG_AR71XX_SPI) += ar71xx_spi.o
|
||||
COBJS-$(CONFIG_ATMEL_DATAFLASH_SPI) += atmel_dataflash_spi.o
|
||||
COBJS-$(CONFIG_ATMEL_SPI) += atmel_spi.o
|
||||
COBJS-$(CONFIG_BFIN_SPI) += bfin_spi.o
|
||||
22
package/boot/uboot-ar71xx/patches/010-enet-ag71xx.patch
Normal file
22
package/boot/uboot-ar71xx/patches/010-enet-ag71xx.patch
Normal file
@@ -0,0 +1,22 @@
|
||||
diff -ur u-boot-2010.03/drivers/net/Makefile u-boot-nbg/drivers/net/Makefile
|
||||
--- u-boot-2010.03/drivers/net/Makefile 2010-03-31 23:54:39.000000000 +0200
|
||||
+++ u-boot-nbg/drivers/net/Makefile 2010-04-19 23:30:01.000000000 +0200
|
||||
@@ -27,6 +27,7 @@
|
||||
|
||||
COBJS-$(CONFIG_DRIVER_3C589) += 3c589.o
|
||||
COBJS-$(CONFIG_PPC4xx_EMAC) += 4xx_enet.o
|
||||
+COBJS-$(CONFIG_AG71XX) += ag71xx.o
|
||||
COBJS-$(CONFIG_DRIVER_AT91EMAC) += at91_emac.o
|
||||
COBJS-$(CONFIG_DRIVER_AX88180) += ax88180.o
|
||||
COBJS-$(CONFIG_BCM570x) += bcm570x.o bcm570x_autoneg.o 5701rls.o
|
||||
diff -ur u-boot-2010.03/include/netdev.h u-boot-nbg/include/netdev.h
|
||||
--- u-boot-2010.03/include/netdev.h 2010-03-31 23:54:39.000000000 +0200
|
||||
+++ u-boot-nbg/include/netdev.h 2010-05-02 11:30:58.000000000 +0200
|
||||
@@ -42,6 +42,7 @@
|
||||
|
||||
/* Driver initialization prototypes */
|
||||
int au1x00_enet_initialize(bd_t*);
|
||||
+int ag71xx_register(bd_t * bis, char *phyname[], u16 phyid[], u16 phyfixed[]);
|
||||
int at91emac_register(bd_t *bis, unsigned long iobase);
|
||||
int bfin_EMAC_initialize(bd_t *bis);
|
||||
int cs8900_initialize(u8 dev_num, int base_addr);
|
||||
28
package/boot/uboot-ar71xx/patches/011-switch-rtl8366sr.patch
Normal file
28
package/boot/uboot-ar71xx/patches/011-switch-rtl8366sr.patch
Normal file
@@ -0,0 +1,28 @@
|
||||
diff -ur u-boot-2010.03/drivers/net/Makefile u-boot-nbg/drivers/net/Makefile
|
||||
--- u-boot-2010.03/drivers/net/Makefile 2010-03-31 23:54:39.000000000 +0200
|
||||
+++ u-boot-nbg/drivers/net/Makefile 2010-04-19 23:30:01.000000000 +0200
|
||||
@@ -65,6 +65,7 @@
|
||||
COBJS-$(CONFIG_DRIVER_RTL8019) += rtl8019.o
|
||||
COBJS-$(CONFIG_RTL8139) += rtl8139.o
|
||||
COBJS-$(CONFIG_RTL8169) += rtl8169.o
|
||||
+COBJS-$(CONFIG_RTL8366_MII) += phy/rtl8366_mii.o
|
||||
COBJS-$(CONFIG_DRIVER_S3C4510_ETH) += s3c4510b_eth.o
|
||||
COBJS-$(CONFIG_SH_ETHER) += sh_eth.o
|
||||
COBJS-$(CONFIG_SMC91111) += smc91111.o
|
||||
diff -ur u-boot-2010.03/include/netdev.h u-boot-nbg/include/netdev.h
|
||||
--- u-boot-2010.03/include/netdev.h 2010-03-31 23:54:39.000000000 +0200
|
||||
+++ u-boot-nbg/include/netdev.h 2010-05-02 11:30:58.000000000 +0200
|
||||
@@ -175,5 +175,13 @@
|
||||
|
||||
int mv88e61xx_switch_initialize(struct mv88e61xx_config *swconfig);
|
||||
#endif /* CONFIG_MV88E61XX_SWITCH */
|
||||
+
|
||||
+#if defined(CONFIG_RTL8366_MII)
|
||||
+#define RTL8366_DEVNAME "rtl8366"
|
||||
+#define RTL8366_WANPHY_ID 4
|
||||
+#define RTL8366_LANPHY_ID -1
|
||||
+int rtl8366_mii_register(bd_t *bis);
|
||||
+int rtl8366s_initialize(void);
|
||||
+#endif
|
||||
|
||||
#endif /* _NETDEV_H_ */
|
||||
11
package/boot/uboot-ar71xx/patches/020-freebsd-compat.patch
Normal file
11
package/boot/uboot-ar71xx/patches/020-freebsd-compat.patch
Normal file
@@ -0,0 +1,11 @@
|
||||
--- a/include/compiler.h
|
||||
+++ b/include/compiler.h
|
||||
@@ -46,7 +46,7 @@ extern int errno;
|
||||
#ifdef __linux__
|
||||
# include <endian.h>
|
||||
# include <byteswap.h>
|
||||
-#elif defined(__MACH__)
|
||||
+#elif defined(__MACH__) || defined(__FreeBSD__)
|
||||
# include <machine/endian.h>
|
||||
typedef unsigned long ulong;
|
||||
typedef unsigned int uint;
|
||||
23
package/boot/uboot-ar71xx/patches/021-darwin_compat.patch
Normal file
23
package/boot/uboot-ar71xx/patches/021-darwin_compat.patch
Normal file
@@ -0,0 +1,23 @@
|
||||
--- a/config.mk
|
||||
+++ b/config.mk
|
||||
@@ -64,9 +64,17 @@ HOSTSTRIP = strip
|
||||
#
|
||||
|
||||
ifeq ($(HOSTOS),darwin)
|
||||
-HOSTCC = cc
|
||||
-HOSTCFLAGS += -traditional-cpp
|
||||
-HOSTLDFLAGS += -multiply_defined suppress
|
||||
+#get the major and minor product version (e.g. '10' and '6' for Snow Leopard)
|
||||
+DARWIN_MAJOR_VERSION = $(shell sw_vers -productVersion | cut -f 1 -d '.')
|
||||
+DARWIN_MINOR_VERSION = $(shell sw_vers -productVersion | cut -f 2 -d '.')
|
||||
+
|
||||
+before-snow-leopard = $(shell if [ $(DARWIN_MAJOR_VERSION) -le 10 -a \
|
||||
+ $(DARWIN_MINOR_VERSION) -le 5 ] ; then echo "$(1)"; else echo "$(2)"; fi ;)
|
||||
+
|
||||
+# Snow Leopards build environment has no longer restrictions as described above
|
||||
+HOSTCC = $(call before-snow-leopard, "cc", "gcc")
|
||||
+HOSTCFLAGS += $(call before-snow-leopard, "-traditional-cpp")
|
||||
+HOSTLDFLAGS += $(call before-snow-leopard, "-multiply_defined suppress")
|
||||
else
|
||||
HOSTCC = gcc
|
||||
endif
|
||||
21
package/boot/uboot-ar71xx/patches/022-getline_backport.patch
Normal file
21
package/boot/uboot-ar71xx/patches/022-getline_backport.patch
Normal file
@@ -0,0 +1,21 @@
|
||||
--- a/tools/os_support.c
|
||||
+++ b/tools/os_support.c
|
||||
@@ -23,6 +23,6 @@
|
||||
#ifdef __MINGW32__
|
||||
#include "mingw_support.c"
|
||||
#endif
|
||||
-#ifdef __APPLE__
|
||||
+#if defined(__APPLE__) && __DARWIN_C_LEVEL < 200809L
|
||||
#include "getline.c"
|
||||
#endif
|
||||
--- a/tools/os_support.h
|
||||
+++ b/tools/os_support.h
|
||||
@@ -28,7 +28,7 @@
|
||||
#include "mingw_support.h"
|
||||
#endif
|
||||
|
||||
-#ifdef __APPLE__
|
||||
+#if defined(__APPLE__) && __DARWIN_C_LEVEL < 200809L
|
||||
#include "getline.h"
|
||||
#endif
|
||||
|
||||
70
package/boot/uboot-envtools/Makefile
Normal file
70
package/boot/uboot-envtools/Makefile
Normal file
@@ -0,0 +1,70 @@
|
||||
#
|
||||
# Copyright (C) 2006-2012 OpenWrt.org
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=uboot-envtools
|
||||
PKG_DISTNAME:=u-boot
|
||||
PKG_VERSION:=2012.04.01
|
||||
PKG_RELEASE:=1
|
||||
|
||||
PKG_SOURCE:=$(PKG_DISTNAME)-$(PKG_VERSION).tar.bz2
|
||||
PKG_SOURCE_URL:=ftp://ftp.denx.de/pub/u-boot
|
||||
PKG_MD5SUM:=192bb231082d9159fb6e16de3039b6b2
|
||||
PKG_BUILD_DEPENDS:=zlib
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
TAR_OPTIONS+= --strip-components=3 -C $(PKG_BUILD_DIR) $(PKG_DISTNAME)-$(PKG_VERSION)/tools/env
|
||||
|
||||
define Package/uboot-envtools
|
||||
SECTION:=utils
|
||||
CATEGORY:=Utilities
|
||||
TITLE:=read/modify U-Boot bootloader environment
|
||||
URL:=http://www.denx.de/wiki/U-Boot
|
||||
endef
|
||||
|
||||
define Package/uboot-envtools/description
|
||||
This package includes tools to read and modify U-Boot bootloader environment.
|
||||
endef
|
||||
|
||||
define Build/Prepare
|
||||
mkdir -p $(PKG_BUILD_DIR)
|
||||
tar xvjf $(DL_DIR)/$(PKG_SOURCE) --strip-components=2 -C $(PKG_BUILD_DIR) $(PKG_DISTNAME)-$(PKG_VERSION)/lib/crc32.c
|
||||
$(call Build/Prepare/Default)
|
||||
endef
|
||||
|
||||
define Package/uboot-envtools/conffiles
|
||||
/etc/config/ubootenv
|
||||
/etc/fw_env.config
|
||||
endef
|
||||
|
||||
define Package/uboot-envtools/install
|
||||
$(INSTALL_DIR) $(1)/usr/sbin
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/fw_printenv $(1)/usr/sbin
|
||||
ln -s fw_printenv $(1)/usr/sbin/fw_setenv
|
||||
$(INSTALL_DIR) $(1)/lib
|
||||
$(INSTALL_DATA) ./files/uboot-envtools.sh $(1)/lib
|
||||
ifneq ($(CONFIG_TARGET_ar71xx),)
|
||||
$(INSTALL_DIR) $(1)/etc/uci-defaults
|
||||
$(INSTALL_BIN) ./files/ar71xx $(1)/etc/uci-defaults/uboot-envtools
|
||||
endif
|
||||
ifneq ($(CONFIG_TARGET_kirkwood),)
|
||||
$(INSTALL_DIR) $(1)/etc/uci-defaults
|
||||
$(INSTALL_BIN) ./files/kirkwood $(1)/etc/uci-defaults/uboot-envtools
|
||||
endif
|
||||
ifneq ($(CONFIG_TARGET_lantiq),)
|
||||
$(INSTALL_DIR) $(1)/etc/uci-defaults
|
||||
$(INSTALL_BIN) ./files/lantiq $(1)/etc/uci-defaults/uboot-envtools
|
||||
endif
|
||||
ifneq ($(CONFIG_TARGET_ramips),)
|
||||
$(INSTALL_DIR) $(1)/etc/uci-defaults
|
||||
$(INSTALL_BIN) ./files/ramips $(1)/etc/uci-defaults/uboot-envtools
|
||||
endif
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,uboot-envtools))
|
||||
31
package/boot/uboot-envtools/files/ar71xx
Normal file
31
package/boot/uboot-envtools/files/ar71xx
Normal file
@@ -0,0 +1,31 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright (C) 2011-2012 OpenWrt.org
|
||||
#
|
||||
|
||||
[ -e /etc/config/ubootenv ] && exit 0
|
||||
|
||||
touch /etc/config/ubootenv
|
||||
|
||||
. /lib/ar71xx.sh
|
||||
. /lib/uboot-envtools.sh
|
||||
. /lib/functions.sh
|
||||
|
||||
board=$(ar71xx_board_name)
|
||||
|
||||
case "$board" in
|
||||
all0258n)
|
||||
ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x10000" "0x10000"
|
||||
;;
|
||||
alfa-ap96 | \
|
||||
all0315n | \
|
||||
om2p | \
|
||||
om2p-lc)
|
||||
ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x40000" "0x40000"
|
||||
;;
|
||||
esac
|
||||
|
||||
config_load ubootenv
|
||||
config_foreach ubootenv_add_app_config ubootenv
|
||||
|
||||
exit 0
|
||||
25
package/boot/uboot-envtools/files/kirkwood
Normal file
25
package/boot/uboot-envtools/files/kirkwood
Normal file
@@ -0,0 +1,25 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright (C) 2012 OpenWrt.org
|
||||
#
|
||||
|
||||
[ -e /etc/config/ubootenv ] && exit 0
|
||||
|
||||
touch /etc/config/ubootenv
|
||||
|
||||
. /lib/kirkwood.sh
|
||||
. /lib/uboot-envtools.sh
|
||||
. /lib/functions.sh
|
||||
|
||||
hardware=$(kirkwood_hardware_name)
|
||||
|
||||
case "$hardware" in
|
||||
"RaidSonic ICY BOX IB-NAS6210")
|
||||
ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x20000" "0x20000"
|
||||
;;
|
||||
esac
|
||||
|
||||
config_load ubootenv
|
||||
config_foreach ubootenv_add_app_config ubootenv
|
||||
|
||||
exit 0
|
||||
25
package/boot/uboot-envtools/files/lantiq
Normal file
25
package/boot/uboot-envtools/files/lantiq
Normal file
@@ -0,0 +1,25 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright (C) 2012 OpenWrt.org
|
||||
#
|
||||
|
||||
[ -e /etc/config/ubootenv ] && exit 0
|
||||
|
||||
touch /etc/config/ubootenv
|
||||
|
||||
. /lib/lantiq.sh
|
||||
. /lib/uboot-envtools.sh
|
||||
. /lib/functions.sh
|
||||
|
||||
board=$(lantiq_board_name)
|
||||
|
||||
case "$board" in
|
||||
GIGASX76X)
|
||||
ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x10000" "0x10000" "1"
|
||||
;;
|
||||
esac
|
||||
|
||||
config_load ubootenv
|
||||
config_foreach ubootenv_add_app_config ubootenv
|
||||
|
||||
exit 0
|
||||
27
package/boot/uboot-envtools/files/ramips
Normal file
27
package/boot/uboot-envtools/files/ramips
Normal file
@@ -0,0 +1,27 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright (C) 2011-2012 OpenWrt.org
|
||||
#
|
||||
|
||||
[ -e /etc/config/ubootenv ] && exit 0
|
||||
|
||||
touch /etc/config/ubootenv
|
||||
|
||||
. /lib/ramips.sh
|
||||
. /lib/uboot-envtools.sh
|
||||
. /lib/functions.sh
|
||||
|
||||
board=$(ramips_board_name)
|
||||
|
||||
case "$board" in
|
||||
all0239-3g | \
|
||||
all0256n | \
|
||||
all5002)
|
||||
ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x10000" "0x10000"
|
||||
;;
|
||||
esac
|
||||
|
||||
config_load ubootenv
|
||||
config_foreach ubootenv_add_app_config ubootenv
|
||||
|
||||
exit 0
|
||||
36
package/boot/uboot-envtools/files/uboot-envtools.sh
Normal file
36
package/boot/uboot-envtools/files/uboot-envtools.sh
Normal file
@@ -0,0 +1,36 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright (C) 2011-2012 OpenWrt.org
|
||||
#
|
||||
|
||||
ubootenv_add_uci_config() {
|
||||
local dev=$1
|
||||
local offset=$2
|
||||
local envsize=$3
|
||||
local secsize=$4
|
||||
local numsec=$5
|
||||
uci batch <<EOF
|
||||
add ubootenv ubootenv
|
||||
set ubootenv.@ubootenv[-1].dev='$dev'
|
||||
set ubootenv.@ubootenv[-1].offset='$offset'
|
||||
set ubootenv.@ubootenv[-1].envsize='$envsize'
|
||||
set ubootenv.@ubootenv[-1].secsize='$secsize'
|
||||
set ubootenv.@ubootenv[-1].numsec='$numsec'
|
||||
EOF
|
||||
uci commit ubootenv
|
||||
}
|
||||
|
||||
ubootenv_add_app_config() {
|
||||
local dev
|
||||
local offset
|
||||
local envsize
|
||||
local secsize
|
||||
local numsec
|
||||
config_get dev "$1" dev
|
||||
config_get offset "$1" offset
|
||||
config_get envsize "$1" envsize
|
||||
config_get secsize "$1" secsize
|
||||
config_get numsec "$1" numsec
|
||||
echo "$dev $offset $envsize $secsize $numsec" >>/etc/fw_env.config
|
||||
}
|
||||
|
||||
@@ -0,0 +1,130 @@
|
||||
--- a/crc32.c
|
||||
+++ b/crc32.c
|
||||
@@ -8,21 +8,16 @@
|
||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||
*/
|
||||
|
||||
-#ifndef USE_HOSTCC
|
||||
-#include <common.h>
|
||||
-#endif
|
||||
-#include <compiler.h>
|
||||
-#include <u-boot/crc.h>
|
||||
+#include <stdint.h>
|
||||
+#include <asm/byteorder.h>
|
||||
+
|
||||
+#include "zlib.h"
|
||||
|
||||
-#if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG)
|
||||
-#include <watchdog.h>
|
||||
-#endif
|
||||
-#include "u-boot/zlib.h"
|
||||
|
||||
#define local static
|
||||
#define ZEXPORT /* empty */
|
||||
|
||||
-#define tole(x) cpu_to_le32(x)
|
||||
+#define tole(x) __constant_cpu_to_le32(x)
|
||||
|
||||
#ifdef DYNAMIC_CRC_TABLE
|
||||
|
||||
@@ -151,7 +146,7 @@ tole(0xb40bbe37L), tole(0xc30c8ea1L), to
|
||||
|
||||
#if 0
|
||||
/* =========================================================================
|
||||
- * This function can be used by asm versions of crc32()
|
||||
+ * This function can be used by asm versions of uboot_crc32()
|
||||
*/
|
||||
const uint32_t * ZEXPORT get_crc_table()
|
||||
{
|
||||
@@ -183,7 +178,7 @@ uint32_t ZEXPORT crc32_no_comp(uint32_t
|
||||
if (crc_table_empty)
|
||||
make_crc_table();
|
||||
#endif
|
||||
- crc = cpu_to_le32(crc);
|
||||
+ crc = __cpu_to_le32(crc);
|
||||
/* Align it */
|
||||
if (((long)b) & 3 && len) {
|
||||
uint8_t *p = (uint8_t *)b;
|
||||
@@ -212,11 +207,11 @@ uint32_t ZEXPORT crc32_no_comp(uint32_t
|
||||
} while (--len);
|
||||
}
|
||||
|
||||
- return le32_to_cpu(crc);
|
||||
+ return __le32_to_cpu(crc);
|
||||
}
|
||||
#undef DO_CRC
|
||||
|
||||
-uint32_t ZEXPORT crc32 (uint32_t crc, const Bytef *p, uInt len)
|
||||
+uint32_t ZEXPORT uboot_crc32 (uint32_t crc, const Bytef *p, uInt len)
|
||||
{
|
||||
return crc32_no_comp(crc ^ 0xffffffffL, p, len) ^ 0xffffffffL;
|
||||
}
|
||||
@@ -239,12 +234,12 @@ uint32_t ZEXPORT crc32_wd (uint32_t crc,
|
||||
chunk = end - curr;
|
||||
if (chunk > chunk_sz)
|
||||
chunk = chunk_sz;
|
||||
- crc = crc32 (crc, curr, chunk);
|
||||
+ crc = uboot_crc32 (crc, curr, chunk);
|
||||
curr += chunk;
|
||||
WATCHDOG_RESET ();
|
||||
}
|
||||
#else
|
||||
- crc = crc32 (crc, buf, len);
|
||||
+ crc = uboot_crc32 (crc, buf, len);
|
||||
#endif
|
||||
|
||||
return crc;
|
||||
--- a/fw_env.c
|
||||
+++ b/fw_env.c
|
||||
@@ -34,6 +34,7 @@
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
+#include <zlib.h>
|
||||
|
||||
#ifdef MTD_OLD
|
||||
# include <stdint.h>
|
||||
@@ -212,13 +213,14 @@ static char default_environment[] = {
|
||||
static int flash_io (int mode);
|
||||
static char *envmatch (char * s1, char * s2);
|
||||
static int parse_config (void);
|
||||
+uint32_t uboot_crc32 (uint32_t crc, const Bytef *p, uInt len);
|
||||
|
||||
#if defined(CONFIG_FILE)
|
||||
static int get_config (char *);
|
||||
#endif
|
||||
-static inline ulong getenvsize (void)
|
||||
+static inline uint32_t getenvsize (void)
|
||||
{
|
||||
- ulong rc = CONFIG_ENV_SIZE - sizeof (long);
|
||||
+ uint32_t rc = CONFIG_ENV_SIZE - sizeof (uint32_t);
|
||||
|
||||
if (HaveRedundEnv)
|
||||
rc -= sizeof (char);
|
||||
@@ -348,7 +350,7 @@ int fw_env_close(void)
|
||||
/*
|
||||
* Update CRC
|
||||
*/
|
||||
- *environment.crc = crc32(0, (uint8_t *) environment.data, ENV_SIZE);
|
||||
+ *environment.crc = uboot_crc32(0, (uint8_t *) environment.data, ENV_SIZE);
|
||||
|
||||
/* write environment back to flash */
|
||||
if (flash_io(O_RDWR)) {
|
||||
@@ -1116,7 +1118,7 @@ int fw_env_open(void)
|
||||
if (flash_io (O_RDONLY))
|
||||
return -1;
|
||||
|
||||
- crc0 = crc32 (0, (uint8_t *) environment.data, ENV_SIZE);
|
||||
+ crc0 = uboot_crc32 (0, (uint8_t *) environment.data, ENV_SIZE);
|
||||
crc0_ok = (crc0 == *environment.crc);
|
||||
if (!HaveRedundEnv) {
|
||||
if (!crc0_ok) {
|
||||
@@ -1160,7 +1162,7 @@ int fw_env_open(void)
|
||||
return -1;
|
||||
}
|
||||
|
||||
- crc1 = crc32 (0, (uint8_t *) redundant->data, ENV_SIZE);
|
||||
+ crc1 = uboot_crc32 (0, (uint8_t *) redundant->data, ENV_SIZE);
|
||||
crc1_ok = (crc1 == redundant->crc);
|
||||
flag1 = redundant->flags;
|
||||
|
||||
44
package/boot/uboot-envtools/patches/002-makefile.patch
Normal file
44
package/boot/uboot-envtools/patches/002-makefile.patch
Normal file
@@ -0,0 +1,44 @@
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -21,34 +21,17 @@
|
||||
# MA 02111-1307 USA
|
||||
#
|
||||
|
||||
-include $(TOPDIR)/config.mk
|
||||
-
|
||||
-HOSTSRCS := $(SRCTREE)/lib/crc32.c fw_env.c fw_env_main.c
|
||||
+SRCS := crc32.c fw_env.c fw_env_main.c
|
||||
HEADERS := fw_env.h
|
||||
|
||||
-# Compile for a hosted environment on the target
|
||||
-HOSTCPPFLAGS = -idirafter $(SRCTREE)/include \
|
||||
- -idirafter $(OBJTREE)/include2 \
|
||||
- -idirafter $(OBJTREE)/include \
|
||||
- -DUSE_HOSTCC
|
||||
-
|
||||
-ifeq ($(MTD_VERSION),old)
|
||||
-HOSTCPPFLAGS += -DMTD_OLD
|
||||
-endif
|
||||
-
|
||||
-all: $(obj)fw_printenv
|
||||
-
|
||||
-# Some files complain if compiled with -pedantic, use HOSTCFLAGS_NOPED
|
||||
-$(obj)fw_printenv: $(HOSTSRCS) $(HEADERS)
|
||||
- $(HOSTCC) $(HOSTCFLAGS_NOPED) $(HOSTLDFLAGS) -o $@ $(HOSTSRCS)
|
||||
+CPPFLAGS := -Wall $(CFLAGS)
|
||||
|
||||
-clean:
|
||||
- rm -f $(obj)fw_printenv
|
||||
+all: fw_printenv
|
||||
|
||||
-#########################################################################
|
||||
+fw_printenv: $(SRCS) $(HEADERS)
|
||||
+ $(CC) $(CPPFLAGS) $(SRCS) -o fw_printenv
|
||||
|
||||
-include $(TOPDIR)/rules.mk
|
||||
-
|
||||
-sinclude $(obj).depend
|
||||
+clean:
|
||||
+ rm -f fw_printenv
|
||||
|
||||
#########################################################################
|
||||
14
package/boot/uboot-envtools/patches/003-nor-eraselen.patch
Normal file
14
package/boot/uboot-envtools/patches/003-nor-eraselen.patch
Normal file
@@ -0,0 +1,14 @@
|
||||
--- a/fw_env.c
|
||||
+++ b/fw_env.c
|
||||
@@ -790,7 +790,10 @@ static int flash_write_buf (int dev, int
|
||||
erase_offset = (offset / blocklen) * blocklen;
|
||||
|
||||
/* Maximum area we may use */
|
||||
- erase_len = top_of_range - erase_offset;
|
||||
+ if (mtd_type == MTD_NANDFLASH)
|
||||
+ erase_len = top_of_range - erase_offset;
|
||||
+ else
|
||||
+ erase_len = blocklen;
|
||||
|
||||
blockstart = erase_offset;
|
||||
/* Offset inside a block */
|
||||
@@ -0,0 +1,21 @@
|
||||
--- a/fw_env.c
|
||||
+++ b/fw_env.c
|
||||
@@ -46,8 +46,6 @@
|
||||
|
||||
#include "fw_env.h"
|
||||
|
||||
-#include <config.h>
|
||||
-
|
||||
#define WHITESPACE(c) ((c == '\t') || (c == ' '))
|
||||
|
||||
#define min(x, y) ({ \
|
||||
@@ -401,9 +399,7 @@ int fw_env_write(char *name, char *value
|
||||
if (
|
||||
(strcmp(name, "serial#") == 0) ||
|
||||
((strcmp(name, "ethaddr") == 0)
|
||||
-#if defined(CONFIG_OVERWRITE_ETHADDR_ONCE) && defined(CONFIG_ETHADDR)
|
||||
&& (strcmp(oldval, MK_STR(CONFIG_ETHADDR)) != 0)
|
||||
-#endif /* CONFIG_OVERWRITE_ETHADDR_ONCE && CONFIG_ETHADDR */
|
||||
) ) {
|
||||
fprintf (stderr, "Can't overwrite \"%s\"\n", name);
|
||||
errno = EROFS;
|
||||
110
package/boot/uboot-kirkwood/Makefile
Normal file
110
package/boot/uboot-kirkwood/Makefile
Normal file
@@ -0,0 +1,110 @@
|
||||
#
|
||||
# Copyright (C) 2010-2012 OpenWrt.org
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
include $(INCLUDE_DIR)/kernel.mk
|
||||
|
||||
PKG_NAME:=u-boot
|
||||
PKG_VERSION:=2012.04.01
|
||||
PKG_RELEASE:=1
|
||||
|
||||
PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
|
||||
PKG_SOURCE_URL:=ftp://ftp.denx.de/pub/u-boot
|
||||
PKG_MD5SUM:=192bb231082d9159fb6e16de3039b6b2
|
||||
PKG_TARGETS:=bin
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define uboot/Default
|
||||
TITLE:=
|
||||
CONFIG:=
|
||||
IMAGE:=
|
||||
endef
|
||||
|
||||
define uboot/sheevaplug
|
||||
TITLE:=U-Boot for the SheevaPlug
|
||||
endef
|
||||
|
||||
define uboot/dockstar
|
||||
TITLE:=U-Boot for the Seagate DockStar
|
||||
endef
|
||||
|
||||
define uboot/iconnect
|
||||
TITLE:=U-Boot for the Iomega iConnect Wireless
|
||||
endef
|
||||
|
||||
define uboot/ib62x0
|
||||
TITLE:=U-Boot for the RaidSonic ICY BOX NAS6210 and NAS6220
|
||||
endef
|
||||
|
||||
UBOOTS:=sheevaplug dockstar iconnect ib62x0
|
||||
|
||||
define Package/uboot/template
|
||||
define Package/uboot-kirkwood-$(1)
|
||||
SECTION:=boot
|
||||
CATEGORY:=Boot Loaders
|
||||
DEPENDS:=@TARGET_kirkwood
|
||||
TITLE:=$(2)
|
||||
URL:=http://www.denx.de/wiki/U-Boot
|
||||
VARIANT:=$(1)
|
||||
endef
|
||||
endef
|
||||
|
||||
define BuildUBootPackage
|
||||
$(eval $(uboot/Default))
|
||||
$(eval $(uboot/$(1)))
|
||||
$(call Package/uboot/template,$(1),$(TITLE))
|
||||
endef
|
||||
|
||||
ifdef BUILD_VARIANT
|
||||
$(eval $(call uboot/$(BUILD_VARIANT)))
|
||||
UBOOT_CONFIG:=$(if $(CONFIG),$(CONFIG),$(BUILD_VARIANT))
|
||||
UBOOT_IMAGE:=$(if $(IMAGE),$(IMAGE),openwrt-$(BOARD)-$(BUILD_VARIANT)-u-boot.bin)
|
||||
endif
|
||||
|
||||
define Build/Prepare
|
||||
$(call Build/Prepare/Default)
|
||||
$(CP) ./files/* $(PKG_BUILD_DIR)
|
||||
endef
|
||||
|
||||
define Build/Configure
|
||||
$(MAKE) -C $(PKG_BUILD_DIR) \
|
||||
$(UBOOT_CONFIG)_config
|
||||
endef
|
||||
|
||||
define Build/Compile
|
||||
$(MAKE) -C $(PKG_BUILD_DIR) \
|
||||
u-boot.kwb \
|
||||
CROSS_COMPILE=$(TARGET_CROSS)
|
||||
endef
|
||||
|
||||
define Package/uboot/install/default
|
||||
$(INSTALL_DIR) $(BIN_DIR)
|
||||
$(CP) $(PKG_BUILD_DIR)/u-boot.bin \
|
||||
$(BIN_DIR)/openwrt-$(BOARD)-$(1)-u-boot.bin
|
||||
$(CP) $(PKG_BUILD_DIR)/u-boot.kwb \
|
||||
$(BIN_DIR)/openwrt-$(BOARD)-$(1)-u-boot.kwb
|
||||
$(INSTALL_DIR) $(BIN_DIR)/u-boot-kwboot/
|
||||
$(CP) $(PKG_BUILD_DIR)/tools/kwboot \
|
||||
$(BIN_DIR)/u-boot-kwboot/
|
||||
endef
|
||||
|
||||
define Package/uboot/install/template
|
||||
define Package/uboot-kirkwood-$(1)/install
|
||||
$(call Package/uboot/install/default,$(2))
|
||||
endef
|
||||
endef
|
||||
|
||||
$(foreach u,$(UBOOTS), \
|
||||
$(eval $(call Package/uboot/install/template,$(u),$(u))) \
|
||||
)
|
||||
|
||||
$(foreach u,$(UBOOTS), \
|
||||
$(eval $(call BuildUBootPackage,$(u))) \
|
||||
$(eval $(call BuildPackage,uboot-kirkwood-$(u))) \
|
||||
)
|
||||
@@ -0,0 +1,43 @@
|
||||
#
|
||||
# (C) Copyright 2009
|
||||
# Marvell Semiconductor <www.marvell.com>
|
||||
# Written-by: Prafulla Wadaskar <prafulla@marvell.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, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
include $(TOPDIR)/config.mk
|
||||
|
||||
LIB = $(obj)lib$(BOARD).o
|
||||
|
||||
COBJS := iconnect.o
|
||||
|
||||
SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c)
|
||||
OBJS := $(addprefix $(obj),$(COBJS))
|
||||
SOBJS := $(addprefix $(obj),$(SOBJS))
|
||||
|
||||
$(LIB): $(obj).depend $(OBJS) $(SOBJS)
|
||||
$(call cmd_link_o_target, $(OBJS) $(SOBJS))
|
||||
|
||||
#########################################################################
|
||||
|
||||
# defines $(obj).depend target
|
||||
include $(SRCTREE)/rules.mk
|
||||
|
||||
sinclude $(obj).depend
|
||||
|
||||
#########################################################################
|
||||
@@ -0,0 +1,141 @@
|
||||
/*
|
||||
* Copyright (C) 2009-2012
|
||||
* Wojciech Dubowik <wojciech.dubowik@neratec.com>
|
||||
* Luka Perkov <uboot@lukaperkov.net>
|
||||
*
|
||||
* 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, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <miiphy.h>
|
||||
#include <asm/arch/cpu.h>
|
||||
#include <asm/arch/kirkwood.h>
|
||||
#include <asm/arch/mpp.h>
|
||||
#include "iconnect.h"
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
int board_early_init_f(void)
|
||||
{
|
||||
/*
|
||||
* default gpio configuration
|
||||
* There are maximum 64 gpios controlled through 2 sets of registers
|
||||
* the below configuration configures mainly initial LED status
|
||||
*/
|
||||
kw_config_gpio(ICONNECT_OE_VAL_LOW,
|
||||
ICONNECT_OE_VAL_HIGH,
|
||||
ICONNECT_OE_LOW, ICONNECT_OE_HIGH);
|
||||
|
||||
/* Multi-Purpose Pins Functionality configuration */
|
||||
u32 kwmpp_config[] = {
|
||||
MPP0_NF_IO2,
|
||||
MPP1_NF_IO3,
|
||||
MPP2_NF_IO4,
|
||||
MPP3_NF_IO5,
|
||||
MPP4_NF_IO6,
|
||||
MPP5_NF_IO7,
|
||||
MPP6_SYSRST_OUTn,
|
||||
MPP7_GPO,
|
||||
MPP8_TW_SDA,
|
||||
MPP9_TW_SCK,
|
||||
MPP10_UART0_TXD,
|
||||
MPP11_UART0_RXD,
|
||||
MPP12_GPO,
|
||||
MPP13_SD_CMD,
|
||||
MPP14_SD_D0,
|
||||
MPP15_SD_D1,
|
||||
MPP16_SD_D2,
|
||||
MPP17_SD_D3,
|
||||
MPP18_NF_IO0,
|
||||
MPP19_NF_IO1,
|
||||
MPP20_GE1_0,
|
||||
MPP21_GE1_1,
|
||||
MPP22_GE1_2,
|
||||
MPP23_GE1_3,
|
||||
MPP24_GE1_4,
|
||||
MPP25_GE1_5,
|
||||
MPP26_GE1_6,
|
||||
MPP27_GE1_7,
|
||||
MPP28_GPIO,
|
||||
MPP29_GPIO,
|
||||
MPP30_GE1_10,
|
||||
MPP31_GE1_11,
|
||||
MPP32_GE1_12,
|
||||
MPP33_GE1_13,
|
||||
MPP34_GE1_14,
|
||||
MPP35_GPIO,
|
||||
MPP36_AUDIO_SPDIFI,
|
||||
MPP37_AUDIO_SPDIFO,
|
||||
MPP38_GPIO,
|
||||
MPP39_TDM_SPI_CS0,
|
||||
MPP40_TDM_SPI_SCK,
|
||||
MPP41_GPIO,
|
||||
MPP42_GPIO,
|
||||
MPP43_GPIO,
|
||||
MPP44_GPIO,
|
||||
MPP45_GPIO,
|
||||
MPP46_GPIO,
|
||||
MPP47_GPIO,
|
||||
MPP48_GPIO,
|
||||
MPP49_GPIO,
|
||||
0
|
||||
};
|
||||
kirkwood_mpp_conf(kwmpp_config);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int board_init(void)
|
||||
{
|
||||
/* Boot parameters address */
|
||||
gd->bd->bi_boot_params = kw_sdram_bar(0) + 0x100;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_RESET_PHY_R
|
||||
/* Configure and initialize PHY */
|
||||
void reset_phy(void)
|
||||
{
|
||||
u16 reg;
|
||||
u16 devadr;
|
||||
char *name = "egiga0";
|
||||
|
||||
if (miiphy_set_current_dev(name))
|
||||
return;
|
||||
|
||||
/* command to read PHY dev address */
|
||||
if (miiphy_read(name, 0xEE, 0xEE, (u16 *) &devadr)) {
|
||||
printf("Err..(%s) could not read PHY dev address\n", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Enable RGMII delay on Tx and Rx for CPU port
|
||||
* Ref: sec 4.7.2 of chip datasheet
|
||||
*/
|
||||
miiphy_write(name, devadr, MV88E1116_PGADR_REG, 2);
|
||||
miiphy_read(name, devadr, MV88E1116_MAC_CTRL_REG, ®);
|
||||
reg |= (MV88E1116_RGMII_RXTM_CTRL | MV88E1116_RGMII_TXTM_CTRL);
|
||||
miiphy_write(name, devadr, MV88E1116_MAC_CTRL_REG, reg);
|
||||
miiphy_write(name, devadr, MV88E1116_PGADR_REG, 0);
|
||||
|
||||
/* reset the phy */
|
||||
miiphy_reset(name, devadr);
|
||||
|
||||
debug("88E1116 Initialized on %s\n", name);
|
||||
}
|
||||
#endif /* CONFIG_RESET_PHY_R */
|
||||
@@ -0,0 +1,39 @@
|
||||
/*
|
||||
* Copyright (C) 2009-2012
|
||||
* Wojciech Dubowik <wojciech.dubowik@neratec.com>
|
||||
* Luka Perkov <uboot@lukaperkov.net>
|
||||
*
|
||||
* 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, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __ICONNECT_H
|
||||
#define __ICONNECT_H
|
||||
|
||||
#define ICONNECT_OE_LOW (~(1 << 7))
|
||||
#define ICONNECT_OE_HIGH (~(1 << 10))
|
||||
#define ICONNECT_OE_VAL_LOW (0)
|
||||
#define ICONNECT_OE_VAL_HIGH (1 << 10)
|
||||
|
||||
/* PHY related */
|
||||
#define MV88E1116_LED_FCTRL_REG 10
|
||||
#define MV88E1116_CPRSP_CR3_REG 21
|
||||
#define MV88E1116_MAC_CTRL_REG 21
|
||||
#define MV88E1116_PGADR_REG 22
|
||||
#define MV88E1116_RGMII_TXTM_CTRL (1 << 4)
|
||||
#define MV88E1116_RGMII_RXTM_CTRL (1 << 5)
|
||||
|
||||
#endif /* __ICONNECT_H */
|
||||
@@ -0,0 +1,165 @@
|
||||
#
|
||||
# (C) Copyright 2009-2012
|
||||
# Wojciech Dubowik <wojciech.dubowik@neratec.com>
|
||||
# Luka Perkov <uboot@lukaperkov.net>
|
||||
#
|
||||
# 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, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
# Refer docs/README.kwimage for more details about how-to configure
|
||||
# and create kirkwood boot image
|
||||
#
|
||||
|
||||
# Boot Media configurations
|
||||
BOOT_FROM nand
|
||||
NAND_ECC_MODE default
|
||||
NAND_PAGE_SIZE 0x0800
|
||||
|
||||
# SOC registers configuration using bootrom header extension
|
||||
# Maximum KWBIMAGE_MAX_CONFIG configurations allowed
|
||||
|
||||
# Configure RGMII-0 interface pad voltage to 1.8V
|
||||
DATA 0xffd100e0 0x1b1b1b9b
|
||||
|
||||
#Dram initalization for SINGLE x16 CL=5 @ 400MHz
|
||||
DATA 0xffd01400 0x43000c30 # DDR Configuration register
|
||||
# bit13-0: 0xc30, (3120 DDR2 clks refresh rate)
|
||||
# bit23-14: 0x0,
|
||||
# bit24: 0x1, enable exit self refresh mode on DDR access
|
||||
# bit25: 0x1, required
|
||||
# bit29-26: 0x0,
|
||||
# bit31-30: 0x1,
|
||||
|
||||
DATA 0xffd01404 0x37543000 # DDR Controller Control Low
|
||||
# bit4: 0x0, addr/cmd in smame cycle
|
||||
# bit5: 0x0, clk is driven during self refresh, we don't care for APX
|
||||
# bit6: 0x0, use recommended falling edge of clk for addr/cmd
|
||||
# bit14: 0x0, input buffer always powered up
|
||||
# bit18: 0x1, cpu lock transaction enabled
|
||||
# bit23-20: 0x5, recommended value for CL=5 and STARTBURST_DEL disabled bit31=0
|
||||
# bit27-24: 0x7, CL+2, STARTBURST sample stages, for freqs 400MHz, unbuffered DIMM
|
||||
# bit30-28: 0x3, required
|
||||
# bit31: 0x0, no additional STARTBURST delay
|
||||
|
||||
DATA 0xffd01408 0x22125451 # DDR Timing (Low) (active cycles value +1)
|
||||
# bit3-0: TRAS lsbs
|
||||
# bit7-4: TRCD
|
||||
# bit11-8: TRP
|
||||
# bit15-12: TWR
|
||||
# bit19-16: TWTR
|
||||
# bit20: TRAS msb
|
||||
# bit23-21: 0x0
|
||||
# bit27-24: TRRD
|
||||
# bit31-28: TRTP
|
||||
|
||||
DATA 0xffd0140c 0x00000a33 # DDR Timing (High)
|
||||
# bit6-0: TRFC
|
||||
# bit8-7: TR2R
|
||||
# bit10-9: TR2W
|
||||
# bit12-11: TW2W
|
||||
# bit31-13: 0x0, required
|
||||
|
||||
DATA 0xffd01410 0x000000cc # DDR Address Control
|
||||
# bit1-0: 00, Cs0width (x8)
|
||||
# bit3-2: 11, Cs0size (1Gb)
|
||||
# bit5-4: 00, Cs1width (x8)
|
||||
# bit7-6: 11, Cs1size (1Gb)
|
||||
# bit9-8: 00, Cs2width (nonexistent)
|
||||
# bit11-10: 00, Cs2size (nonexistent)
|
||||
# bit13-12: 00, Cs3width (nonexistent)
|
||||
# bit15-14: 00, Cs3size (nonexistent)
|
||||
# bit16: 0, Cs0AddrSel
|
||||
# bit17: 0, Cs1AddrSel
|
||||
# bit18: 0, Cs2AddrSel
|
||||
# bit19: 0, Cs3AddrSel
|
||||
# bit31-20: 0x0, required
|
||||
|
||||
DATA 0xffd01414 0x00000000 # DDR Open Pages Control
|
||||
# bit0: 0, OpenPage enabled
|
||||
# bit31-1: 0x0, required
|
||||
|
||||
DATA 0xffd01418 0x00000000 # DDR Operation
|
||||
# bit3-0: 0x0, DDR cmd
|
||||
# bit31-4: 0x0, required
|
||||
|
||||
DATA 0xffd0141c 0x00000c52 # DDR Mode
|
||||
# bit2-0: 0x2, BurstLen=2 required
|
||||
# bit3: 0x0, BurstType=0 required
|
||||
# bit6-4: 0x4, CL=5
|
||||
# bit7: 0x0, TestMode=0 normal
|
||||
# bit8: 0x0, DLL reset=0 normal
|
||||
# bit11-9: 0x6, auto-precharge write recovery ????????????
|
||||
# bit12: 0x0, PD must be zero
|
||||
# bit31-13: 0x0, required
|
||||
|
||||
DATA 0xffd01420 0x00000040 # DDR Extended Mode
|
||||
# bit0: 0, DDR DLL enabled
|
||||
# bit1: 0, DDR drive strenght normal
|
||||
# bit2: 0, DDR ODT control lsd (disabled)
|
||||
# bit5-3: 0x0, required
|
||||
# bit6: 1, DDR ODT control msb, (disabled)
|
||||
# bit9-7: 0x0, required
|
||||
# bit10: 0, differential DQS enabled
|
||||
# bit11: 0, required
|
||||
# bit12: 0, DDR output buffer enabled
|
||||
# bit31-13: 0x0, required
|
||||
|
||||
DATA 0xffd01424 0x0000f17f # DDR Controller Control High
|
||||
# bit2-0: 0x7, required
|
||||
# bit3: 0x1, MBUS Burst Chop disabled
|
||||
# bit6-4: 0x7, required
|
||||
# bit7: 0x0,
|
||||
# bit8: 0x1, add writepath sample stage, must be 1 for DDR freq >= 300MHz
|
||||
# bit9: 0x0, no half clock cycle addition to dataout
|
||||
# bit10: 0x0, 1/4 clock cycle skew enabled for addr/ctl signals
|
||||
# bit11: 0x0, 1/4 clock cycle skew disabled for write mesh
|
||||
# bit15-12: 0xf, required
|
||||
# bit31-16: 0x0, required
|
||||
|
||||
DATA 0xffd01428 0x00085520 # DDR2 ODT Read Timing (default values)
|
||||
DATA 0xffd0147c 0x00008552 # DDR2 ODT Write Timing (default values)
|
||||
|
||||
DATA 0xffd01500 0x00000000 # CS[0]n Base address to 0x0
|
||||
DATA 0xffd01504 0x0ffffff1 # CS[0]n Size
|
||||
# bit0: 0x1, Window enabled
|
||||
# bit1: 0x0, Write Protect disabled
|
||||
# bit3-2: 0x0, CS0 hit selected
|
||||
# bit23-4: 0xfffff, required
|
||||
# bit31-24: 0x0f, Size (i.e. 256MB)
|
||||
|
||||
DATA 0xffd01508 0x00000000 # CS[1]n Base address to 256Mb
|
||||
DATA 0xffd0150c 0x00000000 # CS[1]n Size 256Mb Window enabled for CS1
|
||||
|
||||
DATA 0xffd01514 0x00000000 # CS[2]n Size, window disabled
|
||||
DATA 0xffd0151c 0x00000000 # CS[3]n Size, window disabled
|
||||
|
||||
DATA 0xffd01494 0x00030000 # DDR ODT Control (Low)
|
||||
# bit3-0: ODT0Rd, MODT[0] asserted during read from DRAM CS1
|
||||
# bit7-4: ODT0Rd, MODT[0] asserted during read from DRAM CS0
|
||||
# bit19-16:2, ODT0Wr, MODT[0] asserted during write to DRAM CS1
|
||||
# bit23-20:1, ODT0Wr, MODT[0] asserted during write to DRAM CS0
|
||||
|
||||
DATA 0xffd01498 0x00000000 # DDR ODT Control (High)
|
||||
# bit1-0: 0x0, ODT0 controlled by ODT Control (low) register above
|
||||
# bit3-2: 0x1, ODT1 active NEVER!
|
||||
# bit31-4: 0x0, required
|
||||
|
||||
DATA 0xffd0149c 0x0000e803 # CPU ODT Control
|
||||
DATA 0xffd01480 0x00000001 # DDR Initialization Control
|
||||
# bit0: 0x1, enable DDR init upon this register write
|
||||
|
||||
# End of Header extension
|
||||
DATA 0x0 0x0
|
||||
124
package/boot/uboot-kirkwood/files/include/configs/iconnect.h
Normal file
124
package/boot/uboot-kirkwood/files/include/configs/iconnect.h
Normal file
@@ -0,0 +1,124 @@
|
||||
/*
|
||||
* (C) Copyright 2009-2012
|
||||
* Wojciech Dubowik <wojciech.dubowik@neratec.com>
|
||||
* Luka Perkov <uboot@lukaperkov.net>
|
||||
*
|
||||
* 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, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef _CONFIG_ICONNECT_H
|
||||
#define _CONFIG_ICONNECT_H
|
||||
|
||||
/*
|
||||
* Version number information
|
||||
*/
|
||||
#define CONFIG_IDENT_STRING " Iomega iConnect Wireless"
|
||||
|
||||
/*
|
||||
* High level configuration options
|
||||
*/
|
||||
#define CONFIG_FEROCEON_88FR131 /* CPU Core subversion */
|
||||
#define CONFIG_KIRKWOOD /* SOC Family Name */
|
||||
#define CONFIG_KW88F6281 /* SOC Name */
|
||||
#define CONFIG_SKIP_LOWLEVEL_INIT /* disable board lowlevel_init */
|
||||
#define CONFIG_KIRKWOOD_EGIGA_INIT /* Enable GbePort0/1 for kernel */
|
||||
|
||||
/*
|
||||
* Machine type
|
||||
*/
|
||||
#define CONFIG_MACH_TYPE MACH_TYPE_ICONNECT
|
||||
|
||||
|
||||
/*
|
||||
* Commands configuration
|
||||
*/
|
||||
#define CONFIG_SYS_NO_FLASH /* declare no flash (NOR/SPI) */
|
||||
#define CONFIG_SYS_MVFS
|
||||
#include <config_cmd_default.h>
|
||||
#define CONFIG_CMD_ENV
|
||||
#define CONFIG_CMD_MII
|
||||
#define CONFIG_CMD_NAND
|
||||
#define CONFIG_CMD_PING
|
||||
#define CONFIG_CMD_USB
|
||||
|
||||
/*
|
||||
* mv-common.h should be defined after CMD configs since it used them
|
||||
* to enable certain macros
|
||||
*/
|
||||
#include "mv-common.h"
|
||||
|
||||
#undef CONFIG_SYS_PROMPT
|
||||
#define CONFIG_SYS_PROMPT "iconnect => "
|
||||
|
||||
/*
|
||||
* Environment variables configuration
|
||||
*/
|
||||
#ifdef CONFIG_CMD_NAND
|
||||
#define CONFIG_ENV_IS_IN_NAND
|
||||
#define CONFIG_ENV_SECT_SIZE 0x20000
|
||||
#else
|
||||
#define CONFIG_ENV_IS_NOWHERE
|
||||
#endif
|
||||
#define CONFIG_ENV_SIZE 0x20000
|
||||
#define CONFIG_ENV_OFFSET 0xc0000
|
||||
|
||||
/*
|
||||
* Default environment variables
|
||||
*/
|
||||
#define CONFIG_BOOTCOMMAND "${x_bootcmd_kernel}; " \
|
||||
"setenv bootargs ${x_bootargs} ${x_bootargs_root}; " \
|
||||
"${x_bootcmd_usb}; bootm 0x6400000;"
|
||||
|
||||
#define CONFIG_MTDPARTS "orion_nand:1M(u-boot)," \
|
||||
"3M@1M(kernel),32M@4M(rootfs),475M@36M(data)\0"
|
||||
|
||||
#define CONFIG_EXTRA_ENV_SETTINGS "x_bootargs=console" \
|
||||
"=ttyS0,115200 mtdparts="CONFIG_MTDPARTS \
|
||||
"x_bootcmd_kernel=nand read 0x6400000 0x100000 0x300000\0" \
|
||||
"x_bootcmd_usb=usb start\0" \
|
||||
"x_bootargs_root=root=/dev/mtdblock2 rw rootfstype=jffs2\0"
|
||||
|
||||
/*
|
||||
* Ethernet driver configuration
|
||||
*/
|
||||
#ifdef CONFIG_CMD_NET
|
||||
#define CONFIG_MVGBE_PORTS {1, 0} /* enable port 0 only */
|
||||
#define CONFIG_PHY_BASE_ADR 11
|
||||
#endif /* CONFIG_CMD_NET */
|
||||
|
||||
/*
|
||||
* SATA driver configuration
|
||||
*/
|
||||
#ifdef CONFIG_CMD_IDE
|
||||
#define CONFIG_SYS_ATA_IDE0_OFFSET MV_SATA_PORT0_OFFSET
|
||||
#define CONFIG_SYS_ATA_IDE1_OFFSET MV_SATA_PORT1_OFFSET
|
||||
#endif /* CONFIG_CMD_IDE */
|
||||
|
||||
/*
|
||||
* File system
|
||||
*/
|
||||
#define CONFIG_CMD_EXT2
|
||||
#define CONFIG_CMD_FAT
|
||||
#define CONFIG_CMD_JFFS2
|
||||
#define CONFIG_CMD_UBI
|
||||
#define CONFIG_CMD_UBIFS
|
||||
#define CONFIG_RBTREE
|
||||
#define CONFIG_MTD_DEVICE
|
||||
#define CONFIG_MTD_PARTITIONS
|
||||
#define CONFIG_CMD_MTDPARTS
|
||||
|
||||
#endif /* _CONFIG_ICONNECT_H */
|
||||
542
package/boot/uboot-kirkwood/patches/0001-ib62x0.patch
Normal file
542
package/boot/uboot-kirkwood/patches/0001-ib62x0.patch
Normal file
@@ -0,0 +1,542 @@
|
||||
http://lists.denx.de/pipermail/u-boot/2012-April/122597.html
|
||||
http://patchwork.ozlabs.org/patch/153293/
|
||||
---
|
||||
|
||||
diff --git a/MAINTAINERS b/MAINTAINERS
|
||||
index 708ded7..9d2aba7 100644
|
||||
--- a/MAINTAINERS
|
||||
+++ b/MAINTAINERS
|
||||
@@ -777,6 +777,10 @@ Linus Walleij <linus.walleij@linaro.org>
|
||||
integratorap various
|
||||
integratorcp various
|
||||
|
||||
+Luka Perkov <uboot@lukaperkov.net>
|
||||
+
|
||||
+ ib62x0 ARM926EJS
|
||||
+
|
||||
Dave Peverley <dpeverley@mpc-data.co.uk>
|
||||
|
||||
omap730p2 ARM926EJS
|
||||
diff --git a/board/raidsonic/ib62x0/Makefile b/board/raidsonic/ib62x0/Makefile
|
||||
new file mode 100644
|
||||
index 0000000..d450f8d
|
||||
--- /dev/null
|
||||
+++ b/board/raidsonic/ib62x0/Makefile
|
||||
@@ -0,0 +1,43 @@
|
||||
+#
|
||||
+# (C) Copyright 2009
|
||||
+# Marvell Semiconductor <www.marvell.com>
|
||||
+# Written-by: Prafulla Wadaskar <prafulla@marvell.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, see <http://www.gnu.org/licenses/>.
|
||||
+#
|
||||
+
|
||||
+include $(TOPDIR)/config.mk
|
||||
+
|
||||
+LIB = $(obj)lib$(BOARD).o
|
||||
+
|
||||
+COBJS := ib62x0.o
|
||||
+
|
||||
+SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c)
|
||||
+OBJS := $(addprefix $(obj),$(COBJS))
|
||||
+SOBJS := $(addprefix $(obj),$(SOBJS))
|
||||
+
|
||||
+$(LIB): $(obj).depend $(OBJS) $(SOBJS)
|
||||
+ $(call cmd_link_o_target, $(OBJS) $(SOBJS))
|
||||
+
|
||||
+#########################################################################
|
||||
+
|
||||
+# defines $(obj).depend target
|
||||
+include $(SRCTREE)/rules.mk
|
||||
+
|
||||
+sinclude $(obj).depend
|
||||
+
|
||||
+#########################################################################
|
||||
diff --git a/board/raidsonic/ib62x0/ib62x0.c b/board/raidsonic/ib62x0/ib62x0.c
|
||||
new file mode 100644
|
||||
index 0000000..65f2c2e
|
||||
--- /dev/null
|
||||
+++ b/board/raidsonic/ib62x0/ib62x0.c
|
||||
@@ -0,0 +1,79 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2011-2012
|
||||
+ * Gerald Kerma <dreagle@doukki.net>
|
||||
+ * Luka Perkov <uboot@lukaperkov.net>
|
||||
+ * Simon Baatz <gmbnomis@gmail.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, see <http://www.gnu.org/licenses/>.
|
||||
+ */
|
||||
+
|
||||
+#include <common.h>
|
||||
+#include <miiphy.h>
|
||||
+#include <asm/arch/cpu.h>
|
||||
+#include <asm/arch/kirkwood.h>
|
||||
+#include <asm/arch/mpp.h>
|
||||
+#include "ib62x0.h"
|
||||
+
|
||||
+DECLARE_GLOBAL_DATA_PTR;
|
||||
+
|
||||
+int board_early_init_f(void)
|
||||
+{
|
||||
+ /*
|
||||
+ * default gpio configuration
|
||||
+ * There are maximum 64 gpios controlled through 2 sets of registers
|
||||
+ * the below configuration configures mainly initial LED status
|
||||
+ */
|
||||
+ kw_config_gpio(IB62x0_OE_VAL_LOW,
|
||||
+ IB62x0_OE_VAL_HIGH,
|
||||
+ IB62x0_OE_LOW, IB62x0_OE_HIGH);
|
||||
+
|
||||
+ /* Multi-Purpose Pins Functionality configuration */
|
||||
+ u32 kwmpp_config[] = {
|
||||
+ MPP0_NF_IO2,
|
||||
+ MPP1_NF_IO3,
|
||||
+ MPP2_NF_IO4,
|
||||
+ MPP3_NF_IO5,
|
||||
+ MPP4_NF_IO6,
|
||||
+ MPP5_NF_IO7,
|
||||
+ MPP6_SYSRST_OUTn,
|
||||
+ MPP8_TW_SDA,
|
||||
+ MPP9_TW_SCK,
|
||||
+ MPP10_UART0_TXD,
|
||||
+ MPP11_UART0_RXD,
|
||||
+ MPP18_NF_IO0,
|
||||
+ MPP19_NF_IO1,
|
||||
+ MPP20_SATA1_ACTn,
|
||||
+ MPP21_SATA0_ACTn,
|
||||
+ MPP22_GPIO, /* Power LED red */
|
||||
+ MPP24_GPIO, /* Power off device */
|
||||
+ MPP25_GPIO, /* Power LED green */
|
||||
+ MPP27_GPIO, /* USB transfer LED */
|
||||
+ MPP28_GPIO, /* Reset button */
|
||||
+ MPP29_GPIO, /* USB Copy button */
|
||||
+ 0
|
||||
+ };
|
||||
+ kirkwood_mpp_conf(kwmpp_config);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+int board_init(void)
|
||||
+{
|
||||
+ /* adress of boot parameters */
|
||||
+ gd->bd->bi_boot_params = kw_sdram_bar(0) + 0x100;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
diff --git a/board/raidsonic/ib62x0/ib62x0.h b/board/raidsonic/ib62x0/ib62x0.h
|
||||
new file mode 100644
|
||||
index 0000000..0c30690
|
||||
--- /dev/null
|
||||
+++ b/board/raidsonic/ib62x0/ib62x0.h
|
||||
@@ -0,0 +1,40 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2011-2012
|
||||
+ * Gerald Kerma <dreagle@doukki.net>
|
||||
+ * Simon Baatz <gmbnomis@gmail.com>
|
||||
+ * Luka Perkov <uboot@lukaperkov.net>
|
||||
+ *
|
||||
+ * 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, see <http://www.gnu.org/licenses/>.
|
||||
+ */
|
||||
+
|
||||
+#ifndef __IB62x0_H
|
||||
+#define __IB62x0_H
|
||||
+
|
||||
+#define IB62x0_OE_LOW (~(1 << 22 | 1 << 24 | 1 << 25 | 1 << 27))
|
||||
+#define IB62x0_OE_HIGH (~(0))
|
||||
+#define IB62x0_OE_VAL_LOW 0
|
||||
+#define IB62x0_OE_VAL_HIGH 0
|
||||
+
|
||||
+/* PHY related */
|
||||
+#define MV88E1116_LED_FCTRL_REG 10
|
||||
+#define MV88E1116_CPRSP_CR3_REG 21
|
||||
+#define MV88E1116_MAC_CTRL_REG 21
|
||||
+#define MV88E1116_PGADR_REG 22
|
||||
+#define MV88E1116_RGMII_TXTM_CTRL (1 << 4)
|
||||
+#define MV88E1116_RGMII_RXTM_CTRL (1 << 5)
|
||||
+
|
||||
+#endif /* __IB62x0_H */
|
||||
diff --git a/board/raidsonic/ib62x0/kwbimage.cfg b/board/raidsonic/ib62x0/kwbimage.cfg
|
||||
new file mode 100644
|
||||
index 0000000..bd594eb
|
||||
--- /dev/null
|
||||
+++ b/board/raidsonic/ib62x0/kwbimage.cfg
|
||||
@@ -0,0 +1,169 @@
|
||||
+#
|
||||
+# Copyright (C) 2011-2012
|
||||
+# Gerald Kerma <dreagle@doukki.net>
|
||||
+# Simon Baatz <gmbnomis@gmail.com>
|
||||
+# Luka Perkov <uboot@lukaperkov.net>
|
||||
+#
|
||||
+# 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, see <http://www.gnu.org/licenses/>.
|
||||
+#
|
||||
+# Refer docs/README.kwimage for more details about how-to configure
|
||||
+# and create kirkwood boot image
|
||||
+#
|
||||
+
|
||||
+# Boot Media configurations
|
||||
+BOOT_FROM nand # change from nand to uart if building UART image
|
||||
+NAND_ECC_MODE default
|
||||
+NAND_PAGE_SIZE 0x0800
|
||||
+
|
||||
+# SOC registers configuration using bootrom header extension
|
||||
+# Maximum KWBIMAGE_MAX_CONFIG configurations allowed
|
||||
+
|
||||
+# Configure RGMII-0 interface pad voltage to 1.8V
|
||||
+DATA 0xffd100e0 0x1b1b1b9b
|
||||
+
|
||||
+#Dram initalization for SINGLE x16 CL=5 @ 400MHz
|
||||
+DATA 0xffd01400 0x43000c30 # DDR Configuration register
|
||||
+# bit13-0: 0xc30, (3120 DDR2 clks refresh rate)
|
||||
+# bit23-14: 0x0,
|
||||
+# bit24: 0x1, enable exit self refresh mode on DDR access
|
||||
+# bit25: 0x1, required
|
||||
+# bit29-26: 0x0,
|
||||
+# bit31-30: 0x1,
|
||||
+
|
||||
+DATA 0xffd01404 0x37543000 # DDR Controller Control Low
|
||||
+# bit4: 0x0, addr/cmd in smame cycle
|
||||
+# bit5: 0x0, clk is driven during self refresh, we don't care for APX
|
||||
+# bit6: 0x0, use recommended falling edge of clk for addr/cmd
|
||||
+# bit14: 0x0, input buffer always powered up
|
||||
+# bit18: 0x1, cpu lock transaction enabled
|
||||
+# bit23-20: 0x5, recommended value for CL=5 and STARTBURST_DEL disabled bit31=0
|
||||
+# bit27-24: 0x7, CL+2, STARTBURST sample stages, for freqs 400MHz, unbuffered DIMM
|
||||
+# bit30-28: 0x3, required
|
||||
+# bit31: 0x0, no additional STARTBURST delay
|
||||
+
|
||||
+DATA 0xffd01408 0x22125451 # DDR Timing (Low) (active cycles value +1)
|
||||
+# bit3-0: TRAS lsbs
|
||||
+# bit7-4: TRCD
|
||||
+# bit11-8: TRP
|
||||
+# bit15-12: TWR
|
||||
+# bit19-16: TWTR
|
||||
+# bit20: TRAS msb
|
||||
+# bit23-21: 0x0
|
||||
+# bit27-24: TRRD
|
||||
+# bit31-28: TRTP
|
||||
+
|
||||
+DATA 0xffd0140c 0x00000a33 # DDR Timing (High)
|
||||
+# bit6-0: TRFC
|
||||
+# bit8-7: TR2R
|
||||
+# bit10-9: TR2W
|
||||
+# bit12-11: TW2W
|
||||
+# bit31-13: 0x0, required
|
||||
+
|
||||
+DATA 0xffd01410 0x0000000c # DDR Address Control
|
||||
+# bit1-0: 00, Cs0width (x8)
|
||||
+# bit3-2: 11, Cs0size (1Gb)
|
||||
+# bit5-4: 00, Cs1width (x8)
|
||||
+# bit7-6: 11, Cs1size (1Gb)
|
||||
+# bit9-8: 00, Cs2width (nonexistent
|
||||
+# bit11-10: 00, Cs2size (nonexistent
|
||||
+# bit13-12: 00, Cs3width (nonexistent
|
||||
+# bit15-14: 00, Cs3size (nonexistent
|
||||
+# bit16: 0, Cs0AddrSel
|
||||
+# bit17: 0, Cs1AddrSel
|
||||
+# bit18: 0, Cs2AddrSel
|
||||
+# bit19: 0, Cs3AddrSel
|
||||
+# bit31-20: 0x0, required
|
||||
+
|
||||
+DATA 0xffd01414 0x00000000 # DDR Open Pages Control
|
||||
+# bit0: 0, OpenPage enabled
|
||||
+# bit31-1: 0x0, required
|
||||
+
|
||||
+DATA 0xffd01418 0x00000000 # DDR Operation
|
||||
+# bit3-0: 0x0, DDR cmd
|
||||
+# bit31-4: 0x0, required
|
||||
+
|
||||
+DATA 0xffd0141c 0x00000c52 # DDR Mode
|
||||
+# bit2-0: 0x2, BurstLen=2 required
|
||||
+# bit3: 0x0, BurstType=0 required
|
||||
+# bit6-4: 0x4, CL=5
|
||||
+# bit7: 0x0, TestMode=0 normal
|
||||
+# bit8: 0x0, DLL reset=0 normal
|
||||
+# bit11-9: 0x6, auto-precharge write recovery ????????????
|
||||
+# bit12: 0x0, PD must be zero
|
||||
+# bit31-13: 0x0, required
|
||||
+
|
||||
+DATA 0xffd01420 0x00000040 # DDR Extended Mode
|
||||
+# bit0: 0, DDR DLL enabled
|
||||
+# bit1: 0, DDR drive strenght normal
|
||||
+# bit2: 1, DDR ODT control lsd (disabled)
|
||||
+# bit5-3: 0x0, required
|
||||
+# bit6: 0, DDR ODT control msb, (disabled)
|
||||
+# bit9-7: 0x0, required
|
||||
+# bit10: 0, differential DQS enabled
|
||||
+# bit11: 0, required
|
||||
+# bit12: 0, DDR output buffer enabled
|
||||
+# bit31-13: 0x0, required
|
||||
+
|
||||
+DATA 0xffd01424 0x0000f17f # DDR Controller Control High
|
||||
+# bit2-0: 0x7, required
|
||||
+# bit3: 0x1, MBUS Burst Chop disabled
|
||||
+# bit6-4: 0x7, required
|
||||
+# bit7: 0x0,
|
||||
+# bit8: 0x1, add writepath sample stage, must be 1 for DDR freq >= 300MHz
|
||||
+# bit9: 0x0, no half clock cycle addition to dataout
|
||||
+# bit10: 0x0, 1/4 clock cycle skew enabled for addr/ctl signals
|
||||
+# bit11: 0x0, 1/4 clock cycle skew disabled for write mesh
|
||||
+# bit15-12: 0xf, required
|
||||
+# bit31-16: 0, required
|
||||
+
|
||||
+DATA 0xffd01428 0x00085520 # DDR2 ODT Read Timing (default values)
|
||||
+DATA 0xffd0147c 0x00008552 # DDR2 ODT Write Timing (default values)
|
||||
+
|
||||
+DATA 0xffd01500 0x00000000 # CS[0]n Base address to 0x0
|
||||
+DATA 0xffd01504 0x0ffffff1 # CS[0]n Size
|
||||
+# bit0: 0x1, Window enabled
|
||||
+# bit1: 0x0, Write Protect disabled
|
||||
+# bit3-2: 0x0, CS0 hit selected
|
||||
+# bit23-4: 0xfffff, required
|
||||
+# bit31-24: 0x0f, Size (i.e. 256MB)
|
||||
+
|
||||
+DATA 0xffd01508 0x10000000 # CS[1]n Base address to 256Mb
|
||||
+DATA 0xffd0150c 0x00000000 # CS[1]n Size, window disabled
|
||||
+
|
||||
+DATA 0xffd01514 0x00000000 # CS[2]n Size, window disabled
|
||||
+DATA 0xffd0151c 0x00000000 # CS[3]n Size, window disabled
|
||||
+
|
||||
+DATA 0xffd01494 0x00030000 # DDR ODT Control (Low)
|
||||
+# bit3-0: ODT0Rd, MODT[0] asserted during read from DRAM CS1
|
||||
+# bit7-4: ODT0Rd, MODT[0] asserted during read from DRAM CS0
|
||||
+# bit19-16:2, ODT0Wr, MODT[0] asserted during write to DRAM CS1
|
||||
+# bit23-20:1, ODT0Wr, MODT[0] asserted during write to DRAM CS0
|
||||
+
|
||||
+DATA 0xffd01498 0x00000000 # DDR ODT Control (High)
|
||||
+# bit1-0: 0x0, ODT0 controlled by ODT Control (low) register above
|
||||
+# bit3-2: 0x1, ODT1 active NEVER!
|
||||
+# bit31-4: 0x0, required
|
||||
+
|
||||
+DATA 0xffd0149c 0x0000e803 # CPU ODT Control
|
||||
+DATA 0xffd01480 0x00000001 # DDR Initialization Control
|
||||
+# bit0: 0x1, enable DDR init upon this register write
|
||||
+
|
||||
+DATA 0xFFD20134 0x66666666 # L2 RAM Timing 0 Register
|
||||
+DATA 0xFFD20138 0x66666666 # L2 RAM Timing 1 Register
|
||||
+
|
||||
+# End of Header extension
|
||||
+DATA 0x0 0x0
|
||||
diff --git a/boards.cfg b/boards.cfg
|
||||
index 3cf75c3..23f84e8 100644
|
||||
--- a/boards.cfg
|
||||
+++ b/boards.cfg
|
||||
@@ -153,6 +153,7 @@ openrd_client arm arm926ejs openrd Marvell
|
||||
openrd_ultimate arm arm926ejs openrd Marvell kirkwood openrd:BOARD_IS_OPENRD_ULTIMATE
|
||||
rd6281a arm arm926ejs - Marvell kirkwood
|
||||
sheevaplug arm arm926ejs - Marvell kirkwood
|
||||
+ib62x0 arm arm926ejs ib62x0 raidsonic kirkwood
|
||||
dockstar arm arm926ejs - Seagate kirkwood
|
||||
jadecpu arm arm926ejs jadecpu syteco mb86r0x
|
||||
mx25pdk arm arm926ejs mx25pdk freescale mx25 mx25pdk:IMX_CONFIG=board/freescale/mx25pdk/imximage.cfg
|
||||
diff --git a/include/configs/ib62x0.h b/include/configs/ib62x0.h
|
||||
new file mode 100644
|
||||
index 0000000..85856f2
|
||||
--- /dev/null
|
||||
+++ b/include/configs/ib62x0.h
|
||||
@@ -0,0 +1,150 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2011-2012
|
||||
+ * Gerald Kerma <dreagle@doukki.net>
|
||||
+ * Luka Perkov <uboot@lukaperkov.net>
|
||||
+ *
|
||||
+ * 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, see <http://www.gnu.org/licenses/>.
|
||||
+ */
|
||||
+
|
||||
+#ifndef _CONFIG_IB62x0_H
|
||||
+#define _CONFIG_IB62x0_H
|
||||
+
|
||||
+/*
|
||||
+ * Version number information
|
||||
+ */
|
||||
+#define CONFIG_IDENT_STRING " RaidSonic ICY BOX IB-NAS62x0"
|
||||
+
|
||||
+/*
|
||||
+ * High level configuration options
|
||||
+ */
|
||||
+#define CONFIG_FEROCEON_88FR131 /* CPU Core subversion */
|
||||
+#define CONFIG_KIRKWOOD /* SOC Family Name */
|
||||
+#define CONFIG_KW88F6281 /* SOC Name */
|
||||
+#define CONFIG_SKIP_LOWLEVEL_INIT /* disable board lowlevel_init */
|
||||
+
|
||||
+/*
|
||||
+ * Machine type
|
||||
+ */
|
||||
+#define CONFIG_MACH_TYPE MACH_TYPE_NAS6210
|
||||
+
|
||||
+/*
|
||||
+ * Compression configuration
|
||||
+ */
|
||||
+#define CONFIG_BZIP2
|
||||
+#define CONFIG_LZMA
|
||||
+#define CONFIG_LZO
|
||||
+
|
||||
+/*
|
||||
+ * Commands configuration
|
||||
+ */
|
||||
+#define CONFIG_SYS_NO_FLASH /* declare no flash (NOR/SPI) */
|
||||
+#define CONFIG_SYS_MVFS
|
||||
+#include <config_cmd_default.h>
|
||||
+#define CONFIG_CMD_ENV
|
||||
+#define CONFIG_CMD_IDE
|
||||
+#define CONFIG_CMD_MII
|
||||
+#define CONFIG_CMD_NAND
|
||||
+#define CONFIG_CMD_PING
|
||||
+#define CONFIG_CMD_USB
|
||||
+
|
||||
+/*
|
||||
+ * mv-common.h should be defined after CMD configs since it used them
|
||||
+ * to enable certain macros
|
||||
+ */
|
||||
+#include "mv-common.h"
|
||||
+
|
||||
+#undef CONFIG_SYS_PROMPT
|
||||
+#define CONFIG_SYS_PROMPT "ib62x0 => "
|
||||
+
|
||||
+/*
|
||||
+ * Environment variables configuration
|
||||
+ */
|
||||
+#ifdef CONFIG_CMD_NAND
|
||||
+#define CONFIG_ENV_IS_IN_NAND
|
||||
+#define CONFIG_ENV_SECT_SIZE 0x20000
|
||||
+#else
|
||||
+#define CONFIG_ENV_IS_NOWHERE
|
||||
+#endif
|
||||
+#define CONFIG_ENV_SIZE 0x20000
|
||||
+#define CONFIG_ENV_OFFSET 0x80000
|
||||
+
|
||||
+/*
|
||||
+ * Default environment variables
|
||||
+ */
|
||||
+#define CONFIG_BOOTCOMMAND \
|
||||
+ "setenv bootargs ${console} ${mtdparts} ${bootargs_root}; " \
|
||||
+ "ubi part rootfs; " \
|
||||
+ "ubifsmount rootfs; " \
|
||||
+ "ubifsload 0x800000 ${kernel}; " \
|
||||
+ "bootm 0x800000"
|
||||
+
|
||||
+#define CONFIG_MTDPARTS \
|
||||
+ "mtdparts=orion_nand:" \
|
||||
+ "0x80000@0x0(uboot)," \
|
||||
+ "0x20000@0x80000(uboot_env)," \
|
||||
+ "-@0xa0000(rootfs)\0"
|
||||
+
|
||||
+#define CONFIG_EXTRA_ENV_SETTINGS \
|
||||
+ "console=console=ttyS0,115200\0" \
|
||||
+ "mtdids=nand0=orion_nand\0" \
|
||||
+ "mtdparts="CONFIG_MTDPARTS \
|
||||
+ "kernel=/boot/uImage\0" \
|
||||
+ "bootargs_root=noinitrd ubi.mtd=2 root=ubi0:rootfs rootfstype=ubifs\0"
|
||||
+
|
||||
+/*
|
||||
+ * Ethernet driver configuration
|
||||
+ */
|
||||
+#ifdef CONFIG_CMD_NET
|
||||
+#define CONFIG_MVGBE_PORTS {1, 0} /* enable port 0 only */
|
||||
+#define CONFIG_PHY_BASE_ADR 0
|
||||
+#undef CONFIG_RESET_PHY_R
|
||||
+#endif /* CONFIG_CMD_NET */
|
||||
+
|
||||
+/*
|
||||
+ * SATA driver configuration
|
||||
+ */
|
||||
+#ifdef CONFIG_CMD_IDE
|
||||
+#define __io
|
||||
+#define CONFIG_IDE_PREINIT
|
||||
+#define CONFIG_DOS_PARTITION
|
||||
+#define CONFIG_MVSATA_IDE_USE_PORT0
|
||||
+#define CONFIG_MVSATA_IDE_USE_PORT1
|
||||
+#define CONFIG_SYS_ATA_IDE0_OFFSET MV_SATA_PORT0_OFFSET
|
||||
+#define CONFIG_SYS_ATA_IDE1_OFFSET MV_SATA_PORT1_OFFSET
|
||||
+#endif /* CONFIG_CMD_IDE */
|
||||
+
|
||||
+/*
|
||||
+ * RTC driver configuration
|
||||
+ */
|
||||
+#ifdef CONFIG_CMD_DATE
|
||||
+#define CONFIG_RTC_MV
|
||||
+#endif /* CONFIG_CMD_DATE */
|
||||
+
|
||||
+/*
|
||||
+ * File system
|
||||
+ */
|
||||
+#define CONFIG_CMD_EXT2
|
||||
+#define CONFIG_CMD_FAT
|
||||
+#define CONFIG_CMD_JFFS2
|
||||
+#define CONFIG_CMD_UBI
|
||||
+#define CONFIG_CMD_UBIFS
|
||||
+#define CONFIG_RBTREE
|
||||
+#define CONFIG_MTD_DEVICE
|
||||
+#define CONFIG_MTD_PARTITIONS
|
||||
+#define CONFIG_CMD_MTDPARTS
|
||||
+
|
||||
+#endif /* _CONFIG_IB62x0_H */
|
||||
873
package/boot/uboot-kirkwood/patches/0002-kwboot.patch
Normal file
873
package/boot/uboot-kirkwood/patches/0002-kwboot.patch
Normal file
@@ -0,0 +1,873 @@
|
||||
http://lists.denx.de/pipermail/u-boot/2012-May/125296.html
|
||||
http://patchwork.ozlabs.org/patch/161566/
|
||||
---
|
||||
|
||||
diff --git a/doc/kwboot.1 b/doc/kwboot.1
|
||||
new file mode 100644
|
||||
index 0000000..ed08398
|
||||
--- /dev/null
|
||||
+++ b/doc/kwboot.1
|
||||
@@ -0,0 +1,84 @@
|
||||
+.TH KWBOOT 1 "2012-05-19"
|
||||
+
|
||||
+.SH NAME
|
||||
+kwboot \- Boot Marvell Kirkwood SoCs over a serial link.
|
||||
+.SH SYNOPSIS
|
||||
+.B kwboot
|
||||
+.RB [ "-b \fIimage\fP" ]
|
||||
+.RB [ "-p" ]
|
||||
+.RB [ "-t" ]
|
||||
+.RB [ "-B \fIbaudrate\fP" ]
|
||||
+.RB \fITTY\fP
|
||||
+.SH "DESCRIPTION"
|
||||
+
|
||||
+The \fBmkimage\fP program boots boards based on Marvell's Kirkwood
|
||||
+platform over their integrated UART. Boot image files will typically
|
||||
+contain a second stage boot loader, such as U-Boot. The image file
|
||||
+must conform to Marvell's BootROM firmware image format
|
||||
+(\fIkwbimage\fP), created using a tool such as \fBmkimage\fP.
|
||||
+
|
||||
+Following power-up or a system reset, system BootROM code polls the
|
||||
+UART for a brief period of time, sensing a handshake message which
|
||||
+initiates an image upload. This program sends this boot message until
|
||||
+it receives a positive acknowledgement. The image is transfered using
|
||||
+Xmodem.
|
||||
+
|
||||
+Additionally, this program implements a minimal terminal mode, which
|
||||
+can be used either standalone, or entered immediately following boot
|
||||
+image transfer completion. This is often useful to catch early boot
|
||||
+messages, or to manually interrupt a default boot procedure performed
|
||||
+by the second-stage loader.
|
||||
+
|
||||
+.SH "OPTIONS"
|
||||
+
|
||||
+.TP
|
||||
+.BI "\-b \fIimage\fP"
|
||||
+Handshake; then upload file \fIimage\fP over \fITTY\fP.
|
||||
+
|
||||
+Note that for the encapsulated boot code to be executed, \fIimage\fP
|
||||
+must be of type "UART boot" (0x69). Boot images of different types,
|
||||
+such as backup images of vendor firmware downloaded from flash memory
|
||||
+(type 0x8B), will not work (or not as expected). See \fB-p\fP for a
|
||||
+workaround.
|
||||
+
|
||||
+This mode writes handshake status and upload progress indication to
|
||||
+stdout.
|
||||
+
|
||||
+.TP
|
||||
+.BI "\-p"
|
||||
+In combination with \fB-b\fP, patches the header in \fIimage\fP prior
|
||||
+to upload, to "UART boot" type.
|
||||
+
|
||||
+This option attempts on-the-fly conversion of some none-UART image
|
||||
+types, such as images which were originally formatted to be stored in
|
||||
+flash memory.
|
||||
+
|
||||
+Conversion is performed in memory. The contents of \fIimage\fP will
|
||||
+not be altered.
|
||||
+
|
||||
+.TP
|
||||
+.BI "\-t"
|
||||
+Run a terminal program, connecting standard input and output to
|
||||
+.RB \fITTY\fP.
|
||||
+
|
||||
+If used in combination with \fB-b\fP, terminal mode is entered
|
||||
+immediately following a successful image upload.
|
||||
+
|
||||
+If standard I/O streams connect to a console, this mode will terminate
|
||||
+after receiving 'ctrl-\\' followed by 'c' from console input.
|
||||
+
|
||||
+.TP
|
||||
+.BI "\-B \fIbaudrate\fP"
|
||||
+Adjust the baud rate on \fITTY\fP. Default rate is 115200.
|
||||
+
|
||||
+.SH "SEE ALSO"
|
||||
+.PP
|
||||
+\fBmkimage\fP(1)
|
||||
+
|
||||
+.SH "AUTHORS"
|
||||
+
|
||||
+Daniel Stodden <daniel.stodden@gmail.com>
|
||||
+.br
|
||||
+Luka Perkov <uboot@lukaperkov.net>
|
||||
+.br
|
||||
+David Purdy <david.c.purdy@gmail.com>
|
||||
diff --git a/tools/Makefile b/tools/Makefile
|
||||
index 8993fdd..8097d95 100644
|
||||
--- a/tools/Makefile
|
||||
+++ b/tools/Makefile
|
||||
@@ -72,6 +72,7 @@ BIN_FILES-$(CONFIG_SMDK5250) += mksmdk5250spl$(SFX)
|
||||
BIN_FILES-$(CONFIG_MX28) += mxsboot$(SFX)
|
||||
BIN_FILES-$(CONFIG_NETCONSOLE) += ncb$(SFX)
|
||||
BIN_FILES-$(CONFIG_SHA1_CHECK_UB_IMG) += ubsha1$(SFX)
|
||||
+BIN_FILES-$(CONFIG_KIRKWOOD) += kwboot$(SFX)
|
||||
|
||||
# Source files which exist outside the tools directory
|
||||
EXT_OBJ_FILES-$(CONFIG_BUILD_ENVCRC) += common/env_embedded.o
|
||||
@@ -101,6 +102,7 @@ OBJ_FILES-$(CONFIG_NETCONSOLE) += ncb.o
|
||||
NOPED_OBJ_FILES-y += os_support.o
|
||||
OBJ_FILES-$(CONFIG_SHA1_CHECK_UB_IMG) += ubsha1.o
|
||||
NOPED_OBJ_FILES-y += ublimage.o
|
||||
+OBJ_FILES-$(CONFIG_KIRKWOOD) += kwboot.o
|
||||
|
||||
# Don't build by default
|
||||
#ifeq ($(ARCH),ppc)
|
||||
@@ -234,6 +236,10 @@ $(obj)ncb$(SFX): $(obj)ncb.o
|
||||
$(obj)ubsha1$(SFX): $(obj)os_support.o $(obj)sha1.o $(obj)ubsha1.o
|
||||
$(HOSTCC) $(HOSTCFLAGS) $(HOSTLDFLAGS) -o $@ $^
|
||||
|
||||
+$(obj)kwboot$(SFX): $(obj)kwboot.o
|
||||
+ $(HOSTCC) $(HOSTCFLAGS) $(HOSTLDFLAGS) -o $@ $^
|
||||
+ $(HOSTSTRIP) $@
|
||||
+
|
||||
# Some of the tool objects need to be accessed from outside the tools directory
|
||||
$(obj)%.o: $(SRCTREE)/common/%.c
|
||||
$(HOSTCC) -g $(HOSTCFLAGS_NOPED) -c -o $@ $<
|
||||
diff --git a/tools/kwboot.c b/tools/kwboot.c
|
||||
new file mode 100644
|
||||
index 0000000..e773f01
|
||||
--- /dev/null
|
||||
+++ b/tools/kwboot.c
|
||||
@@ -0,0 +1,742 @@
|
||||
+/*
|
||||
+ * Boot a Marvell Kirkwood SoC, with Xmodem over UART0.
|
||||
+ *
|
||||
+ * (c) 2012 Daniel Stodden <daniel.stodden@gmail.com>
|
||||
+ *
|
||||
+ * References: marvell.com, "88F6180, 88F6190, 88F6192, and 88F6281
|
||||
+ * Integrated Controller: Functional Specifications" December 2,
|
||||
+ * 2008. Chapter 24.2 "BootROM Firmware".
|
||||
+ */
|
||||
+
|
||||
+#include <stdlib.h>
|
||||
+#include <stdio.h>
|
||||
+#include <string.h>
|
||||
+#include <stdarg.h>
|
||||
+#include <libgen.h>
|
||||
+#include <fcntl.h>
|
||||
+#include <errno.h>
|
||||
+#include <unistd.h>
|
||||
+#include <stdint.h>
|
||||
+#include <termios.h>
|
||||
+#include <sys/mman.h>
|
||||
+#include <sys/stat.h>
|
||||
+
|
||||
+#include "kwbimage.h"
|
||||
+
|
||||
+#ifdef __GNUC__
|
||||
+#define PACKED __attribute((packed))
|
||||
+#else
|
||||
+#define PACKED
|
||||
+#endif
|
||||
+
|
||||
+/*
|
||||
+ * Marvell BootROM UART Sensing
|
||||
+ */
|
||||
+
|
||||
+static unsigned char kwboot_msg_boot[] = {
|
||||
+ 0xBB, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77
|
||||
+};
|
||||
+
|
||||
+#define KWBOOT_MSG_REQ_DELAY 10 /* ms */
|
||||
+#define KWBOOT_MSG_RSP_TIMEO 50 /* ms */
|
||||
+
|
||||
+/*
|
||||
+ * Xmodem Transfers
|
||||
+ */
|
||||
+
|
||||
+#define SOH 1 /* sender start of block header */
|
||||
+#define EOT 4 /* sender end of block transfer */
|
||||
+#define ACK 6 /* target block ack */
|
||||
+#define NAK 21 /* target block negative ack */
|
||||
+#define CAN 24 /* target/sender transfer cancellation */
|
||||
+
|
||||
+struct kwboot_block {
|
||||
+ uint8_t soh;
|
||||
+ uint8_t pnum;
|
||||
+ uint8_t _pnum;
|
||||
+ uint8_t data[128];
|
||||
+ uint8_t csum;
|
||||
+} PACKED;
|
||||
+
|
||||
+#define KWBOOT_BLK_RSP_TIMEO 1000 /* ms */
|
||||
+
|
||||
+static int kwboot_verbose;
|
||||
+
|
||||
+static void
|
||||
+kwboot_printv(const char *fmt, ...)
|
||||
+{
|
||||
+ va_list ap;
|
||||
+
|
||||
+ if (kwboot_verbose) {
|
||||
+ va_start(ap, fmt);
|
||||
+ vprintf(fmt, ap);
|
||||
+ va_end(ap);
|
||||
+ fflush(stdout);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+__spinner(void)
|
||||
+{
|
||||
+ const char seq[] = { '-', '\\', '|', '/' };
|
||||
+ const int div = 8;
|
||||
+ static int state, bs;
|
||||
+
|
||||
+ if (state % div == 0) {
|
||||
+ fputc(bs, stdout);
|
||||
+ fputc(seq[state / div % sizeof(seq)], stdout);
|
||||
+ fflush(stdout);
|
||||
+ }
|
||||
+
|
||||
+ bs = '\b';
|
||||
+ state++;
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+kwboot_spinner(void)
|
||||
+{
|
||||
+ if (kwboot_verbose)
|
||||
+ __spinner();
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+__progress(int pct, char c)
|
||||
+{
|
||||
+ const int width = 70;
|
||||
+ static const char *nl = "";
|
||||
+ static int pos;
|
||||
+
|
||||
+ if (pos % width == 0)
|
||||
+ printf("%s%3d %% [", nl, pct);
|
||||
+
|
||||
+ fputc(c, stdout);
|
||||
+
|
||||
+ nl = "]\n";
|
||||
+ pos++;
|
||||
+
|
||||
+ if (pct == 100) {
|
||||
+ while (pos++ < width)
|
||||
+ fputc(' ', stdout);
|
||||
+ fputs(nl, stdout);
|
||||
+ }
|
||||
+
|
||||
+ fflush(stdout);
|
||||
+
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+kwboot_progress(int _pct, char c)
|
||||
+{
|
||||
+ static int pct;
|
||||
+
|
||||
+ if (_pct != -1)
|
||||
+ pct = _pct;
|
||||
+
|
||||
+ if (kwboot_verbose)
|
||||
+ __progress(pct, c);
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+kwboot_tty_recv(int fd, void *buf, size_t len, int timeo)
|
||||
+{
|
||||
+ int rc, nfds;
|
||||
+ fd_set rfds;
|
||||
+ struct timeval tv;
|
||||
+ ssize_t n;
|
||||
+
|
||||
+ rc = -1;
|
||||
+
|
||||
+ FD_ZERO(&rfds);
|
||||
+ FD_SET(fd, &rfds);
|
||||
+
|
||||
+ tv.tv_sec = 0;
|
||||
+ tv.tv_usec = timeo * 1000;
|
||||
+ if (tv.tv_usec > 1000000) {
|
||||
+ tv.tv_sec += tv.tv_usec / 1000000;
|
||||
+ tv.tv_usec %= 1000000;
|
||||
+ }
|
||||
+
|
||||
+ do {
|
||||
+ nfds = select(fd + 1, &rfds, NULL, NULL, &tv);
|
||||
+ if (nfds < 0)
|
||||
+ goto out;
|
||||
+ if (!nfds) {
|
||||
+ errno = ETIMEDOUT;
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ n = read(fd, buf, len);
|
||||
+ if (n < 0)
|
||||
+ goto out;
|
||||
+
|
||||
+ buf = (char *)buf + n;
|
||||
+ len -= n;
|
||||
+ } while (len > 0);
|
||||
+
|
||||
+ rc = 0;
|
||||
+out:
|
||||
+ return rc;
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+kwboot_tty_send(int fd, const void *buf, size_t len)
|
||||
+{
|
||||
+ int rc;
|
||||
+ ssize_t n;
|
||||
+
|
||||
+ rc = -1;
|
||||
+
|
||||
+ do {
|
||||
+ n = write(fd, buf, len);
|
||||
+ if (n < 0)
|
||||
+ goto out;
|
||||
+
|
||||
+ buf = (char *)buf + n;
|
||||
+ len -= n;
|
||||
+ } while (len > 0);
|
||||
+
|
||||
+ rc = tcdrain(fd);
|
||||
+out:
|
||||
+ return rc;
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+kwboot_tty_send_char(int fd, unsigned char c)
|
||||
+{
|
||||
+ return kwboot_tty_send(fd, &c, 1);
|
||||
+}
|
||||
+
|
||||
+static speed_t
|
||||
+kwboot_tty_speed(int baudrate)
|
||||
+{
|
||||
+ switch (baudrate) {
|
||||
+ case 115200:
|
||||
+ return B115200;
|
||||
+ case 57600:
|
||||
+ return B57600;
|
||||
+ case 38400:
|
||||
+ return B38400;
|
||||
+ case 19200:
|
||||
+ return B19200;
|
||||
+ case 9600:
|
||||
+ return B9600;
|
||||
+ }
|
||||
+
|
||||
+ return -1;
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+kwboot_open_tty(const char *path, speed_t speed)
|
||||
+{
|
||||
+ int rc, fd;
|
||||
+ struct termios tio;
|
||||
+
|
||||
+ rc = -1;
|
||||
+
|
||||
+ fd = open(path, O_RDWR|O_NOCTTY|O_NDELAY);
|
||||
+ if (fd < 0)
|
||||
+ goto out;
|
||||
+
|
||||
+ memset(&tio, 0, sizeof(tio));
|
||||
+
|
||||
+ tio.c_iflag = 0;
|
||||
+ tio.c_cflag = CREAD|CLOCAL|CS8;
|
||||
+
|
||||
+ tio.c_cc[VMIN] = 1;
|
||||
+ tio.c_cc[VTIME] = 10;
|
||||
+
|
||||
+ cfsetospeed(&tio, speed);
|
||||
+ cfsetispeed(&tio, speed);
|
||||
+
|
||||
+ rc = tcsetattr(fd, TCSANOW, &tio);
|
||||
+ if (rc)
|
||||
+ goto out;
|
||||
+
|
||||
+ rc = fd;
|
||||
+out:
|
||||
+ if (rc < 0) {
|
||||
+ if (fd >= 0)
|
||||
+ close(fd);
|
||||
+ }
|
||||
+
|
||||
+ return rc;
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+kwboot_bootmsg(int tty, void *msg)
|
||||
+{
|
||||
+ int rc;
|
||||
+ char c;
|
||||
+
|
||||
+ kwboot_printv("Sending boot message. Please reboot the target...");
|
||||
+
|
||||
+ do {
|
||||
+ rc = tcflush(tty, TCIOFLUSH);
|
||||
+ if (rc)
|
||||
+ break;
|
||||
+
|
||||
+ rc = kwboot_tty_send(tty, msg, 8);
|
||||
+ if (rc) {
|
||||
+ usleep(KWBOOT_MSG_REQ_DELAY * 1000);
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
+ rc = kwboot_tty_recv(tty, &c, 1, KWBOOT_MSG_RSP_TIMEO);
|
||||
+
|
||||
+ kwboot_spinner();
|
||||
+
|
||||
+ } while (rc || c != NAK);
|
||||
+
|
||||
+ kwboot_printv("\n");
|
||||
+
|
||||
+ return rc;
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+kwboot_xm_makeblock(struct kwboot_block *block, const void *data,
|
||||
+ size_t size, int pnum)
|
||||
+{
|
||||
+ const size_t blksz = sizeof(block->data);
|
||||
+ size_t n;
|
||||
+ int i;
|
||||
+
|
||||
+ block->pnum = pnum;
|
||||
+ block->_pnum = ~block->pnum;
|
||||
+
|
||||
+ n = size < blksz ? size : blksz;
|
||||
+ memcpy(&block->data[0], data, n);
|
||||
+ memset(&block->data[n], 0, blksz - n);
|
||||
+
|
||||
+ block->csum = 0;
|
||||
+ for (i = 0; i < n; i++)
|
||||
+ block->csum += block->data[i];
|
||||
+
|
||||
+ return n;
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+kwboot_xm_sendblock(int fd, struct kwboot_block *block)
|
||||
+{
|
||||
+ int rc, retries;
|
||||
+ char c;
|
||||
+
|
||||
+ retries = 16;
|
||||
+ do {
|
||||
+ rc = kwboot_tty_send(fd, block, sizeof(*block));
|
||||
+ if (rc)
|
||||
+ break;
|
||||
+
|
||||
+ rc = kwboot_tty_recv(fd, &c, 1, KWBOOT_BLK_RSP_TIMEO);
|
||||
+ if (rc)
|
||||
+ break;
|
||||
+
|
||||
+ if (c != ACK)
|
||||
+ kwboot_progress(-1, '+');
|
||||
+
|
||||
+ } while (c == NAK && retries-- > 0);
|
||||
+
|
||||
+ rc = -1;
|
||||
+
|
||||
+ switch (c) {
|
||||
+ case ACK:
|
||||
+ rc = 0;
|
||||
+ break;
|
||||
+ case NAK:
|
||||
+ errno = EBADMSG;
|
||||
+ break;
|
||||
+ case CAN:
|
||||
+ errno = ECANCELED;
|
||||
+ break;
|
||||
+ default:
|
||||
+ errno = EPROTO;
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ return rc;
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+kwboot_xmodem(int tty, const void *_data, size_t size)
|
||||
+{
|
||||
+ const uint8_t *data = _data;
|
||||
+ int rc, pnum, N, err;
|
||||
+
|
||||
+ pnum = 1;
|
||||
+ N = 0;
|
||||
+
|
||||
+ kwboot_printv("Sending boot image...\n");
|
||||
+
|
||||
+ do {
|
||||
+ struct kwboot_block block;
|
||||
+ int n;
|
||||
+
|
||||
+ n = kwboot_xm_makeblock(&block,
|
||||
+ data + N, size - N,
|
||||
+ pnum++);
|
||||
+ if (n < 0)
|
||||
+ goto can;
|
||||
+
|
||||
+ if (!n)
|
||||
+ break;
|
||||
+
|
||||
+ rc = kwboot_xm_sendblock(tty, &block);
|
||||
+ if (rc)
|
||||
+ goto out;
|
||||
+
|
||||
+ N += n;
|
||||
+ kwboot_progress(N * 100 / size, '.');
|
||||
+ } while (1);
|
||||
+
|
||||
+ rc = kwboot_tty_send_char(tty, EOT);
|
||||
+
|
||||
+out:
|
||||
+ return rc;
|
||||
+
|
||||
+can:
|
||||
+ err = errno;
|
||||
+ kwboot_tty_send_char(tty, CAN);
|
||||
+ errno = err;
|
||||
+ goto out;
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+kwboot_term_pipe(int in, int out, char *quit, int *s)
|
||||
+{
|
||||
+ ssize_t nin, nout;
|
||||
+ char _buf[128], *buf = _buf;
|
||||
+
|
||||
+ nin = read(in, buf, sizeof(buf));
|
||||
+ if (nin < 0)
|
||||
+ return -1;
|
||||
+
|
||||
+ if (quit) {
|
||||
+ int i;
|
||||
+
|
||||
+ for (i = 0; i < nin; i++) {
|
||||
+ if (*buf == quit[*s]) {
|
||||
+ (*s)++;
|
||||
+ if (!quit[*s])
|
||||
+ return 0;
|
||||
+ buf++;
|
||||
+ nin--;
|
||||
+ } else
|
||||
+ while (*s > 0) {
|
||||
+ nout = write(out, quit, *s);
|
||||
+ if (nout <= 0)
|
||||
+ return -1;
|
||||
+ (*s) -= nout;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ while (nin > 0) {
|
||||
+ nout = write(out, buf, nin);
|
||||
+ if (nout <= 0)
|
||||
+ return -1;
|
||||
+ nin -= nout;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+kwboot_terminal(int tty)
|
||||
+{
|
||||
+ int rc, in, s;
|
||||
+ char *quit = "\34c";
|
||||
+ struct termios otio, tio;
|
||||
+
|
||||
+ rc = -1;
|
||||
+
|
||||
+ in = STDIN_FILENO;
|
||||
+ if (isatty(in)) {
|
||||
+ rc = tcgetattr(in, &otio);
|
||||
+ if (!rc) {
|
||||
+ tio = otio;
|
||||
+ cfmakeraw(&tio);
|
||||
+ rc = tcsetattr(in, TCSANOW, &tio);
|
||||
+ }
|
||||
+ if (rc) {
|
||||
+ perror("tcsetattr");
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ kwboot_printv("[Type Ctrl-%c + %c to quit]\r\n",
|
||||
+ quit[0]|0100, quit[1]);
|
||||
+ } else
|
||||
+ in = -1;
|
||||
+
|
||||
+ rc = 0;
|
||||
+ s = 0;
|
||||
+
|
||||
+ do {
|
||||
+ fd_set rfds;
|
||||
+ int nfds = 0;
|
||||
+
|
||||
+ FD_SET(tty, &rfds);
|
||||
+ nfds = nfds < tty ? tty : nfds;
|
||||
+
|
||||
+ if (in >= 0) {
|
||||
+ FD_SET(in, &rfds);
|
||||
+ nfds = nfds < in ? in : nfds;
|
||||
+ }
|
||||
+
|
||||
+ nfds = select(nfds + 1, &rfds, NULL, NULL, NULL);
|
||||
+ if (nfds < 0)
|
||||
+ break;
|
||||
+
|
||||
+ if (FD_ISSET(tty, &rfds)) {
|
||||
+ rc = kwboot_term_pipe(tty, STDOUT_FILENO, NULL, NULL);
|
||||
+ if (rc)
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ if (FD_ISSET(in, &rfds)) {
|
||||
+ rc = kwboot_term_pipe(in, tty, quit, &s);
|
||||
+ if (rc)
|
||||
+ break;
|
||||
+ }
|
||||
+ } while (quit[s] != 0);
|
||||
+
|
||||
+ tcsetattr(in, TCSANOW, &otio);
|
||||
+out:
|
||||
+ return rc;
|
||||
+}
|
||||
+
|
||||
+static void *
|
||||
+kwboot_mmap_image(const char *path, size_t *size, int prot)
|
||||
+{
|
||||
+ int rc, fd, flags;
|
||||
+ struct stat st;
|
||||
+ void *img;
|
||||
+
|
||||
+ rc = -1;
|
||||
+ fd = -1;
|
||||
+ img = NULL;
|
||||
+
|
||||
+ fd = open(path, O_RDONLY);
|
||||
+ if (fd < 0)
|
||||
+ goto out;
|
||||
+
|
||||
+ rc = fstat(fd, &st);
|
||||
+ if (rc)
|
||||
+ goto out;
|
||||
+
|
||||
+ flags = (prot & PROT_WRITE) ? MAP_PRIVATE : MAP_SHARED;
|
||||
+
|
||||
+ img = mmap(NULL, st.st_size, prot, flags, fd, 0);
|
||||
+ if (img == MAP_FAILED) {
|
||||
+ img = NULL;
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ rc = 0;
|
||||
+ *size = st.st_size;
|
||||
+out:
|
||||
+ if (rc && img) {
|
||||
+ munmap(img, st.st_size);
|
||||
+ img = NULL;
|
||||
+ }
|
||||
+ if (fd >= 0)
|
||||
+ close(fd);
|
||||
+
|
||||
+ return img;
|
||||
+}
|
||||
+
|
||||
+static uint8_t
|
||||
+kwboot_img_csum8(void *_data, size_t size)
|
||||
+{
|
||||
+ uint8_t *data = _data, csum;
|
||||
+
|
||||
+ for (csum = 0; size-- > 0; data++)
|
||||
+ csum += *data;
|
||||
+
|
||||
+ return csum;
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+kwboot_img_patch_hdr(void *img, size_t size)
|
||||
+{
|
||||
+ int rc;
|
||||
+ bhr_t *hdr;
|
||||
+ uint8_t csum;
|
||||
+ const size_t hdrsz = sizeof(*hdr);
|
||||
+
|
||||
+ rc = -1;
|
||||
+ hdr = img;
|
||||
+
|
||||
+ if (size < hdrsz) {
|
||||
+ errno = EINVAL;
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ csum = kwboot_img_csum8(hdr, hdrsz) - hdr->checkSum;
|
||||
+ if (csum != hdr->checkSum) {
|
||||
+ errno = EINVAL;
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ if (hdr->blockid == IBR_HDR_UART_ID) {
|
||||
+ rc = 0;
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ hdr->blockid = IBR_HDR_UART_ID;
|
||||
+
|
||||
+ hdr->nandeccmode = IBR_HDR_ECC_DISABLED;
|
||||
+ hdr->nandpagesize = 0;
|
||||
+
|
||||
+ hdr->srcaddr = hdr->ext
|
||||
+ ? sizeof(struct kwb_header)
|
||||
+ : sizeof(*hdr);
|
||||
+
|
||||
+ hdr->checkSum = kwboot_img_csum8(hdr, hdrsz) - csum;
|
||||
+
|
||||
+ rc = 0;
|
||||
+out:
|
||||
+ return rc;
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+kwboot_usage(FILE *stream, char *progname)
|
||||
+{
|
||||
+ fprintf(stream,
|
||||
+ "Usage: %s -b <image> [ -p ] [ -t ] "
|
||||
+ "[-B <baud> ] <TTY>\n", progname);
|
||||
+ fprintf(stream, "\n");
|
||||
+ fprintf(stream, " -b <image>: boot <image>\n");
|
||||
+ fprintf(stream, " -p: patch <image> to type 0x69 (uart boot)\n");
|
||||
+ fprintf(stream, "\n");
|
||||
+ fprintf(stream, " -t: mini terminal\n");
|
||||
+ fprintf(stream, "\n");
|
||||
+ fprintf(stream, " -B <baud>: set baud rate\n");
|
||||
+ fprintf(stream, "\n");
|
||||
+}
|
||||
+
|
||||
+int
|
||||
+main(int argc, char **argv)
|
||||
+{
|
||||
+ const char *ttypath, *imgpath;
|
||||
+ int rv, rc, tty, term, prot, patch;
|
||||
+ void *bootmsg;
|
||||
+ void *img;
|
||||
+ size_t size;
|
||||
+ speed_t speed;
|
||||
+
|
||||
+ rv = 1;
|
||||
+ tty = -1;
|
||||
+ bootmsg = NULL;
|
||||
+ imgpath = NULL;
|
||||
+ img = NULL;
|
||||
+ term = 0;
|
||||
+ patch = 0;
|
||||
+ size = 0;
|
||||
+ speed = B115200;
|
||||
+
|
||||
+ kwboot_verbose = isatty(STDOUT_FILENO);
|
||||
+
|
||||
+ do {
|
||||
+ int c = getopt(argc, argv, "hb:ptB:");
|
||||
+ if (c < 0)
|
||||
+ break;
|
||||
+
|
||||
+ switch (c) {
|
||||
+ case 'b':
|
||||
+ bootmsg = kwboot_msg_boot;
|
||||
+ imgpath = optarg;
|
||||
+ break;
|
||||
+
|
||||
+ case 'p':
|
||||
+ patch = 1;
|
||||
+ break;
|
||||
+
|
||||
+ case 't':
|
||||
+ term = 1;
|
||||
+ break;
|
||||
+
|
||||
+ case 'B':
|
||||
+ speed = kwboot_tty_speed(atoi(optarg));
|
||||
+ if (speed == -1)
|
||||
+ goto usage;
|
||||
+ break;
|
||||
+
|
||||
+ case 'h':
|
||||
+ rv = 0;
|
||||
+ default:
|
||||
+ goto usage;
|
||||
+ }
|
||||
+ } while (1);
|
||||
+
|
||||
+ if (!bootmsg && !term)
|
||||
+ goto usage;
|
||||
+
|
||||
+ if (patch && !imgpath)
|
||||
+ goto usage;
|
||||
+
|
||||
+ if (argc - optind < 1)
|
||||
+ goto usage;
|
||||
+
|
||||
+ ttypath = argv[optind++];
|
||||
+
|
||||
+ tty = kwboot_open_tty(ttypath, speed);
|
||||
+ if (tty < 0) {
|
||||
+ perror(ttypath);
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ if (imgpath) {
|
||||
+ prot = PROT_READ | (patch ? PROT_WRITE : 0);
|
||||
+
|
||||
+ img = kwboot_mmap_image(imgpath, &size, prot);
|
||||
+ if (!img) {
|
||||
+ perror(imgpath);
|
||||
+ goto out;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (patch) {
|
||||
+ rc = kwboot_img_patch_hdr(img, size);
|
||||
+ if (rc) {
|
||||
+ fprintf(stderr, "%s: Invalid image.\n", imgpath);
|
||||
+ goto out;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (bootmsg) {
|
||||
+ rc = kwboot_bootmsg(tty, bootmsg);
|
||||
+ if (rc) {
|
||||
+ perror("bootmsg");
|
||||
+ goto out;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (img) {
|
||||
+ rc = kwboot_xmodem(tty, img, size);
|
||||
+ if (rc) {
|
||||
+ perror("xmodem");
|
||||
+ goto out;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (term) {
|
||||
+ rc = kwboot_terminal(tty);
|
||||
+ if (rc && !(errno == EINTR)) {
|
||||
+ perror("terminal");
|
||||
+ goto out;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ rv = 0;
|
||||
+out:
|
||||
+ if (tty >= 0)
|
||||
+ close(tty);
|
||||
+
|
||||
+ if (img)
|
||||
+ munmap(img, size);
|
||||
+
|
||||
+ return rv;
|
||||
+
|
||||
+usage:
|
||||
+ kwboot_usage(rv ? stderr : stdout, basename(argv[0]));
|
||||
+ goto out;
|
||||
+}
|
||||
17
package/boot/uboot-kirkwood/patches/0003-ide_bus.patch
Normal file
17
package/boot/uboot-kirkwood/patches/0003-ide_bus.patch
Normal file
@@ -0,0 +1,17 @@
|
||||
http://lists.denx.de/pipermail/u-boot/2012-April/122594.html
|
||||
http://patchwork.ozlabs.org/patch/159129/
|
||||
---
|
||||
|
||||
diff --git a/include/ide.h b/include/ide.h
|
||||
index 8ecc9dd..385e909 100644
|
||||
--- a/include/ide.h
|
||||
+++ b/include/ide.h
|
||||
@@ -24,7 +24,7 @@
|
||||
#ifndef _IDE_H
|
||||
#define _IDE_H
|
||||
|
||||
-#define IDE_BUS(dev) (dev >> 1)
|
||||
+#define IDE_BUS(dev) (dev / (CONFIG_SYS_IDE_MAXDEVICE / CONFIG_SYS_IDE_MAXBUS))
|
||||
|
||||
#define ATA_CURR_BASE(dev) (CONFIG_SYS_ATA_BASE_ADDR+ide_bus_offset[IDE_BUS(dev)])
|
||||
|
||||
10
package/boot/uboot-kirkwood/patches/100-iconnect.patch
Normal file
10
package/boot/uboot-kirkwood/patches/100-iconnect.patch
Normal file
@@ -0,0 +1,10 @@
|
||||
--- a/boards.cfg
|
||||
+++ b/boards.cfg
|
||||
@@ -137,6 +137,7 @@ hawkboard_uart arm
|
||||
enbw_cmc arm arm926ejs enbw_cmc enbw davinci
|
||||
calimain arm arm926ejs calimain omicron davinci
|
||||
dns325 arm arm926ejs - d-link kirkwood
|
||||
+iconnect arm arm926ejs - iomega kirkwood
|
||||
km_kirkwood arm arm926ejs km_arm keymile kirkwood km_kirkwood:KM_DISABLE_PCI
|
||||
km_kirkwood_pci arm arm926ejs km_arm keymile kirkwood km_kirkwood:KM_RECONFIG_XLX
|
||||
mgcoge3un arm arm926ejs km_arm keymile kirkwood
|
||||
35
package/boot/uboot-kirkwood/patches/110-dockstar.patch
Normal file
35
package/boot/uboot-kirkwood/patches/110-dockstar.patch
Normal file
@@ -0,0 +1,35 @@
|
||||
--- a/include/configs/dockstar.h
|
||||
+++ b/include/configs/dockstar.h
|
||||
@@ -83,22 +83,19 @@
|
||||
* Default environment variables
|
||||
*/
|
||||
#define CONFIG_BOOTCOMMAND \
|
||||
- "setenv bootargs ${console} ${mtdparts} ${bootargs_root}; " \
|
||||
- "ubi part root; " \
|
||||
- "ubifsmount root; " \
|
||||
- "ubifsload 0x800000 ${kernel}; " \
|
||||
- "ubifsload 0x1100000 ${initrd}; " \
|
||||
- "bootm 0x800000 0x1100000"
|
||||
+ "${x_bootcmd_kernel}; " \
|
||||
+ "setenv bootargs ${x_bootargs} ${x_bootargs_root}; " \
|
||||
+ "${x_bootcmd_usb}; bootm 0x6400000;"
|
||||
|
||||
-#define CONFIG_MTDPARTS "mtdparts=orion_nand:1m(uboot),-(root)\0"
|
||||
+#define CONFIG_MTDPARTS \
|
||||
+ "orion_nand:1M(u-boot),1M@1M(second_stage_u-boot)," \
|
||||
+ "3M@2M(kernel),32M@5M(rootfs),219M@37M(data) rw\0"
|
||||
|
||||
#define CONFIG_EXTRA_ENV_SETTINGS \
|
||||
- "console=console=ttyS0,115200\0" \
|
||||
- "mtdids=nand0=orion_nand\0" \
|
||||
- "mtdparts="CONFIG_MTDPARTS \
|
||||
- "kernel=/boot/uImage\0" \
|
||||
- "initrd=/boot/uInitrd\0" \
|
||||
- "bootargs_root=ubi.mtd=1 root=ubi0:root rootfstype=ubifs ro\0"
|
||||
+ "x_bootargs=console=ttyS0,115200 mtdparts="CONFIG_MTDPARTS \
|
||||
+ "x_bootcmd_kernel=nand read 0x6400000 0x200000 0x300000\0" \
|
||||
+ "x_bootargs_root=root=/dev/mtdblock3 rw rootfstype=jffs2\0" \
|
||||
+ "x_bootcmd_usb=usb start\0"
|
||||
|
||||
/*
|
||||
* Ethernet Driver configuration
|
||||
89
package/boot/uboot-omap35xx/Makefile
Normal file
89
package/boot/uboot-omap35xx/Makefile
Normal file
@@ -0,0 +1,89 @@
|
||||
#
|
||||
# Copyright (C) 2011 OpenWrt.org
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
include $(INCLUDE_DIR)/kernel.mk
|
||||
|
||||
PKG_NAME:=u-boot
|
||||
PKG_VERSION:=2010.12
|
||||
PKG_RELEASE:=1
|
||||
|
||||
PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
|
||||
PKG_SOURCE_URL:=ftp://ftp.denx.de/pub/u-boot
|
||||
PKG_MD5SUM:=
|
||||
PKG_TARGETS:=bin
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define uboot/Default
|
||||
TITLE:=
|
||||
CONFIG:=
|
||||
IMAGE:=
|
||||
endef
|
||||
|
||||
define uboot/omap3_overo
|
||||
TITLE:=U-boot for the gumstix board
|
||||
endef
|
||||
|
||||
UBOOTS:=omap3_overo
|
||||
|
||||
define Package/uboot/template
|
||||
define Package/uboot-omap35xx-$(1)
|
||||
SECTION:=boot
|
||||
CATEGORY:=Boot Loaders
|
||||
DEPENDS:=@TARGET_omap35xx
|
||||
TITLE:=$(2)
|
||||
URL:=http://www.denx.de/wiki/U-Boot
|
||||
VARIANT:=$(1)
|
||||
endef
|
||||
endef
|
||||
|
||||
define BuildUbootPackage
|
||||
$(eval $(uboot/Default))
|
||||
$(eval $(uboot/$(1)))
|
||||
$(call Package/uboot/template,$(1),$(TITLE))
|
||||
endef
|
||||
|
||||
|
||||
ifdef BUILD_VARIANT
|
||||
$(eval $(call uboot/$(BUILD_VARIANT)))
|
||||
UBOOT_CONFIG:=$(if $(CONFIG),$(CONFIG),$(BUILD_VARIANT))
|
||||
UBOOT_IMAGE:=$(if $(IMAGE),$(IMAGE),openwrt-$(BOARD)-$(BUILD_VARIANT)-u-boot.bin)
|
||||
endif
|
||||
|
||||
define Build/Prepare
|
||||
$(call Build/Prepare/Default)
|
||||
$(CP) ./files/* $(PKG_BUILD_DIR)
|
||||
find $(PKG_BUILD_DIR) -name .svn | $(XARGS) rm -rf
|
||||
endef
|
||||
|
||||
define Build/Configure
|
||||
$(MAKE) -C $(PKG_BUILD_DIR) \
|
||||
$(UBOOT_CONFIG)_config
|
||||
endef
|
||||
|
||||
define Build/Compile
|
||||
$(MAKE) -C $(PKG_BUILD_DIR) \
|
||||
CROSS_COMPILE=$(TARGET_CROSS)
|
||||
endef
|
||||
|
||||
define Package/uboot/install/template
|
||||
define Package/uboot-omap35xx-$(1)/install
|
||||
$(INSTALL_DIR) $$(1)
|
||||
$(CP) $(PKG_BUILD_DIR)/u-boot.bin $(BIN_DIR)/$(2)
|
||||
endef
|
||||
endef
|
||||
|
||||
$(foreach u,$(UBOOTS), \
|
||||
$(eval $(call Package/uboot/install/template,$(u),openwrt-$(BOARD)-$(u)-u-boot.bin)) \
|
||||
)
|
||||
|
||||
$(foreach u,$(UBOOTS), \
|
||||
$(eval $(call BuildUbootPackage,$(u))) \
|
||||
$(eval $(call BuildPackage,uboot-omap35xx-$(u))) \
|
||||
)
|
||||
316
package/boot/uboot-omap35xx/files/include/configs/omap3_overo.h
Normal file
316
package/boot/uboot-omap35xx/files/include/configs/omap3_overo.h
Normal file
@@ -0,0 +1,316 @@
|
||||
/*
|
||||
* Configuration settings for the Gumstix Overo board.
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef __CONFIG_H
|
||||
#define __CONFIG_H
|
||||
|
||||
/*
|
||||
* High Level Configuration Options
|
||||
*/
|
||||
#define CONFIG_ARMV7 1 /* This is an ARM V7 CPU core */
|
||||
#define CONFIG_OMAP 1 /* in a TI OMAP core */
|
||||
#define CONFIG_OMAP34XX 1 /* which is a 34XX */
|
||||
#define CONFIG_OMAP3430 1 /* which is in a 3430 */
|
||||
#define CONFIG_OMAP3_OVERO 1 /* working with overo */
|
||||
|
||||
#define CONFIG_SDRC /* The chip has SDRC controller */
|
||||
|
||||
#include <asm/arch/cpu.h> /* get chip and board defs */
|
||||
#include <asm/arch/omap3.h>
|
||||
|
||||
/*
|
||||
* Display CPU and Board information
|
||||
*/
|
||||
#define CONFIG_DISPLAY_CPUINFO 1
|
||||
#define CONFIG_DISPLAY_BOARDINFO 1
|
||||
|
||||
/* Clock Defines */
|
||||
#define V_OSCK 26000000 /* Clock output from T2 */
|
||||
#define V_SCLK (V_OSCK >> 1)
|
||||
|
||||
#undef CONFIG_USE_IRQ /* no support for IRQs */
|
||||
#define CONFIG_MISC_INIT_R
|
||||
|
||||
#define CONFIG_CMDLINE_TAG 1 /* enable passing of ATAGs */
|
||||
#define CONFIG_SETUP_MEMORY_TAGS 1
|
||||
#define CONFIG_INITRD_TAG 1
|
||||
#define CONFIG_REVISION_TAG 1
|
||||
|
||||
/*
|
||||
* Size of malloc() pool
|
||||
*/
|
||||
#define CONFIG_ENV_SIZE (128 << 10) /* 128 KiB */
|
||||
/* Sector */
|
||||
#define CONFIG_SYS_MALLOC_LEN (CONFIG_ENV_SIZE + (128 << 10))
|
||||
/* initial data */
|
||||
|
||||
/*
|
||||
* Hardware drivers
|
||||
*/
|
||||
|
||||
/*
|
||||
* NS16550 Configuration
|
||||
*/
|
||||
#define V_NS16550_CLK 48000000 /* 48MHz (APLL96/2) */
|
||||
|
||||
#define CONFIG_SYS_NS16550
|
||||
#define CONFIG_SYS_NS16550_SERIAL
|
||||
#define CONFIG_SYS_NS16550_REG_SIZE (-4)
|
||||
#define CONFIG_SYS_NS16550_CLK V_NS16550_CLK
|
||||
|
||||
/*
|
||||
* select serial console configuration
|
||||
*/
|
||||
#define CONFIG_CONS_INDEX 3
|
||||
#define CONFIG_SYS_NS16550_COM3 OMAP34XX_UART3
|
||||
#define CONFIG_SERIAL3 3
|
||||
|
||||
/* allow to overwrite serial and ethaddr */
|
||||
#define CONFIG_ENV_OVERWRITE
|
||||
#define CONFIG_BAUDRATE 115200
|
||||
#define CONFIG_SYS_BAUDRATE_TABLE {4800, 9600, 19200, 38400, 57600, \
|
||||
115200}
|
||||
#define CONFIG_GENERIC_MMC 1
|
||||
#define CONFIG_MMC 1
|
||||
#define CONFIG_OMAP_HSMMC 1
|
||||
#define CONFIG_DOS_PARTITION 1
|
||||
|
||||
/* DDR - I use Micron DDR */
|
||||
#define CONFIG_OMAP3_MICRON_DDR 1
|
||||
|
||||
/* commands to include */
|
||||
#include <config_cmd_default.h>
|
||||
|
||||
#define CONFIG_CMD_CACHE
|
||||
#define CONFIG_CMD_EXT2 /* EXT2 Support */
|
||||
#define CONFIG_CMD_FAT /* FAT support */
|
||||
#define CONFIG_CMD_JFFS2 /* JFFS2 Support */
|
||||
|
||||
#define CONFIG_CMD_I2C /* I2C serial bus support */
|
||||
#define CONFIG_CMD_MMC /* MMC support */
|
||||
#define CONFIG_CMD_NAND /* NAND support */
|
||||
|
||||
#undef CONFIG_CMD_FLASH /* flinfo, erase, protect */
|
||||
#undef CONFIG_CMD_FPGA /* FPGA configuration Support */
|
||||
#undef CONFIG_CMD_IMI /* iminfo */
|
||||
#undef CONFIG_CMD_IMLS /* List all found images */
|
||||
#undef CONFIG_CMD_NFS /* NFS support */
|
||||
#define CONFIG_CMD_NET /* bootp, tftpboot, rarpboot */
|
||||
|
||||
#define CONFIG_SYS_NO_FLASH
|
||||
#define CONFIG_HARD_I2C 1
|
||||
#define CONFIG_SYS_I2C_SPEED 100000
|
||||
#define CONFIG_SYS_I2C_SLAVE 1
|
||||
#define CONFIG_SYS_I2C_BUS 0
|
||||
#define CONFIG_SYS_I2C_BUS_SELECT 1
|
||||
#define CONFIG_I2C_MULTI_BUS 1
|
||||
#define CONFIG_DRIVER_OMAP34XX_I2C 1
|
||||
|
||||
/*
|
||||
* TWL4030
|
||||
*/
|
||||
#define CONFIG_TWL4030_POWER 1
|
||||
#define CONFIG_TWL4030_LED 1
|
||||
|
||||
/*
|
||||
* Board NAND Info.
|
||||
*/
|
||||
#define CONFIG_SYS_NAND_QUIET_TEST 1
|
||||
#define CONFIG_NAND_OMAP_GPMC
|
||||
#define CONFIG_SYS_NAND_ADDR NAND_BASE /* physical address */
|
||||
/* to access nand */
|
||||
#define CONFIG_SYS_NAND_BASE NAND_BASE /* physical address */
|
||||
/* to access nand */
|
||||
/* at CS0 */
|
||||
#define GPMC_NAND_ECC_LP_x16_LAYOUT 1
|
||||
|
||||
#define CONFIG_SYS_MAX_NAND_DEVICE 1 /* Max number of NAND */
|
||||
/* devices */
|
||||
#define CONFIG_JFFS2_NAND
|
||||
/* nand device jffs2 lives on */
|
||||
#define CONFIG_JFFS2_DEV "nand0"
|
||||
/* start of jffs2 partition */
|
||||
#define CONFIG_JFFS2_PART_OFFSET 0x680000
|
||||
#define CONFIG_JFFS2_PART_SIZE 0xf980000 /* size of jffs2 */
|
||||
/* partition */
|
||||
|
||||
/* Environment information */
|
||||
#define CONFIG_BOOTDELAY 5
|
||||
|
||||
#define CONFIG_EXTRA_ENV_SETTINGS \
|
||||
"loadaddr=0x82000000\0" \
|
||||
"console=ttyO2,115200n8\0" \
|
||||
"mpurate=500\0" \
|
||||
"vram=12M\0" \
|
||||
"dvimode=1024x768MR-16@60\0" \
|
||||
"defaultdisplay=dvi\0" \
|
||||
"mmcdev=0\0" \
|
||||
"mmcroot=/dev/mmcblk0p2 rw\0" \
|
||||
"mmcrootfstype=ext3 rootwait\0" \
|
||||
"nandroot='ubi0:rootfs ubi.mtd=5 ubi.mtd=6 ubi.mtd=7'\0" \
|
||||
"nandrootfstype=ubifs\0" \
|
||||
"mmcargs=setenv bootargs console=${console} " \
|
||||
"mpurate=${mpurate} " \
|
||||
"vram=${vram} " \
|
||||
"omapfb.mode=dvi:${dvimode} " \
|
||||
"omapfb.debug=y " \
|
||||
"omapdss.def_disp=${defaultdisplay} " \
|
||||
"root=${mmcroot} " \
|
||||
"rootfstype=${mmcrootfstype}\0" \
|
||||
"nandargs=setenv bootargs console=${console} " \
|
||||
"mpurate=${mpurate} " \
|
||||
"vram=${vram} " \
|
||||
"omapfb.mode=dvi:${dvimode} " \
|
||||
"omapfb.debug=y " \
|
||||
"omapdss.def_disp=${defaultdisplay} " \
|
||||
"root=${nandroot} " \
|
||||
"rootfstype=${nandrootfstype}\0" \
|
||||
"loadbootscript=fatload mmc ${mmcdev} ${loadaddr} boot.scr\0" \
|
||||
"bootscript=echo Running bootscript from mmc ...; " \
|
||||
"source ${loadaddr}\0" \
|
||||
"loaduimage=fatload mmc ${mmcdev} ${loadaddr} uImage\0" \
|
||||
"mmcboot=echo Booting from mmc ...; " \
|
||||
"run mmcargs; " \
|
||||
"bootm ${loadaddr}\0" \
|
||||
"nandboot=echo Booting from nand ...; " \
|
||||
"run nandargs; " \
|
||||
"nand read ${loadaddr} 280000 200000; " \
|
||||
"bootm ${loadaddr}\0" \
|
||||
|
||||
#define CONFIG_BOOTCOMMAND \
|
||||
"if mmc rescan ${mmcdev}; then " \
|
||||
"if run loadbootscript; then " \
|
||||
"run bootscript; " \
|
||||
"else " \
|
||||
"if run loaduimage; then " \
|
||||
"run mmcboot; " \
|
||||
"else run nandboot; " \
|
||||
"fi; " \
|
||||
"fi; " \
|
||||
"else run nandboot; fi"
|
||||
|
||||
#define CONFIG_AUTO_COMPLETE 1
|
||||
/*
|
||||
* Miscellaneous configurable options
|
||||
*/
|
||||
#define CONFIG_SYS_LONGHELP /* undef to save memory */
|
||||
#define CONFIG_SYS_HUSH_PARSER /* use "hush" command parser */
|
||||
#define CONFIG_SYS_PROMPT_HUSH_PS2 "> "
|
||||
#define CONFIG_SYS_PROMPT "Overo # "
|
||||
#define CONFIG_SYS_CBSIZE 256 /* Console I/O Buffer Size */
|
||||
/* Print Buffer Size */
|
||||
#define CONFIG_SYS_PBSIZE (CONFIG_SYS_CBSIZE + \
|
||||
sizeof(CONFIG_SYS_PROMPT) + 16)
|
||||
#define CONFIG_SYS_MAXARGS 16 /* max number of command */
|
||||
/* args */
|
||||
/* Boot Argument Buffer Size */
|
||||
#define CONFIG_SYS_BARGSIZE CONFIG_SYS_CBSIZE
|
||||
/* memtest works on */
|
||||
#define CONFIG_SYS_MEMTEST_START (OMAP34XX_SDRC_CS0)
|
||||
#define CONFIG_SYS_MEMTEST_END (OMAP34XX_SDRC_CS0 + \
|
||||
0x01F00000) /* 31MB */
|
||||
|
||||
#define CONFIG_SYS_LOAD_ADDR (OMAP34XX_SDRC_CS0) /* default load */
|
||||
/* address */
|
||||
/*
|
||||
* OMAP3 has 12 GP timers, they can be driven by the system clock
|
||||
* (12/13/16.8/19.2/38.4MHz) or by 32KHz clock. We use 13MHz (V_SCLK).
|
||||
* This rate is divided by a local divisor.
|
||||
*/
|
||||
#define CONFIG_SYS_TIMERBASE OMAP34XX_GPT2
|
||||
#define CONFIG_SYS_PTV 2 /* Divisor: 2^(PTV+1) => 8 */
|
||||
#define CONFIG_SYS_HZ 1000
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* Stack sizes
|
||||
*
|
||||
* The stack sizes are set up in start.S using the settings below
|
||||
*/
|
||||
#define CONFIG_STACKSIZE (128 << 10) /* regular stack 128 KiB */
|
||||
#ifdef CONFIG_USE_IRQ
|
||||
#define CONFIG_STACKSIZE_IRQ (4 << 10) /* IRQ stack 4 KiB */
|
||||
#define CONFIG_STACKSIZE_FIQ (4 << 10) /* FIQ stack 4 KiB */
|
||||
#endif
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* Physical Memory Map
|
||||
*/
|
||||
#define CONFIG_NR_DRAM_BANKS 2 /* CS1 may or may not be populated */
|
||||
#define PHYS_SDRAM_1 OMAP34XX_SDRC_CS0
|
||||
#define PHYS_SDRAM_1_SIZE (32 << 20) /* at least 32 MiB */
|
||||
#define PHYS_SDRAM_2 OMAP34XX_SDRC_CS1
|
||||
|
||||
/* SDRAM Bank Allocation method */
|
||||
#define SDRC_R_B_C 1
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* FLASH and environment organization
|
||||
*/
|
||||
|
||||
/* **** PISMO SUPPORT *** */
|
||||
|
||||
/* Configure the PISMO */
|
||||
#define PISMO1_NAND_SIZE GPMC_SIZE_128M
|
||||
#define PISMO1_ONEN_SIZE GPMC_SIZE_128M
|
||||
|
||||
#define CONFIG_SYS_MONITOR_LEN (256 << 10) /* Reserve 2 sectors */
|
||||
|
||||
#define CONFIG_SYS_FLASH_BASE boot_flash_base
|
||||
|
||||
/* Monitor at start of flash */
|
||||
#define CONFIG_SYS_MONITOR_BASE CONFIG_SYS_FLASH_BASE
|
||||
#define CONFIG_SYS_ONENAND_BASE ONENAND_MAP
|
||||
|
||||
#define CONFIG_ENV_IS_IN_NAND 1
|
||||
#define ONENAND_ENV_OFFSET 0x240000 /* environment starts here */
|
||||
#define SMNAND_ENV_OFFSET 0x240000 /* environment starts here */
|
||||
|
||||
#define CONFIG_SYS_ENV_SECT_SIZE boot_flash_sec
|
||||
#define CONFIG_ENV_OFFSET boot_flash_off
|
||||
#define CONFIG_ENV_ADDR SMNAND_ENV_OFFSET
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
extern unsigned int boot_flash_base;
|
||||
extern volatile unsigned int boot_flash_env_addr;
|
||||
extern unsigned int boot_flash_off;
|
||||
extern unsigned int boot_flash_sec;
|
||||
extern unsigned int boot_flash_type;
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_CMD_NET)
|
||||
/*----------------------------------------------------------------------------
|
||||
* SMSC9211 Ethernet from SMSC9118 family
|
||||
*----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#define CONFIG_NET_MULTI
|
||||
#define CONFIG_SMC911X 1
|
||||
#define CONFIG_SMC911X_32_BIT
|
||||
#define CONFIG_SMC911X_BASE 0x2C000000
|
||||
|
||||
#endif /* (CONFIG_CMD_NET) */
|
||||
|
||||
#define CONFIG_SYS_SDRAM_BASE PHYS_SDRAM_1
|
||||
#define CONFIG_SYS_INIT_RAM_ADDR 0x4020f800
|
||||
#define CONFIG_SYS_INIT_RAM_SIZE 0x800
|
||||
#define CONFIG_SYS_INIT_SP_ADDR (CONFIG_SYS_INIT_RAM_ADDR + \
|
||||
CONFIG_SYS_INIT_RAM_SIZE - \
|
||||
GENERATED_GBL_DATA_SIZE)
|
||||
|
||||
#endif /* __CONFIG_H */
|
||||
90
package/boot/uboot-omap4/Makefile
Normal file
90
package/boot/uboot-omap4/Makefile
Normal file
@@ -0,0 +1,90 @@
|
||||
#
|
||||
# Copyright (C) 2012 OpenWrt.org
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
include $(INCLUDE_DIR)/kernel.mk
|
||||
|
||||
PKG_NAME:=u-boot
|
||||
PKG_VERSION:=2011.12
|
||||
PKG_RELEASE:=1
|
||||
|
||||
PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
|
||||
PKG_SOURCE_URL:=ftp://ftp.denx.de/pub/u-boot
|
||||
PKG_MD5SUM:=7f29b9f6da44d6e46e988e7561fd1d5f
|
||||
PKG_TARGETS:=bin
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define uboot/Default
|
||||
TITLE:=
|
||||
CONFIG:=
|
||||
IMAGE:=
|
||||
endef
|
||||
|
||||
define uboot/omap4_panda
|
||||
TITLE:=U-Boot for the Pandaboard
|
||||
endef
|
||||
|
||||
UBOOTS:=omap4_panda
|
||||
|
||||
define Package/uboot/template
|
||||
define Package/uboot-omap4-$(1)
|
||||
SECTION:=boot
|
||||
CATEGORY:=Boot Loaders
|
||||
DEPENDS:=@TARGET_omap4
|
||||
TITLE:=$(2)
|
||||
URL:=http://www.denx.de/wiki/U-Boot
|
||||
VARIANT:=$(1)
|
||||
endef
|
||||
endef
|
||||
|
||||
define BuildUbootPackage
|
||||
$(eval $(uboot/Default))
|
||||
$(eval $(uboot/$(1)))
|
||||
$(call Package/uboot/template,$(1),$(TITLE))
|
||||
endef
|
||||
|
||||
|
||||
ifdef BUILD_VARIANT
|
||||
$(eval $(call uboot/$(BUILD_VARIANT)))
|
||||
UBOOT_CONFIG:=$(if $(CONFIG),$(CONFIG),$(BUILD_VARIANT))
|
||||
UBOOT_IMAGE:=$(if $(IMAGE),$(IMAGE),openwrt-$(BOARD)-$(BUILD_VARIANT)-u-boot.bin)
|
||||
endif
|
||||
|
||||
define Build/Prepare
|
||||
$(call Build/Prepare/Default)
|
||||
# $(CP) ./files/* $(PKG_BUILD_DIR)
|
||||
find $(PKG_BUILD_DIR) -name .svn | $(XARGS) rm -rf
|
||||
endef
|
||||
|
||||
define Build/Configure
|
||||
$(MAKE) -C $(PKG_BUILD_DIR) \
|
||||
$(UBOOT_CONFIG)_config
|
||||
endef
|
||||
|
||||
define Build/Compile
|
||||
$(MAKE) -C $(PKG_BUILD_DIR) \
|
||||
CROSS_COMPILE=$(TARGET_CROSS)
|
||||
endef
|
||||
|
||||
define Package/uboot/install/template
|
||||
define Package/uboot-omap4-$(1)/install
|
||||
$(INSTALL_DIR) $$(1)
|
||||
$(CP) $(PKG_BUILD_DIR)/MLO $(BIN_DIR)/MLO-$(BOARD)
|
||||
$(CP) $(PKG_BUILD_DIR)/u-boot.img $(BIN_DIR)/$(2)
|
||||
endef
|
||||
endef
|
||||
|
||||
$(foreach u,$(UBOOTS), \
|
||||
$(eval $(call Package/uboot/install/template,$(u),openwrt-$(BOARD)-$(u)-u-boot.img)) \
|
||||
)
|
||||
|
||||
$(foreach u,$(UBOOTS), \
|
||||
$(eval $(call BuildUbootPackage,$(u))) \
|
||||
$(eval $(call BuildPackage,uboot-omap4-$(u))) \
|
||||
)
|
||||
89
package/boot/uboot-pxa/Makefile
Normal file
89
package/boot/uboot-pxa/Makefile
Normal file
@@ -0,0 +1,89 @@
|
||||
#
|
||||
# Copyright (C) 2012 OpenWrt.org
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
include $(INCLUDE_DIR)/kernel.mk
|
||||
|
||||
PKG_NAME:=u-boot
|
||||
PKG_VERSION:=2011.08.25
|
||||
PKG_RELEASE:=1
|
||||
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=git://github.com/ashcharles/verdex-uboot.git
|
||||
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
|
||||
PKG_SOURCE_VERSION:=ca6bf3ef6ac5f5132a359b43dfa31e07076b74b7
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define uboot/Default
|
||||
TITLE:=
|
||||
CONFIG:=
|
||||
IMAGE:=
|
||||
endef
|
||||
|
||||
define uboot/gumstix
|
||||
TITLE:=U-Boot for the Gumstix Verdex
|
||||
endef
|
||||
|
||||
UBOOTS:=gumstix
|
||||
|
||||
define Package/uboot/template
|
||||
define Package/uboot-pxa-$(1)
|
||||
SECTION:=boot
|
||||
CATEGORY:=Boot Loaders
|
||||
DEPENDS:=@TARGET_pxa
|
||||
TITLE:=$(2)
|
||||
URL:=http://www.denx.de/wiki/U-Boot
|
||||
VARIANT:=$(1)
|
||||
MAINTAINER:=Florian Fainelli <florian@openwrt.org>
|
||||
endef
|
||||
endef
|
||||
|
||||
define BuildUBootPackage
|
||||
$(eval $(uboot/Default))
|
||||
$(eval $(uboot/$(1)))
|
||||
$(call Package/uboot/template,$(1),$(TITLE))
|
||||
endef
|
||||
|
||||
ifdef BUILD_VARIANT
|
||||
$(eval $(call uboot/$(BUILD_VARIANT)))
|
||||
UBOOT_CONFIG:=$(if $(CONFIG),$(CONFIG),$(BUILD_VARIANT))
|
||||
UBOOT_IMAGE:=$(if $(IMAGE),$(IMAGE),openwrt-$(BOARD)-$(BUILD_VARIANT)-u-boot.bin)
|
||||
endif
|
||||
|
||||
define Build/Configure
|
||||
$(MAKE) -C $(PKG_BUILD_DIR) \
|
||||
$(UBOOT_CONFIG)_config
|
||||
endef
|
||||
|
||||
define Build/Compile
|
||||
$(MAKE) -C $(PKG_BUILD_DIR) \
|
||||
u-boot.bin \
|
||||
CROSS_COMPILE=$(TARGET_CROSS)
|
||||
endef
|
||||
|
||||
define Package/uboot/install/default
|
||||
$(INSTALL_DIR) $(BIN_DIR)
|
||||
$(CP) $(PKG_BUILD_DIR)/u-boot.bin \
|
||||
$(BIN_DIR)/openwrt-$(BOARD)-$(1)-u-boot.bin
|
||||
endef
|
||||
|
||||
define Package/uboot/install/template
|
||||
define Package/uboot-pxa-$(1)/install
|
||||
$(call Package/uboot/install/default,$(2))
|
||||
endef
|
||||
endef
|
||||
|
||||
$(foreach u,$(UBOOTS), \
|
||||
$(eval $(call Package/uboot/install/template,$(u),$(u))) \
|
||||
)
|
||||
|
||||
$(foreach u,$(UBOOTS), \
|
||||
$(eval $(call BuildUBootPackage,$(u))) \
|
||||
$(eval $(call BuildPackage,uboot-pxa-$(u))) \
|
||||
)
|
||||
@@ -0,0 +1,13 @@
|
||||
diff --git a/include/configs/gumstix.h b/include/configs/gumstix.h
|
||||
index 319da63..5483993 100644
|
||||
--- a/include/configs/gumstix.h
|
||||
+++ b/include/configs/gumstix.h
|
||||
@@ -136,7 +136,7 @@
|
||||
#define CONFIG_MISC_INIT_R /* misc_init_r function in gumstix sets board serial number */
|
||||
|
||||
#define CONFIG_BOOTFILE boot/uImage
|
||||
-#define CONFIG_BOOTARGS "console=ttyS0,115200n8 root=1f01 rootfstype=jffs2 reboot=cold,hard"
|
||||
+#define CONFIG_BOOTARGS "console=ttyS0,115200n8 root=1f01 rootfstype=squashfs,jffs2 reboot=cold,hard"
|
||||
#define CONFIG_BOOTCOMMAND "icache on; setenv stderr nulldev; setenv stdout nulldev; if pinit on && fatload ide 0 a2000000 gumstix-factory.script; then setenv stdout serial; setenv stderr serial; echo Found gumstix-factory.script on CF...; autoscr; else if mmcinit && fatload mmc 0 a2000000 gumstix-factory.script; then setenv stdout serial; setenv stderr serial; echo Found gumstix-factory.script on MMC...; autoscr; else setenv stdout serial; setenv stderr serial; katload 100000 && bootm; fi; fi"
|
||||
#define CONFIG_BOOTDELAY 2 /* in seconds */
|
||||
#define CONFIG_EXTRA_ENV_SETTINGS "verify=no"
|
||||
102
package/boot/uboot-xburst/Makefile
Normal file
102
package/boot/uboot-xburst/Makefile
Normal file
@@ -0,0 +1,102 @@
|
||||
#
|
||||
# Copyright (C) 2010 OpenWrt.org
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
include $(INCLUDE_DIR)/kernel.mk
|
||||
|
||||
PKG_NAME:=u-boot
|
||||
PKG_VERSION:=2009.11
|
||||
PKG_RELEASE:=1
|
||||
|
||||
PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
|
||||
PKG_SOURCE_URL:=ftp://ftp.denx.de/pub/u-boot
|
||||
PKG_MD5SUM:=
|
||||
PKG_TARGETS:=bin
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define uboot/Default
|
||||
TITLE:=
|
||||
CONFIG:=
|
||||
IMAGE:=
|
||||
endef
|
||||
|
||||
define uboot/qi_lb60
|
||||
TITLE:=U-boot for the qi_lb60 board
|
||||
endef
|
||||
|
||||
define uboot/avt2
|
||||
TITLE:=U-boot for the avt2 board
|
||||
endef
|
||||
|
||||
define uboot/sakc
|
||||
TITLE:=U-boot for the sakc board
|
||||
endef
|
||||
|
||||
define uboot/n516
|
||||
TITLE:=U-boot for the N516 e-book reader
|
||||
CONFIG:=n516_nand
|
||||
endef
|
||||
|
||||
UBOOTS:=qi_lb60 n516 avt2 sakc
|
||||
|
||||
define Package/uboot/template
|
||||
define Package/uboot-xburst-$(1)
|
||||
SECTION:=boot
|
||||
CATEGORY:=Boot Loaders
|
||||
DEPENDS:=@TARGET_xburst
|
||||
TITLE:=$(2)
|
||||
URL:=http://www.denx.de/wiki/U-Boot
|
||||
VARIANT:=$(1)
|
||||
endef
|
||||
endef
|
||||
|
||||
define BuildUbootPackage
|
||||
$(eval $(uboot/Default))
|
||||
$(eval $(uboot/$(1)))
|
||||
$(call Package/uboot/template,$(1),$(TITLE))
|
||||
endef
|
||||
|
||||
|
||||
ifdef BUILD_VARIANT
|
||||
$(eval $(call uboot/$(BUILD_VARIANT)))
|
||||
UBOOT_CONFIG:=$(if $(CONFIG),$(CONFIG),$(BUILD_VARIANT))
|
||||
UBOOT_IMAGE:=$(if $(IMAGE),$(IMAGE),openwrt-$(BOARD)-$(BUILD_VARIANT)-u-boot.bin)
|
||||
endif
|
||||
|
||||
define Build/Prepare
|
||||
$(call Build/Prepare/Default)
|
||||
$(CP) ./files/* $(PKG_BUILD_DIR)
|
||||
find $(PKG_BUILD_DIR) -name .svn | $(XARGS) rm -rf
|
||||
endef
|
||||
|
||||
define Build/Configure
|
||||
$(MAKE) -C $(PKG_BUILD_DIR) \
|
||||
$(UBOOT_CONFIG)_config
|
||||
endef
|
||||
|
||||
define Build/Compile
|
||||
$(MAKE) -C $(PKG_BUILD_DIR) \
|
||||
CROSS_COMPILE=$(TARGET_CROSS)
|
||||
endef
|
||||
|
||||
define Package/uboot/install/template
|
||||
define Package/uboot-xburst-$(1)/install
|
||||
$(INSTALL_DIR) $$(1)
|
||||
$(CP) $(PKG_BUILD_DIR)/u-boot-nand.bin $(BIN_DIR)/$(2)
|
||||
endef
|
||||
endef
|
||||
|
||||
$(foreach u,$(UBOOTS), \
|
||||
$(eval $(call Package/uboot/install/template,$(u),openwrt-$(BOARD)-$(u)-u-boot.bin)) \
|
||||
)
|
||||
|
||||
$(foreach u,$(UBOOTS), \
|
||||
$(eval $(call BuildUbootPackage,$(u))) \
|
||||
$(eval $(call BuildPackage,uboot-xburst-$(u))) \
|
||||
)
|
||||
40
package/boot/uboot-xburst/files/board/n516/Makefile
Normal file
40
package/boot/uboot-xburst/files/board/n516/Makefile
Normal file
@@ -0,0 +1,40 @@
|
||||
#
|
||||
# (C) Copyright 2006
|
||||
# Ingenic Semiconductor, <jlwei@ingenic.cn>
|
||||
#
|
||||
# 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 $(TOPDIR)/config.mk
|
||||
|
||||
LIB = $(obj)lib$(BOARD).a
|
||||
|
||||
COBJS = $(BOARD).o flash.o
|
||||
|
||||
OBJS = $(addprefix $(obj),$(COBJS))
|
||||
SOBJS =
|
||||
|
||||
$(LIB): $(obj).depend $(OBJS) $(SOBJS)
|
||||
$(AR) crv $@ $(OBJS) $(SOBJS)
|
||||
|
||||
#########################################################################
|
||||
|
||||
$(obj).depend: Makefile $(SOBJS:.o=.S) $(COBJS:.o=.c)
|
||||
$(CC) -M $(CFLAGS) $(SOBJS:.o=.S) $(COBJS:.o=.c) > $@
|
||||
|
||||
sinclude $(obj).depend
|
||||
|
||||
#########################################################################
|
||||
33
package/boot/uboot-xburst/files/board/n516/config.mk
Normal file
33
package/boot/uboot-xburst/files/board/n516/config.mk
Normal file
@@ -0,0 +1,33 @@
|
||||
#
|
||||
# (C) Copyright 2006
|
||||
# Ingenic Semiconductor, <jlwei@ingenic.cn>
|
||||
#
|
||||
# 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
|
||||
#
|
||||
|
||||
#
|
||||
# Hanvon n516 e-book, MIPS32 core
|
||||
#
|
||||
|
||||
sinclude $(OBJTREE)/board/$(BOARDDIR)/config.tmp
|
||||
|
||||
ifndef TEXT_BASE
|
||||
# ROM version
|
||||
TEXT_BASE = 0x88000000
|
||||
|
||||
# RAM version
|
||||
#TEXT_BASE = 0x80100000
|
||||
endif
|
||||
50
package/boot/uboot-xburst/files/board/n516/flash.c
Normal file
50
package/boot/uboot-xburst/files/board/n516/flash.c
Normal file
@@ -0,0 +1,50 @@
|
||||
/*
|
||||
* (C) Copyright 2006
|
||||
* Ingenic Semiconductor, <jlwei@ingenic.cn>
|
||||
*
|
||||
* 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>
|
||||
|
||||
flash_info_t flash_info[CONFIG_SYS_MAX_FLASH_BANKS]; /* info for FLASH chips */
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* flash_init()
|
||||
*
|
||||
* sets up flash_info and returns size of FLASH (bytes)
|
||||
*/
|
||||
unsigned long flash_init (void)
|
||||
{
|
||||
return (0);
|
||||
}
|
||||
|
||||
int flash_erase (flash_info_t * info, int s_first, int s_last)
|
||||
{
|
||||
printf ("flash_erase not implemented\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
void flash_print_info (flash_info_t * info)
|
||||
{
|
||||
printf ("flash_print_info not implemented\n");
|
||||
}
|
||||
|
||||
int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt)
|
||||
{
|
||||
printf ("write_buff not implemented\n");
|
||||
return (-1);
|
||||
}
|
||||
126
package/boot/uboot-xburst/files/board/n516/n516.c
Normal file
126
package/boot/uboot-xburst/files/board/n516/n516.c
Normal file
@@ -0,0 +1,126 @@
|
||||
/*
|
||||
* (C) Copyright 2006
|
||||
* Ingenic Semiconductor, <jlwei@ingenic.cn>
|
||||
*
|
||||
* 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 <command.h>
|
||||
#include <asm/mipsregs.h>
|
||||
#include <asm/jz4740.h>
|
||||
#include <asm/addrspace.h>
|
||||
#include <asm/cacheops.h>
|
||||
|
||||
void _machine_restart(void)
|
||||
{
|
||||
__wdt_select_extalclk();
|
||||
__wdt_select_clk_div64();
|
||||
__wdt_set_data(100);
|
||||
__wdt_set_count(0);
|
||||
__tcu_start_wdt_clock();
|
||||
__wdt_start();
|
||||
while(1);
|
||||
|
||||
}
|
||||
|
||||
static void gpio_init(void)
|
||||
{
|
||||
|
||||
REG_GPIO_PXPES(0) = 0xffffffff;
|
||||
REG_GPIO_PXPES(1) = 0xffffffff;
|
||||
REG_GPIO_PXPES(2) = 0xffffffff;
|
||||
REG_GPIO_PXPES(3) = 0xffffffff;
|
||||
|
||||
/*
|
||||
* Initialize NAND Flash Pins
|
||||
*/
|
||||
__gpio_as_nand();
|
||||
|
||||
/*
|
||||
* Initialize SDRAM pins
|
||||
*/
|
||||
__gpio_as_sdram_32bit();
|
||||
|
||||
/*
|
||||
* Initialize UART0 pins
|
||||
*/
|
||||
__gpio_as_uart0();
|
||||
|
||||
/*
|
||||
* Initialize MSC pins
|
||||
*/
|
||||
__gpio_as_msc();
|
||||
|
||||
/*
|
||||
* Initialize LCD pins
|
||||
*/
|
||||
__gpio_as_lcd_16bit();
|
||||
|
||||
/*
|
||||
* Initialize Other pins
|
||||
*/
|
||||
__gpio_as_output(GPIO_SD_VCC_EN_N);
|
||||
__gpio_clear_pin(GPIO_SD_VCC_EN_N);
|
||||
|
||||
__gpio_as_input(GPIO_SD_CD_N);
|
||||
__gpio_disable_pull(GPIO_SD_CD_N);
|
||||
|
||||
__gpio_as_output(GPIO_DISP_OFF_N);
|
||||
|
||||
__gpio_as_output(GPIO_LED_EN);
|
||||
__gpio_set_pin(GPIO_LED_EN);
|
||||
|
||||
__gpio_as_input(127);
|
||||
}
|
||||
|
||||
static void cpm_init(void)
|
||||
{
|
||||
__cpm_stop_ipu();
|
||||
__cpm_stop_cim();
|
||||
__cpm_stop_i2c();
|
||||
__cpm_stop_ssi();
|
||||
__cpm_stop_uart1();
|
||||
__cpm_stop_sadc();
|
||||
__cpm_stop_uhc();
|
||||
__cpm_stop_udc();
|
||||
__cpm_stop_aic1();
|
||||
__cpm_stop_aic2();
|
||||
__cpm_suspend_udcphy();
|
||||
__cpm_suspend_usbphy();
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// board early init routine
|
||||
|
||||
void board_early_init(void)
|
||||
{
|
||||
gpio_init();
|
||||
cpm_init();
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// U-Boot common routines
|
||||
|
||||
int checkboard (void)
|
||||
{
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
printf("Board: Hanvon n516 e-book (CPU Speed %d MHz)\n",
|
||||
gd->cpu_clk/1000000);
|
||||
|
||||
return 0; /* success */
|
||||
}
|
||||
63
package/boot/uboot-xburst/files/board/n516/u-boot-nand.lds
Normal file
63
package/boot/uboot-xburst/files/board/n516/u-boot-nand.lds
Normal file
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
* (C) Copyright 2006
|
||||
* Ingenic Semiconductor, <jlwei@ingenic.cn>
|
||||
*
|
||||
* 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-tradlittlemips", "elf32-tradlittlemips", "elf32-tradlittlemips")
|
||||
|
||||
OUTPUT_ARCH(mips)
|
||||
ENTRY(_start)
|
||||
SECTIONS
|
||||
{
|
||||
. = 0x00000000;
|
||||
|
||||
. = ALIGN(4);
|
||||
.text :
|
||||
{
|
||||
*(.text)
|
||||
}
|
||||
|
||||
. = ALIGN(4);
|
||||
.rodata : { *(.rodata) }
|
||||
|
||||
. = ALIGN(4);
|
||||
.data : { *(.data) }
|
||||
|
||||
. = ALIGN(4);
|
||||
.sdata : { *(.sdata) }
|
||||
|
||||
_gp = ALIGN(16);
|
||||
|
||||
__got_start = .;
|
||||
.got : { *(.got) }
|
||||
__got_end = .;
|
||||
|
||||
.sdata : { *(.sdata) }
|
||||
|
||||
__u_boot_cmd_start = .;
|
||||
.u_boot_cmd : { *(.u_boot_cmd) }
|
||||
__u_boot_cmd_end = .;
|
||||
|
||||
uboot_end_data = .;
|
||||
num_got_entries = (__got_end - __got_start) >> 2;
|
||||
|
||||
. = ALIGN(4);
|
||||
.sbss : { *(.sbss) }
|
||||
.bss : { *(.bss) }
|
||||
uboot_end = .;
|
||||
}
|
||||
63
package/boot/uboot-xburst/files/board/n516/u-boot.lds
Normal file
63
package/boot/uboot-xburst/files/board/n516/u-boot.lds
Normal file
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
* (C) Copyright 2006
|
||||
* Ingenic Semiconductor, <jlwei@ingenic.cn>
|
||||
*
|
||||
* 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-tradlittlemips", "elf32-tradlittlemips", "elf32-tradlittlemips")
|
||||
|
||||
OUTPUT_ARCH(mips)
|
||||
ENTRY(_start)
|
||||
SECTIONS
|
||||
{
|
||||
. = 0x00000000;
|
||||
|
||||
. = ALIGN(4);
|
||||
.text :
|
||||
{
|
||||
*(.text)
|
||||
}
|
||||
|
||||
. = ALIGN(4);
|
||||
.rodata : { *(.rodata) }
|
||||
|
||||
. = ALIGN(4);
|
||||
.data : { *(.data) }
|
||||
|
||||
. = ALIGN(4);
|
||||
.sdata : { *(.sdata) }
|
||||
|
||||
_gp = ALIGN(16);
|
||||
|
||||
__got_start = .;
|
||||
.got : { *(.got) }
|
||||
__got_end = .;
|
||||
|
||||
.sdata : { *(.sdata) }
|
||||
|
||||
__u_boot_cmd_start = .;
|
||||
.u_boot_cmd : { *(.u_boot_cmd) }
|
||||
__u_boot_cmd_end = .;
|
||||
|
||||
uboot_end_data = .;
|
||||
num_got_entries = (__got_end - __got_start) >> 2;
|
||||
|
||||
. = ALIGN(4);
|
||||
.sbss : { *(.sbss) }
|
||||
.bss : { *(.bss) }
|
||||
uboot_end = .;
|
||||
}
|
||||
38
package/boot/uboot-xburst/files/board/nanonote/Makefile
Normal file
38
package/boot/uboot-xburst/files/board/nanonote/Makefile
Normal file
@@ -0,0 +1,38 @@
|
||||
#
|
||||
# (C) Copyright 2006
|
||||
# Ingenic Semiconductor, <jlwei@ingenic.cn>
|
||||
#
|
||||
# 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 $(TOPDIR)/config.mk
|
||||
|
||||
LIB = lib$(BOARD).a
|
||||
|
||||
OBJS = $(BOARD).o
|
||||
SOBJS =
|
||||
|
||||
$(LIB): .depend $(OBJS) $(SOBJS)
|
||||
$(AR) crv $@ $(OBJS) $(SOBJS)
|
||||
|
||||
#########################################################################
|
||||
|
||||
.depend: Makefile $(SOBJS:.o=.S) $(OBJS:.o=.c)
|
||||
$(CC) -M $(CFLAGS) $(SOBJS:.o=.S) $(OBJS:.o=.c) > $@
|
||||
|
||||
sinclude .depend
|
||||
|
||||
#########################################################################
|
||||
31
package/boot/uboot-xburst/files/board/nanonote/config.mk
Normal file
31
package/boot/uboot-xburst/files/board/nanonote/config.mk
Normal file
@@ -0,0 +1,31 @@
|
||||
#
|
||||
# (C) Copyright 2006 Qi Hardware, Inc.
|
||||
# Author: Xiangfu Liu <xiangfu.z@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 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
|
||||
#
|
||||
|
||||
#
|
||||
# Qi Hardware, Inc. Ben NanoNote (QI_LB60)
|
||||
#
|
||||
|
||||
ifndef TEXT_BASE
|
||||
# ROM version
|
||||
# TEXT_BASE = 0x88000000
|
||||
|
||||
# RAM version
|
||||
TEXT_BASE = 0x80100000
|
||||
endif
|
||||
123
package/boot/uboot-xburst/files/board/nanonote/nanonote.c
Normal file
123
package/boot/uboot-xburst/files/board/nanonote/nanonote.c
Normal file
@@ -0,0 +1,123 @@
|
||||
/*
|
||||
* Authors: Xiangfu Liu <xiangfu.z@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
|
||||
* 3 of the License, or (at your option) any later version.
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <command.h>
|
||||
#include <asm/mipsregs.h>
|
||||
#include <asm/jz4740.h>
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
static void gpio_init(void)
|
||||
{
|
||||
/*
|
||||
* Initialize NAND Flash Pins
|
||||
*/
|
||||
__gpio_as_nand();
|
||||
|
||||
/*
|
||||
* Initialize SDRAM pins
|
||||
*/
|
||||
__gpio_as_sdram_32bit();
|
||||
|
||||
/*
|
||||
* Initialize LCD pins
|
||||
*/
|
||||
__gpio_as_lcd_8bit();
|
||||
|
||||
/*
|
||||
* Initialize MSC pins
|
||||
*/
|
||||
__gpio_as_msc();
|
||||
|
||||
/*
|
||||
* Initialize Other pins
|
||||
*/
|
||||
unsigned int i;
|
||||
for (i = 0; i < 7; i++){
|
||||
__gpio_as_input(GPIO_KEYIN_BASE + i);
|
||||
__gpio_enable_pull(GPIO_KEYIN_BASE + i);
|
||||
}
|
||||
|
||||
for (i = 0; i < 8; i++) {
|
||||
__gpio_as_output(GPIO_KEYOUT_BASE + i);
|
||||
__gpio_clear_pin(GPIO_KEYOUT_BASE + i);
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize UART0 pins, in Ben NanoNote uart0 and keyin8 use the
|
||||
* same gpio, init the gpio as uart0 cause a keyboard bug. so for
|
||||
* end user we disable the uart0
|
||||
*/
|
||||
if (__gpio_get_pin(GPIO_KEYIN_BASE + 2) == 0){
|
||||
/* if pressed [S] */
|
||||
printf("[S] pressed, enable UART0\n");
|
||||
gd->boot_option = 5;
|
||||
__gpio_as_uart0();
|
||||
} else {
|
||||
printf("[S] not pressed, disable UART0\n");
|
||||
__gpio_as_input(GPIO_KEYIN_8);
|
||||
__gpio_enable_pull(GPIO_KEYIN_8);
|
||||
}
|
||||
|
||||
__gpio_as_output(GPIO_AUDIO_POP);
|
||||
__gpio_set_pin(GPIO_AUDIO_POP);
|
||||
|
||||
__gpio_as_output(GPIO_LCD_CS);
|
||||
__gpio_clear_pin(GPIO_LCD_CS);
|
||||
|
||||
__gpio_as_output(GPIO_AMP_EN);
|
||||
__gpio_clear_pin(GPIO_AMP_EN);
|
||||
|
||||
__gpio_as_output(GPIO_SDPW_EN);
|
||||
__gpio_disable_pull(GPIO_SDPW_EN);
|
||||
__gpio_clear_pin(GPIO_SDPW_EN);
|
||||
|
||||
__gpio_as_input(GPIO_SD_DETECT);
|
||||
__gpio_disable_pull(GPIO_SD_DETECT);
|
||||
|
||||
__gpio_as_input(GPIO_USB_DETECT);
|
||||
__gpio_enable_pull(GPIO_USB_DETECT);
|
||||
|
||||
if (__gpio_get_pin(GPIO_KEYIN_BASE + 3) == 0) {
|
||||
printf("[M] pressed, boot from sd card\n");
|
||||
gd->boot_option = 1;
|
||||
}
|
||||
}
|
||||
|
||||
static void cpm_init(void)
|
||||
{
|
||||
__cpm_stop_ipu();
|
||||
__cpm_stop_cim();
|
||||
__cpm_stop_i2c();
|
||||
__cpm_stop_ssi();
|
||||
__cpm_stop_uart1();
|
||||
__cpm_stop_sadc();
|
||||
__cpm_stop_uhc();
|
||||
__cpm_stop_udc();
|
||||
__cpm_stop_aic1();
|
||||
/* __cpm_stop_aic2();*/
|
||||
}
|
||||
|
||||
void board_early_init(void)
|
||||
{
|
||||
gpio_init();
|
||||
cpm_init();
|
||||
}
|
||||
|
||||
/* U-Boot common routines */
|
||||
|
||||
int checkboard (void)
|
||||
{
|
||||
|
||||
printf("Board: Qi LB60 (Ingenic XBurst Jz4740 SoC, Speed %d MHz)\n",
|
||||
gd->cpu_clk/1000000);
|
||||
|
||||
return 0; /* success */
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
* (C) Copyright 2006
|
||||
* Ingenic Semiconductor, <jlwei@ingenic.cn>
|
||||
*
|
||||
* 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-tradlittlemips", "elf32-tradlittlemips", "elf32-tradlittlemips")
|
||||
|
||||
OUTPUT_ARCH(mips)
|
||||
ENTRY(_start)
|
||||
SECTIONS
|
||||
{
|
||||
. = 0x00000000;
|
||||
|
||||
. = ALIGN(4);
|
||||
.text :
|
||||
{
|
||||
*(.text)
|
||||
}
|
||||
|
||||
. = ALIGN(4);
|
||||
.rodata : { *(.rodata) }
|
||||
|
||||
. = ALIGN(4);
|
||||
.data : { *(.data) }
|
||||
|
||||
. = ALIGN(4);
|
||||
.sdata : { *(.sdata) }
|
||||
|
||||
_gp = ALIGN(16);
|
||||
|
||||
__got_start = .;
|
||||
.got : { *(.got) }
|
||||
__got_end = .;
|
||||
|
||||
.sdata : { *(.sdata) }
|
||||
|
||||
__u_boot_cmd_start = .;
|
||||
.u_boot_cmd : { *(.u_boot_cmd) }
|
||||
__u_boot_cmd_end = .;
|
||||
|
||||
uboot_end_data = .;
|
||||
num_got_entries = (__got_end - __got_start) >> 2;
|
||||
|
||||
. = ALIGN(4);
|
||||
.sbss : { *(.sbss) }
|
||||
.bss : { *(.bss) }
|
||||
uboot_end = .;
|
||||
}
|
||||
63
package/boot/uboot-xburst/files/board/nanonote/u-boot.lds
Normal file
63
package/boot/uboot-xburst/files/board/nanonote/u-boot.lds
Normal file
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
* (C) Copyright 2006
|
||||
* Ingenic Semiconductor, <jlwei@ingenic.cn>
|
||||
*
|
||||
* 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-tradlittlemips", "elf32-tradlittlemips", "elf32-tradlittlemips")
|
||||
|
||||
OUTPUT_ARCH(mips)
|
||||
ENTRY(_start)
|
||||
SECTIONS
|
||||
{
|
||||
. = 0x00000000;
|
||||
|
||||
. = ALIGN(4);
|
||||
.text :
|
||||
{
|
||||
*(.text)
|
||||
}
|
||||
|
||||
. = ALIGN(4);
|
||||
.rodata : { *(.rodata) }
|
||||
|
||||
. = ALIGN(4);
|
||||
.data : { *(.data) }
|
||||
|
||||
. = ALIGN(4);
|
||||
.sdata : { *(.sdata) }
|
||||
|
||||
_gp = ALIGN(16);
|
||||
|
||||
__got_start = .;
|
||||
.got : { *(.got) }
|
||||
__got_end = .;
|
||||
|
||||
.sdata : { *(.sdata) }
|
||||
|
||||
__u_boot_cmd_start = .;
|
||||
.u_boot_cmd : { *(.u_boot_cmd) }
|
||||
__u_boot_cmd_end = .;
|
||||
|
||||
uboot_end_data = .;
|
||||
num_got_entries = (__got_end - __got_start) >> 2;
|
||||
|
||||
. = ALIGN(4);
|
||||
.sbss : { *(.sbss) }
|
||||
.bss : { *(.bss) }
|
||||
uboot_end = .;
|
||||
}
|
||||
38
package/boot/uboot-xburst/files/board/sakc/Makefile
Normal file
38
package/boot/uboot-xburst/files/board/sakc/Makefile
Normal file
@@ -0,0 +1,38 @@
|
||||
#
|
||||
# (C) Copyright 2006
|
||||
# Ingenic Semiconductor, <jlwei@ingenic.cn>
|
||||
#
|
||||
# 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 $(TOPDIR)/config.mk
|
||||
|
||||
LIB = lib$(BOARD).a
|
||||
|
||||
OBJS = $(BOARD).o
|
||||
SOBJS =
|
||||
|
||||
$(LIB): .depend $(OBJS) $(SOBJS)
|
||||
$(AR) crv $@ $(OBJS) $(SOBJS)
|
||||
|
||||
#########################################################################
|
||||
|
||||
.depend: Makefile $(SOBJS:.o=.S) $(OBJS:.o=.c)
|
||||
$(CC) -M $(CFLAGS) $(SOBJS:.o=.S) $(OBJS:.o=.c) > $@
|
||||
|
||||
sinclude .depend
|
||||
|
||||
#########################################################################
|
||||
31
package/boot/uboot-xburst/files/board/sakc/config.mk
Normal file
31
package/boot/uboot-xburst/files/board/sakc/config.mk
Normal file
@@ -0,0 +1,31 @@
|
||||
#
|
||||
# (C) Copyright 2006 Qi Hardware, Inc.
|
||||
# Author: Xiangfu Liu <xiangfu.z@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 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
|
||||
#
|
||||
|
||||
#
|
||||
# SAKC Board
|
||||
#
|
||||
|
||||
ifndef TEXT_BASE
|
||||
# ROM version
|
||||
# TEXT_BASE = 0x88000000
|
||||
|
||||
# RAM version
|
||||
TEXT_BASE = 0x80100000
|
||||
endif
|
||||
94
package/boot/uboot-xburst/files/board/sakc/sakc.c
Normal file
94
package/boot/uboot-xburst/files/board/sakc/sakc.c
Normal file
@@ -0,0 +1,94 @@
|
||||
/*
|
||||
* Authors: Xiangfu Liu <xiangfu.z@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
|
||||
* 3 of the License, or (at your option) any later version.
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <command.h>
|
||||
#include <asm/mipsregs.h>
|
||||
#include <asm/jz4740.h>
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
static void gpio_init(void)
|
||||
{
|
||||
/*
|
||||
* Initialize NAND Flash Pins
|
||||
*/
|
||||
__gpio_as_nand();
|
||||
|
||||
/*
|
||||
* Initialize SDRAM pins
|
||||
*/
|
||||
__gpio_as_sdram_16bit_4725();
|
||||
|
||||
/*
|
||||
* Initialize UART0 pins
|
||||
*/
|
||||
__gpio_as_uart0();
|
||||
|
||||
/*
|
||||
* Initialize LCD pins
|
||||
*/
|
||||
__gpio_as_lcd_18bit();
|
||||
|
||||
/*
|
||||
* Initialize MSC pins
|
||||
*/
|
||||
__gpio_as_msc();
|
||||
|
||||
/*
|
||||
* Initialize SSI pins
|
||||
*/
|
||||
__gpio_as_ssi();
|
||||
|
||||
/*
|
||||
* Initialize I2C pins
|
||||
*/
|
||||
__gpio_as_i2c();
|
||||
|
||||
/*
|
||||
* Initialize MSC pins
|
||||
*/
|
||||
__gpio_as_msc();
|
||||
|
||||
/*
|
||||
* Initialize Other pins
|
||||
*/
|
||||
__gpio_as_input(GPIO_SD_DETECT);
|
||||
__gpio_disable_pull(GPIO_SD_DETECT);
|
||||
}
|
||||
/* TODO SAKC
|
||||
static void cpm_init(void)
|
||||
{
|
||||
__cpm_stop_ipu();
|
||||
__cpm_stop_cim();
|
||||
__cpm_stop_i2c();
|
||||
__cpm_stop_ssi();
|
||||
__cpm_stop_uart1();
|
||||
__cpm_stop_sadc();
|
||||
__cpm_stop_uhc();
|
||||
__cpm_stop_aic1();
|
||||
__cpm_stop_aic2();
|
||||
}*/
|
||||
|
||||
void board_early_init(void)
|
||||
{
|
||||
gpio_init();
|
||||
//cpm_init(); //TODO SAKC
|
||||
}
|
||||
|
||||
/* U-Boot common routines */
|
||||
|
||||
int checkboard (void)
|
||||
{
|
||||
|
||||
printf("Board: SAKC (Ingenic XBurst Jz4725 SoC, Speed %d MHz)\n",
|
||||
gd->cpu_clk/1000000);
|
||||
|
||||
return 0; /* success */
|
||||
}
|
||||
63
package/boot/uboot-xburst/files/board/sakc/u-boot-nand.lds
Normal file
63
package/boot/uboot-xburst/files/board/sakc/u-boot-nand.lds
Normal file
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
* (C) Copyright 2006
|
||||
* Ingenic Semiconductor, <jlwei@ingenic.cn>
|
||||
*
|
||||
* 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-tradlittlemips", "elf32-tradlittlemips", "elf32-tradlittlemips")
|
||||
|
||||
OUTPUT_ARCH(mips)
|
||||
ENTRY(_start)
|
||||
SECTIONS
|
||||
{
|
||||
. = 0x00000000;
|
||||
|
||||
. = ALIGN(4);
|
||||
.text :
|
||||
{
|
||||
*(.text)
|
||||
}
|
||||
|
||||
. = ALIGN(4);
|
||||
.rodata : { *(.rodata) }
|
||||
|
||||
. = ALIGN(4);
|
||||
.data : { *(.data) }
|
||||
|
||||
. = ALIGN(4);
|
||||
.sdata : { *(.sdata) }
|
||||
|
||||
_gp = ALIGN(16);
|
||||
|
||||
__got_start = .;
|
||||
.got : { *(.got) }
|
||||
__got_end = .;
|
||||
|
||||
.sdata : { *(.sdata) }
|
||||
|
||||
__u_boot_cmd_start = .;
|
||||
.u_boot_cmd : { *(.u_boot_cmd) }
|
||||
__u_boot_cmd_end = .;
|
||||
|
||||
uboot_end_data = .;
|
||||
num_got_entries = (__got_end - __got_start) >> 2;
|
||||
|
||||
. = ALIGN(4);
|
||||
.sbss : { *(.sbss) }
|
||||
.bss : { *(.bss) }
|
||||
uboot_end = .;
|
||||
}
|
||||
63
package/boot/uboot-xburst/files/board/sakc/u-boot.lds
Normal file
63
package/boot/uboot-xburst/files/board/sakc/u-boot.lds
Normal file
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
* (C) Copyright 2006
|
||||
* Ingenic Semiconductor, <jlwei@ingenic.cn>
|
||||
*
|
||||
* 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-tradlittlemips", "elf32-tradlittlemips", "elf32-tradlittlemips")
|
||||
|
||||
OUTPUT_ARCH(mips)
|
||||
ENTRY(_start)
|
||||
SECTIONS
|
||||
{
|
||||
. = 0x00000000;
|
||||
|
||||
. = ALIGN(4);
|
||||
.text :
|
||||
{
|
||||
*(.text)
|
||||
}
|
||||
|
||||
. = ALIGN(4);
|
||||
.rodata : { *(.rodata) }
|
||||
|
||||
. = ALIGN(4);
|
||||
.data : { *(.data) }
|
||||
|
||||
. = ALIGN(4);
|
||||
.sdata : { *(.sdata) }
|
||||
|
||||
_gp = ALIGN(16);
|
||||
|
||||
__got_start = .;
|
||||
.got : { *(.got) }
|
||||
__got_end = .;
|
||||
|
||||
.sdata : { *(.sdata) }
|
||||
|
||||
__u_boot_cmd_start = .;
|
||||
.u_boot_cmd : { *(.u_boot_cmd) }
|
||||
__u_boot_cmd_end = .;
|
||||
|
||||
uboot_end_data = .;
|
||||
num_got_entries = (__got_end - __got_start) >> 2;
|
||||
|
||||
. = ALIGN(4);
|
||||
.sbss : { *(.sbss) }
|
||||
.bss : { *(.bss) }
|
||||
uboot_end = .;
|
||||
}
|
||||
559
package/boot/uboot-xburst/files/cpu/mips/jz4740.c
Normal file
559
package/boot/uboot-xburst/files/cpu/mips/jz4740.c
Normal file
@@ -0,0 +1,559 @@
|
||||
/*
|
||||
* Jz4740 common routines
|
||||
*
|
||||
* Copyright (c) 2006
|
||||
* Ingenic Semiconductor, <jlwei@ingenic.cn>
|
||||
*
|
||||
* 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 <config.h>
|
||||
|
||||
#ifdef CONFIG_JZ4740
|
||||
#include <common.h>
|
||||
#include <command.h>
|
||||
#include <asm/jz4740.h>
|
||||
|
||||
extern void board_early_init(void);
|
||||
|
||||
/* PLL output clock = EXTAL * NF / (NR * NO)
|
||||
*
|
||||
* NF = FD + 2, NR = RD + 2
|
||||
* NO = 1 (if OD = 0), NO = 2 (if OD = 1 or 2), NO = 4 (if OD = 3)
|
||||
*/
|
||||
void pll_init(void)
|
||||
{
|
||||
register unsigned int cfcr, plcr1;
|
||||
int n2FR[33] = {
|
||||
0, 0, 1, 2, 3, 0, 4, 0, 5, 0, 0, 0, 6, 0, 0, 0,
|
||||
7, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0,
|
||||
9
|
||||
};
|
||||
int div[5] = {1, 3, 3, 3, 3}; /* divisors of I:S:P:L:M */
|
||||
int nf, pllout2;
|
||||
|
||||
cfcr = CPM_CPCCR_CLKOEN |
|
||||
CPM_CPCCR_PCS |
|
||||
(n2FR[div[0]] << CPM_CPCCR_CDIV_BIT) |
|
||||
(n2FR[div[1]] << CPM_CPCCR_HDIV_BIT) |
|
||||
(n2FR[div[2]] << CPM_CPCCR_PDIV_BIT) |
|
||||
(n2FR[div[3]] << CPM_CPCCR_MDIV_BIT) |
|
||||
(n2FR[div[4]] << CPM_CPCCR_LDIV_BIT);
|
||||
|
||||
pllout2 = (cfcr & CPM_CPCCR_PCS) ? CONFIG_SYS_CPU_SPEED : (CONFIG_SYS_CPU_SPEED / 2);
|
||||
|
||||
/* Init USB Host clock, pllout2 must be n*48MHz */
|
||||
REG_CPM_UHCCDR = pllout2 / 48000000 - 1;
|
||||
|
||||
nf = CONFIG_SYS_CPU_SPEED * 2 / CONFIG_SYS_EXTAL;
|
||||
plcr1 = ((nf - 2) << CPM_CPPCR_PLLM_BIT) | /* FD */
|
||||
(0 << CPM_CPPCR_PLLN_BIT) | /* RD=0, NR=2 */
|
||||
(0 << CPM_CPPCR_PLLOD_BIT) | /* OD=0, NO=1 */
|
||||
(0x20 << CPM_CPPCR_PLLST_BIT) | /* PLL stable time */
|
||||
CPM_CPPCR_PLLEN; /* enable PLL */
|
||||
|
||||
/* init PLL */
|
||||
REG_CPM_CPCCR = cfcr;
|
||||
REG_CPM_CPPCR = plcr1;
|
||||
}
|
||||
|
||||
void pll_add_test(int new_freq)
|
||||
{
|
||||
register unsigned int cfcr, plcr1;
|
||||
int n2FR[33] = {
|
||||
0, 0, 1, 2, 3, 0, 4, 0, 5, 0, 0, 0, 6, 0, 0, 0,
|
||||
7, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0,
|
||||
9
|
||||
};
|
||||
int div[5] = {1, 4, 4, 4, 4}; /* divisors of I:S:P:M:L */
|
||||
int nf, pllout2;
|
||||
|
||||
cfcr = CPM_CPCCR_CLKOEN |
|
||||
(n2FR[div[0]] << CPM_CPCCR_CDIV_BIT) |
|
||||
(n2FR[div[1]] << CPM_CPCCR_HDIV_BIT) |
|
||||
(n2FR[div[2]] << CPM_CPCCR_PDIV_BIT) |
|
||||
(n2FR[div[3]] << CPM_CPCCR_MDIV_BIT) |
|
||||
(n2FR[div[4]] << CPM_CPCCR_LDIV_BIT);
|
||||
|
||||
pllout2 = (cfcr & CPM_CPCCR_PCS) ? new_freq : (new_freq / 2);
|
||||
|
||||
/* Init UHC clock */
|
||||
REG_CPM_UHCCDR = pllout2 / 48000000 - 1;
|
||||
|
||||
/* nf = new_freq * 2 / CONFIG_SYS_EXTAL; */
|
||||
nf = new_freq / 1000000; /* step length is 1M */
|
||||
plcr1 = ((nf - 2) << CPM_CPPCR_PLLM_BIT) | /* FD */
|
||||
(10 << CPM_CPPCR_PLLN_BIT) | /* RD=0, NR=2 */
|
||||
(0 << CPM_CPPCR_PLLOD_BIT) | /* OD=0, NO=1 */
|
||||
(0x20 << CPM_CPPCR_PLLST_BIT) | /* PLL stable time */
|
||||
CPM_CPPCR_PLLEN; /* enable PLL */
|
||||
|
||||
/* init PLL */
|
||||
REG_CPM_CPCCR = cfcr;
|
||||
REG_CPM_CPPCR = plcr1;
|
||||
}
|
||||
|
||||
void calc_clocks_add_test(void)
|
||||
{
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
unsigned int pllout;
|
||||
unsigned int div[10] = {1, 2, 3, 4, 6, 8, 12, 16, 24, 32};
|
||||
|
||||
pllout = __cpm_get_pllout();
|
||||
|
||||
gd->cpu_clk = pllout / div[__cpm_get_cdiv()];
|
||||
gd->sys_clk = pllout / div[__cpm_get_hdiv()];
|
||||
gd->per_clk = pllout / div[__cpm_get_pdiv()];
|
||||
gd->mem_clk = pllout / div[__cpm_get_mdiv()];
|
||||
gd->dev_clk = CONFIG_SYS_EXTAL;
|
||||
}
|
||||
|
||||
void sdram_add_test(int new_freq)
|
||||
{
|
||||
register unsigned int dmcr, sdmode, tmp, cpu_clk, mem_clk, ns;
|
||||
|
||||
unsigned int cas_latency_sdmr[2] = {
|
||||
EMC_SDMR_CAS_2,
|
||||
EMC_SDMR_CAS_3,
|
||||
};
|
||||
|
||||
unsigned int cas_latency_dmcr[2] = {
|
||||
1 << EMC_DMCR_TCL_BIT, /* CAS latency is 2 */
|
||||
2 << EMC_DMCR_TCL_BIT /* CAS latency is 3 */
|
||||
};
|
||||
|
||||
int div[] = {1, 2, 3, 4, 6, 8, 12, 16, 24, 32};
|
||||
|
||||
cpu_clk = new_freq;
|
||||
mem_clk = cpu_clk * div[__cpm_get_cdiv()] / div[__cpm_get_mdiv()];
|
||||
|
||||
REG_EMC_RTCSR = EMC_RTCSR_CKS_DISABLE;
|
||||
REG_EMC_RTCOR = 0;
|
||||
REG_EMC_RTCNT = 0;
|
||||
|
||||
/* Basic DMCR register value. */
|
||||
dmcr = ((SDRAM_ROW-11)<<EMC_DMCR_RA_BIT) |
|
||||
((SDRAM_COL-8)<<EMC_DMCR_CA_BIT) |
|
||||
(SDRAM_BANK4<<EMC_DMCR_BA_BIT) |
|
||||
(SDRAM_BW16<<EMC_DMCR_BW_BIT) |
|
||||
EMC_DMCR_EPIN |
|
||||
cas_latency_dmcr[((SDRAM_CASL == 3) ? 1 : 0)];
|
||||
|
||||
/* SDRAM timimg parameters */
|
||||
ns = 1000000000 / mem_clk;
|
||||
|
||||
#if 0
|
||||
tmp = SDRAM_TRAS/ns;
|
||||
if (tmp < 4) tmp = 4;
|
||||
if (tmp > 11) tmp = 11;
|
||||
dmcr |= ((tmp-4) << EMC_DMCR_TRAS_BIT);
|
||||
|
||||
tmp = SDRAM_RCD/ns;
|
||||
if (tmp > 3) tmp = 3;
|
||||
dmcr |= (tmp << EMC_DMCR_RCD_BIT);
|
||||
|
||||
tmp = SDRAM_TPC/ns;
|
||||
if (tmp > 7) tmp = 7;
|
||||
dmcr |= (tmp << EMC_DMCR_TPC_BIT);
|
||||
|
||||
tmp = SDRAM_TRWL/ns;
|
||||
if (tmp > 3) tmp = 3;
|
||||
dmcr |= (tmp << EMC_DMCR_TRWL_BIT);
|
||||
|
||||
tmp = (SDRAM_TRAS + SDRAM_TPC)/ns;
|
||||
if (tmp > 14) tmp = 14;
|
||||
dmcr |= (((tmp + 1) >> 1) << EMC_DMCR_TRC_BIT);
|
||||
#else
|
||||
dmcr |= 0xfffc;
|
||||
#endif
|
||||
|
||||
/* First, precharge phase */
|
||||
REG_EMC_DMCR = dmcr;
|
||||
|
||||
/* Set refresh registers */
|
||||
tmp = SDRAM_TREF/ns;
|
||||
tmp = tmp/64 + 1;
|
||||
if (tmp > 0xff) tmp = 0xff;
|
||||
|
||||
REG_EMC_RTCOR = tmp;
|
||||
REG_EMC_RTCSR = EMC_RTCSR_CKS_64; /* Divisor is 64, CKO/64 */
|
||||
|
||||
/* SDRAM mode values */
|
||||
sdmode = EMC_SDMR_BT_SEQ |
|
||||
EMC_SDMR_OM_NORMAL |
|
||||
EMC_SDMR_BL_4 |
|
||||
cas_latency_sdmr[((SDRAM_CASL == 3) ? 1 : 0)];
|
||||
|
||||
/* precharge all chip-selects */
|
||||
REG8(EMC_SDMR0|sdmode) = 0;
|
||||
|
||||
/* wait for precharge, > 200us */
|
||||
tmp = (cpu_clk / 1000000) * 200;
|
||||
while (tmp--);
|
||||
|
||||
/* enable refresh and set SDRAM mode */
|
||||
REG_EMC_DMCR = dmcr | EMC_DMCR_RFSH | EMC_DMCR_MRSET;
|
||||
|
||||
/* write sdram mode register for each chip-select */
|
||||
REG8(EMC_SDMR0|sdmode) = 0;
|
||||
|
||||
/* everything is ok now */
|
||||
}
|
||||
|
||||
void sdram_init(void)
|
||||
{
|
||||
register unsigned int dmcr0, dmcr, sdmode, tmp, cpu_clk, mem_clk, ns;
|
||||
|
||||
unsigned int cas_latency_sdmr[2] = {
|
||||
EMC_SDMR_CAS_2,
|
||||
EMC_SDMR_CAS_3,
|
||||
};
|
||||
|
||||
unsigned int cas_latency_dmcr[2] = {
|
||||
1 << EMC_DMCR_TCL_BIT, /* CAS latency is 2 */
|
||||
2 << EMC_DMCR_TCL_BIT /* CAS latency is 3 */
|
||||
};
|
||||
|
||||
int div[] = {1, 2, 3, 4, 6, 8, 12, 16, 24, 32};
|
||||
|
||||
cpu_clk = CONFIG_SYS_CPU_SPEED;
|
||||
mem_clk = cpu_clk * div[__cpm_get_cdiv()] / div[__cpm_get_mdiv()];
|
||||
|
||||
REG_EMC_BCR = 0; /* Disable bus release */
|
||||
REG_EMC_RTCSR = 0; /* Disable clock for counting */
|
||||
|
||||
/* Fault DMCR value for mode register setting*/
|
||||
#define SDRAM_ROW0 11
|
||||
#define SDRAM_COL0 8
|
||||
#define SDRAM_BANK40 0
|
||||
|
||||
dmcr0 = ((SDRAM_ROW0-11)<<EMC_DMCR_RA_BIT) |
|
||||
((SDRAM_COL0-8)<<EMC_DMCR_CA_BIT) |
|
||||
(SDRAM_BANK40<<EMC_DMCR_BA_BIT) |
|
||||
(SDRAM_BW16<<EMC_DMCR_BW_BIT) |
|
||||
EMC_DMCR_EPIN |
|
||||
cas_latency_dmcr[((SDRAM_CASL == 3) ? 1 : 0)];
|
||||
|
||||
/* Basic DMCR value */
|
||||
dmcr = ((SDRAM_ROW-11)<<EMC_DMCR_RA_BIT) |
|
||||
((SDRAM_COL-8)<<EMC_DMCR_CA_BIT) |
|
||||
(SDRAM_BANK4<<EMC_DMCR_BA_BIT) |
|
||||
(SDRAM_BW16<<EMC_DMCR_BW_BIT) |
|
||||
EMC_DMCR_EPIN |
|
||||
cas_latency_dmcr[((SDRAM_CASL == 3) ? 1 : 0)];
|
||||
|
||||
/* SDRAM timimg */
|
||||
ns = 1000000000 / mem_clk;
|
||||
tmp = SDRAM_TRAS/ns;
|
||||
if (tmp < 4) tmp = 4;
|
||||
if (tmp > 11) tmp = 11;
|
||||
dmcr |= ((tmp-4) << EMC_DMCR_TRAS_BIT);
|
||||
tmp = SDRAM_RCD/ns;
|
||||
if (tmp > 3) tmp = 3;
|
||||
dmcr |= (tmp << EMC_DMCR_RCD_BIT);
|
||||
tmp = SDRAM_TPC/ns;
|
||||
if (tmp > 7) tmp = 7;
|
||||
dmcr |= (tmp << EMC_DMCR_TPC_BIT);
|
||||
tmp = SDRAM_TRWL/ns;
|
||||
if (tmp > 3) tmp = 3;
|
||||
dmcr |= (tmp << EMC_DMCR_TRWL_BIT);
|
||||
tmp = (SDRAM_TRAS + SDRAM_TPC)/ns;
|
||||
if (tmp > 14) tmp = 14;
|
||||
dmcr |= (((tmp + 1) >> 1) << EMC_DMCR_TRC_BIT);
|
||||
|
||||
/* SDRAM mode value */
|
||||
sdmode = EMC_SDMR_BT_SEQ |
|
||||
EMC_SDMR_OM_NORMAL |
|
||||
EMC_SDMR_BL_4 |
|
||||
cas_latency_sdmr[((SDRAM_CASL == 3) ? 1 : 0)];
|
||||
|
||||
/* Stage 1. Precharge all banks by writing SDMR with DMCR.MRSET=0 */
|
||||
REG_EMC_DMCR = dmcr;
|
||||
REG8(EMC_SDMR0|sdmode) = 0;
|
||||
|
||||
/* Wait for precharge, > 200us */
|
||||
tmp = (cpu_clk / 1000000) * 1000;
|
||||
while (tmp--);
|
||||
|
||||
/* Stage 2. Enable auto-refresh */
|
||||
REG_EMC_DMCR = dmcr | EMC_DMCR_RFSH;
|
||||
|
||||
tmp = SDRAM_TREF/ns;
|
||||
tmp = tmp/64 + 1;
|
||||
if (tmp > 0xff) tmp = 0xff;
|
||||
REG_EMC_RTCOR = tmp;
|
||||
REG_EMC_RTCNT = 0;
|
||||
REG_EMC_RTCSR = EMC_RTCSR_CKS_64; /* Divisor is 64, CKO/64 */
|
||||
|
||||
/* Wait for number of auto-refresh cycles */
|
||||
tmp = (cpu_clk / 1000000) * 1000;
|
||||
while (tmp--);
|
||||
|
||||
/* Stage 3. Mode Register Set */
|
||||
REG_EMC_DMCR = dmcr0 | EMC_DMCR_RFSH | EMC_DMCR_MRSET;
|
||||
REG8(EMC_SDMR0|sdmode) = 0;
|
||||
|
||||
/* Set back to basic DMCR value */
|
||||
REG_EMC_DMCR = dmcr | EMC_DMCR_RFSH | EMC_DMCR_MRSET;
|
||||
|
||||
/* everything is ok now */
|
||||
}
|
||||
|
||||
#ifndef CONFIG_NAND_SPL
|
||||
|
||||
static void calc_clocks(void)
|
||||
{
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
unsigned int pllout;
|
||||
unsigned int div[10] = {1, 2, 3, 4, 6, 8, 12, 16, 24, 32};
|
||||
|
||||
pllout = __cpm_get_pllout();
|
||||
|
||||
gd->cpu_clk = pllout / div[__cpm_get_cdiv()];
|
||||
gd->sys_clk = pllout / div[__cpm_get_hdiv()];
|
||||
gd->per_clk = pllout / div[__cpm_get_pdiv()];
|
||||
gd->mem_clk = pllout / div[__cpm_get_mdiv()];
|
||||
gd->dev_clk = CONFIG_SYS_EXTAL;
|
||||
}
|
||||
|
||||
static void rtc_init(void)
|
||||
{
|
||||
unsigned long rtcsta;
|
||||
|
||||
while ( !__rtc_write_ready()) ;
|
||||
__rtc_enable_alarm(); /* enable alarm */
|
||||
|
||||
while ( !__rtc_write_ready())
|
||||
;
|
||||
REG_RTC_RGR = 0x00007fff; /* type value */
|
||||
|
||||
while ( !__rtc_write_ready())
|
||||
;
|
||||
REG_RTC_HWFCR = 0x0000ffe0; /* Power on delay 2s */
|
||||
|
||||
while ( !__rtc_write_ready())
|
||||
;
|
||||
REG_RTC_HRCR = 0x00000fe0; /* reset delay 125ms */
|
||||
#if 0
|
||||
while ( !__rtc_write_ready())
|
||||
;
|
||||
rtcsta = REG_RTC_HWRSR;
|
||||
while ( !__rtc_write_ready())
|
||||
;
|
||||
if (rtcsta & 0x33) {
|
||||
if (rtcsta & 0x10) {
|
||||
while ( !__rtc_write_ready())
|
||||
;
|
||||
REG_RTC_RSR = 0x0;
|
||||
}
|
||||
while ( !__rtc_write_ready())
|
||||
;
|
||||
REG_RTC_HWRSR = 0x0;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* jz4740 board init routine
|
||||
*/
|
||||
int jz_board_init(void)
|
||||
{
|
||||
board_early_init(); /* init gpio, pll etc. */
|
||||
#ifndef CONFIG_NAND_U_BOOT
|
||||
pll_init(); /* init PLL */
|
||||
sdram_init(); /* init sdram memory */
|
||||
#endif
|
||||
calc_clocks(); /* calc the clocks */
|
||||
rtc_init(); /* init rtc on any reset: */
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* U-Boot common routines */
|
||||
phys_size_t initdram(int board_type)
|
||||
{
|
||||
u32 dmcr;
|
||||
u32 rows, cols, dw, banks;
|
||||
ulong size;
|
||||
|
||||
dmcr = REG_EMC_DMCR;
|
||||
rows = 11 + ((dmcr & EMC_DMCR_RA_MASK) >> EMC_DMCR_RA_BIT);
|
||||
cols = 8 + ((dmcr & EMC_DMCR_CA_MASK) >> EMC_DMCR_CA_BIT);
|
||||
dw = (dmcr & EMC_DMCR_BW) ? 2 : 4;
|
||||
banks = (dmcr & EMC_DMCR_BA) ? 4 : 2;
|
||||
|
||||
size = (1 << (rows + cols)) * dw * banks;
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
/*
|
||||
* Timer routines
|
||||
*/
|
||||
|
||||
#define TIMER_CHAN 0
|
||||
#define TIMER_FDATA 0xffff /* Timer full data value */
|
||||
#define TIMER_HZ CONFIG_SYS_HZ
|
||||
|
||||
#define READ_TIMER REG_TCU_TCNT(TIMER_CHAN) /* macro to read the 16 bit timer */
|
||||
|
||||
static ulong timestamp;
|
||||
static ulong lastdec;
|
||||
|
||||
void reset_timer_masked (void);
|
||||
ulong get_timer_masked (void);
|
||||
void udelay_masked (unsigned long usec);
|
||||
|
||||
/*
|
||||
* timer without interrupts
|
||||
*/
|
||||
|
||||
int timer_init(void)
|
||||
{
|
||||
REG_TCU_TCSR(TIMER_CHAN) = TCU_TCSR_PRESCALE256 | TCU_TCSR_EXT_EN;
|
||||
REG_TCU_TCNT(TIMER_CHAN) = 0;
|
||||
REG_TCU_TDHR(TIMER_CHAN) = 0;
|
||||
REG_TCU_TDFR(TIMER_CHAN) = TIMER_FDATA;
|
||||
|
||||
REG_TCU_TMSR = (1 << TIMER_CHAN) | (1 << (TIMER_CHAN + 16)); /* mask irqs */
|
||||
REG_TCU_TSCR = (1 << TIMER_CHAN); /* enable timer clock */
|
||||
REG_TCU_TESR = (1 << TIMER_CHAN); /* start counting up */
|
||||
|
||||
lastdec = 0;
|
||||
timestamp = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void reset_timer(void)
|
||||
{
|
||||
reset_timer_masked ();
|
||||
}
|
||||
|
||||
ulong get_timer(ulong base)
|
||||
{
|
||||
return get_timer_masked () - base;
|
||||
}
|
||||
|
||||
void set_timer(ulong t)
|
||||
{
|
||||
timestamp = t;
|
||||
}
|
||||
|
||||
void udelay (unsigned long usec)
|
||||
{
|
||||
ulong tmo,tmp;
|
||||
|
||||
/* normalize */
|
||||
if (usec >= 1000) {
|
||||
tmo = usec / 1000;
|
||||
tmo *= TIMER_HZ;
|
||||
tmo /= 1000;
|
||||
}
|
||||
else {
|
||||
if (usec >= 1) {
|
||||
tmo = usec * TIMER_HZ;
|
||||
tmo /= (1000*1000);
|
||||
}
|
||||
else
|
||||
tmo = 1;
|
||||
}
|
||||
|
||||
/* check for rollover during this delay */
|
||||
tmp = get_timer (0);
|
||||
if ((tmp + tmo) < tmp )
|
||||
reset_timer_masked(); /* timer would roll over */
|
||||
else
|
||||
tmo += tmp;
|
||||
|
||||
while (get_timer_masked () < tmo);
|
||||
}
|
||||
|
||||
void reset_timer_masked (void)
|
||||
{
|
||||
/* reset time */
|
||||
lastdec = READ_TIMER;
|
||||
timestamp = 0;
|
||||
}
|
||||
|
||||
ulong get_timer_masked (void)
|
||||
{
|
||||
ulong now = READ_TIMER;
|
||||
|
||||
if (lastdec <= now) {
|
||||
/* normal mode */
|
||||
timestamp += (now - lastdec);
|
||||
} else {
|
||||
/* we have an overflow ... */
|
||||
timestamp += TIMER_FDATA + now - lastdec;
|
||||
}
|
||||
lastdec = now;
|
||||
|
||||
return timestamp;
|
||||
}
|
||||
|
||||
void udelay_masked (unsigned long usec)
|
||||
{
|
||||
ulong tmo;
|
||||
ulong endtime;
|
||||
signed long diff;
|
||||
|
||||
/* normalize */
|
||||
if (usec >= 1000) {
|
||||
tmo = usec / 1000;
|
||||
tmo *= TIMER_HZ;
|
||||
tmo /= 1000;
|
||||
} else {
|
||||
if (usec > 1) {
|
||||
tmo = usec * TIMER_HZ;
|
||||
tmo /= (1000*1000);
|
||||
} else {
|
||||
tmo = 1;
|
||||
}
|
||||
}
|
||||
|
||||
endtime = get_timer_masked () + tmo;
|
||||
|
||||
do {
|
||||
ulong now = get_timer_masked ();
|
||||
diff = endtime - now;
|
||||
} while (diff >= 0);
|
||||
}
|
||||
|
||||
/*
|
||||
* This function is derived from PowerPC code (read timebase as long long).
|
||||
* On MIPS it just returns the timer value.
|
||||
*/
|
||||
unsigned long long get_ticks(void)
|
||||
{
|
||||
return get_timer(0);
|
||||
}
|
||||
|
||||
/*
|
||||
* This function is derived from PowerPC code (timebase clock frequency).
|
||||
* On MIPS it returns the number of timer ticks per second.
|
||||
*/
|
||||
ulong get_tbclk (void)
|
||||
{
|
||||
return TIMER_HZ;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_NAND_SPL */
|
||||
|
||||
/* End of timer routine. */
|
||||
|
||||
#endif
|
||||
199
package/boot/uboot-xburst/files/cpu/mips/jz4740_nand.c
Normal file
199
package/boot/uboot-xburst/files/cpu/mips/jz4740_nand.c
Normal file
@@ -0,0 +1,199 @@
|
||||
/*
|
||||
* Platform independend driver for JZ4740.
|
||||
*
|
||||
* Copyright (c) 2007 Ingenic Semiconductor Inc.
|
||||
* Author: <jlwei@ingenic.cn>
|
||||
*
|
||||
* 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>
|
||||
|
||||
#if defined(CONFIG_CMD_NAND) && defined(CONFIG_JZ4740)
|
||||
|
||||
#include <nand.h>
|
||||
#include <asm/jz4740.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
#define PAR_SIZE 9
|
||||
#define __nand_ecc_enable() (REG_EMC_NFECR = EMC_NFECR_ECCE | EMC_NFECR_ERST )
|
||||
#define __nand_ecc_disable() (REG_EMC_NFECR &= ~EMC_NFECR_ECCE)
|
||||
|
||||
#define __nand_select_rs_ecc() (REG_EMC_NFECR |= EMC_NFECR_RS)
|
||||
|
||||
#define __nand_rs_ecc_encoding() (REG_EMC_NFECR |= EMC_NFECR_RS_ENCODING)
|
||||
#define __nand_rs_ecc_decoding() (REG_EMC_NFECR |= EMC_NFECR_RS_DECODING)
|
||||
#define __nand_ecc_encode_sync() while (!(REG_EMC_NFINTS & EMC_NFINTS_ENCF))
|
||||
#define __nand_ecc_decode_sync() while (!(REG_EMC_NFINTS & EMC_NFINTS_DECF))
|
||||
|
||||
static void jz_hwcontrol(struct mtd_info *mtd, int cmd, unsigned int ctrl)
|
||||
{
|
||||
struct nand_chip *this = mtd->priv;
|
||||
unsigned long nandaddr = (unsigned long)this->IO_ADDR_W;
|
||||
|
||||
if (ctrl & NAND_CTRL_CHANGE) {
|
||||
/* Change this to use I/O accessors. */
|
||||
if (ctrl & NAND_NCE)
|
||||
REG_EMC_NFCSR |= EMC_NFCSR_NFCE1;
|
||||
else
|
||||
REG_EMC_NFCSR &= ~EMC_NFCSR_NFCE1;
|
||||
}
|
||||
|
||||
if (cmd == NAND_CMD_NONE)
|
||||
return;
|
||||
|
||||
if (ctrl & NAND_CLE)
|
||||
nandaddr |= 0x00008000;
|
||||
else /* must be ALE */
|
||||
nandaddr |= 0x00010000;
|
||||
|
||||
writeb(cmd, (uint8_t *)nandaddr);
|
||||
}
|
||||
|
||||
static int jz_device_ready(struct mtd_info *mtd)
|
||||
{
|
||||
int ready;
|
||||
udelay(20); /* FIXME: add 20us delay */
|
||||
ready = (REG_GPIO_PXPIN(2) & 0x40000000) ? 1 : 0;
|
||||
return ready;
|
||||
}
|
||||
|
||||
/*
|
||||
* EMC setup
|
||||
*/
|
||||
static void jz_device_setup(void)
|
||||
{
|
||||
/* Set NFE bit */
|
||||
REG_EMC_NFCSR |= EMC_NFCSR_NFE1;
|
||||
REG_EMC_SMCR1 = 0x094c4400;
|
||||
/* REG_EMC_SMCR3 = 0x04444400; */
|
||||
}
|
||||
|
||||
void board_nand_select_device(struct nand_chip *nand, int chip)
|
||||
{
|
||||
/*
|
||||
* Don't use "chip" to address the NAND device,
|
||||
* generate the cs from the address where it is encoded.
|
||||
*/
|
||||
}
|
||||
|
||||
static int jzsoc_nand_calculate_rs_ecc(struct mtd_info* mtd, const u_char* dat,
|
||||
u_char* ecc_code)
|
||||
{
|
||||
volatile u8 *paraddr = (volatile u8 *)EMC_NFPAR0;
|
||||
short i;
|
||||
|
||||
__nand_ecc_encode_sync()
|
||||
__nand_ecc_disable();
|
||||
|
||||
for(i = 0; i < PAR_SIZE; i++)
|
||||
ecc_code[i] = *paraddr++;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void jzsoc_nand_enable_rs_hwecc(struct mtd_info* mtd, int mode)
|
||||
{
|
||||
__nand_ecc_enable();
|
||||
__nand_select_rs_ecc();
|
||||
|
||||
REG_EMC_NFINTS = 0x0;
|
||||
if (NAND_ECC_READ == mode){
|
||||
__nand_rs_ecc_decoding();
|
||||
}
|
||||
if (NAND_ECC_WRITE == mode){
|
||||
__nand_rs_ecc_encoding();
|
||||
}
|
||||
}
|
||||
|
||||
/* Correct 1~9-bit errors in 512-bytes data */
|
||||
static void jzsoc_rs_correct(unsigned char *dat, int idx, int mask)
|
||||
{
|
||||
int i;
|
||||
|
||||
idx--;
|
||||
|
||||
i = idx + (idx >> 3);
|
||||
if (i >= 512)
|
||||
return;
|
||||
|
||||
mask <<= (idx & 0x7);
|
||||
|
||||
dat[i] ^= mask & 0xff;
|
||||
if (i < 511)
|
||||
dat[i+1] ^= (mask >> 8) & 0xff;
|
||||
}
|
||||
|
||||
static int jzsoc_nand_rs_correct_data(struct mtd_info *mtd, u_char *dat,
|
||||
u_char *read_ecc, u_char *calc_ecc)
|
||||
{
|
||||
volatile u8 *paraddr = (volatile u8 *)EMC_NFPAR0;
|
||||
short k;
|
||||
u32 stat;
|
||||
/* Set PAR values */
|
||||
|
||||
for (k = 0; k < PAR_SIZE; k++) {
|
||||
*paraddr++ = read_ecc[k];
|
||||
}
|
||||
|
||||
/* Set PRDY */
|
||||
REG_EMC_NFECR |= EMC_NFECR_PRDY;
|
||||
|
||||
/* Wait for completion */
|
||||
__nand_ecc_decode_sync();
|
||||
__nand_ecc_disable();
|
||||
|
||||
/* Check decoding */
|
||||
stat = REG_EMC_NFINTS;
|
||||
if (stat & EMC_NFINTS_ERR) {
|
||||
if (stat & EMC_NFINTS_UNCOR) {
|
||||
printk("Uncorrectable error occurred\n");
|
||||
return -1;
|
||||
}
|
||||
else {
|
||||
u32 errcnt = (stat & EMC_NFINTS_ERRCNT_MASK) >> EMC_NFINTS_ERRCNT_BIT;
|
||||
switch (errcnt) {
|
||||
case 4:
|
||||
jzsoc_rs_correct(dat, (REG_EMC_NFERR3 & EMC_NFERR_INDEX_MASK) >> EMC_NFERR_INDEX_BIT, (REG_EMC_NFERR3 & EMC_NFERR_MASK_MASK) >> EMC_NFERR_MASK_BIT);
|
||||
case 3:
|
||||
jzsoc_rs_correct(dat, (REG_EMC_NFERR2 & EMC_NFERR_INDEX_MASK) >> EMC_NFERR_INDEX_BIT, (REG_EMC_NFERR2 & EMC_NFERR_MASK_MASK) >> EMC_NFERR_MASK_BIT);
|
||||
case 2:
|
||||
jzsoc_rs_correct(dat, (REG_EMC_NFERR1 & EMC_NFERR_INDEX_MASK) >> EMC_NFERR_INDEX_BIT, (REG_EMC_NFERR1 & EMC_NFERR_MASK_MASK) >> EMC_NFERR_MASK_BIT);
|
||||
case 1:
|
||||
jzsoc_rs_correct(dat, (REG_EMC_NFERR0 & EMC_NFERR_INDEX_MASK) >> EMC_NFERR_INDEX_BIT, (REG_EMC_NFERR0 & EMC_NFERR_MASK_MASK) >> EMC_NFERR_MASK_BIT);
|
||||
return 0;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
/* no error need to be correct */
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Main initialization routine
|
||||
*/
|
||||
int board_nand_init(struct nand_chip *nand)
|
||||
{
|
||||
jz_device_setup();
|
||||
|
||||
nand->cmd_ctrl = jz_hwcontrol;
|
||||
nand->dev_ready = jz_device_ready;
|
||||
|
||||
/* FIXME: should use NAND_ECC_SOFT */
|
||||
nand->ecc.hwctl = jzsoc_nand_enable_rs_hwecc;
|
||||
nand->ecc.correct = jzsoc_nand_rs_correct_data;
|
||||
nand->ecc.calculate = jzsoc_nand_calculate_rs_ecc;
|
||||
nand->ecc.mode = NAND_ECC_HW;
|
||||
nand->ecc.size = 512;
|
||||
nand->ecc.bytes = 9;
|
||||
|
||||
/* 20 us command delay time */
|
||||
nand->chip_delay = 20;
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif /* (CONFIG_SYS_CMD_NAND) */
|
||||
484
package/boot/uboot-xburst/files/cpu/mips/jz_lcd.c
Normal file
484
package/boot/uboot-xburst/files/cpu/mips/jz_lcd.c
Normal file
@@ -0,0 +1,484 @@
|
||||
/*
|
||||
* JzRISC lcd controller
|
||||
*
|
||||
* xiangfu liu <xiangfu.z@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 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
|
||||
*/
|
||||
|
||||
/*
|
||||
* Fallowing macro may be used:
|
||||
* CONFIG_LCD : LCD support
|
||||
* LCD_BPP : Bits per pixel, 0 = 1, 1 = 2, 2 = 4, 3 = 8
|
||||
* CONFIG_LCD_LOGO : show logo
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <common.h>
|
||||
#include <lcd.h>
|
||||
|
||||
#include <asm/io.h> /* virt_to_phys() */
|
||||
|
||||
#if defined(CONFIG_LCD) && !defined(CONFIG_SLCD)
|
||||
|
||||
#if defined(CONFIG_JZ4740)
|
||||
#include <asm/jz4740.h>
|
||||
#endif
|
||||
|
||||
#include "jz_lcd.h"
|
||||
|
||||
|
||||
struct jzfb_info {
|
||||
unsigned int cfg; /* panel mode and pin usage etc. */
|
||||
unsigned int w;
|
||||
unsigned int h;
|
||||
unsigned int bpp; /* bit per pixel */
|
||||
unsigned int fclk; /* frame clk */
|
||||
unsigned int hsw; /* hsync width, in pclk */
|
||||
unsigned int vsw; /* vsync width, in line count */
|
||||
unsigned int elw; /* end of line, in pclk */
|
||||
unsigned int blw; /* begin of line, in pclk */
|
||||
unsigned int efw; /* end of frame, in line count */
|
||||
unsigned int bfw; /* begin of frame, in line count */
|
||||
};
|
||||
|
||||
static struct jzfb_info jzfb = {
|
||||
#if defined(CONFIG_NANONOTE)
|
||||
MODE_8BIT_SERIAL_TFT | PCLK_N | HSYNC_N | VSYNC_N,
|
||||
320, 240, 32, 70, 1, 1, 273, 140, 1, 20
|
||||
#endif
|
||||
|
||||
};
|
||||
|
||||
/************************************************************************/
|
||||
|
||||
vidinfo_t panel_info = {
|
||||
#if defined(CONFIG_JZLCD_FOXCONN_PT035TN01)
|
||||
320, 240, LCD_BPP,
|
||||
#endif
|
||||
};
|
||||
|
||||
/*----------------------------------------------------------------------*/
|
||||
|
||||
int lcd_line_length;
|
||||
|
||||
int lcd_color_fg;
|
||||
int lcd_color_bg;
|
||||
|
||||
/*
|
||||
* Frame buffer memory information
|
||||
*/
|
||||
void *lcd_base; /* Start of framebuffer memory */
|
||||
void *lcd_console_address; /* Start of console buffer */
|
||||
|
||||
short console_col;
|
||||
short console_row;
|
||||
|
||||
/*----------------------------------------------------------------------*/
|
||||
|
||||
void lcd_ctrl_init (void *lcdbase);
|
||||
|
||||
void lcd_enable (void);
|
||||
void lcd_disable (void);
|
||||
|
||||
/*----------------------------------------------------------------------*/
|
||||
|
||||
static int jz_lcd_init_mem(void *lcdbase, vidinfo_t *vid);
|
||||
static void jz_lcd_desc_init(vidinfo_t *vid);
|
||||
static int jz_lcd_hw_init( vidinfo_t *vid );
|
||||
extern int flush_cache_all(void);
|
||||
|
||||
#if LCD_BPP == LCD_COLOR8
|
||||
void lcd_setcolreg (ushort regno, ushort red, ushort green, ushort blue);
|
||||
#endif
|
||||
#if LCD_BPP == LCD_MONOCHROME
|
||||
void lcd_initcolregs (void);
|
||||
#endif
|
||||
|
||||
/*-----------------------------------------------------------------------*/
|
||||
|
||||
void lcd_ctrl_init (void *lcdbase)
|
||||
{
|
||||
__lcd_display_pin_init();
|
||||
|
||||
jz_lcd_init_mem(lcdbase, &panel_info);
|
||||
jz_lcd_desc_init(&panel_info);
|
||||
jz_lcd_hw_init(&panel_info);
|
||||
|
||||
__lcd_display_on() ;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------*/
|
||||
#if LCD_BPP == LCD_COLOR8
|
||||
void
|
||||
lcd_setcolreg (ushort regno, ushort red, ushort green, ushort blue)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
/*----------------------------------------------------------------------*/
|
||||
|
||||
#if LCD_BPP == LCD_MONOCHROME
|
||||
static
|
||||
void lcd_initcolregs (void)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Before enabled lcd controller, lcd registers should be configured correctly.
|
||||
*/
|
||||
|
||||
void lcd_enable (void)
|
||||
{
|
||||
REG_LCD_CTRL &= ~(1<<4); /* LCDCTRL.DIS */
|
||||
REG_LCD_CTRL |= 1<<3; /* LCDCTRL.ENA*/
|
||||
}
|
||||
|
||||
void lcd_disable (void)
|
||||
{
|
||||
REG_LCD_CTRL |= (1<<4); /* LCDCTRL.DIS, regular disable */
|
||||
/* REG_LCD_CTRL |= (1<<3); */ /* LCDCTRL.DIS, quikly disable */
|
||||
}
|
||||
|
||||
static int jz_lcd_init_mem(void *lcdbase, vidinfo_t *vid)
|
||||
{
|
||||
u_long palette_mem_size;
|
||||
struct jz_fb_info *fbi = &vid->jz_fb;
|
||||
int fb_size = vid->vl_row * (vid->vl_col * NBITS (vid->vl_bpix)) / 8;
|
||||
|
||||
fbi->screen = (u_long)lcdbase;
|
||||
fbi->palette_size = 256;
|
||||
palette_mem_size = fbi->palette_size * sizeof(u16);
|
||||
|
||||
debug("jz_lcd.c palette_mem_size = 0x%08lx\n", (u_long) palette_mem_size);
|
||||
/* locate palette and descs at end of page following fb */
|
||||
fbi->palette = (u_long)lcdbase + fb_size + PAGE_SIZE - palette_mem_size;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void jz_lcd_desc_init(vidinfo_t *vid)
|
||||
{
|
||||
struct jz_fb_info * fbi;
|
||||
fbi = &vid->jz_fb;
|
||||
fbi->dmadesc_fblow = (struct jz_fb_dma_descriptor *)((unsigned int)fbi->palette - 3*16);
|
||||
fbi->dmadesc_fbhigh = (struct jz_fb_dma_descriptor *)((unsigned int)fbi->palette - 2*16);
|
||||
fbi->dmadesc_palette = (struct jz_fb_dma_descriptor *)((unsigned int)fbi->palette - 1*16);
|
||||
|
||||
#define BYTES_PER_PANEL (vid->vl_col * vid->vl_row * NBITS(vid->vl_bpix) / 8)
|
||||
|
||||
/* populate descriptors */
|
||||
fbi->dmadesc_fblow->fdadr = virt_to_phys(fbi->dmadesc_fblow);
|
||||
fbi->dmadesc_fblow->fsadr = virt_to_phys((void *)(fbi->screen + BYTES_PER_PANEL));
|
||||
fbi->dmadesc_fblow->fidr = 0;
|
||||
fbi->dmadesc_fblow->ldcmd = BYTES_PER_PANEL / 4 ;
|
||||
|
||||
fbi->fdadr1 = virt_to_phys(fbi->dmadesc_fblow); /* only used in dual-panel mode */
|
||||
|
||||
fbi->dmadesc_fbhigh->fsadr = virt_to_phys((void *)fbi->screen);
|
||||
fbi->dmadesc_fbhigh->fidr = 0;
|
||||
fbi->dmadesc_fbhigh->ldcmd = BYTES_PER_PANEL / 4; /* length in word */
|
||||
|
||||
fbi->dmadesc_palette->fsadr = virt_to_phys((void *)fbi->palette);
|
||||
fbi->dmadesc_palette->fidr = 0;
|
||||
fbi->dmadesc_palette->ldcmd = (fbi->palette_size * 2)/4 | (1<<28);
|
||||
|
||||
if( NBITS(vid->vl_bpix) < 12)
|
||||
{
|
||||
/* assume any mode with <12 bpp is palette driven */
|
||||
fbi->dmadesc_palette->fdadr = virt_to_phys(fbi->dmadesc_fbhigh);
|
||||
fbi->dmadesc_fbhigh->fdadr = virt_to_phys(fbi->dmadesc_palette);
|
||||
/* flips back and forth between pal and fbhigh */
|
||||
fbi->fdadr0 = virt_to_phys(fbi->dmadesc_palette);
|
||||
} else {
|
||||
/* palette shouldn't be loaded in true-color mode */
|
||||
fbi->dmadesc_fbhigh->fdadr = virt_to_phys((void *)fbi->dmadesc_fbhigh);
|
||||
fbi->fdadr0 = virt_to_phys(fbi->dmadesc_fbhigh); /* no pal just fbhigh */
|
||||
}
|
||||
|
||||
flush_cache_all();
|
||||
}
|
||||
|
||||
static int jz_lcd_hw_init(vidinfo_t *vid)
|
||||
{
|
||||
struct jz_fb_info *fbi = &vid->jz_fb;
|
||||
unsigned int val = 0;
|
||||
unsigned int pclk;
|
||||
unsigned int stnH;
|
||||
#if defined(CONFIG_MIPS_JZ4740)
|
||||
int pll_div;
|
||||
#endif
|
||||
|
||||
/* Setting Control register */
|
||||
switch (jzfb.bpp) {
|
||||
case 1:
|
||||
val |= LCD_CTRL_BPP_1;
|
||||
break;
|
||||
case 2:
|
||||
val |= LCD_CTRL_BPP_2;
|
||||
break;
|
||||
case 4:
|
||||
val |= LCD_CTRL_BPP_4;
|
||||
break;
|
||||
case 8:
|
||||
val |= LCD_CTRL_BPP_8;
|
||||
break;
|
||||
case 15:
|
||||
val |= LCD_CTRL_RGB555;
|
||||
case 16:
|
||||
val |= LCD_CTRL_BPP_16;
|
||||
break;
|
||||
#if defined(CONFIG_MIPS_JZ4740)
|
||||
case 17 ... 32:
|
||||
val |= LCD_CTRL_BPP_18_24; /* target is 4bytes/pixel */
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
printf("jz_lcd.c The BPP %d is not supported\n", jzfb.bpp);
|
||||
val |= LCD_CTRL_BPP_16;
|
||||
break;
|
||||
}
|
||||
|
||||
switch (jzfb.cfg & MODE_MASK) {
|
||||
case MODE_STN_MONO_DUAL:
|
||||
case MODE_STN_COLOR_DUAL:
|
||||
case MODE_STN_MONO_SINGLE:
|
||||
case MODE_STN_COLOR_SINGLE:
|
||||
switch (jzfb.bpp) {
|
||||
case 1:
|
||||
/* val |= LCD_CTRL_PEDN; */
|
||||
case 2:
|
||||
val |= LCD_CTRL_FRC_2;
|
||||
break;
|
||||
case 4:
|
||||
val |= LCD_CTRL_FRC_4;
|
||||
break;
|
||||
case 8:
|
||||
default:
|
||||
val |= LCD_CTRL_FRC_16;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
val |= LCD_CTRL_BST_16; /* Burst Length is 16WORD=64Byte */
|
||||
val |= LCD_CTRL_OFUP; /* OutFIFO underrun protect */
|
||||
|
||||
switch (jzfb.cfg & MODE_MASK) {
|
||||
case MODE_STN_MONO_DUAL:
|
||||
case MODE_STN_COLOR_DUAL:
|
||||
case MODE_STN_MONO_SINGLE:
|
||||
case MODE_STN_COLOR_SINGLE:
|
||||
switch (jzfb.cfg & STN_DAT_PINMASK) {
|
||||
#define align2(n) (n)=((((n)+1)>>1)<<1)
|
||||
#define align4(n) (n)=((((n)+3)>>2)<<2)
|
||||
#define align8(n) (n)=((((n)+7)>>3)<<3)
|
||||
case STN_DAT_PIN1:
|
||||
/* Do not adjust the hori-param value. */
|
||||
break;
|
||||
case STN_DAT_PIN2:
|
||||
align2(jzfb.hsw);
|
||||
align2(jzfb.elw);
|
||||
align2(jzfb.blw);
|
||||
break;
|
||||
case STN_DAT_PIN4:
|
||||
align4(jzfb.hsw);
|
||||
align4(jzfb.elw);
|
||||
align4(jzfb.blw);
|
||||
break;
|
||||
case STN_DAT_PIN8:
|
||||
align8(jzfb.hsw);
|
||||
align8(jzfb.elw);
|
||||
align8(jzfb.blw);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
REG_LCD_CTRL = val;
|
||||
|
||||
switch (jzfb.cfg & MODE_MASK) {
|
||||
case MODE_STN_MONO_DUAL:
|
||||
case MODE_STN_COLOR_DUAL:
|
||||
case MODE_STN_MONO_SINGLE:
|
||||
case MODE_STN_COLOR_SINGLE:
|
||||
if (((jzfb.cfg & MODE_MASK) == MODE_STN_MONO_DUAL) ||
|
||||
((jzfb.cfg & MODE_MASK) == MODE_STN_COLOR_DUAL))
|
||||
stnH = jzfb.h >> 1;
|
||||
else
|
||||
stnH = jzfb.h;
|
||||
|
||||
REG_LCD_VSYNC = (0 << 16) | jzfb.vsw;
|
||||
REG_LCD_HSYNC = ((jzfb.blw+jzfb.w) << 16) | (jzfb.blw+jzfb.w+jzfb.hsw);
|
||||
|
||||
/* Screen setting */
|
||||
REG_LCD_VAT = ((jzfb.blw + jzfb.w + jzfb.hsw + jzfb.elw) << 16) | (stnH + jzfb.vsw + jzfb.bfw + jzfb.efw);
|
||||
REG_LCD_DAH = (jzfb.blw << 16) | (jzfb.blw + jzfb.w);
|
||||
REG_LCD_DAV = (0 << 16) | (stnH);
|
||||
|
||||
/* AC BIAs signal */
|
||||
REG_LCD_PS = (0 << 16) | (stnH+jzfb.vsw+jzfb.efw+jzfb.bfw);
|
||||
|
||||
break;
|
||||
|
||||
case MODE_TFT_GEN:
|
||||
case MODE_TFT_SHARP:
|
||||
case MODE_TFT_CASIO:
|
||||
case MODE_TFT_SAMSUNG:
|
||||
case MODE_8BIT_SERIAL_TFT:
|
||||
case MODE_TFT_18BIT:
|
||||
REG_LCD_VSYNC = (0 << 16) | jzfb.vsw;
|
||||
REG_LCD_HSYNC = (0 << 16) | jzfb.hsw;
|
||||
#if defined(CONFIG_JZLCD_INNOLUX_AT080TN42)
|
||||
REG_LCD_DAV = (0 << 16) | ( jzfb.h );
|
||||
#else
|
||||
REG_LCD_DAV =((jzfb.vsw+jzfb.bfw) << 16) | (jzfb.vsw +jzfb.bfw+jzfb.h);
|
||||
#endif /*#if defined(CONFIG_JZLCD_INNOLUX_AT080TN42)*/
|
||||
REG_LCD_DAH = ((jzfb.hsw + jzfb.blw) << 16) | (jzfb.hsw + jzfb.blw + jzfb.w );
|
||||
REG_LCD_VAT = (((jzfb.blw + jzfb.w + jzfb.elw + jzfb.hsw)) << 16) \
|
||||
| (jzfb.vsw + jzfb.bfw + jzfb.h + jzfb.efw);
|
||||
break;
|
||||
}
|
||||
|
||||
switch (jzfb.cfg & MODE_MASK) {
|
||||
case MODE_TFT_SAMSUNG:
|
||||
{
|
||||
unsigned int total, tp_s, tp_e, ckv_s, ckv_e;
|
||||
unsigned int rev_s, rev_e, inv_s, inv_e;
|
||||
|
||||
pclk = val * (jzfb.w + jzfb.hsw + jzfb.elw + jzfb.blw) *
|
||||
(jzfb.h + jzfb.vsw + jzfb.efw + jzfb.bfw); /* Pixclk */
|
||||
|
||||
total = jzfb.blw + jzfb.w + jzfb.elw + jzfb.hsw;
|
||||
tp_s = jzfb.blw + jzfb.w + 1;
|
||||
tp_e = tp_s + 1;
|
||||
/* ckv_s = tp_s - jz_clocks.pixclk/(1000000000/4100); */
|
||||
ckv_s = tp_s - pclk/(1000000000/4100);
|
||||
ckv_e = tp_s + total;
|
||||
rev_s = tp_s - 11; /* -11.5 clk */
|
||||
rev_e = rev_s + total;
|
||||
inv_s = tp_s;
|
||||
inv_e = inv_s + total;
|
||||
REG_LCD_CLS = (tp_s << 16) | tp_e;
|
||||
REG_LCD_PS = (ckv_s << 16) | ckv_e;
|
||||
REG_LCD_SPL = (rev_s << 16) | rev_e;
|
||||
REG_LCD_REV = (inv_s << 16) | inv_e;
|
||||
jzfb.cfg |= STFT_REVHI | STFT_SPLHI;
|
||||
break;
|
||||
}
|
||||
case MODE_TFT_SHARP:
|
||||
{
|
||||
unsigned int total, cls_s, cls_e, ps_s, ps_e;
|
||||
unsigned int spl_s, spl_e, rev_s, rev_e;
|
||||
total = jzfb.blw + jzfb.w + jzfb.elw + jzfb.hsw;
|
||||
#if !defined(CONFIG_JZLCD_INNOLUX_AT080TN42)
|
||||
spl_s = 1;
|
||||
spl_e = spl_s + 1;
|
||||
cls_s = 0;
|
||||
cls_e = total - 60; /* > 4us (pclk = 80ns) */
|
||||
ps_s = cls_s;
|
||||
ps_e = cls_e;
|
||||
rev_s = total - 40; /* > 3us (pclk = 80ns) */
|
||||
rev_e = rev_s + total;
|
||||
jzfb.cfg |= STFT_PSHI;
|
||||
#else /*#if defined(CONFIG_JZLCD_INNOLUX_AT080TN42)*/
|
||||
spl_s = total - 5; /* LD */
|
||||
spl_e = total -3;
|
||||
cls_s = 32; /* CKV */
|
||||
cls_e = 145;
|
||||
ps_s = 0; /* OEV */
|
||||
ps_e = 45;
|
||||
rev_s = 0; /* POL */
|
||||
rev_e = 0;
|
||||
#endif /*#if defined(CONFIG_JZLCD_INNOLUX_AT080TN42)*/
|
||||
REG_LCD_SPL = (spl_s << 16) | spl_e;
|
||||
REG_LCD_CLS = (cls_s << 16) | cls_e;
|
||||
REG_LCD_PS = (ps_s << 16) | ps_e;
|
||||
REG_LCD_REV = (rev_s << 16) | rev_e;
|
||||
break;
|
||||
}
|
||||
case MODE_TFT_CASIO:
|
||||
break;
|
||||
}
|
||||
|
||||
/* Configure the LCD panel */
|
||||
REG_LCD_CFG = jzfb.cfg;
|
||||
|
||||
/* Timing setting */
|
||||
__cpm_stop_lcd();
|
||||
|
||||
val = jzfb.fclk; /* frame clk */
|
||||
if ( (jzfb.cfg & MODE_MASK) != MODE_8BIT_SERIAL_TFT) {
|
||||
pclk = val * (jzfb.w + jzfb.hsw + jzfb.elw + jzfb.blw) *
|
||||
(jzfb.h + jzfb.vsw + jzfb.efw + jzfb.bfw); /* Pixclk */
|
||||
}
|
||||
else {
|
||||
/* serial mode: Hsync period = 3*Width_Pixel */
|
||||
pclk = val * (jzfb.w*3 + jzfb.hsw + jzfb.elw + jzfb.blw) *
|
||||
(jzfb.h + jzfb.vsw + jzfb.efw + jzfb.bfw); /* Pixclk */
|
||||
}
|
||||
|
||||
if (((jzfb.cfg & MODE_MASK) == MODE_STN_COLOR_SINGLE) ||
|
||||
((jzfb.cfg & MODE_MASK) == MODE_STN_COLOR_DUAL))
|
||||
pclk = (pclk * 3);
|
||||
|
||||
if (((jzfb.cfg & MODE_MASK) == MODE_STN_COLOR_SINGLE) ||
|
||||
((jzfb.cfg & MODE_MASK) == MODE_STN_COLOR_DUAL) ||
|
||||
((jzfb.cfg & MODE_MASK) == MODE_STN_MONO_SINGLE) ||
|
||||
((jzfb.cfg & MODE_MASK) == MODE_STN_MONO_DUAL))
|
||||
pclk = pclk >> ((jzfb.cfg & STN_DAT_PINMASK) >> 4);
|
||||
|
||||
if (((jzfb.cfg & MODE_MASK) == MODE_STN_COLOR_DUAL) ||
|
||||
((jzfb.cfg & MODE_MASK) == MODE_STN_MONO_DUAL))
|
||||
pclk >>= 1;
|
||||
|
||||
pll_div = ( REG_CPM_CPCCR & CPM_CPCCR_PCS ); /* clock source,0:pllout/2 1: pllout */
|
||||
pll_div = pll_div ? 1 : 2 ;
|
||||
val = ( __cpm_get_pllout()/pll_div ) / pclk;
|
||||
val--;
|
||||
if ( val > 0x1ff ) {
|
||||
printf("CPM_LPCDR too large, set it to 0x1ff\n");
|
||||
val = 0x1ff;
|
||||
}
|
||||
__cpm_set_pixdiv(val);
|
||||
|
||||
val = pclk * 3 ; /* LCDClock > 2.5*Pixclock */
|
||||
if ( val > 150000000 ) {
|
||||
printf("Warning: LCDClock=%d\n, LCDClock must less or equal to 150MHz.\n", val);
|
||||
printf("Change LCDClock to 150MHz\n");
|
||||
val = 150000000;
|
||||
}
|
||||
val = ( __cpm_get_pllout()/pll_div ) / val;
|
||||
val--;
|
||||
if ( val > 0x1f ) {
|
||||
printf("CPM_CPCCR.LDIV too large, set it to 0x1f\n");
|
||||
val = 0x1f;
|
||||
}
|
||||
__cpm_set_ldiv( val );
|
||||
REG_CPM_CPCCR |= CPM_CPCCR_CE ; /* update divide */
|
||||
|
||||
__cpm_start_lcd();
|
||||
udelay(1000);
|
||||
|
||||
REG_LCD_DA0 = fbi->fdadr0; /* frame descripter*/
|
||||
|
||||
if (((jzfb.cfg & MODE_MASK) == MODE_STN_COLOR_DUAL) ||
|
||||
((jzfb.cfg & MODE_MASK) == MODE_STN_MONO_DUAL))
|
||||
REG_LCD_DA1 = fbi->fdadr1; /* frame descripter*/
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
260
package/boot/uboot-xburst/files/cpu/mips/jz_lcd.h
Normal file
260
package/boot/uboot-xburst/files/cpu/mips/jz_lcd.h
Normal file
@@ -0,0 +1,260 @@
|
||||
/*
|
||||
* JzRISC lcd controller
|
||||
*
|
||||
* xiangfu liu <xiangfu.z@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 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
|
||||
*/
|
||||
|
||||
#ifndef __JZLCD_H__
|
||||
#define __JZLCD_H__
|
||||
|
||||
#include <asm/io.h>
|
||||
/*
|
||||
* change u-boot macro to celinux macro
|
||||
*/
|
||||
/* Chip type */
|
||||
#if defined(CONFIG_JZ4740)
|
||||
#define CONFIG_MIPS_JZ4740 1
|
||||
#endif
|
||||
|
||||
/* board type */
|
||||
#if defined(CONFIG_NANONOTE)
|
||||
#define CONFIG_MIPS_JZ4740_PI 1
|
||||
#endif
|
||||
|
||||
#define mdelay(n) udelay((n)*1000)
|
||||
|
||||
/*
|
||||
* change u-boot macro to celinux macro
|
||||
*/
|
||||
|
||||
#define NR_PALETTE 256
|
||||
|
||||
struct lcd_desc{
|
||||
unsigned int next_desc; /* LCDDAx */
|
||||
unsigned int databuf; /* LCDSAx */
|
||||
unsigned int frame_id; /* LCDFIDx */
|
||||
unsigned int cmd; /* LCDCMDx */
|
||||
};
|
||||
|
||||
#define MODE_MASK 0x0f
|
||||
#define MODE_TFT_GEN 0x00
|
||||
#define MODE_TFT_SHARP 0x01
|
||||
#define MODE_TFT_CASIO 0x02
|
||||
#define MODE_TFT_SAMSUNG 0x03
|
||||
#define MODE_CCIR656_NONINT 0x04
|
||||
#define MODE_CCIR656_INT 0x05
|
||||
#define MODE_STN_COLOR_SINGLE 0x08
|
||||
#define MODE_STN_MONO_SINGLE 0x09
|
||||
#define MODE_STN_COLOR_DUAL 0x0a
|
||||
#define MODE_STN_MONO_DUAL 0x0b
|
||||
#define MODE_8BIT_SERIAL_TFT 0x0c
|
||||
|
||||
#define MODE_TFT_18BIT (1<<7)
|
||||
|
||||
#define STN_DAT_PIN1 (0x00 << 4)
|
||||
#define STN_DAT_PIN2 (0x01 << 4)
|
||||
#define STN_DAT_PIN4 (0x02 << 4)
|
||||
#define STN_DAT_PIN8 (0x03 << 4)
|
||||
#define STN_DAT_PINMASK STN_DAT_PIN8
|
||||
|
||||
#define STFT_PSHI (1 << 15)
|
||||
#define STFT_CLSHI (1 << 14)
|
||||
#define STFT_SPLHI (1 << 13)
|
||||
#define STFT_REVHI (1 << 12)
|
||||
|
||||
#define SYNC_MASTER (0 << 16)
|
||||
#define SYNC_SLAVE (1 << 16)
|
||||
|
||||
#define DE_P (0 << 9)
|
||||
#define DE_N (1 << 9)
|
||||
|
||||
#define PCLK_P (0 << 10)
|
||||
#define PCLK_N (1 << 10)
|
||||
|
||||
#define HSYNC_P (0 << 11)
|
||||
#define HSYNC_N (1 << 11)
|
||||
|
||||
#define VSYNC_P (0 << 8)
|
||||
#define VSYNC_N (1 << 8)
|
||||
|
||||
#define DATA_NORMAL (0 << 17)
|
||||
#define DATA_INVERSE (1 << 17)
|
||||
|
||||
|
||||
/* Jz LCDFB supported I/O controls. */
|
||||
#define FBIOSETBACKLIGHT 0x4688
|
||||
#define FBIODISPON 0x4689
|
||||
#define FBIODISPOFF 0x468a
|
||||
#define FBIORESET 0x468b
|
||||
#define FBIOPRINT_REG 0x468c
|
||||
|
||||
/*
|
||||
* LCD panel specific definition
|
||||
*/
|
||||
|
||||
#if defined(CONFIG_JZLCD_FOXCONN_PT035TN01) || defined(CONFIG_JZLCD_INNOLUX_PT035TN01_SERIAL)
|
||||
|
||||
#if defined(CONFIG_JZLCD_FOXCONN_PT035TN01) /* board pmp */
|
||||
#define MODE 0xcd /* 24bit parellel RGB */
|
||||
#endif
|
||||
#if defined(CONFIG_JZLCD_INNOLUX_PT035TN01_SERIAL)
|
||||
#define MODE 0xc9 /* 8bit serial RGB */
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_MIPS_JZ4740_PI) /* board pavo */
|
||||
#define SPEN (32*2+21) /*LCD_SPL */
|
||||
#define SPCK (32*2+23) /*LCD_CLS */
|
||||
#define SPDA (32*2+22) /*LCD_D12 */
|
||||
#define LCD_RET (32*3+27)
|
||||
#else
|
||||
#error "cpu/misp/Jzlcd.h, please define SPI pins on your board."
|
||||
#endif
|
||||
|
||||
#define __spi_write_reg1(reg, val) \
|
||||
do { \
|
||||
unsigned char no;\
|
||||
unsigned short value;\
|
||||
unsigned char a=0;\
|
||||
unsigned char b=0;\
|
||||
a=reg;\
|
||||
b=val;\
|
||||
__gpio_set_pin(SPEN);\
|
||||
__gpio_set_pin(SPCK);\
|
||||
__gpio_clear_pin(SPDA);\
|
||||
__gpio_clear_pin(SPEN);\
|
||||
udelay(25);\
|
||||
value=((a<<8)|(b&0xFF));\
|
||||
for(no=0;no<16;no++)\
|
||||
{\
|
||||
__gpio_clear_pin(SPCK);\
|
||||
if((value&0x8000)==0x8000)\
|
||||
__gpio_set_pin(SPDA);\
|
||||
else\
|
||||
__gpio_clear_pin(SPDA);\
|
||||
udelay(25);\
|
||||
__gpio_set_pin(SPCK);\
|
||||
value=(value<<1); \
|
||||
udelay(25);\
|
||||
}\
|
||||
__gpio_set_pin(SPEN);\
|
||||
udelay(100);\
|
||||
} while (0)
|
||||
|
||||
#define __spi_write_reg(reg, val) \
|
||||
do {\
|
||||
__spi_write_reg1((reg<<2|2), val);\
|
||||
udelay(100); \
|
||||
}while(0)
|
||||
|
||||
|
||||
#define __lcd_special_pin_init() \
|
||||
do { \
|
||||
__gpio_as_output(SPEN); /* use SPDA */\
|
||||
__gpio_as_output(SPCK); /* use SPCK */\
|
||||
__gpio_as_output(SPDA); /* use SPDA */\
|
||||
__gpio_as_output(LCD_RET);\
|
||||
} while (0)
|
||||
|
||||
#if defined(CONFIG_NANONOTE)
|
||||
#define __lcd_special_on() \
|
||||
do { \
|
||||
udelay(50);\
|
||||
__spi_write_reg1(0x05, 0x16); \
|
||||
__spi_write_reg1(0x04, 0x0b); \
|
||||
__spi_write_reg1(0x07, 0x8d); \
|
||||
__spi_write_reg1(0x01, 0x95); \
|
||||
__spi_write_reg1(0x08, 0xc0); \
|
||||
__spi_write_reg1(0x03, 0x40); \
|
||||
__spi_write_reg1(0x06, 0x15); \
|
||||
__spi_write_reg1(0x05, 0xd7); \
|
||||
} while (0) /* reg 0x0a is control the display direction:DB0->horizontal level DB1->vertical level */
|
||||
|
||||
#define __lcd_special_off() \
|
||||
do { \
|
||||
__spi_write_reg1(0x05, 0x5e); \
|
||||
} while (0)
|
||||
#endif /* CONFIG_NANONOTE */
|
||||
#endif /* CONFIG_JZLCD_FOXCONN_PT035TN01 or CONFIG_JZLCD_INNOLUX_PT035TN01_SERIAL */
|
||||
|
||||
#ifndef __lcd_special_pin_init
|
||||
#define __lcd_special_pin_init()
|
||||
#endif
|
||||
#ifndef __lcd_special_on
|
||||
#define __lcd_special_on()
|
||||
#endif
|
||||
#ifndef __lcd_special_off
|
||||
#define __lcd_special_off()
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* Platform specific definition
|
||||
*/
|
||||
|
||||
#if defined(CONFIG_MIPS_JZ4740_PI)
|
||||
|
||||
/* 100 level: 0,1,...,100 */
|
||||
#define __lcd_set_backlight_level(n)\
|
||||
do { \
|
||||
__gpio_as_output(32*3+27); \
|
||||
__gpio_set_pin(32*3+27); \
|
||||
} while (0)
|
||||
|
||||
#define __lcd_close_backlight() \
|
||||
do { \
|
||||
__gpio_as_output(GPIO_PWM); \
|
||||
__gpio_clear_pin(GPIO_PWM); \
|
||||
} while (0)
|
||||
|
||||
#define __lcd_display_pin_init() \
|
||||
do { \
|
||||
__gpio_as_output(GPIO_DISP_OFF_N); \
|
||||
__cpm_start_tcu(); \
|
||||
__lcd_special_pin_init(); \
|
||||
} while (0)
|
||||
/* __lcd_set_backlight_level(100); \*/
|
||||
#define __lcd_display_on() \
|
||||
do { \
|
||||
__gpio_set_pin(GPIO_DISP_OFF_N); \
|
||||
__lcd_special_on(); \
|
||||
} while (0)
|
||||
|
||||
#define __lcd_display_off() \
|
||||
do { \
|
||||
__lcd_special_off(); \
|
||||
__gpio_clear_pin(GPIO_DISP_OFF_N); \
|
||||
} while (0)
|
||||
|
||||
#endif /* CONFIG_MIPS_JZ4740_PI) */
|
||||
|
||||
/*****************************************************************************
|
||||
* LCD display pin dummy macros
|
||||
*****************************************************************************/
|
||||
#ifndef __lcd_display_pin_init
|
||||
#define __lcd_display_pin_init()
|
||||
#endif
|
||||
#ifndef __lcd_display_on
|
||||
#define __lcd_display_on()
|
||||
#endif
|
||||
#ifndef __lcd_display_off
|
||||
#define __lcd_display_off()
|
||||
#endif
|
||||
#ifndef __lcd_set_backlight_level
|
||||
#define __lcd_set_backlight_level(n)
|
||||
#endif
|
||||
|
||||
1416
package/boot/uboot-xburst/files/cpu/mips/jz_mmc.c
Normal file
1416
package/boot/uboot-xburst/files/cpu/mips/jz_mmc.c
Normal file
File diff suppressed because it is too large
Load Diff
113
package/boot/uboot-xburst/files/cpu/mips/jz_mmc.h
Normal file
113
package/boot/uboot-xburst/files/cpu/mips/jz_mmc.h
Normal file
@@ -0,0 +1,113 @@
|
||||
/*
|
||||
* linux/drivers/mmc/jz_mmc.h
|
||||
*
|
||||
* Author: Vladimir Shebordaev, Igor Oblakov
|
||||
* Copyright: MontaVista Software Inc.
|
||||
*
|
||||
* $Id: jz_mmc.h,v 1.3 2007-06-15 08:04:20 jlwei Exp $
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#ifndef __MMC_JZMMC_H__
|
||||
#define __MMC_JZMMC_H__
|
||||
|
||||
#include "mmc_protocol.h"
|
||||
|
||||
#define MMC_DEBUG_LEVEL 0 /* Enable Debug: 0 - no debug */
|
||||
|
||||
#define MMC_BLOCK_SIZE 512 /* MMC/SD Block Size */
|
||||
|
||||
#define ID_TO_RCA(x) ((x)+1)
|
||||
|
||||
#define MMC_OCR_ARG 0x00ff8000 /* Argument of OCR */
|
||||
|
||||
enum mmc_result_t {
|
||||
MMC_NO_RESPONSE = -1,
|
||||
MMC_NO_ERROR = 0,
|
||||
MMC_ERROR_OUT_OF_RANGE,
|
||||
MMC_ERROR_ADDRESS,
|
||||
MMC_ERROR_BLOCK_LEN,
|
||||
MMC_ERROR_ERASE_SEQ,
|
||||
MMC_ERROR_ERASE_PARAM,
|
||||
MMC_ERROR_WP_VIOLATION,
|
||||
MMC_ERROR_CARD_IS_LOCKED,
|
||||
MMC_ERROR_LOCK_UNLOCK_FAILED,
|
||||
MMC_ERROR_COM_CRC,
|
||||
MMC_ERROR_ILLEGAL_COMMAND,
|
||||
MMC_ERROR_CARD_ECC_FAILED,
|
||||
MMC_ERROR_CC,
|
||||
MMC_ERROR_GENERAL,
|
||||
MMC_ERROR_UNDERRUN,
|
||||
MMC_ERROR_OVERRUN,
|
||||
MMC_ERROR_CID_CSD_OVERWRITE,
|
||||
MMC_ERROR_STATE_MISMATCH,
|
||||
MMC_ERROR_HEADER_MISMATCH,
|
||||
MMC_ERROR_TIMEOUT,
|
||||
MMC_ERROR_CRC,
|
||||
MMC_ERROR_DRIVER_FAILURE,
|
||||
};
|
||||
|
||||
/* the information structure of MMC/SD Card */
|
||||
typedef struct MMC_INFO
|
||||
{
|
||||
int id; /* Card index */
|
||||
int sd; /* MMC or SD card */
|
||||
int rca; /* RCA */
|
||||
u32 scr; /* SCR 63:32*/
|
||||
int flags; /* Ejected, inserted */
|
||||
enum card_state state; /* empty, ident, ready, whatever */
|
||||
|
||||
/* Card specific information */
|
||||
struct mmc_cid cid;
|
||||
struct mmc_csd csd;
|
||||
u32 block_num;
|
||||
u32 block_len;
|
||||
u32 erase_unit;
|
||||
} mmc_info;
|
||||
|
||||
mmc_info mmcinfo;
|
||||
|
||||
struct mmc_request {
|
||||
int index; /* Slot index - used for CS lines */
|
||||
int cmd; /* Command to send */
|
||||
u32 arg; /* Argument to send */
|
||||
enum mmc_rsp_t rtype; /* Response type expected */
|
||||
|
||||
/* Data transfer (these may be modified at the low level) */
|
||||
u16 nob; /* Number of blocks to transfer*/
|
||||
u16 block_len; /* Block length */
|
||||
u8 *buffer; /* Data buffer */
|
||||
u32 cnt; /* Data length, for PIO */
|
||||
|
||||
/* Results */
|
||||
u8 response[18]; /* Buffer to store response - CRC is optional */
|
||||
enum mmc_result_t result;
|
||||
};
|
||||
|
||||
char * mmc_result_to_string(int);
|
||||
int mmc_unpack_csd(struct mmc_request *request, struct mmc_csd *csd);
|
||||
int mmc_unpack_r1(struct mmc_request *request, struct mmc_response_r1 *r1, enum card_state state);
|
||||
int mmc_unpack_r6(struct mmc_request *request, struct mmc_response_r1 *r1, enum card_state state, int *rca);
|
||||
int mmc_unpack_scr(struct mmc_request *request, struct mmc_response_r1 *r1, enum card_state state, u32 *scr);
|
||||
int mmc_unpack_cid(struct mmc_request *request, struct mmc_cid *cid);
|
||||
int mmc_unpack_r3(struct mmc_request *request, struct mmc_response_r3 *r3);
|
||||
|
||||
void mmc_send_cmd(struct mmc_request *request, int cmd, u32 arg,
|
||||
u16 nob, u16 block_len, enum mmc_rsp_t rtype, u8 *buffer);
|
||||
u32 mmc_tran_speed(u8 ts);
|
||||
void jz_mmc_set_clock(int sd, u32 rate);
|
||||
void jz_mmc_hardware_init(void);
|
||||
|
||||
static inline void mmc_simple_cmd(struct mmc_request *request, int cmd, u32 arg, enum mmc_rsp_t rtype)
|
||||
{
|
||||
mmc_send_cmd( request, cmd, arg, 0, 0, rtype, 0);
|
||||
}
|
||||
|
||||
int mmc_legacy_init(int verbose);
|
||||
int mmc_read(ulong src, uchar *dst, int size);
|
||||
int mmc_write(uchar *src, ulong dst, int size);
|
||||
int mmc2info(ulong addr);
|
||||
|
||||
#endif /* __MMC_JZMMC_H__ */
|
||||
141
package/boot/uboot-xburst/files/cpu/mips/jz_serial.c
Normal file
141
package/boot/uboot-xburst/files/cpu/mips/jz_serial.c
Normal file
@@ -0,0 +1,141 @@
|
||||
/*
|
||||
* Jz47xx UART support
|
||||
*
|
||||
* Hardcoded to UART 0 for now
|
||||
* Options also hardcoded to 8N1
|
||||
*
|
||||
* Copyright (c) 2005
|
||||
* Ingenic Semiconductor, <jlwei@ingenic.cn>
|
||||
*
|
||||
* 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 <config.h>
|
||||
|
||||
#if defined(CONFIG_JZ4740)
|
||||
|
||||
#include <common.h>
|
||||
|
||||
#include <asm/jz4740.h>
|
||||
|
||||
#undef UART_BASE
|
||||
#ifndef CONFIG_SYS_UART_BASE
|
||||
#define UART_BASE UART0_BASE
|
||||
#else
|
||||
#define UART_BASE CONFIG_SYS_UART_BASE
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* serial_init - initialize a channel
|
||||
*
|
||||
* This routine initializes the number of data bits, parity
|
||||
* and set the selected baud rate. Interrupts are disabled.
|
||||
* Set the modem control signals if the option is selected.
|
||||
*
|
||||
* RETURNS: N/A
|
||||
*/
|
||||
|
||||
int serial_init (void)
|
||||
{
|
||||
#if !defined(CONFIG_NAND_U_BOOT) || defined(CONFIG_NAND_SPL)
|
||||
volatile u8 *uart_fcr = (volatile u8 *)(UART_BASE + OFF_FCR);
|
||||
volatile u8 *uart_lcr = (volatile u8 *)(UART_BASE + OFF_LCR);
|
||||
volatile u8 *uart_ier = (volatile u8 *)(UART_BASE + OFF_IER);
|
||||
volatile u8 *uart_sircr = (volatile u8 *)(UART_BASE + OFF_SIRCR);
|
||||
|
||||
/* Disable port interrupts while changing hardware */
|
||||
*uart_ier = 0;
|
||||
|
||||
/* Disable UART unit function */
|
||||
*uart_fcr = ~UART_FCR_UUE;
|
||||
|
||||
/* Set both receiver and transmitter in UART mode (not SIR) */
|
||||
*uart_sircr = ~(SIRCR_RSIRE | SIRCR_TSIRE);
|
||||
|
||||
/* Set databits, stopbits and parity. (8-bit data, 1 stopbit, no parity) */
|
||||
*uart_lcr = UART_LCR_WLEN_8 | UART_LCR_STOP_1;
|
||||
|
||||
/* Set baud rate */
|
||||
serial_setbrg();
|
||||
|
||||
/* Enable UART unit, enable and clear FIFO */
|
||||
*uart_fcr = UART_FCR_UUE | UART_FCR_FE | UART_FCR_TFLS | UART_FCR_RFLS;
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
void serial_setbrg (void)
|
||||
{
|
||||
volatile u8 *uart_lcr = (volatile u8 *)(UART_BASE + OFF_LCR);
|
||||
volatile u8 *uart_dlhr = (volatile u8 *)(UART_BASE + OFF_DLHR);
|
||||
volatile u8 *uart_dllr = (volatile u8 *)(UART_BASE + OFF_DLLR);
|
||||
u32 baud_div, tmp;
|
||||
|
||||
baud_div = CONFIG_SYS_EXTAL / 16 / CONFIG_BAUDRATE;
|
||||
|
||||
tmp = *uart_lcr;
|
||||
tmp |= UART_LCR_DLAB;
|
||||
*uart_lcr = tmp;
|
||||
|
||||
*uart_dlhr = (baud_div >> 8) & 0xff;
|
||||
*uart_dllr = baud_div & 0xff;
|
||||
|
||||
tmp &= ~UART_LCR_DLAB;
|
||||
*uart_lcr = tmp;
|
||||
}
|
||||
|
||||
void serial_putc (const char c)
|
||||
{
|
||||
volatile u8 *uart_lsr = (volatile u8 *)(UART_BASE + OFF_LSR);
|
||||
volatile u8 *uart_tdr = (volatile u8 *)(UART_BASE + OFF_TDR);
|
||||
|
||||
if (c == '\n') serial_putc ('\r');
|
||||
|
||||
/* Wait for fifo to shift out some bytes */
|
||||
while ( !((*uart_lsr & (UART_LSR_TDRQ | UART_LSR_TEMT)) == 0x60) );
|
||||
|
||||
*uart_tdr = (u8)c;
|
||||
}
|
||||
|
||||
void serial_puts (const char *s)
|
||||
{
|
||||
while (*s) {
|
||||
serial_putc (*s++);
|
||||
}
|
||||
}
|
||||
|
||||
int serial_getc (void)
|
||||
{
|
||||
volatile u8 *uart_rdr = (volatile u8 *)(UART_BASE + OFF_RDR);
|
||||
|
||||
while (!serial_tstc());
|
||||
|
||||
return *uart_rdr;
|
||||
}
|
||||
|
||||
int serial_tstc (void)
|
||||
{
|
||||
volatile u8 *uart_lsr = (volatile u8 *)(UART_BASE + OFF_LSR);
|
||||
|
||||
if (*uart_lsr & UART_LSR_DR) {
|
||||
/* Data in rfifo */
|
||||
return (1);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
273
package/boot/uboot-xburst/files/cpu/mips/mmc_protocol.h
Normal file
273
package/boot/uboot-xburst/files/cpu/mips/mmc_protocol.h
Normal file
@@ -0,0 +1,273 @@
|
||||
/*
|
||||
**********************************************************************
|
||||
*
|
||||
* uC/MMC
|
||||
*
|
||||
* (c) Copyright 2005 - 2007, Ingenic Semiconductor, Inc
|
||||
* All rights reserved.
|
||||
*
|
||||
***********************************************************************
|
||||
|
||||
----------------------------------------------------------------------
|
||||
File : mmc_protocol.h
|
||||
Purpose : MMC protocol definitions.
|
||||
|
||||
----------------------------------------------------------------------
|
||||
Version-Date-----Author-Explanation
|
||||
----------------------------------------------------------------------
|
||||
1.00.00 20060831 WeiJianli First release
|
||||
|
||||
----------------------------------------------------------------------
|
||||
Known problems or limitations with current version
|
||||
----------------------------------------------------------------------
|
||||
(none)
|
||||
---------------------------END-OF-HEADER------------------------------
|
||||
*/
|
||||
|
||||
#ifndef __MMC_PROTOCOL__
|
||||
#define __MMC_PROTOCOL__
|
||||
|
||||
/* Standard MMC/SD clock speeds */
|
||||
#define MMC_CLOCK_SLOW 400000 /* 400 kHz for initial setup */
|
||||
#define MMC_CLOCK_FAST 20000000 /* 20 MHz for maximum for normal operation */
|
||||
#define SD_CLOCK_FAST 24000000 /* 24 MHz for SD Cards */
|
||||
|
||||
/* Extra MMC commands for state control */
|
||||
/* Use negative numbers to disambiguate */
|
||||
#define MMC_CIM_RESET -1
|
||||
|
||||
/* Standard MMC commands (3.1) type argument response */
|
||||
/* class 1 */
|
||||
#define MMC_GO_IDLE_STATE 0 /* bc */
|
||||
#define MMC_SEND_OP_COND 1 /* bcr [31:0] OCR R3 */
|
||||
#define MMC_ALL_SEND_CID 2 /* bcr R2 */
|
||||
#define MMC_SET_RELATIVE_ADDR 3 /* ac [31:16] RCA R1 */
|
||||
#define MMC_SET_DSR 4 /* bc [31:16] RCA */
|
||||
#define MMC_SELECT_CARD 7 /* ac [31:16] RCA R1 */
|
||||
#define MMC_SEND_CSD 9 /* ac [31:16] RCA R2 */
|
||||
#define MMC_SEND_CID 10 /* ac [31:16] RCA R2 */
|
||||
#define MMC_READ_DAT_UNTIL_STOP 11 /* adtc [31:0] dadr R1 */
|
||||
#define MMC_STOP_TRANSMISSION 12 /* ac R1b */
|
||||
#define MMC_SEND_STATUS 13 /* ac [31:16] RCA R1 */
|
||||
#define MMC_GO_INACTIVE_STATE 15 /* ac [31:16] RCA */
|
||||
|
||||
/* class 2 */
|
||||
#define MMC_SET_BLOCKLEN 16 /* ac [31:0] block len R1 */
|
||||
#define MMC_READ_SINGLE_BLOCK 17 /* adtc [31:0] data addr R1 */
|
||||
#define MMC_READ_MULTIPLE_BLOCK 18 /* adtc [31:0] data addr R1 */
|
||||
|
||||
/* class 3 */
|
||||
#define MMC_WRITE_DAT_UNTIL_STOP 20 /* adtc [31:0] data addr R1 */
|
||||
|
||||
/* class 4 */
|
||||
#define MMC_SET_BLOCK_COUNT 23 /* adtc [31:0] data addr R1 */
|
||||
#define MMC_WRITE_BLOCK 24 /* adtc [31:0] data addr R1 */
|
||||
#define MMC_WRITE_MULTIPLE_BLOCK 25 /* adtc R1 */
|
||||
#define MMC_PROGRAM_CID 26 /* adtc R1 */
|
||||
#define MMC_PROGRAM_CSD 27 /* adtc R1 */
|
||||
|
||||
/* class 6 */
|
||||
#define MMC_SET_WRITE_PROT 28 /* ac [31:0] data addr R1b */
|
||||
#define MMC_CLR_WRITE_PROT 29 /* ac [31:0] data addr R1b */
|
||||
#define MMC_SEND_WRITE_PROT 30 /* adtc [31:0] wpdata addr R1 */
|
||||
|
||||
/* class 5 */
|
||||
#define MMC_ERASE_GROUP_START 35 /* ac [31:0] data addr R1 */
|
||||
#define MMC_ERASE_GROUP_END 36 /* ac [31:0] data addr R1 */
|
||||
#define MMC_ERASE 37 /* ac R1b */
|
||||
|
||||
/* class 9 */
|
||||
#define MMC_FAST_IO 39 /* ac <Complex> R4 */
|
||||
#define MMC_GO_IRQ_STATE 40 /* bcr R5 */
|
||||
|
||||
/* class 7 */
|
||||
#define MMC_LOCK_UNLOCK 42 /* adtc R1b */
|
||||
|
||||
/* class 8 */
|
||||
#define MMC_APP_CMD 55 /* ac [31:16] RCA R1 */
|
||||
#define MMC_GEN_CMD 56 /* adtc [0] RD/WR R1b */
|
||||
|
||||
/* SD class */
|
||||
#define SD_SEND_OP_COND 41 /* bcr [31:0] OCR R3 */
|
||||
#define SET_BUS_WIDTH 6 /* ac [1:0] bus width R1 */
|
||||
#define SEND_SCR 51 /* adtc [31:0] staff R1 */
|
||||
|
||||
/* Don't change the order of these; they are used in dispatch tables */
|
||||
enum mmc_rsp_t {
|
||||
RESPONSE_NONE = 0,
|
||||
RESPONSE_R1 = 1,
|
||||
RESPONSE_R1B = 2,
|
||||
RESPONSE_R2_CID = 3,
|
||||
RESPONSE_R2_CSD = 4,
|
||||
RESPONSE_R3 = 5,
|
||||
RESPONSE_R4 = 6,
|
||||
RESPONSE_R5 = 7,
|
||||
RESPONSE_R6 = 8,
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
MMC status in R1
|
||||
Type
|
||||
e : error bit
|
||||
s : status bit
|
||||
r : detected and set for the actual command response
|
||||
x : detected and set during command execution. the host must poll
|
||||
the card by sending status command in order to read these bits.
|
||||
Clear condition
|
||||
a : according to the card state
|
||||
b : always related to the previous command. Reception of
|
||||
a valid command will clear it (with a delay of one command)
|
||||
c : clear by read
|
||||
*/
|
||||
|
||||
#define R1_OUT_OF_RANGE (1 << 31) /* er, c */
|
||||
#define R1_ADDRESS_ERROR (1 << 30) /* erx, c */
|
||||
#define R1_BLOCK_LEN_ERROR (1 << 29) /* er, c */
|
||||
#define R1_ERASE_SEQ_ERROR (1 << 28) /* er, c */
|
||||
#define R1_ERASE_PARAM (1 << 27) /* ex, c */
|
||||
#define R1_WP_VIOLATION (1 << 26) /* erx, c */
|
||||
#define R1_CARD_IS_LOCKED (1 << 25) /* sx, a */
|
||||
#define R1_LOCK_UNLOCK_FAILED (1 << 24) /* erx, c */
|
||||
#define R1_COM_CRC_ERROR (1 << 23) /* er, b */
|
||||
#define R1_ILLEGAL_COMMAND (1 << 22) /* er, b */
|
||||
#define R1_CARD_ECC_FAILED (1 << 21) /* ex, c */
|
||||
#define R1_CC_ERROR (1 << 20) /* erx, c */
|
||||
#define R1_ERROR (1 << 19) /* erx, c */
|
||||
#define R1_UNDERRUN (1 << 18) /* ex, c */
|
||||
#define R1_OVERRUN (1 << 17) /* ex, c */
|
||||
#define R1_CID_CSD_OVERWRITE (1 << 16) /* erx, c, CID/CSD overwrite */
|
||||
#define R1_WP_ERASE_SKIP (1 << 15) /* sx, c */
|
||||
#define R1_CARD_ECC_DISABLED (1 << 14) /* sx, a */
|
||||
#define R1_ERASE_RESET (1 << 13) /* sr, c */
|
||||
#define R1_STATUS(x) (x & 0xFFFFE000)
|
||||
#define R1_CURRENT_STATE(x) ((x & 0x00001E00) >> 9) /* sx, b (4 bits) */
|
||||
#define R1_READY_FOR_DATA (1 << 8) /* sx, a */
|
||||
#define R1_APP_CMD (1 << 7) /* sr, c */
|
||||
|
||||
enum card_state {
|
||||
CARD_STATE_EMPTY = -1,
|
||||
CARD_STATE_IDLE = 0,
|
||||
CARD_STATE_READY = 1,
|
||||
CARD_STATE_IDENT = 2,
|
||||
CARD_STATE_STBY = 3,
|
||||
CARD_STATE_TRAN = 4,
|
||||
CARD_STATE_DATA = 5,
|
||||
CARD_STATE_RCV = 6,
|
||||
CARD_STATE_PRG = 7,
|
||||
CARD_STATE_DIS = 8,
|
||||
};
|
||||
|
||||
/* These are unpacked versions of the actual responses */
|
||||
|
||||
struct mmc_response_r1 {
|
||||
u8 cmd;
|
||||
u32 status;
|
||||
};
|
||||
|
||||
typedef struct mmc_cid {
|
||||
u8 mid;
|
||||
u16 oid;
|
||||
u8 pnm[7]; /* Product name (we null-terminate) */
|
||||
u8 prv;
|
||||
u32 psn;
|
||||
u8 mdt;
|
||||
}mmc_cid_t;
|
||||
|
||||
typedef struct mmc_csd {
|
||||
u8 csd_structure;
|
||||
u8 spec_vers;
|
||||
u8 taac;
|
||||
u8 nsac;
|
||||
u8 tran_speed;
|
||||
u16 ccc;
|
||||
u8 read_bl_len;
|
||||
u8 read_bl_partial;
|
||||
u8 write_blk_misalign;
|
||||
u8 read_blk_misalign;
|
||||
u8 dsr_imp;
|
||||
u16 c_size;
|
||||
u8 vdd_r_curr_min;
|
||||
u8 vdd_r_curr_max;
|
||||
u8 vdd_w_curr_min;
|
||||
u8 vdd_w_curr_max;
|
||||
u8 c_size_mult;
|
||||
union {
|
||||
struct { /* MMC system specification version 3.1 */
|
||||
u8 erase_grp_size;
|
||||
u8 erase_grp_mult;
|
||||
} v31;
|
||||
struct { /* MMC system specification version 2.2 */
|
||||
u8 sector_size;
|
||||
u8 erase_grp_size;
|
||||
} v22;
|
||||
} erase;
|
||||
u8 wp_grp_size;
|
||||
u8 wp_grp_enable;
|
||||
u8 default_ecc;
|
||||
u8 r2w_factor;
|
||||
u8 write_bl_len;
|
||||
u8 write_bl_partial;
|
||||
u8 file_format_grp;
|
||||
u8 copy;
|
||||
u8 perm_write_protect;
|
||||
u8 tmp_write_protect;
|
||||
u8 file_format;
|
||||
u8 ecc;
|
||||
}mmc_csd_t;;
|
||||
|
||||
struct mmc_response_r3 {
|
||||
u32 ocr;
|
||||
};
|
||||
|
||||
#define MMC_VDD_145_150 0x00000001 /* VDD voltage 1.45 - 1.50 */
|
||||
#define MMC_VDD_150_155 0x00000002 /* VDD voltage 1.50 - 1.55 */
|
||||
#define MMC_VDD_155_160 0x00000004 /* VDD voltage 1.55 - 1.60 */
|
||||
#define MMC_VDD_160_165 0x00000008 /* VDD voltage 1.60 - 1.65 */
|
||||
#define MMC_VDD_165_170 0x00000010 /* VDD voltage 1.65 - 1.70 */
|
||||
#define MMC_VDD_17_18 0x00000020 /* VDD voltage 1.7 - 1.8 */
|
||||
#define MMC_VDD_18_19 0x00000040 /* VDD voltage 1.8 - 1.9 */
|
||||
#define MMC_VDD_19_20 0x00000080 /* VDD voltage 1.9 - 2.0 */
|
||||
#define MMC_VDD_20_21 0x00000100 /* VDD voltage 2.0 ~ 2.1 */
|
||||
#define MMC_VDD_21_22 0x00000200 /* VDD voltage 2.1 ~ 2.2 */
|
||||
#define MMC_VDD_22_23 0x00000400 /* VDD voltage 2.2 ~ 2.3 */
|
||||
#define MMC_VDD_23_24 0x00000800 /* VDD voltage 2.3 ~ 2.4 */
|
||||
#define MMC_VDD_24_25 0x00001000 /* VDD voltage 2.4 ~ 2.5 */
|
||||
#define MMC_VDD_25_26 0x00002000 /* VDD voltage 2.5 ~ 2.6 */
|
||||
#define MMC_VDD_26_27 0x00004000 /* VDD voltage 2.6 ~ 2.7 */
|
||||
#define MMC_VDD_27_28 0x00008000 /* VDD voltage 2.7 ~ 2.8 */
|
||||
#define MMC_VDD_28_29 0x00010000 /* VDD voltage 2.8 ~ 2.9 */
|
||||
#define MMC_VDD_29_30 0x00020000 /* VDD voltage 2.9 ~ 3.0 */
|
||||
#define MMC_VDD_30_31 0x00040000 /* VDD voltage 3.0 ~ 3.1 */
|
||||
#define MMC_VDD_31_32 0x00080000 /* VDD voltage 3.1 ~ 3.2 */
|
||||
#define MMC_VDD_32_33 0x00100000 /* VDD voltage 3.2 ~ 3.3 */
|
||||
#define MMC_VDD_33_34 0x00200000 /* VDD voltage 3.3 ~ 3.4 */
|
||||
#define MMC_VDD_34_35 0x00400000 /* VDD voltage 3.4 ~ 3.5 */
|
||||
#define MMC_VDD_35_36 0x00800000 /* VDD voltage 3.5 ~ 3.6 */
|
||||
#define MMC_CARD_BUSY 0x80000000 /* Card Power up status bit */
|
||||
|
||||
|
||||
/* CSD field definitions */
|
||||
|
||||
#define CSD_STRUCT_VER_1_0 0 /* Valid for system specification 1.0 - 1.2 */
|
||||
#define CSD_STRUCT_VER_1_1 1 /* Valid for system specification 1.4 - 2.2 */
|
||||
#define CSD_STRUCT_VER_1_2 2 /* Valid for system specification 3.1 */
|
||||
|
||||
#define CSD_SPEC_VER_0 0 /* Implements system specification 1.0 - 1.2 */
|
||||
#define CSD_SPEC_VER_1 1 /* Implements system specification 1.4 */
|
||||
#define CSD_SPEC_VER_2 2 /* Implements system specification 2.0 - 2.2 */
|
||||
#define CSD_SPEC_VER_3 3 /* Implements system specification 3.1 */
|
||||
|
||||
#if MMC_DEBUG_LEVEL
|
||||
|
||||
#define DEBUG(n, args...) \
|
||||
do { \
|
||||
if (n <= MMC_DEBUG_LEVEL) { \
|
||||
printf(args); \
|
||||
} \
|
||||
} while(0)
|
||||
#else
|
||||
#define DEBUG(n, args...)
|
||||
#endif /* MMC_DEBUG_EN */
|
||||
|
||||
#endif /* __MMC_PROTOCOL__ */
|
||||
420
package/boot/uboot-xburst/files/cpu/mips/nanonote_gpm940b0.c
Normal file
420
package/boot/uboot-xburst/files/cpu/mips/nanonote_gpm940b0.c
Normal file
@@ -0,0 +1,420 @@
|
||||
/*
|
||||
* JzRISC lcd controller
|
||||
*
|
||||
* xiangfu liu <xiangfu.z@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 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 <config.h>
|
||||
#include <common.h>
|
||||
#include <lcd.h>
|
||||
|
||||
#include <asm/io.h> /* virt_to_phys() */
|
||||
|
||||
#include <asm/jz4740.h>
|
||||
#include "nanonote_gpm940b0.h"
|
||||
|
||||
#define align2(n) (n)=((((n)+1)>>1)<<1)
|
||||
#define align4(n) (n)=((((n)+3)>>2)<<2)
|
||||
#define align8(n) (n)=((((n)+7)>>3)<<3)
|
||||
|
||||
struct jzfb_info {
|
||||
unsigned int cfg; /* panel mode and pin usage etc. */
|
||||
unsigned int w;
|
||||
unsigned int h;
|
||||
unsigned int bpp; /* bit per pixel */
|
||||
unsigned int fclk; /* frame clk */
|
||||
unsigned int hsw; /* hsync width, in pclk */
|
||||
unsigned int vsw; /* vsync width, in line count */
|
||||
unsigned int elw; /* end of line, in pclk */
|
||||
unsigned int blw; /* begin of line, in pclk */
|
||||
unsigned int efw; /* end of frame, in line count */
|
||||
unsigned int bfw; /* begin of frame, in line count */
|
||||
};
|
||||
|
||||
static struct jzfb_info jzfb = {
|
||||
MODE_8BIT_SERIAL_TFT | PCLK_N | HSYNC_N | VSYNC_N,
|
||||
320, 240, 32, 70, 1, 1, 273, 140, 1, 20
|
||||
};
|
||||
|
||||
vidinfo_t panel_info = {
|
||||
320, 240, LCD_BPP,
|
||||
};
|
||||
|
||||
int lcd_line_length;
|
||||
|
||||
int lcd_color_fg;
|
||||
int lcd_color_bg;
|
||||
/*
|
||||
* Frame buffer memory information
|
||||
*/
|
||||
void *lcd_base; /* Start of framebuffer memory */
|
||||
void *lcd_console_address; /* Start of console buffer */
|
||||
|
||||
short console_col;
|
||||
short console_row;
|
||||
|
||||
void lcd_ctrl_init (void *lcdbase);
|
||||
void lcd_enable (void);
|
||||
void lcd_disable (void);
|
||||
|
||||
static int jz_lcd_init_mem(void *lcdbase, vidinfo_t *vid);
|
||||
static void jz_lcd_desc_init(vidinfo_t *vid);
|
||||
static int jz_lcd_hw_init( vidinfo_t *vid );
|
||||
extern int flush_cache_all(void);
|
||||
|
||||
void lcd_ctrl_init (void *lcdbase)
|
||||
{
|
||||
__lcd_display_pin_init();
|
||||
|
||||
jz_lcd_init_mem(lcdbase, &panel_info);
|
||||
jz_lcd_desc_init(&panel_info);
|
||||
jz_lcd_hw_init(&panel_info);
|
||||
|
||||
__lcd_display_on() ;
|
||||
}
|
||||
|
||||
/*
|
||||
* Before enabled lcd controller, lcd registers should be configured correctly.
|
||||
*/
|
||||
|
||||
void lcd_enable (void)
|
||||
{
|
||||
REG_LCD_CTRL &= ~(1<<4); /* LCDCTRL.DIS */
|
||||
REG_LCD_CTRL |= 1<<3; /* LCDCTRL.ENA*/
|
||||
}
|
||||
|
||||
void lcd_disable (void)
|
||||
{
|
||||
REG_LCD_CTRL |= (1<<4); /* LCDCTRL.DIS, regular disable */
|
||||
/* REG_LCD_CTRL |= (1<<3); */ /* LCDCTRL.DIS, quikly disable */
|
||||
}
|
||||
|
||||
static int jz_lcd_init_mem(void *lcdbase, vidinfo_t *vid)
|
||||
{
|
||||
u_long palette_mem_size;
|
||||
struct jz_fb_info *fbi = &vid->jz_fb;
|
||||
int fb_size = vid->vl_row * (vid->vl_col * NBITS (vid->vl_bpix)) / 8;
|
||||
|
||||
fbi->screen = (u_long)lcdbase;
|
||||
fbi->palette_size = 256;
|
||||
palette_mem_size = fbi->palette_size * sizeof(u16);
|
||||
|
||||
debug("jz_lcd.c palette_mem_size = 0x%08lx\n", (u_long) palette_mem_size);
|
||||
/* locate palette and descs at end of page following fb */
|
||||
fbi->palette = (u_long)lcdbase + fb_size + PAGE_SIZE - palette_mem_size;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void jz_lcd_desc_init(vidinfo_t *vid)
|
||||
{
|
||||
struct jz_fb_info * fbi;
|
||||
fbi = &vid->jz_fb;
|
||||
fbi->dmadesc_fblow = (struct jz_fb_dma_descriptor *)((unsigned int)fbi->palette - 3*16);
|
||||
fbi->dmadesc_fbhigh = (struct jz_fb_dma_descriptor *)((unsigned int)fbi->palette - 2*16);
|
||||
fbi->dmadesc_palette = (struct jz_fb_dma_descriptor *)((unsigned int)fbi->palette - 1*16);
|
||||
|
||||
#define BYTES_PER_PANEL (vid->vl_col * vid->vl_row * NBITS(vid->vl_bpix) / 8)
|
||||
|
||||
/* populate descriptors */
|
||||
fbi->dmadesc_fblow->fdadr = virt_to_phys(fbi->dmadesc_fblow);
|
||||
fbi->dmadesc_fblow->fsadr = virt_to_phys((void *)(fbi->screen + BYTES_PER_PANEL));
|
||||
fbi->dmadesc_fblow->fidr = 0;
|
||||
fbi->dmadesc_fblow->ldcmd = BYTES_PER_PANEL / 4 ;
|
||||
|
||||
fbi->fdadr1 = virt_to_phys(fbi->dmadesc_fblow); /* only used in dual-panel mode */
|
||||
|
||||
fbi->dmadesc_fbhigh->fsadr = virt_to_phys((void *)fbi->screen);
|
||||
fbi->dmadesc_fbhigh->fidr = 0;
|
||||
fbi->dmadesc_fbhigh->ldcmd = BYTES_PER_PANEL / 4; /* length in word */
|
||||
|
||||
fbi->dmadesc_palette->fsadr = virt_to_phys((void *)fbi->palette);
|
||||
fbi->dmadesc_palette->fidr = 0;
|
||||
fbi->dmadesc_palette->ldcmd = (fbi->palette_size * 2)/4 | (1<<28);
|
||||
|
||||
if(NBITS(vid->vl_bpix) < 12)
|
||||
{
|
||||
/* assume any mode with <12 bpp is palette driven */
|
||||
fbi->dmadesc_palette->fdadr = virt_to_phys(fbi->dmadesc_fbhigh);
|
||||
fbi->dmadesc_fbhigh->fdadr = virt_to_phys(fbi->dmadesc_palette);
|
||||
/* flips back and forth between pal and fbhigh */
|
||||
fbi->fdadr0 = virt_to_phys(fbi->dmadesc_palette);
|
||||
} else {
|
||||
/* palette shouldn't be loaded in true-color mode */
|
||||
fbi->dmadesc_fbhigh->fdadr = virt_to_phys((void *)fbi->dmadesc_fbhigh);
|
||||
fbi->fdadr0 = virt_to_phys(fbi->dmadesc_fbhigh); /* no pal just fbhigh */
|
||||
}
|
||||
|
||||
flush_cache_all();
|
||||
}
|
||||
|
||||
static int jz_lcd_hw_init(vidinfo_t *vid)
|
||||
{
|
||||
struct jz_fb_info *fbi = &vid->jz_fb;
|
||||
unsigned int val = 0;
|
||||
unsigned int pclk;
|
||||
unsigned int stnH;
|
||||
int pll_div;
|
||||
|
||||
/* Setting Control register */
|
||||
switch (jzfb.bpp) {
|
||||
case 1:
|
||||
val |= LCD_CTRL_BPP_1;
|
||||
break;
|
||||
case 2:
|
||||
val |= LCD_CTRL_BPP_2;
|
||||
break;
|
||||
case 4:
|
||||
val |= LCD_CTRL_BPP_4;
|
||||
break;
|
||||
case 8:
|
||||
val |= LCD_CTRL_BPP_8;
|
||||
break;
|
||||
case 15:
|
||||
val |= LCD_CTRL_RGB555;
|
||||
case 16:
|
||||
val |= LCD_CTRL_BPP_16;
|
||||
break;
|
||||
case 17 ... 32:
|
||||
val |= LCD_CTRL_BPP_18_24; /* target is 4bytes/pixel */
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("jz_lcd.c The BPP %d is not supported\n", jzfb.bpp);
|
||||
val |= LCD_CTRL_BPP_16;
|
||||
break;
|
||||
}
|
||||
|
||||
switch (jzfb.cfg & MODE_MASK) {
|
||||
case MODE_STN_MONO_DUAL:
|
||||
case MODE_STN_COLOR_DUAL:
|
||||
case MODE_STN_MONO_SINGLE:
|
||||
case MODE_STN_COLOR_SINGLE:
|
||||
switch (jzfb.bpp) {
|
||||
case 1:
|
||||
/* val |= LCD_CTRL_PEDN; */
|
||||
case 2:
|
||||
val |= LCD_CTRL_FRC_2;
|
||||
break;
|
||||
case 4:
|
||||
val |= LCD_CTRL_FRC_4;
|
||||
break;
|
||||
case 8:
|
||||
default:
|
||||
val |= LCD_CTRL_FRC_16;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
val |= LCD_CTRL_BST_16; /* Burst Length is 16WORD=64Byte */
|
||||
val |= LCD_CTRL_OFUP; /* OutFIFO underrun protect */
|
||||
|
||||
switch (jzfb.cfg & MODE_MASK) {
|
||||
case MODE_STN_MONO_DUAL:
|
||||
case MODE_STN_COLOR_DUAL:
|
||||
case MODE_STN_MONO_SINGLE:
|
||||
case MODE_STN_COLOR_SINGLE:
|
||||
switch (jzfb.cfg & STN_DAT_PINMASK) {
|
||||
case STN_DAT_PIN1:
|
||||
/* Do not adjust the hori-param value. */
|
||||
break;
|
||||
case STN_DAT_PIN2:
|
||||
align2(jzfb.hsw);
|
||||
align2(jzfb.elw);
|
||||
align2(jzfb.blw);
|
||||
break;
|
||||
case STN_DAT_PIN4:
|
||||
align4(jzfb.hsw);
|
||||
align4(jzfb.elw);
|
||||
align4(jzfb.blw);
|
||||
break;
|
||||
case STN_DAT_PIN8:
|
||||
align8(jzfb.hsw);
|
||||
align8(jzfb.elw);
|
||||
align8(jzfb.blw);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
REG_LCD_CTRL = val;
|
||||
|
||||
switch (jzfb.cfg & MODE_MASK) {
|
||||
case MODE_STN_MONO_DUAL:
|
||||
case MODE_STN_COLOR_DUAL:
|
||||
case MODE_STN_MONO_SINGLE:
|
||||
case MODE_STN_COLOR_SINGLE:
|
||||
if (((jzfb.cfg & MODE_MASK) == MODE_STN_MONO_DUAL) ||
|
||||
((jzfb.cfg & MODE_MASK) == MODE_STN_COLOR_DUAL))
|
||||
stnH = jzfb.h >> 1;
|
||||
else
|
||||
stnH = jzfb.h;
|
||||
|
||||
REG_LCD_VSYNC = (0 << 16) | jzfb.vsw;
|
||||
REG_LCD_HSYNC = ((jzfb.blw+jzfb.w) << 16) | (jzfb.blw+jzfb.w+jzfb.hsw);
|
||||
|
||||
/* Screen setting */
|
||||
REG_LCD_VAT = ((jzfb.blw + jzfb.w + jzfb.hsw + jzfb.elw) << 16) | (stnH + jzfb.vsw + jzfb.bfw + jzfb.efw);
|
||||
REG_LCD_DAH = (jzfb.blw << 16) | (jzfb.blw + jzfb.w);
|
||||
REG_LCD_DAV = (0 << 16) | (stnH);
|
||||
|
||||
/* AC BIAs signal */
|
||||
REG_LCD_PS = (0 << 16) | (stnH+jzfb.vsw+jzfb.efw+jzfb.bfw);
|
||||
|
||||
break;
|
||||
|
||||
case MODE_TFT_GEN:
|
||||
case MODE_TFT_SHARP:
|
||||
case MODE_TFT_CASIO:
|
||||
case MODE_TFT_SAMSUNG:
|
||||
case MODE_8BIT_SERIAL_TFT:
|
||||
case MODE_TFT_18BIT:
|
||||
REG_LCD_VSYNC = (0 << 16) | jzfb.vsw;
|
||||
REG_LCD_HSYNC = (0 << 16) | jzfb.hsw;
|
||||
REG_LCD_DAV =((jzfb.vsw+jzfb.bfw) << 16) | (jzfb.vsw +jzfb.bfw+jzfb.h);
|
||||
REG_LCD_DAH = ((jzfb.hsw + jzfb.blw) << 16) | (jzfb.hsw + jzfb.blw + jzfb.w );
|
||||
REG_LCD_VAT = (((jzfb.blw + jzfb.w + jzfb.elw + jzfb.hsw)) << 16) \
|
||||
| (jzfb.vsw + jzfb.bfw + jzfb.h + jzfb.efw);
|
||||
break;
|
||||
}
|
||||
|
||||
switch (jzfb.cfg & MODE_MASK) {
|
||||
case MODE_TFT_SAMSUNG:
|
||||
{
|
||||
unsigned int total, tp_s, tp_e, ckv_s, ckv_e;
|
||||
unsigned int rev_s, rev_e, inv_s, inv_e;
|
||||
|
||||
pclk = val * (jzfb.w + jzfb.hsw + jzfb.elw + jzfb.blw) *
|
||||
(jzfb.h + jzfb.vsw + jzfb.efw + jzfb.bfw); /* Pixclk */
|
||||
|
||||
total = jzfb.blw + jzfb.w + jzfb.elw + jzfb.hsw;
|
||||
tp_s = jzfb.blw + jzfb.w + 1;
|
||||
tp_e = tp_s + 1;
|
||||
/* ckv_s = tp_s - jz_clocks.pixclk/(1000000000/4100); */
|
||||
ckv_s = tp_s - pclk/(1000000000/4100);
|
||||
ckv_e = tp_s + total;
|
||||
rev_s = tp_s - 11; /* -11.5 clk */
|
||||
rev_e = rev_s + total;
|
||||
inv_s = tp_s;
|
||||
inv_e = inv_s + total;
|
||||
REG_LCD_CLS = (tp_s << 16) | tp_e;
|
||||
REG_LCD_PS = (ckv_s << 16) | ckv_e;
|
||||
REG_LCD_SPL = (rev_s << 16) | rev_e;
|
||||
REG_LCD_REV = (inv_s << 16) | inv_e;
|
||||
jzfb.cfg |= STFT_REVHI | STFT_SPLHI;
|
||||
break;
|
||||
}
|
||||
case MODE_TFT_SHARP:
|
||||
{
|
||||
unsigned int total, cls_s, cls_e, ps_s, ps_e;
|
||||
unsigned int spl_s, spl_e, rev_s, rev_e;
|
||||
total = jzfb.blw + jzfb.w + jzfb.elw + jzfb.hsw;
|
||||
spl_s = 1;
|
||||
spl_e = spl_s + 1;
|
||||
cls_s = 0;
|
||||
cls_e = total - 60; /* > 4us (pclk = 80ns) */
|
||||
ps_s = cls_s;
|
||||
ps_e = cls_e;
|
||||
rev_s = total - 40; /* > 3us (pclk = 80ns) */
|
||||
rev_e = rev_s + total;
|
||||
jzfb.cfg |= STFT_PSHI;
|
||||
REG_LCD_SPL = (spl_s << 16) | spl_e;
|
||||
REG_LCD_CLS = (cls_s << 16) | cls_e;
|
||||
REG_LCD_PS = (ps_s << 16) | ps_e;
|
||||
REG_LCD_REV = (rev_s << 16) | rev_e;
|
||||
break;
|
||||
}
|
||||
case MODE_TFT_CASIO:
|
||||
break;
|
||||
}
|
||||
|
||||
/* Configure the LCD panel */
|
||||
REG_LCD_CFG = jzfb.cfg;
|
||||
|
||||
/* Timing setting */
|
||||
__cpm_stop_lcd();
|
||||
|
||||
val = jzfb.fclk; /* frame clk */
|
||||
if ( (jzfb.cfg & MODE_MASK) != MODE_8BIT_SERIAL_TFT) {
|
||||
pclk = val * (jzfb.w + jzfb.hsw + jzfb.elw + jzfb.blw) *
|
||||
(jzfb.h + jzfb.vsw + jzfb.efw + jzfb.bfw); /* Pixclk */
|
||||
} else {
|
||||
/* serial mode: Hsync period = 3*Width_Pixel */
|
||||
pclk = val * (jzfb.w*3 + jzfb.hsw + jzfb.elw + jzfb.blw) *
|
||||
(jzfb.h + jzfb.vsw + jzfb.efw + jzfb.bfw); /* Pixclk */
|
||||
}
|
||||
|
||||
if (((jzfb.cfg & MODE_MASK) == MODE_STN_COLOR_SINGLE) ||
|
||||
((jzfb.cfg & MODE_MASK) == MODE_STN_COLOR_DUAL))
|
||||
pclk = (pclk * 3);
|
||||
|
||||
if (((jzfb.cfg & MODE_MASK) == MODE_STN_COLOR_SINGLE) ||
|
||||
((jzfb.cfg & MODE_MASK) == MODE_STN_COLOR_DUAL) ||
|
||||
((jzfb.cfg & MODE_MASK) == MODE_STN_MONO_SINGLE) ||
|
||||
((jzfb.cfg & MODE_MASK) == MODE_STN_MONO_DUAL))
|
||||
pclk = pclk >> ((jzfb.cfg & STN_DAT_PINMASK) >> 4);
|
||||
|
||||
if (((jzfb.cfg & MODE_MASK) == MODE_STN_COLOR_DUAL) ||
|
||||
((jzfb.cfg & MODE_MASK) == MODE_STN_MONO_DUAL))
|
||||
pclk >>= 1;
|
||||
|
||||
pll_div = ( REG_CPM_CPCCR & CPM_CPCCR_PCS ); /* clock source,0:pllout/2 1: pllout */
|
||||
pll_div = pll_div ? 1 : 2 ;
|
||||
val = ( __cpm_get_pllout()/pll_div ) / pclk;
|
||||
val--;
|
||||
if ( val > 0x1ff ) {
|
||||
printf("CPM_LPCDR too large, set it to 0x1ff\n");
|
||||
val = 0x1ff;
|
||||
}
|
||||
__cpm_set_pixdiv(val);
|
||||
|
||||
val = pclk * 3 ; /* LCDClock > 2.5*Pixclock */
|
||||
if ( val > 150000000 ) {
|
||||
printf("Warning: LCDClock=%d\n, LCDClock must less or equal to 150MHz.\n", val);
|
||||
printf("Change LCDClock to 150MHz\n");
|
||||
val = 150000000;
|
||||
}
|
||||
val = ( __cpm_get_pllout()/pll_div ) / val;
|
||||
val--;
|
||||
if ( val > 0x1f ) {
|
||||
printf("CPM_CPCCR.LDIV too large, set it to 0x1f\n");
|
||||
val = 0x1f;
|
||||
}
|
||||
__cpm_set_ldiv( val );
|
||||
REG_CPM_CPCCR |= CPM_CPCCR_CE ; /* update divide */
|
||||
|
||||
__cpm_start_lcd();
|
||||
udelay(1000);
|
||||
|
||||
REG_LCD_DA0 = fbi->fdadr0; /* frame descripter*/
|
||||
|
||||
if (((jzfb.cfg & MODE_MASK) == MODE_STN_COLOR_DUAL) ||
|
||||
((jzfb.cfg & MODE_MASK) == MODE_STN_MONO_DUAL))
|
||||
REG_LCD_DA1 = fbi->fdadr1; /* frame descripter*/
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void lcd_setcolreg (ushort regno, ushort red, ushort green, ushort blue)
|
||||
{
|
||||
}
|
||||
|
||||
void lcd_initcolregs (void)
|
||||
{
|
||||
}
|
||||
234
package/boot/uboot-xburst/files/cpu/mips/nanonote_gpm940b0.h
Normal file
234
package/boot/uboot-xburst/files/cpu/mips/nanonote_gpm940b0.h
Normal file
@@ -0,0 +1,234 @@
|
||||
/*
|
||||
* JzRISC lcd controller
|
||||
*
|
||||
* xiangfu liu <xiangfu.z@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 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
|
||||
*/
|
||||
|
||||
#ifndef __QI_LB60_GPM940B0_H__
|
||||
#define __QI_LB60_GPM940B0_H__
|
||||
|
||||
#include <asm/io.h>
|
||||
|
||||
#define mdelay(n) udelay((n)*1000)
|
||||
|
||||
#define NR_PALETTE 256
|
||||
|
||||
struct lcd_desc{
|
||||
unsigned int next_desc; /* LCDDAx */
|
||||
unsigned int databuf; /* LCDSAx */
|
||||
unsigned int frame_id; /* LCDFIDx */
|
||||
unsigned int cmd; /* LCDCMDx */
|
||||
};
|
||||
|
||||
#define MODE_MASK 0x0f
|
||||
#define MODE_TFT_GEN 0x00
|
||||
#define MODE_TFT_SHARP 0x01
|
||||
#define MODE_TFT_CASIO 0x02
|
||||
#define MODE_TFT_SAMSUNG 0x03
|
||||
#define MODE_CCIR656_NONINT 0x04
|
||||
#define MODE_CCIR656_INT 0x05
|
||||
#define MODE_STN_COLOR_SINGLE 0x08
|
||||
#define MODE_STN_MONO_SINGLE 0x09
|
||||
#define MODE_STN_COLOR_DUAL 0x0a
|
||||
#define MODE_STN_MONO_DUAL 0x0b
|
||||
#define MODE_8BIT_SERIAL_TFT 0x0c
|
||||
|
||||
#define MODE_TFT_18BIT (1<<7)
|
||||
|
||||
#define STN_DAT_PIN1 (0x00 << 4)
|
||||
#define STN_DAT_PIN2 (0x01 << 4)
|
||||
#define STN_DAT_PIN4 (0x02 << 4)
|
||||
#define STN_DAT_PIN8 (0x03 << 4)
|
||||
#define STN_DAT_PINMASK STN_DAT_PIN8
|
||||
|
||||
#define STFT_PSHI (1 << 15)
|
||||
#define STFT_CLSHI (1 << 14)
|
||||
#define STFT_SPLHI (1 << 13)
|
||||
#define STFT_REVHI (1 << 12)
|
||||
|
||||
#define SYNC_MASTER (0 << 16)
|
||||
#define SYNC_SLAVE (1 << 16)
|
||||
|
||||
#define DE_P (0 << 9)
|
||||
#define DE_N (1 << 9)
|
||||
|
||||
#define PCLK_P (0 << 10)
|
||||
#define PCLK_N (1 << 10)
|
||||
|
||||
#define HSYNC_P (0 << 11)
|
||||
#define HSYNC_N (1 << 11)
|
||||
|
||||
#define VSYNC_P (0 << 8)
|
||||
#define VSYNC_N (1 << 8)
|
||||
|
||||
#define DATA_NORMAL (0 << 17)
|
||||
#define DATA_INVERSE (1 << 17)
|
||||
|
||||
|
||||
/* Jz LCDFB supported I/O controls. */
|
||||
#define FBIOSETBACKLIGHT 0x4688
|
||||
#define FBIODISPON 0x4689
|
||||
#define FBIODISPOFF 0x468a
|
||||
#define FBIORESET 0x468b
|
||||
#define FBIOPRINT_REG 0x468c
|
||||
|
||||
/*
|
||||
* LCD panel specific definition
|
||||
*/
|
||||
#define MODE 0xc9 /* 8bit serial RGB */
|
||||
#define SPEN (32*2+21) /*LCD_SPL */
|
||||
#define SPCK (32*2+23) /*LCD_CLS */
|
||||
#define SPDA (32*2+22) /*LCD_D12 */
|
||||
#define LCD_RET (32*3+27)
|
||||
|
||||
#define __spi_write_reg1(reg, val) \
|
||||
do { \
|
||||
unsigned char no;\
|
||||
unsigned short value;\
|
||||
unsigned char a=0;\
|
||||
unsigned char b=0;\
|
||||
a=reg;\
|
||||
b=val;\
|
||||
__gpio_set_pin(SPEN);\
|
||||
__gpio_set_pin(SPCK);\
|
||||
__gpio_clear_pin(SPDA);\
|
||||
__gpio_clear_pin(SPEN);\
|
||||
udelay(25);\
|
||||
value=((a<<8)|(b&0xFF));\
|
||||
for(no=0;no<16;no++)\
|
||||
{\
|
||||
__gpio_clear_pin(SPCK);\
|
||||
if((value&0x8000)==0x8000)\
|
||||
__gpio_set_pin(SPDA);\
|
||||
else\
|
||||
__gpio_clear_pin(SPDA);\
|
||||
udelay(25);\
|
||||
__gpio_set_pin(SPCK);\
|
||||
value=(value<<1); \
|
||||
udelay(25);\
|
||||
}\
|
||||
__gpio_set_pin(SPEN);\
|
||||
udelay(100);\
|
||||
} while (0)
|
||||
|
||||
#define __spi_write_reg(reg, val) \
|
||||
do {\
|
||||
__spi_write_reg1((reg<<2|2), val);\
|
||||
udelay(100); \
|
||||
}while(0)
|
||||
|
||||
#define __lcd_special_pin_init() \
|
||||
do { \
|
||||
__gpio_as_output(SPEN); /* use SPDA */\
|
||||
__gpio_as_output(SPCK); /* use SPCK */\
|
||||
__gpio_as_output(SPDA); /* use SPDA */\
|
||||
__gpio_as_output(LCD_RET);\
|
||||
} while (0)
|
||||
|
||||
#define __lcd_special_on() \
|
||||
do { \
|
||||
__spi_write_reg1(0x05, 0x1e); \
|
||||
udelay(50);\
|
||||
__spi_write_reg1(0x05, 0x5d); \
|
||||
__spi_write_reg1(0x0B, 0x81); \
|
||||
__spi_write_reg1(0x01, 0x95); \
|
||||
__spi_write_reg1(0x00, 0x07); \
|
||||
__spi_write_reg1(0x06, 0x15); \
|
||||
__spi_write_reg1(0x07, 0x8d); \
|
||||
__spi_write_reg1(0x04, 0x0f); \
|
||||
__spi_write_reg1(0x0d, 0x3d); \
|
||||
__spi_write_reg1(0x10, 0x42); \
|
||||
__spi_write_reg1(0x11, 0x3a); \
|
||||
__spi_write_reg1(0x05, 0x5f); \
|
||||
} while (0)
|
||||
|
||||
#define __lcd_special_off() \
|
||||
do { \
|
||||
__spi_write_reg1(0x05, 0x5e); \
|
||||
} while (0)
|
||||
|
||||
#define __lcd_display_pin_init() \
|
||||
do { \
|
||||
__lcd_special_pin_init();\
|
||||
__gpio_as_pwm();\
|
||||
__lcd_set_backlight_level(8);\
|
||||
} while (0)
|
||||
|
||||
#define __lcd_display_on() \
|
||||
do { \
|
||||
__lcd_set_backlight_level(8); \
|
||||
__lcd_special_on();\
|
||||
} while (0)
|
||||
|
||||
#define __lcd_display_off() \
|
||||
do { \
|
||||
__lcd_set_backlight_level(0); \
|
||||
__lcd_special_off();\
|
||||
} while (0)
|
||||
|
||||
#define __lcd_set_backlight_level(n)\
|
||||
do { \
|
||||
__gpio_as_output(LCD_RET); \
|
||||
__gpio_set_pin(LCD_RET); \
|
||||
} while (0)
|
||||
|
||||
#if defined(CONFIG_SAKC)
|
||||
#define __lcd_close_backlight() \
|
||||
do { \
|
||||
__gpio_as_output(GPIO_PWM); \
|
||||
__gpio_clear_pin(GPIO_PWM); \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SAKC)
|
||||
#define __lcd_display_pin_init() \
|
||||
do { \
|
||||
__cpm_start_tcu(); \
|
||||
__lcd_special_pin_init(); \
|
||||
} while (0)
|
||||
|
||||
#define __lcd_display_on() \
|
||||
do { \
|
||||
__lcd_special_on(); \
|
||||
} while (0)
|
||||
|
||||
#define __lcd_display_off() \
|
||||
do { \
|
||||
__lcd_special_off(); \
|
||||
} while (0)
|
||||
#else
|
||||
#define __lcd_display_pin_init() \
|
||||
do { \
|
||||
__cpm_start_tcu(); \
|
||||
__lcd_special_pin_init(); \
|
||||
} while (0)
|
||||
|
||||
#define __lcd_display_on() \
|
||||
do { \
|
||||
__gpio_set_pin(GPIO_DISP_OFF_N); \
|
||||
__lcd_special_on(); \
|
||||
} while (0)
|
||||
|
||||
#define __lcd_display_off() \
|
||||
do { \
|
||||
__lcd_special_off(); \
|
||||
__gpio_clear_pin(GPIO_DISP_OFF_N); \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
#endif /* __QI_LB60_GPM940B0_H__ */
|
||||
880
package/boot/uboot-xburst/files/cpu/mips/usb_boot.S
Normal file
880
package/boot/uboot-xburst/files/cpu/mips/usb_boot.S
Normal file
@@ -0,0 +1,880 @@
|
||||
/*
|
||||
* for jz4740 usb boot
|
||||
*
|
||||
* Copyright (c) 2009 Xiangfu Liu <xiangfu.z@gmail.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
|
||||
*/
|
||||
.set noreorder
|
||||
.globl usb_boot
|
||||
.text
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// Both NAND and USB boot load data to D-Cache first, then transfer
|
||||
// data from D-Cache to I-Cache, and jump to execute the code in I-Cache.
|
||||
// So init caches first and then dispatch to a proper boot routine.
|
||||
//----------------------------------------------------------------------
|
||||
|
||||
.macro load_addr reg addr
|
||||
li \reg, 0x80000000
|
||||
addiu \reg, \reg, \addr
|
||||
la $2, usbboot_begin
|
||||
subu \reg, \reg, $2
|
||||
.endm
|
||||
|
||||
usb_boot:
|
||||
//--------------------------------------------------------------
|
||||
// Initialize PLL: set ICLK to 84MHz and HCLK to 42MHz.
|
||||
//--------------------------------------------------------------
|
||||
la $9, 0xB0000000 // CPCCR: Clock Control Register
|
||||
la $8, 0x42041110 // I:S:M:P=1:2:2:2
|
||||
sw $8, 0($9)
|
||||
|
||||
la $9, 0xB0000010 // CPPCR: PLL Control Register
|
||||
la $8, 0x06000120 // M=12 N=0 D=0 CLK=12*(M+2)/(N+2)
|
||||
sw $8, 0($9)
|
||||
|
||||
mtc0 $0, $26 // CP0_ERRCTL, restore WST reset state
|
||||
nop
|
||||
|
||||
mtc0 $0, $16 // CP0_CONFIG
|
||||
nop
|
||||
|
||||
// Relocate code to beginning of the ram
|
||||
|
||||
la $2, usbboot_begin
|
||||
la $3, usbboot_end
|
||||
li $4, 0x80000000
|
||||
|
||||
1:
|
||||
lw $5, 0($2)
|
||||
sw $5, 0($4)
|
||||
addiu $2, $2, 4
|
||||
bne $2, $3, 1b
|
||||
addiu $4, $4, 4
|
||||
|
||||
li $2, 0x80000000
|
||||
ori $3, $2, 0
|
||||
addiu $3, $3, usbboot_end
|
||||
la $4, usbboot_begin
|
||||
subu $3, $3, $4
|
||||
|
||||
|
||||
2:
|
||||
cache 0x0, 0($2) // Index_Invalidate_I
|
||||
cache 0x1, 0($2) // Index_Writeback_Inv_D
|
||||
addiu $2, $2, 32
|
||||
subu $4, $3, $2
|
||||
bgtz $4, 2b
|
||||
nop
|
||||
|
||||
load_addr $3, usb_boot_return
|
||||
|
||||
jr $3
|
||||
|
||||
usbboot_begin:
|
||||
|
||||
init_caches:
|
||||
li $2, 3 // cacheable for kseg0 access
|
||||
mtc0 $2, $16 // CP0_CONFIG
|
||||
nop
|
||||
|
||||
li $2, 0x20000000 // enable idx-store-data cache insn
|
||||
mtc0 $2, $26 // CP0_ERRCTL
|
||||
|
||||
ori $2, $28, 0 // start address
|
||||
ori $3, $2, 0x3fe0 // end address, total 16KB
|
||||
mtc0 $0, $28, 0 // CP0_TAGLO
|
||||
mtc0 $0, $28, 1 // CP0_DATALO
|
||||
cache_clear_a_line:
|
||||
cache 0x8, 0($2) // Index_Store_Tag_I
|
||||
cache 0x9, 0($2) // Index_Store_Tag_D
|
||||
bne $2, $3, cache_clear_a_line
|
||||
addiu $2, $2, 32 // increment CACHE_LINE_SIZE
|
||||
|
||||
ori $2, $28, 0 // start address
|
||||
ori $3, $2, 0x3fe0 // end address, total 16KB
|
||||
la $4, 0x1ffff000 // physical address and 4KB page mask
|
||||
cache_alloc_a_line:
|
||||
and $5, $2, $4
|
||||
ori $5, $5, 1 // V bit of the physical tag
|
||||
mtc0 $5, $28, 0 // CP0_TAGLO
|
||||
cache 0x8, 0($2) // Index_Store_Tag_I
|
||||
cache 0x9, 0($2) // Index_Store_Tag_D
|
||||
bne $2, $3, cache_alloc_a_line
|
||||
addiu $2, $2, 32 // increment CACHE_LINE_SIZE
|
||||
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
//--------------------------------------------------------------
|
||||
// Transfer data from dcache to icache, then jump to icache.
|
||||
//
|
||||
// Input parameters:
|
||||
//
|
||||
// $19: data length in bytes
|
||||
// $20: jump target address
|
||||
//--------------------------------------------------------------
|
||||
xfer_d2i:
|
||||
|
||||
ori $8, $20, 0
|
||||
addu $9, $8, $19 // total 16KB
|
||||
|
||||
1:
|
||||
cache 0x0, 0($8) // Index_Invalidate_I
|
||||
cache 0x1, 0($8) // Index_Writeback_Inv_D
|
||||
bne $8, $9, 1b
|
||||
addiu $8, $8, 32
|
||||
|
||||
// flush write-buffer
|
||||
sync
|
||||
|
||||
// Invalidate BTB
|
||||
mfc0 $8, $16, 7 // CP0_CONFIG
|
||||
nop
|
||||
ori $8, 2
|
||||
mtc0 $8, $16, 7
|
||||
nop
|
||||
|
||||
// Overwrite config to disable ram initalisation
|
||||
li $2, 0xff
|
||||
sb $2, 20($20)
|
||||
|
||||
jalr $20
|
||||
nop
|
||||
|
||||
icache_return:
|
||||
//--------------------------------------------------------------
|
||||
// User code can return to here after executing itself in
|
||||
// icache, by jumping to $31.
|
||||
//--------------------------------------------------------------
|
||||
b usb_boot_return
|
||||
nop
|
||||
|
||||
|
||||
usb_boot_return:
|
||||
//--------------------------------------------------------------
|
||||
// Enable the USB PHY
|
||||
//--------------------------------------------------------------
|
||||
la $9, 0xB0000024 // CPM_SCR
|
||||
lw $8, 0($9)
|
||||
ori $8, 0x40 // USBPHY_ENABLE
|
||||
sw $8, 0($9)
|
||||
|
||||
//--------------------------------------------------------------
|
||||
// Initialize USB registers
|
||||
//--------------------------------------------------------------
|
||||
la $27, 0xb3040000 // USB registers base address
|
||||
|
||||
sb $0, 0x0b($27) // INTRUSBE: disable common USB interrupts
|
||||
sh $0, 0x06($27) // INTRINE: disable EPIN interrutps
|
||||
sh $0, 0x08($27) // INTROUTE: disable EPOUT interrutps
|
||||
|
||||
li $9, 0x61
|
||||
sb $9, 0x01($27) // POWER: HSENAB | SUSPENDM | SOFTCONN
|
||||
|
||||
//--------------------------------------------------------------
|
||||
// Initialize USB states
|
||||
//--------------------------------------------------------------
|
||||
li $22, 0 // set EP0 to IDLE state
|
||||
li $23, 1 // no data stage
|
||||
|
||||
//--------------------------------------------------------------
|
||||
// Main loop of polling the usb commands
|
||||
//--------------------------------------------------------------
|
||||
usb_command_loop:
|
||||
lbu $9, 0x0a($27) // read INTRUSB
|
||||
andi $9, 0x04 // check USB_INTR_RESET
|
||||
beqz $9, check_intr_ep0in
|
||||
nop
|
||||
|
||||
//--------------------------------------------------------------
|
||||
// 1. Handle USB reset interrupt
|
||||
//--------------------------------------------------------------
|
||||
handle_reset_intr:
|
||||
lbu $9, 0x01($27) // read POWER
|
||||
andi $9, 0x10 // test HS_MODE
|
||||
bnez $9, _usb_set_maxpktsize
|
||||
li $9, 512 // max packet size of HS mode
|
||||
li $9, 64 // max packet size of FS mode
|
||||
|
||||
_usb_set_maxpktsize:
|
||||
li $8, 1
|
||||
sb $8, 0x0e($27) // set INDEX 1
|
||||
|
||||
sh $9, 0x10($27) // INMAXP
|
||||
sb $0, 0x13($27) // INCSRH
|
||||
sh $9, 0x14($27) // OUTMAXP
|
||||
sb $0, 0x17($27) // OUTCSRH
|
||||
|
||||
_usb_flush_fifo:
|
||||
li $8, 0x48 // INCSR_CDT && INCSR_FF
|
||||
sb $8, 0x12($27) // INCSR
|
||||
li $8, 0x90 // OUTCSR_CDT && OUTCSR_FF
|
||||
sb $8, 0x16($27) // OUTCSR
|
||||
|
||||
li $22, 0 // set EP0 to IDLE state
|
||||
li $23, 1 // no data stage
|
||||
|
||||
//--------------------------------------------------------------
|
||||
// 2. Check and handle EP0 interrupt
|
||||
//--------------------------------------------------------------
|
||||
check_intr_ep0in:
|
||||
lhu $10, 0x02($27) // read INTRIN
|
||||
andi $9, $10, 0x1 // check EP0 interrupt
|
||||
beqz $9, check_intr_ep1in
|
||||
nop
|
||||
|
||||
handle_ep0_intr:
|
||||
sb $0, 0x0e($27) // set INDEX 0
|
||||
lbu $11, 0x12($27) // read CSR0
|
||||
|
||||
andi $9, $11, 0x04 // check SENTSTALL
|
||||
beqz $9, _ep0_setupend
|
||||
nop
|
||||
|
||||
_ep0_sentstall:
|
||||
andi $9, $11, 0xdb
|
||||
sb $9, 0x12($27) // clear SENDSTALL and SENTSTALL
|
||||
li $22, 0 // set EP0 to IDLE state
|
||||
|
||||
_ep0_setupend:
|
||||
andi $9, $11, 0x10 // check SETUPEND
|
||||
beqz $9, ep0_idle_state
|
||||
nop
|
||||
|
||||
ori $9, $11, 0x80
|
||||
sb $9, 0x12($27) // set SVDSETUPEND
|
||||
li $22, 0 // set EP0 to IDLE state
|
||||
|
||||
ep0_idle_state:
|
||||
bnez $22, ep0_tx_state
|
||||
nop
|
||||
|
||||
//--------------------------------------------------------------
|
||||
// 2.1 Handle EP0 IDLE state interrupt
|
||||
//--------------------------------------------------------------
|
||||
andi $9, $11, 0x01 // check OUTPKTRDY
|
||||
beqz $9, check_intr_ep1in
|
||||
nop
|
||||
|
||||
//--------------------------------------------------------------
|
||||
// Read 8-bytes setup packet from the FIFO
|
||||
//--------------------------------------------------------------
|
||||
lw $25, 0x20($27) // first word of setup packet
|
||||
lw $26, 0x20($27) // second word of setup packet
|
||||
|
||||
andi $9, $25, 0x60 // bRequestType & USB_TYPE_MASK
|
||||
beqz $9, _ep0_std_req
|
||||
nop
|
||||
|
||||
//--------------------------------------------------------------
|
||||
// 2.1.1 Vendor-specific setup request
|
||||
//--------------------------------------------------------------
|
||||
_ep0_vend_req:
|
||||
li $22, 0 // set EP0 to IDLE state
|
||||
li $23, 1 // NoData = 1
|
||||
|
||||
andi $9, $25, 0xff00 // check bRequest
|
||||
srl $9, $9, 8
|
||||
beqz $9, __ep0_get_cpu_info
|
||||
sub $8, $9, 0x1
|
||||
beqz $8, __ep0_set_data_address
|
||||
sub $8, $9, 0x2
|
||||
beqz $8, __ep0_set_data_length
|
||||
sub $8, $9, 0x3
|
||||
beqz $8, __ep0_flush_caches
|
||||
sub $8, $9, 0x4
|
||||
beqz $8, __ep0_prog_start1
|
||||
sub $8, $9, 0x5
|
||||
beqz $8, __ep0_prog_start2
|
||||
nop
|
||||
b _ep0_idle_state_fini // invalid request
|
||||
nop
|
||||
|
||||
__ep0_get_cpu_info:
|
||||
load_addr $20, cpu_info_data // data pointer to transfer
|
||||
li $21, 8 // bytes left to transfer
|
||||
li $22, 1 // set EP0 to TX state
|
||||
li $23, 0 // NoData = 0
|
||||
|
||||
b _ep0_idle_state_fini
|
||||
nop
|
||||
|
||||
__ep0_set_data_address:
|
||||
li $9, 0xffff0000
|
||||
and $9, $25, $9
|
||||
andi $8, $26, 0xffff
|
||||
or $20, $9, $8 // data address of next transfer
|
||||
|
||||
b _ep0_idle_state_fini
|
||||
nop
|
||||
|
||||
__ep0_set_data_length:
|
||||
li $9, 0xffff0000
|
||||
and $9, $25, $9
|
||||
andi $8, $26, 0xffff
|
||||
or $21, $9, $8 // data length of next transfer
|
||||
|
||||
li $9, 0x48 // SVDOUTPKTRDY and DATAEND
|
||||
sb $9, 0x12($27) // CSR0
|
||||
|
||||
// We must write packet to FIFO before EP1-IN interrupt here.
|
||||
b handle_epin1_intr
|
||||
nop
|
||||
|
||||
__ep0_flush_caches:
|
||||
// Flush dcache and invalidate icache.
|
||||
li $8, 0x80000000
|
||||
addi $9, $8, 0x3fe0 // total 16KB
|
||||
|
||||
1:
|
||||
cache 0x0, 0($8) // Index_Invalidate_I
|
||||
cache 0x1, 0($8) // Index_Writeback_Inv_D
|
||||
bne $8, $9, 1b
|
||||
addiu $8, $8, 32
|
||||
|
||||
// flush write-buffer
|
||||
sync
|
||||
|
||||
// Invalidate BTB
|
||||
mfc0 $8, $16, 7 // CP0_CONFIG
|
||||
nop
|
||||
ori $8, 2
|
||||
mtc0 $8, $16, 7
|
||||
nop
|
||||
|
||||
b _ep0_idle_state_fini
|
||||
nop
|
||||
|
||||
__ep0_prog_start1:
|
||||
li $9, 0x48 // SVDOUTPKTRDY and DATAEND
|
||||
sb $9, 0x12($27) // CSR0
|
||||
|
||||
li $9, 0xffff0000
|
||||
and $9, $25, $9
|
||||
andi $8, $26, 0xffff
|
||||
or $20, $9, $8 // target address
|
||||
|
||||
b xfer_d2i
|
||||
li $19, 0x2000 // 16KB data length
|
||||
|
||||
__ep0_prog_start2:
|
||||
li $9, 0x48 // SVDOUTPKTRDY and DATAEND
|
||||
sb $9, 0x12($27) // CSR0
|
||||
|
||||
li $9, 0xffff0000
|
||||
and $9, $25, $9
|
||||
andi $8, $26, 0xffff
|
||||
or $20, $9, $8 // target address
|
||||
|
||||
jalr $20 // jump, and place the return address in $31
|
||||
nop
|
||||
|
||||
__ep0_prog_start2_return:
|
||||
// User code can return to here after executing itself, by jumping to $31.
|
||||
b usb_boot_return
|
||||
nop
|
||||
|
||||
//--------------------------------------------------------------
|
||||
// 2.1.2 Standard setup request
|
||||
//--------------------------------------------------------------
|
||||
_ep0_std_req:
|
||||
andi $12, $25, 0xff00 // check bRequest
|
||||
srl $12, $12, 8
|
||||
sub $9, $12, 0x05 // check USB_REQ_SET_ADDRESS
|
||||
bnez $9, __ep0_req_set_config
|
||||
nop
|
||||
|
||||
//--------------------------------------------------------------
|
||||
// Handle USB_REQ_SET_ADDRESS
|
||||
//--------------------------------------------------------------
|
||||
__ep0_req_set_addr:
|
||||
srl $9, $25, 16 // get wValue
|
||||
sb $9, 0x0($27) // set FADDR
|
||||
li $23, 1 // NoData = 1
|
||||
b _ep0_idle_state_fini
|
||||
nop
|
||||
|
||||
__ep0_req_set_config:
|
||||
sub $9, $12, 0x09 // check USB_REQ_SET_CONFIGURATION
|
||||
bnez $9, __ep0_req_get_desc
|
||||
nop
|
||||
|
||||
//--------------------------------------------------------------
|
||||
// Handle USB_REQ_SET_CONFIGURATION
|
||||
//--------------------------------------------------------------
|
||||
li $23, 1 // NoData = 1
|
||||
b _ep0_idle_state_fini
|
||||
nop
|
||||
|
||||
__ep0_req_get_desc:
|
||||
sub $9, $12, 0x06 // check USB_REQ_GET_DESCRIPTOR
|
||||
bnez $9, _ep0_idle_state_fini
|
||||
li $23, 1 // NoData = 1
|
||||
|
||||
//--------------------------------------------------------------
|
||||
// Handle USB_REQ_GET_DESCRIPTOR
|
||||
//--------------------------------------------------------------
|
||||
li $23, 0 // NoData = 0
|
||||
|
||||
srl $9, $25, 24 // wValue >> 8
|
||||
sub $8, $9, 0x01 // check USB_DT_DEVICE
|
||||
beqz $8, ___ep0_get_dev_desc
|
||||
srl $21, $26, 16 // get wLength
|
||||
sub $8, $9, 0x02 // check USB_DT_CONFIG
|
||||
beqz $8, ___ep0_get_conf_desc
|
||||
sub $8, $9, 0x03 // check USB_DT_STRING
|
||||
beqz $8, ___ep0_get_string_desc
|
||||
sub $8, $9, 0x06 // check USB_DT_DEVICE_QUALIFIER
|
||||
beqz $8, ___ep0_get_dev_qualifier
|
||||
nop
|
||||
b _ep0_idle_state_fini
|
||||
nop
|
||||
|
||||
___ep0_get_dev_desc:
|
||||
load_addr $20, device_desc // data pointer
|
||||
li $22, 1 // set EP0 to TX state
|
||||
sub $8, $21, 18
|
||||
blez $8, _ep0_idle_state_fini // wLength <= 18
|
||||
nop
|
||||
li $21, 18 // max length of device_desc
|
||||
b _ep0_idle_state_fini
|
||||
nop
|
||||
|
||||
___ep0_get_dev_qualifier:
|
||||
load_addr $20, dev_qualifier // data pointer
|
||||
li $22, 1 // set EP0 to TX state
|
||||
sub $8, $21, 10
|
||||
blez $8, _ep0_idle_state_fini // wLength <= 10
|
||||
nop
|
||||
li $21, 10 // max length of dev_qualifier
|
||||
b _ep0_idle_state_fini
|
||||
nop
|
||||
|
||||
___ep0_get_conf_desc:
|
||||
load_addr $20, config_desc_fs // data pointer of FS mode
|
||||
lbu $8, 0x01($27) // read POWER
|
||||
andi $8, 0x10 // test HS_MODE
|
||||
beqz $8, ___ep0_get_conf_desc2
|
||||
nop
|
||||
load_addr $20, config_desc_hs // data pointer of HS mode
|
||||
|
||||
___ep0_get_conf_desc2:
|
||||
li $22, 1 // set EP0 to TX state
|
||||
sub $8, $21, 32
|
||||
blez $8, _ep0_idle_state_fini // wLength <= 32
|
||||
nop
|
||||
li $21, 32 // max length of config_desc
|
||||
b _ep0_idle_state_fini
|
||||
nop
|
||||
|
||||
___ep0_get_string_desc:
|
||||
li $22, 1 // set EP0 to TX state
|
||||
|
||||
srl $9, $25, 16 // wValue & 0xff
|
||||
andi $9, 0xff
|
||||
|
||||
sub $8, $9, 1
|
||||
beqz $8, ___ep0_get_string_manufacture
|
||||
sub $8, $9, 2
|
||||
beqz $8, ___ep0_get_string_product
|
||||
nop
|
||||
|
||||
___ep0_get_string_lang_ids:
|
||||
load_addr $20, string_lang_ids // data pointer
|
||||
b _ep0_idle_state_fini
|
||||
li $21, 4 // data length
|
||||
|
||||
___ep0_get_string_manufacture:
|
||||
load_addr $20, string_manufacture // data pointer
|
||||
b _ep0_idle_state_fini
|
||||
li $21, 16 // data length
|
||||
|
||||
___ep0_get_string_product:
|
||||
load_addr $20, string_product // data pointer
|
||||
b _ep0_idle_state_fini
|
||||
li $21, 46 // data length
|
||||
|
||||
_ep0_idle_state_fini:
|
||||
li $9, 0x40 // SVDOUTPKTRDY
|
||||
beqz $23, _ep0_idle_state_fini2
|
||||
nop
|
||||
ori $9, $9, 0x08 // DATAEND
|
||||
_ep0_idle_state_fini2:
|
||||
sb $9, 0x12($27) // CSR0
|
||||
beqz $22, check_intr_ep1in
|
||||
nop
|
||||
|
||||
//--------------------------------------------------------------
|
||||
// 2.2 Handle EP0 TX state interrupt
|
||||
//--------------------------------------------------------------
|
||||
ep0_tx_state:
|
||||
sub $9, $22, 1
|
||||
bnez $9, check_intr_ep1in
|
||||
nop
|
||||
|
||||
sub $9, $21, 64 // max packetsize
|
||||
blez $9, _ep0_tx_state2 // data count <= 64
|
||||
ori $19, $21, 0
|
||||
li $19, 64
|
||||
|
||||
_ep0_tx_state2:
|
||||
beqz $19, _ep0_tx_state3 // send ZLP
|
||||
ori $18, $19, 0 // record bytes to be transferred
|
||||
sub $21, $21, $19 // decrement data count
|
||||
|
||||
_ep0_fifo_write_loop:
|
||||
lbu $9, 0($20) // read data
|
||||
sb $9, 0x20($27) // load FIFO
|
||||
sub $19, $19, 1 // decrement counter
|
||||
bnez $19, _ep0_fifo_write_loop
|
||||
addi $20, $20, 1 // increment data pointer
|
||||
|
||||
sub $9, $18, 64 // max packetsize
|
||||
beqz $9, _ep0_tx_state4
|
||||
nop
|
||||
|
||||
_ep0_tx_state3:
|
||||
// transferred bytes < max packetsize
|
||||
li $9, 0x0a // set INPKTRDY and DATAEND
|
||||
sb $9, 0x12($27) // CSR0
|
||||
li $22, 0 // set EP0 to IDLE state
|
||||
b check_intr_ep1in
|
||||
nop
|
||||
|
||||
_ep0_tx_state4:
|
||||
// transferred bytes == max packetsize
|
||||
li $9, 0x02 // set INPKTRDY
|
||||
sb $9, 0x12($27) // CSR0
|
||||
b check_intr_ep1in
|
||||
nop
|
||||
|
||||
//--------------------------------------------------------------
|
||||
// 3. Check and handle EP1 BULK-IN interrupt
|
||||
//--------------------------------------------------------------
|
||||
check_intr_ep1in:
|
||||
andi $9, $10, 0x2 // check EP1 IN interrupt
|
||||
beqz $9, check_intr_ep1out
|
||||
nop
|
||||
|
||||
handle_epin1_intr:
|
||||
li $9, 1
|
||||
sb $9, 0x0e($27) // set INDEX 1
|
||||
lbu $9, 0x12($27) // read INCSR
|
||||
|
||||
andi $8, $9, 0x2 // check INCSR_FFNOTEMPT
|
||||
bnez $8, _epin1_tx_state4
|
||||
nop
|
||||
|
||||
_epin1_write_fifo:
|
||||
lhu $9, 0x10($27) // get INMAXP
|
||||
sub $8, $21, $9
|
||||
blez $8, _epin1_tx_state1 // bytes left <= INMAXP
|
||||
ori $19, $21, 0
|
||||
ori $19, $9, 0
|
||||
|
||||
_epin1_tx_state1:
|
||||
beqz $19, _epin1_tx_state4 // No data
|
||||
nop
|
||||
|
||||
sub $21, $21, $19 // decrement data count
|
||||
|
||||
srl $5, $19, 2 // # of word
|
||||
andi $6, $19, 0x3 // # of byte
|
||||
beqz $5, _epin1_tx_state2
|
||||
nop
|
||||
|
||||
_epin1_fifo_write_word:
|
||||
lw $9, 0($20) // read data from source address
|
||||
sw $9, 0x24($27) // write FIFO
|
||||
sub $5, $5, 1 // decrement counter
|
||||
bnez $5, _epin1_fifo_write_word
|
||||
addiu $20, $20, 4 // increment dest address
|
||||
|
||||
_epin1_tx_state2:
|
||||
beqz $6, _epin1_tx_state3
|
||||
nop
|
||||
|
||||
_epin1_fifo_write_byte:
|
||||
lbu $9, 0($20) // read data from source address
|
||||
sb $9, 0x24($27) // write FIFO
|
||||
sub $6, $6, 1 // decrement counter
|
||||
bnez $6, _epin1_fifo_write_byte
|
||||
addiu $20, $20, 1 // increment dest address
|
||||
|
||||
_epin1_tx_state3:
|
||||
li $9, 0x1
|
||||
sb $9, 0x12($27) // INCSR, set INPKTRDY
|
||||
|
||||
_epin1_tx_state4:
|
||||
// nop
|
||||
|
||||
//--------------------------------------------------------------
|
||||
// 4. Check and handle EP1 BULK-OUT interrupt
|
||||
//--------------------------------------------------------------
|
||||
check_intr_ep1out:
|
||||
lhu $9, 0x04($27) // read INTROUT
|
||||
andi $9, 0x2
|
||||
beqz $9, check_status_next
|
||||
nop
|
||||
|
||||
handle_epout1_intr:
|
||||
li $9, 1
|
||||
sb $9, 0x0e($27) // set INDEX 1
|
||||
|
||||
lbu $9, 0x16($27) // read OUTCSR
|
||||
andi $9, 0x1 // check OUTPKTRDY
|
||||
beqz $9, check_status_next
|
||||
nop
|
||||
|
||||
_epout1_read_fifo:
|
||||
lhu $19, 0x18($27) // read OUTCOUNT
|
||||
srl $5, $19, 2 // # of word
|
||||
andi $6, $19, 0x3 // # of byte
|
||||
beqz $5, _epout1_rx_state1
|
||||
nop
|
||||
|
||||
_epout1_fifo_read_word:
|
||||
lw $9, 0x24($27) // read FIFO
|
||||
sw $9, 0($20) // store to dest address
|
||||
sub $5, $5, 1 // decrement counter
|
||||
bnez $5, _epout1_fifo_read_word
|
||||
addiu $20, $20, 4 // increment dest address
|
||||
|
||||
_epout1_rx_state1:
|
||||
beqz $6, _epout1_rx_state2
|
||||
nop
|
||||
|
||||
_epout1_fifo_read_byte:
|
||||
lbu $9, 0x24($27) // read FIFO
|
||||
sb $9, 0($20) // store to dest address
|
||||
sub $6, $6, 1 // decrement counter
|
||||
bnez $6, _epout1_fifo_read_byte
|
||||
addiu $20, $20, 1 // increment dest address
|
||||
|
||||
_epout1_rx_state2:
|
||||
sb $0, 0x16($27) // clear OUTPKTRDY
|
||||
|
||||
check_status_next:
|
||||
b usb_command_loop
|
||||
nop
|
||||
|
||||
//--------------------------------------------------------------
|
||||
// Device/Configuration/Interface/Endpoint/String Descriptors
|
||||
//--------------------------------------------------------------
|
||||
|
||||
.align 2
|
||||
device_desc:
|
||||
.byte 0x12 // bLength
|
||||
.byte 0x01 // bDescriptorType
|
||||
.byte 0x00 // bcdUSB
|
||||
.byte 0x02 // bcdUSB
|
||||
.byte 0x00 // bDeviceClass
|
||||
.byte 0x00 // bDeviceSubClass
|
||||
.byte 0x00 // bDeviceProtocol
|
||||
.byte 0x40 // bMaxPacketSize0
|
||||
.byte 0x1a // idVendor
|
||||
.byte 0x60 // idVendor
|
||||
.byte 0x40 // idProduct
|
||||
.byte 0x47 // idProduct
|
||||
.byte 0x00 // bcdDevice
|
||||
.byte 0x01 // bcdDevice
|
||||
.byte 0x01 // iManufacturer
|
||||
.byte 0x02 // iProduct
|
||||
.byte 0x00 // iSerialNumber
|
||||
.byte 0x01 // bNumConfigurations
|
||||
|
||||
.align 2
|
||||
dev_qualifier:
|
||||
.byte 0x0a // bLength
|
||||
.byte 0x06 // bDescriptorType
|
||||
.byte 0x00 // bcdUSB
|
||||
.byte 0x02 // bcdUSB
|
||||
.byte 0x00 // bDeviceClass
|
||||
.byte 0x00 // bDeviceSubClass
|
||||
.byte 0x00 // bDeviceProtocol
|
||||
.byte 0x40 // bMaxPacketSize0
|
||||
.byte 0x01 // bNumConfigurations
|
||||
.byte 0x00 // bRESERVED
|
||||
|
||||
.align 2
|
||||
config_desc_hs:
|
||||
.byte 0x09 // bLength
|
||||
.byte 0x02 // bDescriptorType
|
||||
.byte 0x20 // wTotalLength
|
||||
.byte 0x00 // wTotalLength
|
||||
.byte 0x01 // bNumInterfaces
|
||||
.byte 0x01 // bConfigurationValue
|
||||
.byte 0x00 // iConfiguration
|
||||
.byte 0xc0 // bmAttributes
|
||||
.byte 0x01 // MaxPower
|
||||
intf_desc_hs:
|
||||
.byte 0x09 // bLength
|
||||
.byte 0x04 // bDescriptorType
|
||||
.byte 0x00 // bInterfaceNumber
|
||||
.byte 0x00 // bAlternateSetting
|
||||
.byte 0x02 // bNumEndpoints
|
||||
.byte 0xff // bInterfaceClass
|
||||
.byte 0x00 // bInterfaceSubClass
|
||||
.byte 0x50 // bInterfaceProtocol
|
||||
.byte 0x00 // iInterface
|
||||
ep1_desc_hs:
|
||||
.byte 0x07 // bLength
|
||||
.byte 0x05 // bDescriptorType
|
||||
.byte 0x01 // bEndpointAddress
|
||||
.byte 0x02 // bmAttributes
|
||||
.byte 0x00 // wMaxPacketSize
|
||||
.byte 0x02 // wMaxPacketSize
|
||||
.byte 0x00 // bInterval
|
||||
ep2_desc_hs:
|
||||
.byte 0x07 // bLength
|
||||
.byte 0x05 // bDescriptorType
|
||||
.byte 0x81 // bEndpointAddress
|
||||
.byte 0x02 // bmAttributes
|
||||
.byte 0x00 // wMaxPacketSize
|
||||
.byte 0x02 // wMaxPacketSize
|
||||
.byte 0x00 // bInterval
|
||||
|
||||
.align 2
|
||||
config_desc_fs:
|
||||
.byte 0x09 // bLength
|
||||
.byte 0x02 // bDescriptorType
|
||||
.byte 0x20 // wTotalLength
|
||||
.byte 0x00 // wTotalLength
|
||||
.byte 0x01 // bNumInterfaces
|
||||
.byte 0x01 // bConfigurationValue
|
||||
.byte 0x00 // iConfiguration
|
||||
.byte 0xc0 // bmAttributes
|
||||
.byte 0x01 // MaxPower
|
||||
intf_desc_fs:
|
||||
.byte 0x09 // bLength
|
||||
.byte 0x04 // bDescriptorType
|
||||
.byte 0x00 // bInterfaceNumber
|
||||
.byte 0x00 // bAlternateSetting
|
||||
.byte 0x02 // bNumEndpoints
|
||||
.byte 0xff // bInterfaceClass
|
||||
.byte 0x00 // bInterfaceSubClass
|
||||
.byte 0x50 // bInterfaceProtocol
|
||||
.byte 0x00 // iInterface
|
||||
ep1_desc_fs:
|
||||
.byte 0x07 // bLength
|
||||
.byte 0x05 // bDescriptorType
|
||||
.byte 0x01 // bEndpointAddress
|
||||
.byte 0x02 // bmAttributes
|
||||
.byte 0x40 // wMaxPacketSize
|
||||
.byte 0x00 // wMaxPacketSize
|
||||
.byte 0x00 // bInterval
|
||||
ep2_desc_fs:
|
||||
.byte 0x07 // bLength
|
||||
.byte 0x05 // bDescriptorType
|
||||
.byte 0x81 // bEndpointAddress
|
||||
.byte 0x02 // bmAttributes
|
||||
.byte 0x40 // wMaxPacketSize
|
||||
.byte 0x00 // wMaxPacketSize
|
||||
.byte 0x00 // bInterval
|
||||
|
||||
.align 2
|
||||
string_lang_ids:
|
||||
.byte 0x04
|
||||
.byte 0x03
|
||||
.byte 0x09
|
||||
.byte 0x04
|
||||
|
||||
.align 2
|
||||
string_manufacture:
|
||||
.byte 0x10
|
||||
.byte 0x03
|
||||
.byte 0x49
|
||||
.byte 0x00
|
||||
.byte 0x6e
|
||||
.byte 0x00
|
||||
.byte 0x67
|
||||
.byte 0x00
|
||||
.byte 0x65
|
||||
.byte 0x00
|
||||
.byte 0x6e
|
||||
.byte 0x00
|
||||
.byte 0x69
|
||||
.byte 0x00
|
||||
.byte 0x63
|
||||
.byte 0x00
|
||||
|
||||
.align 2
|
||||
string_product:
|
||||
.byte 0x2e
|
||||
.byte 0x03
|
||||
.byte 0x4a
|
||||
.byte 0x00
|
||||
.byte 0x5a
|
||||
.byte 0x00
|
||||
.byte 0x34
|
||||
.byte 0x00
|
||||
.byte 0x37
|
||||
.byte 0x00
|
||||
.byte 0x34
|
||||
.byte 0x00
|
||||
.byte 0x30
|
||||
.byte 0x00
|
||||
.byte 0x20
|
||||
.byte 0x00
|
||||
.byte 0x55
|
||||
.byte 0x00
|
||||
.byte 0x53
|
||||
.byte 0x00
|
||||
.byte 0x42
|
||||
.byte 0x00
|
||||
.byte 0x20
|
||||
.byte 0x00
|
||||
.byte 0x42
|
||||
.byte 0x00
|
||||
.byte 0x6f
|
||||
.byte 0x00
|
||||
.byte 0x6f
|
||||
.byte 0x00
|
||||
.byte 0x74
|
||||
.byte 0x00
|
||||
.byte 0x20
|
||||
.byte 0x00
|
||||
.byte 0x44
|
||||
.byte 0x00
|
||||
.byte 0x65
|
||||
.byte 0x00
|
||||
.byte 0x76
|
||||
.byte 0x00
|
||||
.byte 0x69
|
||||
.byte 0x00
|
||||
.byte 0x63
|
||||
.byte 0x00
|
||||
.byte 0x65
|
||||
.byte 0x00
|
||||
|
||||
.align 2
|
||||
cpu_info_data:
|
||||
.byte 0x4a
|
||||
.byte 0x5a
|
||||
.byte 0x34
|
||||
.byte 0x37
|
||||
.byte 0x34
|
||||
.byte 0x30
|
||||
.byte 0x56
|
||||
.byte 0x31
|
||||
usbboot_end:
|
||||
|
||||
.set reorder
|
||||
4892
package/boot/uboot-xburst/files/include/asm-mips/jz4740.h
Normal file
4892
package/boot/uboot-xburst/files/include/asm-mips/jz4740.h
Normal file
File diff suppressed because it is too large
Load Diff
26
package/boot/uboot-xburst/files/include/configs/avt2.h
Normal file
26
package/boot/uboot-xburst/files/include/configs/avt2.h
Normal file
@@ -0,0 +1,26 @@
|
||||
#ifndef __CONFIG_AVT2_H
|
||||
#define __CONFIG_AVT2_H
|
||||
|
||||
#include <configs/nanonote.h>
|
||||
|
||||
#define CONFIG_AVT2 1
|
||||
|
||||
#define CONFIG_BOOTARGS "mem=64M console=ttyS0,57600n8 ubi.mtd=2 rootfstype=ubifs root=ubi0:rootfs rw rootwait avt2=1"
|
||||
#define CONFIG_BOOTARGSFROMSD "mem=64M console=ttyS0,57600n8 rootfstype=ext2 root=/dev/mmcblk0p1 rw rootwait avt2=1"
|
||||
#define CONFIG_BOOTCOMMAND "nand read 0x80600000 0x400000 0x200000;bootm"
|
||||
|
||||
/* SDRAM paramters */
|
||||
#define SDRAM_BW16 1 /* Data bus width: 0-32bit, 1-16bit */
|
||||
#define SDRAM_BANK4 1 /* Banks each chip: 0-2bank, 1-4bank */
|
||||
#define SDRAM_ROW 13 /* Row address: 11 to 13 */
|
||||
#define SDRAM_COL 10 /* Column address: 8 to 12 */
|
||||
#define SDRAM_CASL 2 /* CAS latency: 2 or 3 */
|
||||
|
||||
/* SDRAM Timings, unit: ns */
|
||||
#define SDRAM_TRAS 45 /* RAS# Active Time */
|
||||
#define SDRAM_RCD 20 /* RAS# to CAS# Delay */
|
||||
#define SDRAM_TPC 20 /* RAS# Precharge Time */
|
||||
#define SDRAM_TRWL 7 /* Write Latency Time */
|
||||
#define SDRAM_TREF 15625 /* Refresh period: 8192 cycles/64ms */
|
||||
|
||||
#endif /* __CONFIG_AVT_H */
|
||||
311
package/boot/uboot-xburst/files/include/configs/n516.h
Normal file
311
package/boot/uboot-xburst/files/include/configs/n516.h
Normal file
@@ -0,0 +1,311 @@
|
||||
/*
|
||||
* (C) Copyright 2006
|
||||
* Ingenic Semiconductor, <jlwei@ingenic.cn>
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
/*
|
||||
* This file contains the configuration parameters for the pavo board.
|
||||
*/
|
||||
|
||||
#ifndef __CONFIG_H
|
||||
#define __CONFIG_H
|
||||
|
||||
//#define DEBUG
|
||||
//#define DEBUG_SHELL
|
||||
|
||||
#define CONFIG_MIPS32 1 /* MIPS32 CPU core */
|
||||
#define CONFIG_JzRISC 1 /* JzRISC core */
|
||||
#define CONFIG_JZSOC 1 /* Jz SoC */
|
||||
#define CONFIG_JZ4740 1 /* Jz4740 SoC */
|
||||
#define CONFIG_PAVO 1 /* PAVO validation board */
|
||||
|
||||
#define CONFIG_BOARD_NAME "n516"
|
||||
#define CONFIG_BOARD_HWREV "1.0"
|
||||
#define CONFIG_FIRMWARE_EPOCH "0"
|
||||
#define CONFIG_UPDATE_TMPBUF 0x80600000
|
||||
#define CONFIG_UPDATE_CHUNKSIZE 0x800000
|
||||
#define CONFIG_UPDATE_FILENAME "update.oifw"
|
||||
#define CONFIG_UPDATE_FILEEXT ".oifw"
|
||||
#define CONFIG_UBI_PARTITION "UBI"
|
||||
|
||||
#define CONFIG_SKIP_LOWLEVEL_INIT 1
|
||||
#undef CONFIG_SKIP_RELOCATE_UBOOT
|
||||
|
||||
#if 0
|
||||
#define CONFIG_LCD /* LCD support */
|
||||
#define CONFIG_JZLCD_METRONOME_800x600
|
||||
#define LCD_BPP LCD_COLOR8
|
||||
|
||||
#define WFM_DATA_SIZE ( 1 << 14 )
|
||||
#define CONFIG_METRONOME_WF_LEN (64 * (1 << 10))
|
||||
#define CONFIG_METRONOME_WF_NAND_OFFSET (0x100000)
|
||||
#define BMP_LOGO_HEIGHT 0
|
||||
#define CONFIG_UBI_WF_VOLUME "waveforms"
|
||||
#define CONFIG_UBI_BOOTSPLASH_VOLUME "bootsplash"
|
||||
#define CONFIG_METRONOME_BOOTSPLASH_LEN 480000
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
#define CONFIG_JZSOC_I2C
|
||||
#define CONFIG_HARD_I2C
|
||||
#define CONFIG_SYS_I2C_SPEED 100000
|
||||
#define CONFIG_SYS_I2C_SLAVE 0
|
||||
#define CONFIG_LPC_I2C_ADDR 0x54
|
||||
#endif
|
||||
|
||||
#define JZ4740_NORBOOT_CFG JZ4740_NORBOOT_16BIT /* NOR Boot config code */
|
||||
#define JZ4740_NANDBOOT_CFG JZ4740_NANDBOOT_B8R3 /* NAND Boot config code */
|
||||
|
||||
#define CONFIG_SYS_CPU_SPEED 336000000 /* CPU clock: 336 MHz */
|
||||
#define CONFIG_SYS_EXTAL 12000000 /* EXTAL freq: 12 MHz */
|
||||
#define CONFIG_SYS_HZ (CONFIG_SYS_EXTAL/256) /* incrementer freq */
|
||||
|
||||
#define CONFIG_SYS_UART_BASE UART0_BASE /* Base of the UART channel */
|
||||
|
||||
#define CONFIG_BAUDRATE 57600
|
||||
#define CONFIG_SYS_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200 }
|
||||
|
||||
|
||||
#define CONFIG_MMC 1
|
||||
#define CONFIG_GENERIC_MMC 1
|
||||
#define CONFIG_JZ_MMC 1
|
||||
#define CONFIG_FAT 1
|
||||
|
||||
#define CONFIG_SYS_HUSH_PARSER
|
||||
#define CONFIG_SYS_PROMPT_HUSH_PS2 ">"
|
||||
#define CONFIG_CMDLINE_EDITING
|
||||
|
||||
/* allow to overwrite serial and ethaddr */
|
||||
#define CONFIG_ENV_OVERWRITE
|
||||
|
||||
#include <config_cmd_default.h>
|
||||
|
||||
#undef CONFIG_CMD_BDI /* bdinfo */
|
||||
#undef CONFIG_CMD_FPGA
|
||||
#undef CONFIG_CMD_ECHO /* echo arguments */
|
||||
#undef CONFIG_CMD_FLASH /* flinfo, erase, protect */
|
||||
#undef CONFIG_CMD_FPGA /* FPGA configuration Support */
|
||||
#undef CONFIG_CMD_IMI /* iminfo */
|
||||
#undef CONFIG_CMD_ITEST /* Integer (and string) test */
|
||||
#undef CONFIG_CMD_LOADB /* loadb */
|
||||
#undef CONFIG_CMD_LOADS /* loads */
|
||||
#undef CONFIG_CMD_NFS /* NFS support */
|
||||
#undef CONFIG_CMD_SETGETDCR /* DCR support on 4xx */
|
||||
#undef CONFIG_CMD_SOURCE /* "source" command support */
|
||||
#undef CONFIG_CMD_XIMG /* Load part of Multi Image */
|
||||
#undef CONFIG_CMD_NET
|
||||
|
||||
//#define CONFIG_CMD_ASKENV
|
||||
//#define CONFIG_CMD_DHCP
|
||||
//#define CONFIG_CMD_PING
|
||||
#define CONFIG_CMD_NAND
|
||||
#define CONFIG_CMD_MMC
|
||||
#define CONFIG_CMD_FAT
|
||||
/*#define CONFIG_CMD_UBI*/
|
||||
/*#define CONFIG_CMD_MTDPARTS*/
|
||||
//#define CONFIG_CMD_JFFS2
|
||||
//#define CONFIG_JFFS2_NAND
|
||||
//#define CONFIG_JFFS2_CMDLINE
|
||||
#define CONFIG_CMD_UPDATE
|
||||
|
||||
#define CONFIG_DOS_PARTITION
|
||||
|
||||
/*#define CONFIG_MTD_PARTITIONS*/
|
||||
#define CONFIG_RBTREE
|
||||
|
||||
#define CONFIG_BOOTP_MASK ( CONFIG_BOOTP_DEFAUL )
|
||||
|
||||
/* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */
|
||||
#if 0
|
||||
#define CONFIG_ZERO_BOOTDELAY_CHECK
|
||||
#define CONFIG_BOOTDELAY 0
|
||||
#define CONFIG_BOOTFILE uImage /* file to load */
|
||||
#define CONFIG_BOOTARGS "mem=64M console=ttyS0,57600n8 ip=off rootfstype=ubifs root=ubi:rootfs ubi.mtd=UBI rw panic=5 " MTDPARTS_DEFAULT
|
||||
#define CONFIG_BOOTCOMMAND "check_and_update; setenv bootargs $bootargs $batt_level_param; ubi read 0x80600000 bootsplash && show_image 0x80600000; ubi read 0x80600000 kernel; bootm 0x80600000; ubi read 0x80600000 errorsplash && show_image 0x80600000; while test 0 = 0; do check_and_update; done"
|
||||
#define CONFIG_SYS_AUTOLOAD "n" /* No autoload */
|
||||
#define CONFIG_IPADDR 192.168.111.1
|
||||
#define CONFIG_SERVERIP 192.168.111.2
|
||||
#define MTDIDS_DEFAULT "nand0=jz4740-nand"
|
||||
#define MTDPARTS_DEFAULT "mtdparts=jz4740-nand:1M@0(uboot)ro,-@1M(UBI)"
|
||||
#define CONFIG_EXTRA_ENV_SETTINGS "mtdids=nand0=jz4740-nand\0mtdparts=mtdparts=jz4740-nand:1M@0(uboot)ro,-@1M(UBI)\0" \
|
||||
"stdout=serial\0stderr=lcd\0"
|
||||
#endif
|
||||
|
||||
#define CONFIG_BOOTP_MASK (CONFIG_BOOTP_DEFAUL)
|
||||
#define CONFIG_BOOTDELAY 0
|
||||
#define CONFIG_BOOTFILE "uImage" /* file to load */
|
||||
#define CONFIG_BOOTARGS "mem=64M console=ttyS0,57600n8 ubi.mtd=2 rootfstype=ubifs root=ubi0:rootfs rw rootwait"
|
||||
#define CONFIG_BOOTCOMMAND "nand read 0x80600000 0x400000 0x200000;bootm"
|
||||
|
||||
|
||||
|
||||
#define CONFIG_SYS_CONSOLE_IS_IN_ENV
|
||||
|
||||
/*
|
||||
* Serial download configuration
|
||||
*
|
||||
*/
|
||||
#define CONFIG_LOADS_ECHO 1 /* echo on for serial download */
|
||||
#define CONFIG_SYS_LOADS_BAUD_CHANGE 1 /* allow baudrate change */
|
||||
|
||||
/*
|
||||
* Miscellaneous configurable options
|
||||
*/
|
||||
#define CONFIG_SYS_LONGHELP /* undef to save memory */
|
||||
#define CONFIG_SYS_PROMPT "n516 # " /* Monitor Command Prompt */
|
||||
#define CONFIG_SYS_CBSIZE 256 /* Console I/O Buffer Size */
|
||||
#define CONFIG_SYS_PBSIZE (CONFIG_SYS_CBSIZE+sizeof(CONFIG_SYS_PROMPT)+16) /* Print Buffer Size */
|
||||
#define CONFIG_SYS_MAXARGS 16 /* max number of command args*/
|
||||
|
||||
#define CONFIG_SYS_MALLOC_LEN 1024*1024*2
|
||||
#define CONFIG_SYS_BOOTPARAMS_LEN 128*1024
|
||||
|
||||
#define CONFIG_SYS_SDRAM_BASE 0x80000000 /* Cached addr */
|
||||
|
||||
#define CONFIG_SYS_INIT_SP_OFFSET 0x400000
|
||||
|
||||
#define CONFIG_SYS_LOAD_ADDR 0x80600000 /* default load address */
|
||||
|
||||
#define CONFIG_SYS_MEMTEST_START 0x80100000
|
||||
#define CONFIG_SYS_MEMTEST_END 0x80800000
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* Environment
|
||||
*----------------------------------------------------------------------*/
|
||||
#if !defined(CONFIG_NAND_U_BOOT) && !defined(CONFIG_NAND_SPL)
|
||||
#define CONFIG_ENV_IS_IN_FLASH 1 /* use FLASH for environment vars */
|
||||
#else
|
||||
#define CONFIG_ENV_IS_IN_NAND 1 /* use NAND for environment vars */
|
||||
#endif
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* NAND FLASH configuration
|
||||
*/
|
||||
#define CONFIG_SYS_MAX_NAND_DEVICE 1
|
||||
#define NAND_MAX_CHIPS 1
|
||||
#define CONFIG_SYS_NAND_BASE 0xB8000000
|
||||
#define CONFIG_SYS_NAND_SELECT_DEVICE 1 /* nand driver supports mutipl. chips */
|
||||
|
||||
/*
|
||||
* IPL (Initial Program Loader, integrated inside CPU)
|
||||
* Will load first 8k from NAND (SPL) into cache and execute it from there.
|
||||
*
|
||||
* SPL (Secondary Program Loader)
|
||||
* Will load special U-Boot version (NUB) from NAND and execute it. This SPL
|
||||
* has to fit into 8kByte. It sets up the CPU and configures the SDRAM
|
||||
* controller and the NAND controller so that the special U-Boot image can be
|
||||
* loaded from NAND to SDRAM.
|
||||
*
|
||||
* NUB (NAND U-Boot)
|
||||
* This NAND U-Boot (NUB) is a special U-Boot version which can be started
|
||||
* from RAM. Therefore it mustn't (re-)configure the SDRAM controller.
|
||||
*
|
||||
*/
|
||||
#define CONFIG_SYS_NAND_U_BOOT_DST 0x80100000 /* Load NUB to this addr */
|
||||
#define CONFIG_SYS_NAND_U_BOOT_START CONFIG_SYS_NAND_U_BOOT_DST /* Start NUB from this addr */
|
||||
|
||||
/*
|
||||
* Define the partitioning of the NAND chip (only RAM U-Boot is needed here)
|
||||
*/
|
||||
#define CONFIG_SYS_NAND_U_BOOT_OFFS (256 << 10) /* Offset to RAM U-Boot image */
|
||||
#define CONFIG_SYS_NAND_U_BOOT_SIZE (512 << 10) /* Size of RAM U-Boot image */
|
||||
|
||||
#define CONFIG_SYS_NAND_PAGE_SIZE 2048
|
||||
#define CONFIG_SYS_NAND_BLOCK_SIZE (128 << 10) /* NAND chip block size */
|
||||
#define CONFIG_SYS_NAND_BADBLOCK_PAGE 63 /* NAND bad block was marked at this page in a block, starting from 0 */
|
||||
#define CONFIG_SYS_NAND_ECC_POS 6
|
||||
|
||||
#ifdef CONFIG_ENV_IS_IN_NAND
|
||||
//#define CONFIG_ENV_SIZE CONFIG_SYS_NAND_BLOCK_SIZE
|
||||
#define CONFIG_ENV_SIZE (128 * 1024)
|
||||
//#define CONFIG_ENV_OFFSET (CONFIG_SYS_NAND_BLOCK_SIZE + CONFIG_SYS_NAND_U_BOOT_SIZE + CONFIG_SYS_NAND_BLOCK_SIZE) /* environment starts here */
|
||||
#define CONFIG_ENV_OFFSET (CONFIG_SYS_NAND_U_BOOT_SIZE + CONFIG_SYS_NAND_U_BOOT_OFFS)
|
||||
//#define CONFIG_ENV_OFFSET_REDUND (CONFIG_ENV_OFFSET + CONFIG_ENV_SIZE)
|
||||
#endif
|
||||
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* NOR FLASH and environment organization
|
||||
*/
|
||||
#define CONFIG_SYS_MAX_FLASH_BANKS 1 /* max number of memory banks */
|
||||
#define CONFIG_SYS_MAX_FLASH_SECT (128) /* max number of sectors on one chip */
|
||||
|
||||
#define PHYS_FLASH_1 0xa8000000 /* Flash Bank #1 */
|
||||
|
||||
/* The following #defines are needed to get flash environment right */
|
||||
#define CONFIG_SYS_MONITOR_BASE TEXT_BASE /* in pavo/config.mk TEXT_BASE=0x88000000*/
|
||||
#define CONFIG_SYS_SYS_MONITOR_BASE TEXT_BASE /* in pavo/config.mk TEXT_BASE=0x88000000*/
|
||||
#define CONFIG_SYS_MONITOR_LEN (256*1024) /* Reserve 256 kB for Monitor */
|
||||
|
||||
#define CONFIG_SYS_FLASH_BASE PHYS_FLASH_1
|
||||
|
||||
/* timeout values are in ticks */
|
||||
#define CONFIG_SYS_FLASH_ERASE_TOUT (2 * CONFIG_SYS_HZ) /* Timeout for Flash Erase */
|
||||
#define CONFIG_SYS_FLASH_WRITE_TOUT (2 * CONFIG_SYS_HZ) /* Timeout for Flash Write */
|
||||
|
||||
#ifdef CONFIG_ENV_IS_IN_FLASH
|
||||
#define CONFIG_ENV_IS_NOWHERE 1
|
||||
#define CONFIG_ENV_ADDR 0xa8040000
|
||||
#define CONFIG_ENV_SIZE 0x20000
|
||||
#endif
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* SDRAM Info.
|
||||
*/
|
||||
#define CONFIG_NR_DRAM_BANKS 1
|
||||
|
||||
// SDRAM paramters
|
||||
#define SDRAM_BW16 0 /* Data bus width: 0-32bit, 1-16bit */
|
||||
#define SDRAM_BANK4 1 /* Banks each chip: 0-2bank, 1-4bank */
|
||||
#define SDRAM_ROW 13 /* Row address: 11 to 13 */
|
||||
#define SDRAM_COL 9 /* Column address: 8 to 12 */
|
||||
#define SDRAM_CASL 2 /* CAS latency: 2 or 3 */
|
||||
|
||||
// SDRAM Timings, unit: ns
|
||||
#define SDRAM_TRAS 45 /* RAS# Active Time */
|
||||
#define SDRAM_RCD 20 /* RAS# to CAS# Delay */
|
||||
#define SDRAM_TPC 20 /* RAS# Precharge Time */
|
||||
#define SDRAM_TRWL 7 /* Write Latency Time */
|
||||
#define SDRAM_TREF 15625 /* Refresh period: 4096 refresh cycles/64ms */
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* Cache Configuration
|
||||
*/
|
||||
#define CONFIG_SYS_DCACHE_SIZE 16384
|
||||
#define CONFIG_SYS_ICACHE_SIZE 16384
|
||||
#define CONFIG_SYS_CACHELINE_SIZE 32
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* GPIO definition
|
||||
*/
|
||||
#define GPIO_SD_VCC_EN_N 113 /* GPD17 */
|
||||
#define GPIO_SD_CD_N 103 /* GPD7 */
|
||||
#define GPIO_SD_WP 111 /* GPD15 */
|
||||
#define GPIO_USB_DETE 115 /* GPD6 */
|
||||
//#define GPIO_DC_DETE_N 103 /* GPD7 */
|
||||
#define GPIO_CHARG_STAT_N 112 /* GPD15 */
|
||||
#define GPIO_DISP_OFF_N 97 /* GPD1 */
|
||||
#define GPIO_UDC_HOTPLUG 100 /* GPD4 */
|
||||
#define GPIO_LED_EN 124 /* GPD28 */
|
||||
|
||||
#define GPIO_RST_L 50 /* GPB18 LCD_SPL */
|
||||
#define GPIO_LCDRDY 49 /* GPB17 LCD_CLS */
|
||||
#define GPIO_STBY 86 /* GPC22 LCD_PS */
|
||||
#define GPIO_ERR 87 /* GPC23 LCD_REV */
|
||||
|
||||
#endif /* __CONFIG_H */
|
||||
191
package/boot/uboot-xburst/files/include/configs/nanonote.h
Normal file
191
package/boot/uboot-xburst/files/include/configs/nanonote.h
Normal file
@@ -0,0 +1,191 @@
|
||||
/*
|
||||
* Authors: Xiangfu Liu <xiangfu.z@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
|
||||
* 3 of the License, or (at your option) any later version.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This file contains the configuration parameters for the NanoNote.
|
||||
*/
|
||||
#ifndef __CONFIG_NANONOTE_H
|
||||
#define __CONFIG_NANONOTE_H
|
||||
|
||||
#define CONFIG_MIPS32 1 /* MIPS32 CPU core */
|
||||
#define CONFIG_JzRISC 1 /* JzRISC core */
|
||||
#define CONFIG_JZSOC 1 /* Jz SoC */
|
||||
#define CONFIG_JZ4740 1 /* Jz4740 SoC */
|
||||
#define CONFIG_NANONOTE 1
|
||||
|
||||
#define CONFIG_LCD 1 /* LCD support */
|
||||
#define LCD_BPP LCD_COLOR32 /*5:18,24,32 bits per pixel */
|
||||
#define CONFIG_SYS_WHITE_ON_BLACK 1
|
||||
|
||||
#define CONFIG_SYS_CPU_SPEED 336000000 /* CPU clock: 336 MHz */
|
||||
#define CONFIG_SYS_EXTAL 12000000 /* EXTAL freq: 12 MHz */
|
||||
#define CONFIG_SYS_HZ (CONFIG_SYS_EXTAL / 256) /* incrementer freq */
|
||||
#define CONFIG_SYS_MIPS_TIMER_FREQ CONFIG_SYS_CPU_SPEED
|
||||
|
||||
#define CONFIG_SYS_UART_BASE UART0_BASE /* Base of the UART channel */
|
||||
#define CONFIG_BAUDRATE 57600
|
||||
#define CONFIG_SYS_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200 }
|
||||
|
||||
#define CONFIG_MMC 1
|
||||
#define CONFIG_FAT 1
|
||||
#define CONFIG_DOS_PARTITION 1
|
||||
#define CONFIG_SKIP_LOWLEVEL_INIT 1
|
||||
#define CONFIG_BOARD_EARLY_INIT_F 1
|
||||
#define CONFIG_SYS_NO_FLASH 1
|
||||
#define CONFIG_ENV_OVERWRITE 1
|
||||
|
||||
#define CONFIG_BOOTP_MASK (CONFIG_BOOTP_DEFAUL)
|
||||
#define CONFIG_BOOTDELAY 0
|
||||
#define CONFIG_BOOTFILE "uImage" /* file to load */
|
||||
/*
|
||||
* Command line configuration.
|
||||
*/
|
||||
#define CONFIG_CMD_BOOTD /* bootd */
|
||||
#define CONFIG_CMD_CONSOLE /* coninfo */
|
||||
#define CONFIG_CMD_ECHO /* echo arguments */
|
||||
|
||||
#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_SAVEENV /* saveenv */
|
||||
#define CONFIG_CMD_SETGETDCR /* DCR support on 4xx */
|
||||
#define CONFIG_CMD_SOURCE /* "source" command support */
|
||||
|
||||
#define CONFIG_CMD_NAND
|
||||
#define CONFIG_CMD_MMC
|
||||
#define CONFIG_CMD_FAT
|
||||
|
||||
/*
|
||||
* Serial download configuration
|
||||
*/
|
||||
#define CONFIG_LOADS_ECHO 1 /* echo on for serial download */
|
||||
#define CONFIG_LOADS_BAUD_CHANGE 1 /* allow baudrate change */
|
||||
|
||||
/*
|
||||
* Miscellaneous configurable options
|
||||
*/
|
||||
#define CONFIG_SYS_LONGHELP /* undef to save memory */
|
||||
#define CONFIG_SYS_PROMPT "QI# " /* Monitor Command Prompt */
|
||||
#define CONFIG_SYS_CBSIZE 256 /* Console I/O Buffer Size */
|
||||
#define CONFIG_SYS_PBSIZE (CONFIG_SYS_CBSIZE + sizeof(CONFIG_SYS_PROMPT) + 16)
|
||||
/* Print Buffer Size */
|
||||
#define CONFIG_SYS_MAXARGS 16 /* max number of command args*/
|
||||
|
||||
#define CONFIG_SYS_MALLOC_LEN 896 * 1024
|
||||
#define CONFIG_SYS_BOOTPARAMS_LEN 128 * 1024
|
||||
|
||||
#define CONFIG_SYS_SDRAM_BASE 0x80000000 /* Cached addr */
|
||||
#define CONFIG_SYS_INIT_SP_OFFSET 0x400000
|
||||
#define CONFIG_SYS_LOAD_ADDR 0x80600000 /* default load address */
|
||||
#define CONFIG_SYS_MEMTEST_START 0x80100000
|
||||
#define CONFIG_SYS_MEMTEST_END 0x80800000
|
||||
|
||||
/*
|
||||
* Environment
|
||||
*/
|
||||
#define CONFIG_ENV_IS_IN_NAND 1 /* use NAND for environment vars */
|
||||
|
||||
/*
|
||||
* NAND FLASH configuration
|
||||
*/
|
||||
/* NAND Boot config code */
|
||||
#define JZ4740_NANDBOOT_CFG JZ4740_NANDBOOT_B8R3
|
||||
|
||||
#define NANONOTE_NAND_SIZE 2 /* if board nand flash is 1GB, set to 1
|
||||
* if board nand flash is 2GB, set to 2
|
||||
* for change the PAGE_SIZE and BLOCK_SIZE
|
||||
* will delete when there is no 1GB flash
|
||||
*/
|
||||
|
||||
#define CONFIG_SYS_NAND_PAGE_SIZE (2048 * NANONOTE_NAND_SIZE)
|
||||
/* nand chip block size */
|
||||
#define CONFIG_SYS_NAND_BLOCK_SIZE (256 * NANONOTE_NAND_SIZE << 10)
|
||||
/* nand bad block was marked at this page in a block, start from 0 */
|
||||
#define CONFIG_SYS_NAND_BADBLOCK_PAGE 127
|
||||
/* ECC offset position in oob area, default value is 6 if it isn't defined */
|
||||
#define CONFIG_SYS_NAND_ECC_POS (6 * NANONOTE_NAND_SIZE)
|
||||
#define CONFIG_SYS_MAX_NAND_DEVICE 1
|
||||
#define NAND_MAX_CHIPS 1
|
||||
#define CONFIG_SYS_NAND_BASE 0xB8000000
|
||||
#define CONFIG_SYS_NAND_SELECT_DEVICE 1 /* nand driver supports mutipl.*/
|
||||
#define CONFIG_SYS_ONENAND_BASE CONFIG_SYS_NAND_BASE
|
||||
|
||||
/*
|
||||
* IPL (Initial Program Loader, integrated inside CPU)
|
||||
* Will load first 8k from NAND (SPL) into cache and execute it from there.
|
||||
*
|
||||
* SPL (Secondary Program Loader)
|
||||
* Will load special U-Boot version (NUB) from NAND and execute it. This SPL
|
||||
* has to fit into 8kByte. It sets up the CPU and configures the SDRAM
|
||||
* controller and the NAND controller so that the special U-Boot image can be
|
||||
* loaded from NAND to SDRAM.
|
||||
*
|
||||
* NUB (NAND U-Boot)
|
||||
* This NAND U-Boot (NUB) is a special U-Boot version which can be started
|
||||
* from RAM. Therefore it mustn't (re-)configure the SDRAM controller.
|
||||
*
|
||||
*/
|
||||
#define CONFIG_SYS_NAND_U_BOOT_DST 0x80100000 /* Load NUB to this addr */
|
||||
#define CONFIG_SYS_NAND_U_BOOT_START CONFIG_SYS_NAND_U_BOOT_DST
|
||||
/* Start NUB from this addr*/
|
||||
|
||||
/*
|
||||
* Define the partitioning of the NAND chip (only RAM U-Boot is needed here)
|
||||
*/
|
||||
#define CONFIG_SYS_NAND_U_BOOT_OFFS (256 << 10) /* Offset to RAM U-Boot image */
|
||||
#define CONFIG_SYS_NAND_U_BOOT_SIZE (512 << 10) /* Size of RAM U-Boot image */
|
||||
|
||||
#define CONFIG_ENV_SIZE CONFIG_SYS_NAND_BLOCK_SIZE
|
||||
#define CONFIG_ENV_OFFSET (CONFIG_SYS_NAND_BLOCK_SIZE + CONFIG_SYS_NAND_U_BOOT_SIZE + CONFIG_SYS_NAND_BLOCK_SIZE)
|
||||
/* environment starts here */
|
||||
#define CONFIG_ENV_OFFSET_REDUND (CONFIG_ENV_OFFSET + CONFIG_ENV_SIZE)
|
||||
|
||||
/* in board/nanonote/config.mk TEXT_BAS = 0x88000000 */
|
||||
#define CONFIG_SYS_MONITOR_BASE TEXT_BASE
|
||||
|
||||
/*
|
||||
* SDRAM Info.
|
||||
*/
|
||||
#define CONFIG_NR_DRAM_BANKS 1
|
||||
|
||||
/*
|
||||
* Cache Configuration
|
||||
*/
|
||||
#define CONFIG_SYS_DCACHE_SIZE 16384
|
||||
#define CONFIG_SYS_ICACHE_SIZE 16384
|
||||
#define CONFIG_SYS_CACHELINE_SIZE 32
|
||||
|
||||
/*
|
||||
* GPIO definition
|
||||
*/
|
||||
#define GPIO_LCD_CS (2 * 32 + 21)
|
||||
#define GPIO_DISP_OFF_N (3 * 32 + 21)
|
||||
#define GPIO_PWM (3 * 32 + 27)
|
||||
|
||||
#define GPIO_AMP_EN (3 * 32 + 4)
|
||||
|
||||
#define GPIO_SDPW_EN (3 * 32 + 2)
|
||||
#define GPIO_SD_DETECT (3 * 32 + 0)
|
||||
|
||||
#define GPIO_USB_DETECT (3 * 32 + 27)
|
||||
#define GPIO_BUZZ_PWM (3 * 32 + 28)
|
||||
|
||||
#define GPIO_AUDIO_POP (1 * 32 + 29)
|
||||
#define GPIO_COB_TEST (1 * 32 + 30)
|
||||
|
||||
#define GPIO_KEYOUT_BASE (2 * 32 + 10)
|
||||
#define GPIO_KEYIN_BASE (3 * 32 + 18)
|
||||
#define GPIO_KEYIN_8 (3 * 32 + 26)
|
||||
|
||||
#define GPIO_SD_CD_N GPIO_SD_DETECT /* SD Card insert detect */
|
||||
#define GPIO_SD_VCC_EN_N GPIO_SDPW_EN /* SD Card Power Enable */
|
||||
|
||||
#endif /* __CONFIG_NANONOTE_H */
|
||||
27
package/boot/uboot-xburst/files/include/configs/qi_lb60.h
Normal file
27
package/boot/uboot-xburst/files/include/configs/qi_lb60.h
Normal file
@@ -0,0 +1,27 @@
|
||||
#ifndef __CONFIG_QI_LB60_H
|
||||
#define __CONFIG_QI_LB60_H
|
||||
|
||||
#include <configs/nanonote.h>
|
||||
|
||||
#define CONFIG_QI_LB60 1
|
||||
|
||||
#define CONFIG_BOOTARGS "mem=32M console=ttyS0,57600n8 ubi.mtd=2 rootfstype=ubifs root=ubi0:rootfs rw rootwait"
|
||||
#define CONFIG_BOOTARGSFROMSD "mem=32M console=ttyS0,57600n8 rootfstype=ext2 root=/dev/mmcblk0p2 rw rootwait"
|
||||
#define CONFIG_BOOTCOMMAND "nand read 0x80600000 0x400000 0x200000;bootm"
|
||||
#define CONFIG_BOOTCOMMANDFROMSD "mmc init; fatload mmc 0 0x80600000 uImage; bootm"
|
||||
|
||||
/* SDRAM paramters */
|
||||
#define SDRAM_BW16 1 /* Data bus width: 0-32bit, 1-16bit */
|
||||
#define SDRAM_BANK4 1 /* Banks each chip: 0-2bank, 1-4bank */
|
||||
#define SDRAM_ROW 13 /* Row address: 11 to 13 */
|
||||
#define SDRAM_COL 9 /* Column address: 8 to 12 */
|
||||
#define SDRAM_CASL 2 /* CAS latency: 2 or 3 */
|
||||
|
||||
/* SDRAM Timings, unit: ns */
|
||||
#define SDRAM_TRAS 45 /* RAS# Active Time */
|
||||
#define SDRAM_RCD 20 /* RAS# to CAS# Delay */
|
||||
#define SDRAM_TPC 20 /* RAS# Precharge Time */
|
||||
#define SDRAM_TRWL 7 /* Write Latency Time */
|
||||
#define SDRAM_TREF 15625 /* Refresh period: 8192 cycles/64ms */
|
||||
|
||||
#endif
|
||||
200
package/boot/uboot-xburst/files/include/configs/sakc.h
Normal file
200
package/boot/uboot-xburst/files/include/configs/sakc.h
Normal file
@@ -0,0 +1,200 @@
|
||||
/*
|
||||
* Authors: Xiangfu Liu <xiangfu.z@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
|
||||
* 3 of the License, or (at your option) any later version.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This file contains the configuration parameters for SAKC.
|
||||
*/
|
||||
#ifndef __CONFIG_H
|
||||
#define __CONFIG_H
|
||||
|
||||
#define DEBUG
|
||||
#define CONFIG_MIPS32 1 /* MIPS32 CPU core */
|
||||
#define CONFIG_JzRISC 1 /* JzRISC core */
|
||||
#define CONFIG_JZSOC 1 /* Jz SoC */
|
||||
#define CONFIG_JZ4725 1 /* Jz4725 SoC */
|
||||
#define CONFIG_JZ4740 1 /* Jz4740 SoC */
|
||||
#define CONFIG_SAKC 1 /* SAKC board */
|
||||
|
||||
#define MMC_BUS_WIDTH_1BIT 1 /* 1 for MMC 1Bit Bus Width */
|
||||
|
||||
//#define CONFIG_LCD 1 /* LCD support */
|
||||
//#define LCD_BPP LCD_COLOR32 /*5:18,24,32 bits per pixel */
|
||||
//#define CONFIG_SYS_WHITE_ON_BLACK 1
|
||||
|
||||
#define CONFIG_SYS_CPU_SPEED 336000000 /* CPU clock: 336 MHz */
|
||||
#define CONFIG_SYS_EXTAL 12000000 /* EXTAL freq: 12 MHz */
|
||||
#define CONFIG_SYS_HZ (CONFIG_SYS_EXTAL / 256) /* incrementer freq */
|
||||
#define CONFIG_SYS_MIPS_TIMER_FREQ CONFIG_SYS_CPU_SPEED
|
||||
|
||||
#define CONFIG_SYS_UART_BASE UART0_BASE /* Base of the UART channel */
|
||||
#define CONFIG_BAUDRATE 57600
|
||||
#define CONFIG_SYS_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200 }
|
||||
|
||||
#define CONFIG_MMC 1
|
||||
#define CONFIG_FAT 1
|
||||
#define CONFIG_DOS_PARTITION 1
|
||||
#define CONFIG_SKIP_LOWLEVEL_INIT 1
|
||||
#define CONFIG_BOARD_EARLY_INIT_F 1
|
||||
#define CONFIG_SYS_NO_FLASH 1
|
||||
#define CONFIG_ENV_OVERWRITE 1
|
||||
|
||||
#define CONFIG_BOOTP_MASK (CONFIG_BOOTP_DEFAUL)
|
||||
#define CONFIG_BOOTDELAY 3
|
||||
#define CONFIG_BOOTFILE "uImage" /* file to load */
|
||||
#define CONFIG_BOOTARGS "mem=32M console=ttyS0,57600n8 ubi.mtd=2 rootfstype=ubifs root=ubi0:rootfs rw rootwait"
|
||||
#define CONFIG_EXTRA_ENV_SETTINGS 1
|
||||
#define CONFIG_BOOTARGSFROMSD "mem=32M console=ttyS0,57600n8 rootfstype=ext2 root=/dev/mmcblk0p1 rw rootwait"
|
||||
#define CONFIG_BOOTCOMMAND "nand read 0x80600000 0x400000 0x200000;bootm"
|
||||
|
||||
/*
|
||||
* 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_IMI /* iminfo */
|
||||
#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_SAVEENV /* saveenv */
|
||||
#define CONFIG_CMD_SETGETDCR /* DCR support on 4xx */
|
||||
#define CONFIG_CMD_SOURCE /* "source" command support */
|
||||
#define CONFIG_CMD_XIMG /* Load part of Multi Image */
|
||||
|
||||
#define CONFIG_CMD_NAND
|
||||
#define CONFIG_CMD_MMC
|
||||
#define CONFIG_CMD_FAT
|
||||
|
||||
/*
|
||||
* Serial download configuration
|
||||
*/
|
||||
#define CONFIG_LOADS_ECHO 1 /* echo on for serial download */
|
||||
#define CONFIG_LOADS_BAUD_CHANGE 1 /* allow baudrate change */
|
||||
|
||||
/*
|
||||
* Miscellaneous configurable options
|
||||
*/
|
||||
#define CONFIG_SYS_LONGHELP /* undef to save memory */
|
||||
#define CONFIG_SYS_PROMPT "SAKC# " /* Monitor Command Prompt */
|
||||
#define CONFIG_SYS_CBSIZE 256 /* Console I/O Buffer Size */
|
||||
#define CONFIG_SYS_PBSIZE (CONFIG_SYS_CBSIZE + sizeof(CONFIG_SYS_PROMPT) + 16)
|
||||
/* Print Buffer Size */
|
||||
#define CONFIG_SYS_MAXARGS 16 /* max number of command args*/
|
||||
|
||||
#define CONFIG_SYS_MALLOC_LEN 128 * 1024
|
||||
#define CONFIG_SYS_BOOTPARAMS_LEN 128 * 1024
|
||||
|
||||
#define CONFIG_SYS_SDRAM_BASE 0x80000000 /* Cached addr */
|
||||
#define CONFIG_SYS_INIT_SP_OFFSET 0x400000
|
||||
#define CONFIG_SYS_LOAD_ADDR 0x80600000 /* default load address */
|
||||
#define CONFIG_SYS_MEMTEST_START 0x80100000
|
||||
#define CONFIG_SYS_MEMTEST_END 0x80800000
|
||||
|
||||
/*
|
||||
* Environment
|
||||
*/
|
||||
#define CONFIG_ENV_IS_IN_NAND 1 /* use NAND for environment vars */
|
||||
|
||||
/*
|
||||
* NAND FLASH configuration
|
||||
*/
|
||||
/* NAND Boot config code */
|
||||
#define JZ4740_NANDBOOT_CFG JZ4740_NANDBOOT_B8R3
|
||||
|
||||
#define SAKC_NAND_SIZE 1 /* if board nand flash is 1GB, set to 1
|
||||
* if board nand flash is 2GB, set to 2
|
||||
* for change the PAGE_SIZE and BLOCK_SIZE
|
||||
* will delete when there is no 1GB flash
|
||||
*/
|
||||
|
||||
#define CONFIG_SYS_NAND_PAGE_SIZE (2048 * SAKC_NAND_SIZE)
|
||||
/* nand chip block size */
|
||||
#define CONFIG_SYS_NAND_BLOCK_SIZE (256 * SAKC_NAND_SIZE << 10)
|
||||
/* nand bad block was marked at this page in a block, start from 0 */
|
||||
#define CONFIG_SYS_NAND_BADBLOCK_PAGE 127
|
||||
/* ECC offset position in oob area, default value is 6 if it isn't defined */
|
||||
#define CONFIG_SYS_NAND_ECC_POS (6 * SAKC_NAND_SIZE)
|
||||
#define CONFIG_SYS_MAX_NAND_DEVICE 1
|
||||
#define NAND_MAX_CHIPS 1
|
||||
#define CONFIG_SYS_NAND_BASE 0xB8000000
|
||||
#define CONFIG_SYS_NAND_SELECT_DEVICE 1 /* nand driver supports mutipl.*/
|
||||
#define CONFIG_SYS_ONENAND_BASE CONFIG_SYS_NAND_BASE
|
||||
|
||||
/*
|
||||
* IPL (Initial Program Loader, integrated inside CPU)
|
||||
* Will load first 8k from NAND (SPL) into cache and execute it from there.
|
||||
*
|
||||
* SPL (Secondary Program Loader)
|
||||
* Will load special U-Boot version (NUB) from NAND and execute it. This SPL
|
||||
* has to fit into 8kByte. It sets up the CPU and configures the SDRAM
|
||||
* controller and the NAND controller so that the special U-Boot image can be
|
||||
* loaded from NAND to SDRAM.
|
||||
*
|
||||
* NUB (NAND U-Boot)
|
||||
* This NAND U-Boot (NUB) is a special U-Boot version which can be started
|
||||
* from RAM. Therefore it mustn't (re-)configure the SDRAM controller.
|
||||
*
|
||||
*/
|
||||
#define CONFIG_SYS_NAND_U_BOOT_DST 0x80100000 /* Load NUB to this addr */
|
||||
#define CONFIG_SYS_NAND_U_BOOT_START CONFIG_SYS_NAND_U_BOOT_DST
|
||||
/* Start NUB from this addr*/
|
||||
|
||||
/*
|
||||
* Define the partitioning of the NAND chip (only RAM U-Boot is needed here)
|
||||
*/
|
||||
#define CONFIG_SYS_NAND_U_BOOT_OFFS (256 << 10) /* Offset to RAM U-Boot image */
|
||||
#define CONFIG_SYS_NAND_U_BOOT_SIZE (512 << 10) /* Size of RAM U-Boot image */
|
||||
|
||||
#define CONFIG_ENV_SIZE CONFIG_SYS_NAND_BLOCK_SIZE
|
||||
#define CONFIG_ENV_OFFSET (CONFIG_SYS_NAND_BLOCK_SIZE + CONFIG_SYS_NAND_U_BOOT_SIZE + CONFIG_SYS_NAND_BLOCK_SIZE)
|
||||
/* environment starts here */
|
||||
#define CONFIG_ENV_OFFSET_REDUND (CONFIG_ENV_OFFSET + CONFIG_ENV_SIZE)
|
||||
|
||||
/* in qi_lb60.h/config.mk TEXT_BAS = 0x88000000 */
|
||||
#define CONFIG_SYS_MONITOR_BASE TEXT_BASE
|
||||
|
||||
/*
|
||||
* SDRAM Info.
|
||||
*/
|
||||
#define CONFIG_NR_DRAM_BANKS 1
|
||||
|
||||
/* SDRAM paramters */
|
||||
#define SDRAM_BW16 1 /* Data bus width: 0-32bit, 1-16bit */
|
||||
#define SDRAM_BANK4 1 /* Banks each chip: 0-2bank, 1-4bank */
|
||||
#define SDRAM_ROW 13 /* Row address: 11 to 13 */
|
||||
#define SDRAM_COL 9 /* Column address: 8 to 12 */
|
||||
#define SDRAM_CASL 2 /* CAS latency: 2 or 3 */
|
||||
|
||||
/* SDRAM Timings, unit: ns */
|
||||
#define SDRAM_TRAS 45 /* RAS# Active Time */
|
||||
#define SDRAM_RCD 20 /* RAS# to CAS# Delay */
|
||||
#define SDRAM_TPC 20 /* RAS# Precharge Time */
|
||||
#define SDRAM_TRWL 7 /* Write Latency Time */
|
||||
#define SDRAM_TREF 15625 /* Refresh period: 8192 cycles/64ms */
|
||||
|
||||
/*
|
||||
* Cache Configuration
|
||||
*/
|
||||
#define CONFIG_SYS_DCACHE_SIZE 16384
|
||||
#define CONFIG_SYS_ICACHE_SIZE 16384
|
||||
#define CONFIG_SYS_CACHELINE_SIZE 32
|
||||
|
||||
/*
|
||||
* GPIO definition
|
||||
*/
|
||||
#define GPIO_SD_DETECT (2 * 32 + 27)
|
||||
#define GPIO_SD_CD_N GPIO_SD_DETECT /* SD Card insert detect */
|
||||
#define GPIO_SD_VCC_EN_N GPIO_SDPW_EN /* SD Card Power Enable */
|
||||
|
||||
#endif /* __CONFIG_H */
|
||||
104
package/boot/uboot-xburst/files/nand_spl/board/n516/Makefile
Normal file
104
package/boot/uboot-xburst/files/nand_spl/board/n516/Makefile
Normal file
@@ -0,0 +1,104 @@
|
||||
#
|
||||
# (C) Copyright 2006
|
||||
# Stefan Roese, DENX Software Engineering, sr@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
|
||||
#
|
||||
|
||||
include $(TOPDIR)/config.mk
|
||||
include $(TOPDIR)/nand_spl/board/$(BOARDDIR)/config.mk
|
||||
|
||||
LDSCRIPT= $(TOPDIR)/nand_spl/board/$(BOARDDIR)/u-boot.lds
|
||||
LDFLAGS = -Bstatic -T $(LDSCRIPT) -Ttext $(TEXT_BASE)
|
||||
AFLAGS += -DCONFIG_NAND_SPL
|
||||
CFLAGS += -DCONFIG_NAND_SPL
|
||||
|
||||
SOBJS = start.o usb_boot.o
|
||||
COBJS = nand_boot_jz4740.o cpu.o jz4740.o jz_serial.o
|
||||
|
||||
SRCS := $(addprefix $(obj),$(SOBJS:.o=.S) $(COBJS:.o=.c))
|
||||
OBJS := $(addprefix $(obj),$(SOBJS) $(COBJS))
|
||||
__OBJS := $(SOBJS) $(COBJS)
|
||||
LNDIR := $(OBJTREE)/nand_spl/board/$(BOARDDIR)
|
||||
|
||||
nandobj := $(OBJTREE)/nand_spl/
|
||||
|
||||
ALL = $(nandobj)u-boot-spl $(nandobj)u-boot-spl.bin $(nandobj)u-boot-spl-16k.bin
|
||||
all: $(obj).depend $(ALL)
|
||||
|
||||
$(nandobj)u-boot-spl-16k.bin: $(nandobj)u-boot-spl.bin
|
||||
dd bs=1024 count=8 if=/dev/zero of=$(nandobj)junk1
|
||||
cat $< $(nandobj)junk1 > $(nandobj)junk2
|
||||
dd bs=1024 count=8 if=$(nandobj)junk2 of=$(nandobj)junk3
|
||||
cat $(nandobj)junk3 $(nandobj)junk3 > $(nandobj)junk4
|
||||
dd bs=1024 count=256 if=/dev/zero of=$(nandobj)junk5
|
||||
cat $(nandobj)junk4 $(nandobj)junk5 > $(nandobj)junk6
|
||||
dd bs=1024 count=256 if=$(nandobj)junk6 of=$@
|
||||
rm -f $(nandobj)junk*
|
||||
|
||||
$(nandobj)u-boot-spl.bin: $(nandobj)u-boot-spl
|
||||
$(OBJCOPY) ${OBJCFLAGS} -O binary $< $@
|
||||
|
||||
$(nandobj)u-boot-spl: $(OBJS)
|
||||
cd $(LNDIR) && $(LD) $(LDFLAGS) $$UNDEF_SYM $(__OBJS) \
|
||||
-Map $(nandobj)u-boot-spl.map \
|
||||
-o $(nandobj)u-boot-spl
|
||||
|
||||
# create symbolic links for common files
|
||||
|
||||
# from cpu directory
|
||||
$(obj)start.S:
|
||||
@rm -f $(obj)start.S
|
||||
ln -s $(SRCTREE)/cpu/mips/start.S $(obj)start.S
|
||||
|
||||
$(obj)usb_boot.S:
|
||||
@rm -f $(obj)usb_boot.S
|
||||
ln -s $(SRCTREE)/cpu/mips/usb_boot.S $(obj)usb_boot.S
|
||||
|
||||
$(obj)cpu.c:
|
||||
@rm -f $(obj)cpu.c
|
||||
ln -s $(SRCTREE)/cpu/mips/cpu.c $(obj)cpu.c
|
||||
|
||||
$(obj)jz4740.c:
|
||||
@rm -f $(obj)jz4740.c
|
||||
ln -s $(SRCTREE)/cpu/mips/jz4740.c $(obj)jz4740.c
|
||||
|
||||
$(obj)jz_serial.c:
|
||||
@rm -f $(obj)jz_serial.c
|
||||
ln -s $(SRCTREE)/cpu/mips/jz_serial.c $(obj)jz_serial.c
|
||||
|
||||
# from nand_spl directory
|
||||
$(obj)nand_boot_jz4740.c:
|
||||
@rm -f $(obj)nand_boot_jz4740.c
|
||||
ln -s $(SRCTREE)/nand_spl/nand_boot_jz4740.c $(obj)nand_boot_jz4740.c
|
||||
|
||||
#########################################################################
|
||||
|
||||
$(obj)%.o: $(obj)%.S
|
||||
$(CC) $(AFLAGS) -c -o $@ $<
|
||||
|
||||
$(obj)%.o: $(obj)%.c
|
||||
$(CC) $(CFLAGS) -c -o $@ $<
|
||||
|
||||
# defines $(obj).depend target
|
||||
include $(SRCTREE)/rules.mk
|
||||
|
||||
sinclude $(obj).depend
|
||||
|
||||
#########################################################################
|
||||
@@ -0,0 +1,34 @@
|
||||
#
|
||||
# (C) Copyright 2006
|
||||
# Stefan Roese, DENX Software Engineering, sr@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
|
||||
#
|
||||
#
|
||||
# Ingenic JZ4740 Reference Platform
|
||||
#
|
||||
|
||||
#
|
||||
# TEXT_BASE for SPL:
|
||||
#
|
||||
# On JZ4730 platforms the SPL is located at 0x80000000...0x80001000,
|
||||
# in the first 4kBytes of memory space in cache. So we set
|
||||
# TEXT_BASE to starting address in internal cache here.
|
||||
#
|
||||
TEXT_BASE = 0x80000000
|
||||
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
* (C) Copyright 2005
|
||||
* Ingenic Semiconductor, <jlwei@ingenic.cn>
|
||||
*
|
||||
* 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-tradlittlemips", "elf32-tradlittlemips", "elf32-tradlittlemips")
|
||||
|
||||
OUTPUT_ARCH(mips)
|
||||
ENTRY(_start)
|
||||
SECTIONS
|
||||
{
|
||||
. = 0x00000000;
|
||||
|
||||
. = ALIGN(4);
|
||||
.text :
|
||||
{
|
||||
*(.text)
|
||||
}
|
||||
|
||||
. = ALIGN(4);
|
||||
.rodata : { *(.rodata) }
|
||||
|
||||
. = ALIGN(4);
|
||||
.data : { *(.data) }
|
||||
|
||||
. = ALIGN(4);
|
||||
.sdata : { *(.sdata) }
|
||||
|
||||
_gp = ALIGN(16);
|
||||
|
||||
__got_start = .;
|
||||
.got : { *(.got) }
|
||||
__got_end = .;
|
||||
|
||||
.sdata : { *(.sdata) }
|
||||
|
||||
__u_boot_cmd_start = .;
|
||||
.u_boot_cmd : { *(.u_boot_cmd) }
|
||||
__u_boot_cmd_end = .;
|
||||
|
||||
uboot_end_data = .;
|
||||
num_got_entries = (__got_end - __got_start) >> 2;
|
||||
|
||||
. = ALIGN(4);
|
||||
.sbss : { *(.sbss) }
|
||||
.bss : { *(.bss) }
|
||||
uboot_end = .;
|
||||
}
|
||||
104
package/boot/uboot-xburst/files/nand_spl/board/nanonote/Makefile
Normal file
104
package/boot/uboot-xburst/files/nand_spl/board/nanonote/Makefile
Normal file
@@ -0,0 +1,104 @@
|
||||
#
|
||||
# (C) Copyright 2006
|
||||
# Stefan Roese, DENX Software Engineering, sr@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
|
||||
#
|
||||
|
||||
include $(TOPDIR)/config.mk
|
||||
include $(TOPDIR)/nand_spl/board/$(BOARDDIR)/config.mk
|
||||
|
||||
LDSCRIPT= $(TOPDIR)/nand_spl/board/$(BOARDDIR)/u-boot.lds
|
||||
LDFLAGS = -Bstatic -T $(LDSCRIPT) -Ttext $(TEXT_BASE)
|
||||
AFLAGS += -DCONFIG_NAND_SPL
|
||||
CFLAGS += -DCONFIG_NAND_SPL
|
||||
|
||||
SOBJS = start.o usb_boot.o
|
||||
COBJS = nand_boot_jz4740.o cpu.o jz4740.o jz_serial.o
|
||||
|
||||
SRCS := $(addprefix $(obj),$(SOBJS:.o=.S) $(COBJS:.o=.c))
|
||||
OBJS := $(addprefix $(obj),$(SOBJS) $(COBJS))
|
||||
__OBJS := $(SOBJS) $(COBJS)
|
||||
LNDIR := $(OBJTREE)/nand_spl/board/$(BOARDDIR)
|
||||
|
||||
nandobj := $(OBJTREE)/nand_spl/
|
||||
|
||||
ALL = $(nandobj)u-boot-spl $(nandobj)u-boot-spl.bin $(nandobj)u-boot-spl-16k.bin
|
||||
all: $(obj).depend $(ALL)
|
||||
|
||||
$(nandobj)u-boot-spl-16k.bin: $(nandobj)u-boot-spl.bin
|
||||
dd bs=1024 count=8 if=/dev/zero of=$(nandobj)junk1
|
||||
cat $< $(nandobj)junk1 > $(nandobj)junk2
|
||||
dd bs=1024 count=8 if=$(nandobj)junk2 of=$(nandobj)junk3
|
||||
cat $(nandobj)junk3 $(nandobj)junk3 > $(nandobj)junk4
|
||||
dd bs=1024 count=256 if=/dev/zero of=$(nandobj)junk5
|
||||
cat $(nandobj)junk4 $(nandobj)junk5 > $(nandobj)junk6
|
||||
dd bs=1024 count=256 if=$(nandobj)junk6 of=$@
|
||||
rm -f $(nandobj)junk*
|
||||
|
||||
$(nandobj)u-boot-spl.bin: $(nandobj)u-boot-spl
|
||||
$(OBJCOPY) ${OBJCFLAGS} -O binary $< $@
|
||||
|
||||
$(nandobj)u-boot-spl: $(OBJS)
|
||||
cd $(LNDIR) && $(LD) $(LDFLAGS) $$UNDEF_SYM $(__OBJS) \
|
||||
-Map $(nandobj)u-boot-spl.map \
|
||||
-o $(nandobj)u-boot-spl
|
||||
|
||||
# create symbolic links for common files
|
||||
|
||||
# from cpu directory
|
||||
$(obj)start.S:
|
||||
@rm -f $(obj)start.S
|
||||
ln -s $(SRCTREE)/cpu/mips/start.S $(obj)start.S
|
||||
|
||||
$(obj)usb_boot.S:
|
||||
@rm -f $(obj)usb_boot.S
|
||||
ln -s $(SRCTREE)/cpu/mips/usb_boot.S $(obj)usb_boot.S
|
||||
|
||||
$(obj)cpu.c:
|
||||
@rm -f $(obj)cpu.c
|
||||
ln -s $(SRCTREE)/cpu/mips/cpu.c $(obj)cpu.c
|
||||
|
||||
$(obj)jz4740.c:
|
||||
@rm -f $(obj)jz4740.c
|
||||
ln -s $(SRCTREE)/cpu/mips/jz4740.c $(obj)jz4740.c
|
||||
|
||||
$(obj)jz_serial.c:
|
||||
@rm -f $(obj)jz_serial.c
|
||||
ln -s $(SRCTREE)/cpu/mips/jz_serial.c $(obj)jz_serial.c
|
||||
|
||||
# from nand_spl directory
|
||||
$(obj)nand_boot_jz4740.c:
|
||||
@rm -f $(obj)nand_boot_jz4740.c
|
||||
ln -s $(SRCTREE)/nand_spl/nand_boot_jz4740.c $(obj)nand_boot_jz4740.c
|
||||
|
||||
#########################################################################
|
||||
|
||||
$(obj)%.o: $(obj)%.S
|
||||
$(CC) $(AFLAGS) -c -o $@ $<
|
||||
|
||||
$(obj)%.o: $(obj)%.c
|
||||
$(CC) $(CFLAGS) -c -o $@ $<
|
||||
|
||||
# defines $(obj).depend target
|
||||
include $(SRCTREE)/rules.mk
|
||||
|
||||
sinclude $(obj).depend
|
||||
|
||||
#########################################################################
|
||||
@@ -0,0 +1,34 @@
|
||||
#
|
||||
# (C) Copyright 2006
|
||||
# Stefan Roese, DENX Software Engineering, sr@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
|
||||
#
|
||||
#
|
||||
# Ingenic JZ4740 Reference Platform
|
||||
#
|
||||
|
||||
#
|
||||
# TEXT_BASE for SPL:
|
||||
#
|
||||
# On JZ4730 platforms the SPL is located at 0x80000000...0x80001000,
|
||||
# in the first 4kBytes of memory space in cache. So we set
|
||||
# TEXT_BASE to starting address in internal cache here.
|
||||
#
|
||||
TEXT_BASE = 0x80000000
|
||||
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
* (C) Copyright 2005
|
||||
* Ingenic Semiconductor, <jlwei@ingenic.cn>
|
||||
*
|
||||
* 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-tradlittlemips", "elf32-tradlittlemips", "elf32-tradlittlemips")
|
||||
|
||||
OUTPUT_ARCH(mips)
|
||||
ENTRY(_start)
|
||||
SECTIONS
|
||||
{
|
||||
. = 0x00000000;
|
||||
|
||||
. = ALIGN(4);
|
||||
.text :
|
||||
{
|
||||
*(.text)
|
||||
}
|
||||
|
||||
. = ALIGN(4);
|
||||
.rodata : { *(.rodata) }
|
||||
|
||||
. = ALIGN(4);
|
||||
.data : { *(.data) }
|
||||
|
||||
. = ALIGN(4);
|
||||
.sdata : { *(.sdata) }
|
||||
|
||||
_gp = ALIGN(16);
|
||||
|
||||
__got_start = .;
|
||||
.got : { *(.got) }
|
||||
__got_end = .;
|
||||
|
||||
.sdata : { *(.sdata) }
|
||||
|
||||
__u_boot_cmd_start = .;
|
||||
.u_boot_cmd : { *(.u_boot_cmd) }
|
||||
__u_boot_cmd_end = .;
|
||||
|
||||
uboot_end_data = .;
|
||||
num_got_entries = (__got_end - __got_start) >> 2;
|
||||
|
||||
. = ALIGN(4);
|
||||
.sbss : { *(.sbss) }
|
||||
.bss : { *(.bss) }
|
||||
uboot_end = .;
|
||||
}
|
||||
104
package/boot/uboot-xburst/files/nand_spl/board/sakc/Makefile
Normal file
104
package/boot/uboot-xburst/files/nand_spl/board/sakc/Makefile
Normal file
@@ -0,0 +1,104 @@
|
||||
#
|
||||
# (C) Copyright 2006
|
||||
# Stefan Roese, DENX Software Engineering, sr@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
|
||||
#
|
||||
|
||||
include $(TOPDIR)/config.mk
|
||||
include $(TOPDIR)/nand_spl/board/$(BOARDDIR)/config.mk
|
||||
|
||||
LDSCRIPT= $(TOPDIR)/nand_spl/board/$(BOARDDIR)/u-boot.lds
|
||||
LDFLAGS = -Bstatic -T $(LDSCRIPT) -Ttext $(TEXT_BASE)
|
||||
AFLAGS += -DCONFIG_NAND_SPL
|
||||
CFLAGS += -DCONFIG_NAND_SPL
|
||||
|
||||
SOBJS = start.o usb_boot.o
|
||||
COBJS = nand_boot_jz4740.o cpu.o jz4740.o jz_serial.o
|
||||
|
||||
SRCS := $(addprefix $(obj),$(SOBJS:.o=.S) $(COBJS:.o=.c))
|
||||
OBJS := $(addprefix $(obj),$(SOBJS) $(COBJS))
|
||||
__OBJS := $(SOBJS) $(COBJS)
|
||||
LNDIR := $(OBJTREE)/nand_spl/board/$(BOARDDIR)
|
||||
|
||||
nandobj := $(OBJTREE)/nand_spl/
|
||||
|
||||
ALL = $(nandobj)u-boot-spl $(nandobj)u-boot-spl.bin $(nandobj)u-boot-spl-16k.bin
|
||||
all: $(obj).depend $(ALL)
|
||||
|
||||
$(nandobj)u-boot-spl-16k.bin: $(nandobj)u-boot-spl.bin
|
||||
dd bs=1024 count=8 if=/dev/zero of=$(nandobj)junk1
|
||||
cat $< $(nandobj)junk1 > $(nandobj)junk2
|
||||
dd bs=1024 count=8 if=$(nandobj)junk2 of=$(nandobj)junk3
|
||||
cat $(nandobj)junk3 $(nandobj)junk3 > $(nandobj)junk4
|
||||
dd bs=1024 count=256 if=/dev/zero of=$(nandobj)junk5
|
||||
cat $(nandobj)junk4 $(nandobj)junk5 > $(nandobj)junk6
|
||||
dd bs=1024 count=256 if=$(nandobj)junk6 of=$@
|
||||
rm -f $(nandobj)junk*
|
||||
|
||||
$(nandobj)u-boot-spl.bin: $(nandobj)u-boot-spl
|
||||
$(OBJCOPY) ${OBJCFLAGS} -O binary $< $@
|
||||
|
||||
$(nandobj)u-boot-spl: $(OBJS)
|
||||
cd $(LNDIR) && $(LD) $(LDFLAGS) $$UNDEF_SYM $(__OBJS) \
|
||||
-Map $(nandobj)u-boot-spl.map \
|
||||
-o $(nandobj)u-boot-spl
|
||||
|
||||
# create symbolic links for common files
|
||||
|
||||
# from cpu directory
|
||||
$(obj)start.S:
|
||||
@rm -f $(obj)start.S
|
||||
ln -s $(SRCTREE)/cpu/mips/start.S $(obj)start.S
|
||||
|
||||
$(obj)usb_boot.S:
|
||||
@rm -f $(obj)usb_boot.S
|
||||
ln -s $(SRCTREE)/cpu/mips/usb_boot.S $(obj)usb_boot.S
|
||||
|
||||
$(obj)cpu.c:
|
||||
@rm -f $(obj)cpu.c
|
||||
ln -s $(SRCTREE)/cpu/mips/cpu.c $(obj)cpu.c
|
||||
|
||||
$(obj)jz4740.c:
|
||||
@rm -f $(obj)jz4740.c
|
||||
ln -s $(SRCTREE)/cpu/mips/jz4740.c $(obj)jz4740.c
|
||||
|
||||
$(obj)jz_serial.c:
|
||||
@rm -f $(obj)jz_serial.c
|
||||
ln -s $(SRCTREE)/cpu/mips/jz_serial.c $(obj)jz_serial.c
|
||||
|
||||
# from nand_spl directory
|
||||
$(obj)nand_boot_jz4740.c:
|
||||
@rm -f $(obj)nand_boot_jz4740.c
|
||||
ln -s $(SRCTREE)/nand_spl/nand_boot_jz4740.c $(obj)nand_boot_jz4740.c
|
||||
|
||||
#########################################################################
|
||||
|
||||
$(obj)%.o: $(obj)%.S
|
||||
$(CC) $(AFLAGS) -c -o $@ $<
|
||||
|
||||
$(obj)%.o: $(obj)%.c
|
||||
$(CC) $(CFLAGS) -c -o $@ $<
|
||||
|
||||
# defines $(obj).depend target
|
||||
include $(SRCTREE)/rules.mk
|
||||
|
||||
sinclude $(obj).depend
|
||||
|
||||
#########################################################################
|
||||
@@ -0,0 +1,34 @@
|
||||
#
|
||||
# (C) Copyright 2006
|
||||
# Stefan Roese, DENX Software Engineering, sr@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
|
||||
#
|
||||
#
|
||||
# Ingenic JZ4740 Reference Platform
|
||||
#
|
||||
|
||||
#
|
||||
# TEXT_BASE for SPL:
|
||||
#
|
||||
# On JZ4730 platforms the SPL is located at 0x80000000...0x80001000,
|
||||
# in the first 4kBytes of memory space in cache. So we set
|
||||
# TEXT_BASE to starting address in internal cache here.
|
||||
#
|
||||
TEXT_BASE = 0x80000000
|
||||
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
* (C) Copyright 2005
|
||||
* Ingenic Semiconductor, <jlwei@ingenic.cn>
|
||||
*
|
||||
* 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-tradlittlemips", "elf32-tradlittlemips", "elf32-tradlittlemips")
|
||||
|
||||
OUTPUT_ARCH(mips)
|
||||
ENTRY(_start)
|
||||
SECTIONS
|
||||
{
|
||||
. = 0x00000000;
|
||||
|
||||
. = ALIGN(4);
|
||||
.text :
|
||||
{
|
||||
*(.text)
|
||||
}
|
||||
|
||||
. = ALIGN(4);
|
||||
.rodata : { *(.rodata) }
|
||||
|
||||
. = ALIGN(4);
|
||||
.data : { *(.data) }
|
||||
|
||||
. = ALIGN(4);
|
||||
.sdata : { *(.sdata) }
|
||||
|
||||
_gp = ALIGN(16);
|
||||
|
||||
__got_start = .;
|
||||
.got : { *(.got) }
|
||||
__got_end = .;
|
||||
|
||||
.sdata : { *(.sdata) }
|
||||
|
||||
__u_boot_cmd_start = .;
|
||||
.u_boot_cmd : { *(.u_boot_cmd) }
|
||||
__u_boot_cmd_end = .;
|
||||
|
||||
uboot_end_data = .;
|
||||
num_got_entries = (__got_end - __got_start) >> 2;
|
||||
|
||||
. = ALIGN(4);
|
||||
.sbss : { *(.sbss) }
|
||||
.bss : { *(.bss) }
|
||||
uboot_end = .;
|
||||
}
|
||||
429
package/boot/uboot-xburst/files/nand_spl/nand_boot_jz4740.c
Normal file
429
package/boot/uboot-xburst/files/nand_spl/nand_boot_jz4740.c
Normal file
@@ -0,0 +1,429 @@
|
||||
/*
|
||||
* Copyright (C) 2007 Ingenic Semiconductor Inc.
|
||||
* Author: Peter <jlwei@ingenic.cn>
|
||||
*
|
||||
* 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 <nand.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/jz4740.h>
|
||||
|
||||
#define KEY_U_OUT (32 * 2 + 16)
|
||||
#define KEY_U_IN (32 * 3 + 19)
|
||||
|
||||
/*
|
||||
* NAND flash definitions
|
||||
*/
|
||||
|
||||
#define NAND_DATAPORT 0xb8000000
|
||||
#define NAND_ADDRPORT 0xb8010000
|
||||
#define NAND_COMMPORT 0xb8008000
|
||||
|
||||
#define ECC_BLOCK 512
|
||||
#define ECC_POS 6
|
||||
#define PAR_SIZE 9
|
||||
|
||||
#define __nand_enable() (REG_EMC_NFCSR |= EMC_NFCSR_NFE1 | EMC_NFCSR_NFCE1)
|
||||
#define __nand_disable() (REG_EMC_NFCSR &= ~(EMC_NFCSR_NFCE1))
|
||||
#define __nand_ecc_rs_encoding() \
|
||||
(REG_EMC_NFECR = EMC_NFECR_ECCE | EMC_NFECR_ERST | EMC_NFECR_RS | EMC_NFECR_RS_ENCODING)
|
||||
#define __nand_ecc_rs_decoding() \
|
||||
(REG_EMC_NFECR = EMC_NFECR_ECCE | EMC_NFECR_ERST | EMC_NFECR_RS | EMC_NFECR_RS_DECODING)
|
||||
#define __nand_ecc_disable() (REG_EMC_NFECR &= ~EMC_NFECR_ECCE)
|
||||
#define __nand_ecc_encode_sync() while (!(REG_EMC_NFINTS & EMC_NFINTS_ENCF))
|
||||
#define __nand_ecc_decode_sync() while (!(REG_EMC_NFINTS & EMC_NFINTS_DECF))
|
||||
|
||||
static inline void __nand_dev_ready(void)
|
||||
{
|
||||
unsigned int timeout = 10000;
|
||||
while ((REG_GPIO_PXPIN(2) & 0x40000000) && timeout--);
|
||||
while (!(REG_GPIO_PXPIN(2) & 0x40000000));
|
||||
}
|
||||
|
||||
#define __nand_cmd(n) (REG8(NAND_COMMPORT) = (n))
|
||||
#define __nand_addr(n) (REG8(NAND_ADDRPORT) = (n))
|
||||
#define __nand_data8() REG8(NAND_DATAPORT)
|
||||
#define __nand_data16() REG16(NAND_DATAPORT)
|
||||
|
||||
#if (JZ4740_NANDBOOT_CFG == JZ4740_NANDBOOT_B8R3)
|
||||
#define NAND_BUS_WIDTH 8
|
||||
#define NAND_ROW_CYCLE 3
|
||||
#elif (JZ4740_NANDBOOT_CFG == JZ4740_NANDBOOT_B8R2)
|
||||
#define NAND_BUS_WIDTH 8
|
||||
#define NAND_ROW_CYCLE 2
|
||||
#elif (JZ4740_NANDBOOT_CFG == JZ4740_NANDBOOT_B16R3)
|
||||
#define NAND_BUS_WIDTH 16
|
||||
#define NAND_ROW_CYCLE 3
|
||||
#elif (JZ4740_NANDBOOT_CFG == JZ4740_NANDBOOT_B16R2)
|
||||
#define NAND_BUS_WIDTH 16
|
||||
#define NAND_ROW_CYCLE 2
|
||||
#endif
|
||||
|
||||
/*
|
||||
* NAND flash parameters
|
||||
*/
|
||||
static int page_size = 2048;
|
||||
static int oob_size = 64;
|
||||
static int ecc_count = 4;
|
||||
static int page_per_block = 64;
|
||||
static int bad_block_pos = 0;
|
||||
static int block_size = 131072;
|
||||
|
||||
static unsigned char oob_buf[128] = {0};
|
||||
|
||||
/*
|
||||
* External routines
|
||||
*/
|
||||
extern void flush_cache_all(void);
|
||||
extern int serial_init(void);
|
||||
extern void serial_puts(const char *s);
|
||||
extern void sdram_init(void);
|
||||
extern void pll_init(void);
|
||||
extern void usb_boot();
|
||||
|
||||
/*
|
||||
* NAND flash routines
|
||||
*/
|
||||
#if NAND_BUS_WIDTH == 16
|
||||
static inline void nand_read_buf16(void *buf, int count)
|
||||
{
|
||||
int i;
|
||||
u16 *p = (u16 *)buf;
|
||||
|
||||
for (i = 0; i < count; i += 2)
|
||||
*p++ = __nand_data16();
|
||||
}
|
||||
#define nand_read_buf nand_read_buf16
|
||||
|
||||
#elif NAND_BUS_WIDTH == 8
|
||||
static inline void nand_read_buf8(void *buf, int count)
|
||||
{
|
||||
int i;
|
||||
u8 *p = (u8 *)buf;
|
||||
|
||||
for (i = 0; i < count; i++)
|
||||
*p++ = __nand_data8();
|
||||
}
|
||||
#define nand_read_buf nand_read_buf8
|
||||
|
||||
#endif
|
||||
|
||||
/* Correct 1~9-bit errors in 512-bytes data */
|
||||
static void rs_correct(unsigned char *dat, int idx, int mask)
|
||||
{
|
||||
int i;
|
||||
|
||||
idx--;
|
||||
|
||||
i = idx + (idx >> 3);
|
||||
if (i >= 512)
|
||||
return;
|
||||
|
||||
mask <<= (idx & 0x7);
|
||||
|
||||
dat[i] ^= mask & 0xff;
|
||||
if (i < 511)
|
||||
dat[i+1] ^= (mask >> 8) & 0xff;
|
||||
}
|
||||
|
||||
static int nand_read_oob(int page_addr, uchar *buf, int size)
|
||||
{
|
||||
int col_addr;
|
||||
if (page_size != 512)
|
||||
col_addr = page_size;
|
||||
else {
|
||||
col_addr = 0;
|
||||
__nand_dev_ready();
|
||||
}
|
||||
|
||||
if (page_size != 512)
|
||||
/* Send READ0 command */
|
||||
__nand_cmd(NAND_CMD_READ0);
|
||||
else
|
||||
/* Send READOOB command */
|
||||
__nand_cmd(NAND_CMD_READOOB);
|
||||
|
||||
/* Send column address */
|
||||
__nand_addr(col_addr & 0xff);
|
||||
if (page_size != 512)
|
||||
__nand_addr((col_addr >> 8) & 0xff);
|
||||
|
||||
/* Send page address */
|
||||
__nand_addr(page_addr & 0xff);
|
||||
__nand_addr((page_addr >> 8) & 0xff);
|
||||
#ifdef NAND_ROW_CYCLE == 3
|
||||
__nand_addr((page_addr >> 16) & 0xff);
|
||||
#endif
|
||||
|
||||
/* Send READSTART command for 2048 or 4096 ps NAND */
|
||||
if (page_size != 512)
|
||||
__nand_cmd(NAND_CMD_READSTART);
|
||||
|
||||
/* Wait for device ready */
|
||||
__nand_dev_ready();
|
||||
|
||||
/* Read oob data */
|
||||
nand_read_buf(buf, size);
|
||||
if (page_size == 512)
|
||||
__nand_dev_ready();
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int nand_read_page(int page_addr, uchar *dst, uchar *oobbuf)
|
||||
{
|
||||
uchar *databuf = dst, *tmpbuf;
|
||||
int i, j;
|
||||
|
||||
/*
|
||||
* Read oob data
|
||||
*/
|
||||
nand_read_oob(page_addr, oobbuf, oob_size);
|
||||
|
||||
/*
|
||||
* Read page data
|
||||
*/
|
||||
|
||||
/* Send READ0 command */
|
||||
__nand_cmd(NAND_CMD_READ0);
|
||||
|
||||
/* Send column address */
|
||||
__nand_addr(0);
|
||||
if (page_size != 512)
|
||||
__nand_addr(0);
|
||||
|
||||
/* Send page address */
|
||||
__nand_addr(page_addr & 0xff);
|
||||
__nand_addr((page_addr >> 8) & 0xff);
|
||||
#if NAND_ROW_CYCLE == 3
|
||||
__nand_addr((page_addr >> 16) & 0xff);
|
||||
#endif
|
||||
|
||||
/* Send READSTART command for 2048 or 4096 ps NAND */
|
||||
if (page_size != 512)
|
||||
__nand_cmd(NAND_CMD_READSTART);
|
||||
|
||||
/* Wait for device ready */
|
||||
__nand_dev_ready();
|
||||
|
||||
/* Read page data */
|
||||
tmpbuf = databuf;
|
||||
|
||||
for (i = 0; i < ecc_count; i++) {
|
||||
volatile unsigned char *paraddr = (volatile unsigned char *)EMC_NFPAR0;
|
||||
unsigned int stat;
|
||||
|
||||
/* Enable RS decoding */
|
||||
REG_EMC_NFINTS = 0x0;
|
||||
__nand_ecc_rs_decoding();
|
||||
|
||||
/* Read data */
|
||||
nand_read_buf((void *)tmpbuf, ECC_BLOCK);
|
||||
|
||||
/* Set PAR values */
|
||||
for (j = 0; j < PAR_SIZE; j++) {
|
||||
#if defined(CONFIG_SYS_NAND_ECC_POS)
|
||||
*paraddr++ = oobbuf[CONFIG_SYS_NAND_ECC_POS + i*PAR_SIZE + j];
|
||||
#else
|
||||
*paraddr++ = oobbuf[ECC_POS + i*PAR_SIZE + j];
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Set PRDY */
|
||||
REG_EMC_NFECR |= EMC_NFECR_PRDY;
|
||||
|
||||
/* Wait for completion */
|
||||
__nand_ecc_decode_sync();
|
||||
|
||||
/* Disable decoding */
|
||||
__nand_ecc_disable();
|
||||
|
||||
/* Check result of decoding */
|
||||
stat = REG_EMC_NFINTS;
|
||||
if (stat & EMC_NFINTS_ERR) {
|
||||
/* Error occurred */
|
||||
/* serial_puts("\n Error occurred\n"); */
|
||||
if (stat & EMC_NFINTS_UNCOR) {
|
||||
/* Uncorrectable error occurred */
|
||||
/* serial_puts("\nUncorrectable error occurred\n"); */
|
||||
}
|
||||
else {
|
||||
unsigned int errcnt, index, mask;
|
||||
|
||||
errcnt = (stat & EMC_NFINTS_ERRCNT_MASK) >> EMC_NFINTS_ERRCNT_BIT;
|
||||
switch (errcnt) {
|
||||
case 4:
|
||||
index = (REG_EMC_NFERR3 & EMC_NFERR_INDEX_MASK) >> EMC_NFERR_INDEX_BIT;
|
||||
mask = (REG_EMC_NFERR3 & EMC_NFERR_MASK_MASK) >> EMC_NFERR_MASK_BIT;
|
||||
rs_correct(tmpbuf, index, mask);
|
||||
/* FALL-THROUGH */
|
||||
case 3:
|
||||
index = (REG_EMC_NFERR2 & EMC_NFERR_INDEX_MASK) >> EMC_NFERR_INDEX_BIT;
|
||||
mask = (REG_EMC_NFERR2 & EMC_NFERR_MASK_MASK) >> EMC_NFERR_MASK_BIT;
|
||||
rs_correct(tmpbuf, index, mask);
|
||||
/* FALL-THROUGH */
|
||||
case 2:
|
||||
index = (REG_EMC_NFERR1 & EMC_NFERR_INDEX_MASK) >> EMC_NFERR_INDEX_BIT;
|
||||
mask = (REG_EMC_NFERR1 & EMC_NFERR_MASK_MASK) >> EMC_NFERR_MASK_BIT;
|
||||
rs_correct(tmpbuf, index, mask);
|
||||
/* FALL-THROUGH */
|
||||
case 1:
|
||||
index = (REG_EMC_NFERR0 & EMC_NFERR_INDEX_MASK) >> EMC_NFERR_INDEX_BIT;
|
||||
mask = (REG_EMC_NFERR0 & EMC_NFERR_MASK_MASK) >> EMC_NFERR_MASK_BIT;
|
||||
rs_correct(tmpbuf, index, mask);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
tmpbuf += ECC_BLOCK;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifndef CONFIG_SYS_NAND_BADBLOCK_PAGE
|
||||
#define CONFIG_SYS_NAND_BADBLOCK_PAGE 0 /* NAND bad block was marked at this page in a block, starting from 0 */
|
||||
#endif
|
||||
|
||||
static void nand_load(int offs, int uboot_size, uchar *dst)
|
||||
{
|
||||
int page;
|
||||
int pagecopy_count;
|
||||
|
||||
__nand_enable();
|
||||
|
||||
page = offs / page_size;
|
||||
pagecopy_count = 0;
|
||||
while (pagecopy_count < (uboot_size / page_size)) {
|
||||
if (page % page_per_block == 0) {
|
||||
nand_read_oob(page + CONFIG_SYS_NAND_BADBLOCK_PAGE, oob_buf, oob_size);
|
||||
if (oob_buf[bad_block_pos] != 0xff) {
|
||||
page += page_per_block;
|
||||
/* Skip bad block */
|
||||
continue;
|
||||
}
|
||||
}
|
||||
/* Load this page to dst, do the ECC */
|
||||
nand_read_page(page, dst, oob_buf);
|
||||
|
||||
dst += page_size;
|
||||
page++;
|
||||
pagecopy_count++;
|
||||
}
|
||||
|
||||
__nand_disable();
|
||||
}
|
||||
|
||||
static void jz_nand_init(void) {
|
||||
|
||||
/* Optimize the timing of nand */
|
||||
REG_EMC_SMCR1 = 0x094c4400;
|
||||
}
|
||||
|
||||
static void gpio_init(void)
|
||||
{
|
||||
/*
|
||||
* Initialize SDRAM pins
|
||||
*/
|
||||
#if defined(CONFIG_JZ4720)
|
||||
__gpio_as_sdram_16bit_4720();
|
||||
#elif defined(CONFIG_JZ4725)
|
||||
__gpio_as_sdram_16bit_4725();
|
||||
#else
|
||||
__gpio_as_sdram_32bit();
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Initialize UART0 pins
|
||||
*/
|
||||
__gpio_as_uart0();
|
||||
}
|
||||
|
||||
static int is_usb_boot()
|
||||
{
|
||||
int keyU = 0;
|
||||
|
||||
__gpio_as_input(KEY_U_IN);
|
||||
__gpio_enable_pull(KEY_U_IN);
|
||||
|
||||
__gpio_as_output(KEY_U_OUT);
|
||||
__gpio_clear_pin(KEY_U_OUT);
|
||||
|
||||
keyU = __gpio_get_pin(KEY_U_IN);
|
||||
|
||||
if (keyU)
|
||||
serial_puts("[U] not pressed\n");
|
||||
else
|
||||
serial_puts("[U] pressed\n");
|
||||
|
||||
return !keyU;
|
||||
}
|
||||
|
||||
void nand_boot(void)
|
||||
{
|
||||
void (*uboot)(void);
|
||||
|
||||
/*
|
||||
* Init hardware
|
||||
*/
|
||||
jz_nand_init();
|
||||
gpio_init();
|
||||
serial_init();
|
||||
|
||||
serial_puts("\n\nNAND Secondary Program Loader\n\n");
|
||||
|
||||
pll_init();
|
||||
sdram_init();
|
||||
|
||||
#if defined(CONFIG_NANONOTE)
|
||||
if(is_usb_boot()) {
|
||||
serial_puts("enter USB BOOT mode\n");
|
||||
usb_boot();
|
||||
}
|
||||
#endif
|
||||
|
||||
page_size = CONFIG_SYS_NAND_PAGE_SIZE;
|
||||
block_size = CONFIG_SYS_NAND_BLOCK_SIZE;
|
||||
page_per_block = CONFIG_SYS_NAND_BLOCK_SIZE / CONFIG_SYS_NAND_PAGE_SIZE;
|
||||
bad_block_pos = (page_size == 512) ? 5 : 0;
|
||||
oob_size = page_size / 32;
|
||||
ecc_count = page_size / ECC_BLOCK;
|
||||
|
||||
/*
|
||||
* Load U-Boot image from NAND into RAM
|
||||
*/
|
||||
nand_load(CONFIG_SYS_NAND_U_BOOT_OFFS, CONFIG_SYS_NAND_U_BOOT_SIZE,
|
||||
(uchar *)CONFIG_SYS_NAND_U_BOOT_DST);
|
||||
|
||||
uboot = (void (*)(void))CONFIG_SYS_NAND_U_BOOT_START;
|
||||
|
||||
serial_puts("Starting U-Boot ...\n");
|
||||
|
||||
/*
|
||||
* Flush caches
|
||||
*/
|
||||
flush_cache_all();
|
||||
|
||||
/*
|
||||
* Jump to U-Boot image
|
||||
*/
|
||||
(*uboot)();
|
||||
}
|
||||
1669
package/boot/uboot-xburst/patches/001-xburst.patch
Normal file
1669
package/boot/uboot-xburst/patches/001-xburst.patch
Normal file
File diff suppressed because it is too large
Load Diff
13
package/boot/uboot-xburst/patches/005-i2c.patch
Normal file
13
package/boot/uboot-xburst/patches/005-i2c.patch
Normal file
@@ -0,0 +1,13 @@
|
||||
diff --git a/drivers/i2c/Makefile b/drivers/i2c/Makefile
|
||||
index ef32f13..4e234b4 100644
|
||||
--- a/drivers/i2c/Makefile
|
||||
+++ b/drivers/i2c/Makefile
|
||||
@@ -36,6 +36,7 @@ COBJS-$(CONFIG_DRIVER_S3C24X0_I2C) += s3c24x0_i2c.o
|
||||
COBJS-$(CONFIG_S3C44B0_I2C) += s3c44b0_i2c.o
|
||||
COBJS-$(CONFIG_SOFT_I2C) += soft_i2c.o
|
||||
COBJS-$(CONFIG_TSI108_I2C) += tsi108_i2c.o
|
||||
+COBJS-$(CONFIG_JZSOC_I2C) += jz_i2c.o
|
||||
|
||||
COBJS := $(COBJS-y)
|
||||
SRCS := $(COBJS:.o=.c)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user