From 1b77d4249b5addbf3b0848db6992a445019a1865 Mon Sep 17 00:00:00 2001 From: Luka Perkov Date: Wed, 29 Aug 2012 22:08:42 +0200 Subject: tools: add some helper tools for Lantiq SoCs Signed-off-by: Luka Perkov Luka Perkov Signed-off-by: Daniel Schwierzeck --- /dev/null +++ b/tools/gct.pl @@ -0,0 +1,155 @@ +#!/usr/bin/perl + +#use strict; +#use Cwd; +#use Env; + +my $aline; +my $lineid; +my $length; +my $address; +my @bytes; +my $addstr; +my $chsum=0; +my $count=0; +my $firstime=1; +my $i; +my $currentaddr; +my $tmp; +my $holder=""; +my $loadaddr; + +if(@ARGV < 2){ + die("\n Syntax: perl gct.pl uart_ddr_settings.conf u-boot.srec u-boot.asc\n"); +} + +open(IN_UART_DDR_SETTINGS, "<$ARGV[0]") || die("failed to open uart_ddr_settings.conf\n"); +open(IN_UART_SREC, "<$ARGV[1]") || die("failed to open u-boot.srec\n"); +open(OUT_UBOOT_ASC, ">$ARGV[2]") || die("failed to open u-boot.asc\n"); + +$i=0; +while ($line = ){ + if($line=~/\w/){ + if($line!~/[;#\*]/){ + if($i eq 0){ + printf OUT_UBOOT_ASC ("33333333"); + } + chomp($line); + $line=~s/\t//; + @array=split(/ +/,$line); + $j=0; + while(@array[$j]!~/\w/){ + $j=$j+1; + } + $addr=@array[$j]; + $regval=@array[$j+1]; + $addr=~s/0x//; + $regval=~s/0x//; + printf OUT_UBOOT_ASC ("%08x%08x",hex($addr),hex($regval)); + $i=$i+1; + if($i eq 8){ + $i=0; + printf OUT_UBOOT_ASC ("\n"); + } + } + } +} + +while($i lt 8 && $i gt 0){ + printf OUT_UBOOT_ASC "00"x8; + $i=$i+1; +} + +if($i eq 8){ + printf OUT_UBOOT_ASC ("\n"); +} + +while($aline=){ + $aline=uc($aline); + chomp($aline); + next if(($aline=~/^S0/) || ($aline=~/^S7/)); + ($lineid, $length, $address, @bytes) = unpack"A2A2A8"."A2"x300, $aline; + $length = hex($length); + $address = hex($address); + $length -=5; + $i=0; + + while($length>0){ + if($firstime==1){ + $addstr = sprintf("%x", $address); + $addstr = "0"x(8-length($addstr)).$addstr; + print OUT_UBOOT_ASC $addstr; + addchsum($addstr); + $firstime=0; + $currentaddr=$address; + $loadaddr = $addstr; + } + else{ + if($count==64){ + $addstr = sprintf("%x", $currentaddr); + $addstr = "0"x(8-length($addstr)).$addstr; + print OUT_UBOOT_ASC $addstr; + addchsum($addstr); + $count=0; + } +#printf("*** %x != %x\n", $address, $currentaddr) if $address != $currentaddr; + } + if($currentaddr < $address) { + print OUT_UBOOT_ASC "00"; + addchsum("00"); + $count++; + $currentaddr++; + } + else { + while($count<64){ + $bytes[$i]=~tr/ABCDEF/abcdef/; + print OUT_UBOOT_ASC "$bytes[$i]"; + addchsum($bytes[$i]); + $i++; + $count++; + $currentaddr++; + $length--; + last if($length==0); + } + } + if($count==64){ + print OUT_UBOOT_ASC "\n"; + } + } +} +if($count != 64){ + $tmp = "00"; + for($i=0;$i<(64-$count);$i++){ + print OUT_UBOOT_ASC "00"; + addchsum($tmp); + } + print OUT_UBOOT_ASC "\n"; +} + + +print OUT_UBOOT_ASC "11"x4; +use integer; +$chsum=$chsum & 0xffffffff; +$chsum = sprintf("%X", $chsum); +$chsum = "0"x(8-length($chsum)).$chsum; +$chsum =~tr/ABCDEF/abcdef/; +print OUT_UBOOT_ASC $chsum; +print OUT_UBOOT_ASC "00"x60; +print OUT_UBOOT_ASC "\n"; + +print OUT_UBOOT_ASC "99"x4; +print OUT_UBOOT_ASC $loadaddr; +print OUT_UBOOT_ASC "00"x60; +print OUT_UBOOT_ASC "\n"; + +close OUT_UBOOT_ASC; + +sub addchsum{ + my $cc=$_[0]; + $holder=$holder.$cc; + if(length($holder)==8){ + $holder = hex($holder); + $chsum+=$holder; + $holder=""; + } +} --- /dev/null +++ b/tools/lantiq_extract_openwrt_patches.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +set -e +set -x + +test $# -eq 1 + +openwrt_root=$(readlink -f $1) +test -d $openwrt_root + +uboot_lantiq_dir=$openwrt_root/package/boot/uboot-lantiq/patches +test -d $uboot_lantiq_dir + +rm -vf $uboot_lantiq_dir/* +git format-patch -k -p --no-renames --text --full-index -o $uboot_lantiq_dir v2012.10..openwrt/v2013.01 --- /dev/null +++ b/tools/lantiq_ram_extract_magic.awk @@ -0,0 +1,70 @@ +# +# This file is released under the terms of GPL v2 and any later version. +# See the file COPYING in the root directory of the source tree for details. +# +# Copyright (C) 2011 Luka Perkov +# +# usage: mips-openwrt-linux-objdump -EB -b binary -m mips:isa32r2 -D YOUR_IMAGE_DUMP | awk -f lantiq_ram_extract_magic.awk +# + +BEGIN { + print "/* " + print " * This file is released under the terms of GPL v2 and any later version. " + print " * See the file COPYING in the root directory of the source tree for details. " + print " * " + print " * generated with lantiq_ram_extract_magic.awk " + print " * " + print " * Copyright (C) 2011 Luka Perkov " + print " */ " + print "" + + mc_dc_value=0 + mc_dc_number=0 + right_section=0 + mc_dc_value_print=0 + mc_dc_number_print=0 +} + +/t2,[0-9]+$/ { + if (right_section) { + split($4, tmp, ",") + mc_dc_value=sprintf("%X", tmp[2]) + mc_dc_value_print=1 + } +} + +/t2,0x[0-9a-f]+$/ { + if (right_section) { + split($4, tmp, ",0x") + mc_dc_value=sprintf("%s", tmp[2]) + mc_dc_value=toupper(mc_dc_value) + mc_dc_value_print=1 + } +} + +/t2,[0-9]+\(t1\)$/ { + if (right_section) { + split($4, tmp, ",") + split(tmp[2], tmp, "(") + mc_dc_number=tmp[1]/16 + mc_dc_number_print=1 + } +} + +{ + if (right_section && mc_dc_number_print && mc_dc_value_print) { + if (mc_dc_number < 10) + print "#define MC_DC0" mc_dc_number "_VALUE\t0x" mc_dc_value + else + print "#define MC_DC" mc_dc_number "_VALUE\t0x" mc_dc_value + mc_dc_value_print=0 + mc_dc_number_print=0 + } + + if ($4 == "t1,t1,0x1000") + right_section=1 + + + if ($4 == "t2,736(t1)") + right_section=0 +} --- /dev/null +++ b/tools/lantiq_ram_init_uart.awk @@ -0,0 +1,101 @@ +#!/usr/bin/awk -f +# +# This file is released under the terms of GPL v2 and any later version. +# See the file COPYING in the root directory of the source tree for details. +# +# Copyright (C) 2011-2012 Luka Perkov +# Copyright (C) 2012 Daniel Schwierzeck +# +# usage: awk -f lantiq_ram_init_uart.awk -v soc= PATH_TO_BOARD/ddr_settings.h +# + +function print_header() +{ + print "; " + print "; This file is released under the terms of GPL v2 and any later version. " + print "; See the file COPYING in the root directory of the source tree for details. " + print "; " + print "; generated with lantiq_ram_init_uart.awk " + print "; " + print "; Copyright (C) 2011-2012 Luka Perkov " + print "; Copyright (C) 2012 Daniel Schwierzeck " + print "; " + print "" +} + +function mc_ddr1_prologue() +{ + /* Clear access error log registers */ + print "0xbf800010", "0x0" + print "0xbf800020", "0x0" + + /* Enable DDR and SRAM module in memory controller */ + print "0xbf800060", "0x5" + + /* Clear start bit of DDR memory controller */ + print "0xbf801030", "0x0" +} + +function mc_ddr1_epilogue() +{ + /* Set start bit of DDR memory controller */ + print "0xbf801030", "0x100" +} + +function mc_ddr2_prologue() +{ + /* Put memory controller in inactive mode */ + print "0xbf401070", "0x0" +} + +function mc_ddr2_epilogue(mc_ccr07_value) +{ + /* Put memory controller in active mode */ + mc_ccr07_value = or(mc_ccr07_value, 0x100) + printf("0xbf401070 0x%x\n", mc_ccr07_value) +} + +BEGIN { + switch (soc) { + case "danube": + case "ar9": + reg_base = 0xbf801000 + print_header() + mc_ddr1_prologue() + break + case "vr9": + reg_base = 0xbf401000 + print_header() + mc_ddr2_prologue() + break + default: + print "Invalid or no value for soc specified!" + exit 1 + } + + mc_ccr07_value = 0 +} + +/^#define/ { + printf("0x%x %s\n", reg_base, tolower($3)) + reg_base += 0x10 +} + +/^#define(.*)MC_CCR07_VALUE/ { + printf("0x%x %s\n", reg_base, tolower($3)) + reg_base += 0x10 + mc_ccr07_value = strtonum($3) +} + +END { + switch (soc) { + case "danube": + case "ar9": + mc_ddr1_epilogue() + break + case "vr9": + mc_ddr2_epilogue(mc_ccr07_value) + break + default: + } +}