From: Imre Kaloz Date: Fri, 8 Jun 2007 10:44:01 +0000 (+0000) Subject: add support for the AVR32 platform, namely the ATNGW100 board - joint work with wigyori X-Git-Url: http://git.lede-project.org./?a=commitdiff_plain;h=08c72656130891389229ca29e455e08bc735ce1f;p=openwrt%2Fstaging%2Fldir.git add support for the AVR32 platform, namely the ATNGW100 board - joint work with wigyori SVN-Revision: 7533 --- diff --git a/include/kernel-defaults.mk b/include/kernel-defaults.mk index 529b330851..84030a6d2d 100644 --- a/include/kernel-defaults.mk +++ b/include/kernel-defaults.mk @@ -21,6 +21,9 @@ endif ifneq (,$(findstring ppc,$(BOARD))) KERNELNAME="uImage" endif +ifneq (,$(findstring avr32,$(BOARD))) + KERNELNAME="uImage" +endif KERNEL_MAKEOPTS := -C $(LINUX_DIR) \ CROSS_COMPILE="$(KERNEL_CROSS)" \ diff --git a/include/site/avr32-linux-uclibc b/include/site/avr32-linux-uclibc new file mode 100644 index 0000000000..5ea25159a6 --- /dev/null +++ b/include/site/avr32-linux-uclibc @@ -0,0 +1,31 @@ +#!/bin/sh + +ac_cv_c_littleendian=${ac_cv_c_littleendian=no} +ac_cv_c_bigendian=${ac_cv_c_bigendian=yes} + +ac_cv_sizeof___int64=0 +ac_cv_sizeof_char=1 +ac_cv_sizeof_int=4 +ac_cv_sizeof_int16_t=2 +ac_cv_sizeof_int32_t=4 +ac_cv_sizeof_int64_t=8 +ac_cv_sizeof_long_int=4 +ac_cv_sizeof_long_long=8 +ac_cv_sizeof_long=4 +ac_cv_sizeof_off_t=8 +ac_cv_sizeof_short_int=2 +ac_cv_sizeof_short=2 +ac_cv_sizeof_size_t=4 +ac_cv_sizeof_u_int16_t=2 +ac_cv_sizeof_u_int32_t=4 +ac_cv_sizeof_u_int64_t=8 +ac_cv_sizeof_uint16_t=2 +ac_cv_sizeof_uint32_t=4 +ac_cv_sizeof_uint64_t=8 +ac_cv_sizeof_unsigned_int=4 +ac_cv_sizeof_unsigned_long=4 +ac_cv_sizeof_unsigned_short=2 +ac_cv_sizeof_void_p=4 + +. $TOPDIR/include/site/linux-uclibc + diff --git a/package/base-files/Makefile b/package/base-files/Makefile index 8d265f07ee..cc6ce5d2a1 100644 --- a/package/base-files/Makefile +++ b/package/base-files/Makefile @@ -72,6 +72,7 @@ endef define Package/libgcc $(call Package/gcc/Default) TITLE:=GCC support library + DEPENDS:=@!LINUX_2_6_AVR32 endef define Package/libssp diff --git a/target/Config.in b/target/Config.in index 780ee421fc..31a4e590e1 100644 --- a/target/Config.in +++ b/target/Config.in @@ -57,6 +57,10 @@ config armeb select BIG_ENDIAN bool +config avr32 + select BIG_ENDIAN + bool + config cris bool @@ -92,6 +96,7 @@ config ARCH string default "arm" if arm default "armeb" if armeb + default "avr32" if avr32 default "cris" if cris default "i386" if i386 default "m68k" if m68k diff --git a/target/linux/avr32-2.6/Makefile b/target/linux/avr32-2.6/Makefile new file mode 100644 index 0000000000..2dcd76a9b4 --- /dev/null +++ b/target/linux/avr32-2.6/Makefile @@ -0,0 +1,25 @@ +# +# Copyright (C) 2007 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# +include $(TOPDIR)/rules.mk + +ARCH:=avr32 +BOARD:=avr32 +BOARDNAME:=Atmel AVR32 +FEATURES:=squashfs + +define Target/Description + Build firmware images for ATNGW100 board +endef + +KERNEL:=2.6 + +include $(INCLUDE_DIR)/kernel-build.mk + +#include the profiles +-include profiles/*.mk + +$(eval $(call BuildKernel)) diff --git a/target/linux/avr32-2.6/config/default b/target/linux/avr32-2.6/config/default new file mode 100644 index 0000000000..88c5bacd21 --- /dev/null +++ b/target/linux/avr32-2.6/config/default @@ -0,0 +1,85 @@ +CONFIG_AP7000_16_BIT_SMC=y +# CONFIG_AP7000_32_BIT_SMC is not set +# CONFIG_AP7000_8_BIT_SMC is not set +# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set +CONFIG_AVR32=y +CONFIG_BOARD_ATNGW100=y +# CONFIG_BOARD_ATSTK1000 is not set +CONFIG_CPU_AT32AP7000=y +CONFIG_DW_DMAC=y +CONFIG_ENTRY_ADDRESS=0x90000000 +# CONFIG_GEN_RTC is not set +# CONFIG_HZ_100 is not set +CONFIG_HZ=250 +CONFIG_HZ_250=y +# CONFIG_HW_RANDOM is not set +# CONFIG_I2C is not set +# CONFIG_IDE is not set +CONFIG_INITRAMFS_SOURCE="" +CONFIG_MACB=y +# CONFIG_MTD_ABSENT is not set +CONFIG_MTD_BLKDEVS=y +# CONFIG_MTD_BLOCK2MTD is not set +CONFIG_MTD_BLOCK=y +# CONFIG_MTD_CFI_ADV_OPTIONS is not set +CONFIG_MTD_CFI_AMDSTD=y +CONFIG_MTD_CFI_I1=y +CONFIG_MTD_CFI_I2=y +# CONFIG_MTD_CFI_I4 is not set +# CONFIG_MTD_CFI_I8 is not set +# CONFIG_MTD_CFI_INTELEXT is not set +# CONFIG_MTD_CFI_STAA is not set +CONFIG_MTD_CFI_UTIL=y +CONFIG_MTD_CFI=y +CONFIG_MTD_CHAR=y +CONFIG_MTD_CMDLINE_PARTS=y +# CONFIG_MTD_COMPLEX_MAPPINGS is not set +# CONFIG_MTD_CONCAT is not set +CONFIG_MTD_DATAFLASH=y +# CONFIG_MTD_DEBUG is not set +# CONFIG_MTD_DOC2000 is not set +# CONFIG_MTD_DOC2001 is not set +# CONFIG_MTD_DOC2001PLUS is not set +CONFIG_MTD_GEN_PROBE=y +# CONFIG_MTD_JEDECPROBE is not set +# CONFIG_MTD_M25P80 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set +CONFIG_MTD_MAP_BANK_WIDTH_1=y +CONFIG_MTD_MAP_BANK_WIDTH_2=y +# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set +CONFIG_MTD_MAP_BANK_WIDTH_4=y +# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set +# CONFIG_MTD_MTDRAM is not set +# CONFIG_MTD_NAND is not set +# CONFIG_MTD_OBSOLETE_CHIPS is not set +# CONFIG_MTD_ONENAND is not set +CONFIG_MTD_PARTITIONS=y +# CONFIG_MTD_PHRAM is not set +CONFIG_MTD_PHYSMAP_BANKWIDTH=2 +CONFIG_MTD_PHYSMAP_LEN=0x0 +CONFIG_MTD_PHYSMAP_START=0x80000000 +CONFIG_MTD_PHYSMAP=y +# CONFIG_MTD_PLATRAM is not set +# CONFIG_MTD_RAM is not set +# CONFIG_MTD_REDBOOT_PARTS is not set +# CONFIG_MTD_ROM is not set +# CONFIG_MTD_SLRAM is not set +CONFIG_MTD_SPLIT_ROOTFS=y +CONFIG_MTD=y +# CONFIG_OWNERSHIP_TRACE is not set +CONFIG_PHYS_OFFSET=0x10000000 +CONFIG_PLATFORM_AT32AP=y +# CONFIG_RTC is not set +# CONFIG_SERIAL_8250 is not set +CONFIG_SERIAL_ATMEL_CONSOLE=y +# CONFIG_SERIAL_ATMEL_TTYAT is not set +CONFIG_SERIAL_ATMEL=y +# CONFIG_SPI_AT25 is not set +CONFIG_SPI_ATMEL=y +# CONFIG_SPI_BITBANG is not set +# CONFIG_SPI_DEBUG is not set +CONFIG_SPI_MASTER=y +CONFIG_SPI=y +CONFIG_SUBARCH_AVR32B=y +# CONFIG_UNUSED_SYMBOLS is not set +# CONFIG_WATCHDOG is not set diff --git a/target/linux/avr32-2.6/image/Makefile b/target/linux/avr32-2.6/image/Makefile new file mode 100644 index 0000000000..a001097c58 --- /dev/null +++ b/target/linux/avr32-2.6/image/Makefile @@ -0,0 +1,37 @@ +# +# Copyright (C) 2007 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)/image.mk + +define Image/Prepare + cp $(LINUX_DIR)/arch/avr32/boot/images/uImage $(KDIR)/uImage +endef + +define Image/BuildKernel + cp $(KDIR)/uImage $(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL)-uImage +endef + +define Image/Build + $(call Image/Build/$(1),$(1)) +endef + +define Image/Build/squashfs + $(call prepare_generic_squashfs,$(KDIR)/root.squashfs) + ( \ + dd if=$(KDIR)/uImage bs=1024k conv=sync; \ + dd if=$(KDIR)/root.$(1) bs=64k conv=sync; \ + ) > $(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL)-$(1).img +endef + +define Image/Build/jffs2-64k + ( \ + dd if=$(KDIR)/uImage bs=1024k conv=sync; \ + dd if=$(KDIR)/root.$(1) bs=64k conv=sync; \ + ) > $(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL)-$(1).img +endef + +$(eval $(call BuildImage)) diff --git a/target/linux/avr32-2.6/patches/100-git_sync.patch b/target/linux/avr32-2.6/patches/100-git_sync.patch new file mode 100644 index 0000000000..5c5cc8e7fb --- /dev/null +++ b/target/linux/avr32-2.6/patches/100-git_sync.patch @@ -0,0 +1,11252 @@ +diff -Nur -x .gitignore -x .git linux-2.6.21.3/arch/avr32/boards/atngw100/flash.c avr32-git/arch/avr32/boards/atngw100/flash.c +--- linux-2.6.21.3/arch/avr32/boards/atngw100/flash.c 1970-01-01 01:00:00.000000000 +0100 ++++ avr32-git/arch/avr32/boards/atngw100/flash.c 2007-06-06 11:33:46.000000000 +0200 +@@ -0,0 +1,95 @@ ++/* ++ * ATNGW100 board-specific flash initialization ++ * ++ * Copyright (C) 2005-2006 Atmel Corporation ++ * ++ * 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 ++#include ++#include ++#include ++#include ++ ++#include ++ ++static struct smc_config flash_config __initdata = { ++ .ncs_read_setup = 0, ++ .nrd_setup = 40, ++ .ncs_write_setup = 0, ++ .nwe_setup = 10, ++ ++ .ncs_read_pulse = 80, ++ .nrd_pulse = 40, ++ .ncs_write_pulse = 65, ++ .nwe_pulse = 55, ++ ++ .read_cycle = 120, ++ .write_cycle = 120, ++ ++ .bus_width = 2, ++ .nrd_controlled = 1, ++ .nwe_controlled = 1, ++ .byte_write = 1, ++}; ++ ++static struct mtd_partition flash_parts[] = { ++ { ++ .name = "u-boot", ++ .offset = 0x00000000, ++ .size = 0x00020000, /* 128 KiB */ ++ .mask_flags = MTD_WRITEABLE, ++ }, ++ { ++ .name = "root", ++ .offset = 0x00020000, ++ .size = 0x007d0000, ++ }, ++ { ++ .name = "env", ++ .offset = 0x007f0000, ++ .size = 0x00010000, ++ .mask_flags = MTD_WRITEABLE, ++ }, ++}; ++ ++static struct physmap_flash_data flash_data = { ++ .width = 2, ++ .nr_parts = ARRAY_SIZE(flash_parts), ++ .parts = flash_parts, ++}; ++ ++static struct resource flash_resource = { ++ .start = 0x00000000, ++ .end = 0x007fffff, ++ .flags = IORESOURCE_MEM, ++}; ++ ++static struct platform_device flash_device = { ++ .name = "physmap-flash", ++ .id = 0, ++ .resource = &flash_resource, ++ .num_resources = 1, ++ .dev = { ++ .platform_data = &flash_data, ++ }, ++}; ++ ++/* This needs to be called after the SMC has been initialized */ ++static int __init atngw100_flash_init(void) ++{ ++ int ret; ++ ++ ret = smc_set_configuration(0, &flash_config); ++ if (ret < 0) { ++ printk(KERN_ERR "atngw100: failed to set NOR flash timing\n"); ++ return ret; ++ } ++ ++ platform_device_register(&flash_device); ++ ++ return 0; ++} ++device_initcall(atngw100_flash_init); +diff -Nur -x .gitignore -x .git linux-2.6.21.3/arch/avr32/boards/atngw100/Makefile avr32-git/arch/avr32/boards/atngw100/Makefile +--- linux-2.6.21.3/arch/avr32/boards/atngw100/Makefile 1970-01-01 01:00:00.000000000 +0100 ++++ avr32-git/arch/avr32/boards/atngw100/Makefile 2007-06-06 11:33:46.000000000 +0200 +@@ -0,0 +1 @@ ++obj-y += setup.o flash.o +diff -Nur -x .gitignore -x .git linux-2.6.21.3/arch/avr32/boards/atngw100/setup.c avr32-git/arch/avr32/boards/atngw100/setup.c +--- linux-2.6.21.3/arch/avr32/boards/atngw100/setup.c 1970-01-01 01:00:00.000000000 +0100 ++++ avr32-git/arch/avr32/boards/atngw100/setup.c 2007-06-06 11:33:46.000000000 +0200 +@@ -0,0 +1,131 @@ ++/* ++ * Board-specific setup code for the ATNGW100 Network Gateway ++ * ++ * Copyright (C) 2005-2006 Atmel Corporation ++ * ++ * 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 ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++ ++#include ++#include ++#include ++ ++/* Initialized by bootloader-specific startup code. */ ++struct tag *bootloader_tags __initdata; ++ ++struct eth_addr { ++ u8 addr[6]; ++}; ++static struct eth_addr __initdata hw_addr[2]; ++static struct eth_platform_data __initdata eth_data[2]; ++ ++static struct spi_board_info spi0_board_info[] __initdata = { ++ { ++ .modalias = "mtd_dataflash", ++ .max_speed_hz = 10000000, ++ .chip_select = 0, ++ }, ++}; ++ ++static struct mci_platform_data __initdata mci0_data = { ++ .detect_pin = GPIO_PIN_PC(25), ++ .wp_pin = GPIO_PIN_PE(0), ++}; ++ ++/* ++ * The next two functions should go away as the boot loader is ++ * supposed to initialize the macb address registers with a valid ++ * ethernet address. But we need to keep it around for a while until ++ * we can be reasonably sure the boot loader does this. ++ * ++ * The phy_id is ignored as the driver will probe for it. ++ */ ++static int __init parse_tag_ethernet(struct tag *tag) ++{ ++ int i; ++ ++ i = tag->u.ethernet.mac_index; ++ if (i < ARRAY_SIZE(hw_addr)) ++ memcpy(hw_addr[i].addr, tag->u.ethernet.hw_address, ++ sizeof(hw_addr[i].addr)); ++ ++ return 0; ++} ++__tagtable(ATAG_ETHERNET, parse_tag_ethernet); ++ ++static void __init set_hw_addr(struct platform_device *pdev) ++{ ++ struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); ++ const u8 *addr; ++ void __iomem *regs; ++ struct clk *pclk; ++ ++ if (!res) ++ return; ++ if (pdev->id >= ARRAY_SIZE(hw_addr)) ++ return; ++ ++ addr = hw_addr[pdev->id].addr; ++ if (!is_valid_ether_addr(addr)) ++ return; ++ ++ /* ++ * Since this is board-specific code, we'll cheat and use the ++ * physical address directly as we happen to know that it's ++ * the same as the virtual address. ++ */ ++ regs = (void __iomem __force *)res->start; ++ pclk = clk_get(&pdev->dev, "pclk"); ++ if (!pclk) ++ return; ++ ++ clk_enable(pclk); ++ __raw_writel((addr[3] << 24) | (addr[2] << 16) ++ | (addr[1] << 8) | addr[0], regs + 0x98); ++ __raw_writel((addr[5] << 8) | addr[4], regs + 0x9c); ++ clk_disable(pclk); ++ clk_put(pclk); ++} ++ ++struct platform_device *at32_usart_map[1]; ++unsigned int at32_nr_usarts = 1; ++ ++void __init setup_board(void) ++{ ++ at32_map_usart(1, 0); /* USART 1: /dev/ttyS0, DB9 */ ++ at32_setup_serial_console(0); ++} ++ ++static int __init atngw100_init(void) ++{ ++ /* ++ * ATNGW100 uses 16-bit SDRAM interface, so we don't need to ++ * reserve any pins for it. ++ */ ++ ++ at32_add_system_devices(); ++ ++ at32_add_device_usart(0); ++ ++ set_hw_addr(at32_add_device_eth(0, ð_data[0])); ++ set_hw_addr(at32_add_device_eth(1, ð_data[1])); ++ ++ at32_add_device_spi(0, spi0_board_info, ARRAY_SIZE(spi0_board_info)); ++ at32_add_device_mci(0, &mci0_data); ++ at32_add_device_usba(0); ++ ++ return 0; ++} ++postcore_initcall(atngw100_init); +diff -Nur -x .gitignore -x .git linux-2.6.21.3/arch/avr32/boards/atstk1000/atstk1000.h avr32-git/arch/avr32/boards/atstk1000/atstk1000.h +--- linux-2.6.21.3/arch/avr32/boards/atstk1000/atstk1000.h 1970-01-01 01:00:00.000000000 +0100 ++++ avr32-git/arch/avr32/boards/atstk1000/atstk1000.h 2007-06-06 11:33:46.000000000 +0200 +@@ -0,0 +1,15 @@ ++/* ++ * ATSTK1000 setup code: Daughterboard interface ++ * ++ * Copyright (C) 2007 Atmel Corporation ++ * ++ * 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 __ARCH_AVR32_BOARDS_ATSTK1000_ATSTK1000_H ++#define __ARCH_AVR32_BOARDS_ATSTK1000_ATSTK1000_H ++ ++extern struct atmel_lcdfb_info atstk1000_lcdc_data; ++ ++#endif /* __ARCH_AVR32_BOARDS_ATSTK1000_ATSTK1000_H */ +diff -Nur -x .gitignore -x .git linux-2.6.21.3/arch/avr32/boards/atstk1000/atstk1002.c avr32-git/arch/avr32/boards/atstk1000/atstk1002.c +--- linux-2.6.21.3/arch/avr32/boards/atstk1000/atstk1002.c 2007-05-24 23:22:47.000000000 +0200 ++++ avr32-git/arch/avr32/boards/atstk1000/atstk1002.c 2007-06-06 11:33:46.000000000 +0200 +@@ -16,6 +16,8 @@ + #include + #include + ++#include