2245726371
SVN-Revision: 35292
361 lines
8.6 KiB
Diff
361 lines
8.6 KiB
Diff
From 1b77d4249b5addbf3b0848db6992a445019a1865 Mon Sep 17 00:00:00 2001
|
|
From: Luka Perkov <luka@openwrt.org>
|
|
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 <luka@openwrt.org>
|
|
Signed-off-by: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
|
|
|
|
--- /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 = <IN_UART_DDR_SETTINGS>){
|
|
+ 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=<IN_UART_SREC>){
|
|
+ $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 <luka@openwrt.org>
|
|
+#
|
|
+# 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 <luka@openwrt.org> "
|
|
+ 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 <luka@openwrt.org>
|
|
+# Copyright (C) 2012 Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
|
|
+#
|
|
+# usage: awk -f lantiq_ram_init_uart.awk -v soc=<danube|ar9|vr9> 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 <luka@openwrt.org> "
|
|
+ print "; Copyright (C) 2012 Daniel Schwierzeck <daniel.schwierzeck@gmail.com> "
|
|
+ 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:
|
|
+ }
|
|
+}
|