478 lines
11 KiB
Diff
478 lines
11 KiB
Diff
From 1da5479d59b39d7931a2b0efabdfa314f6788b6d Mon Sep 17 00:00:00 2001
|
|
From: Luka Perkov <luka@openwrt.org>
|
|
Date: Sat, 2 Mar 2013 23:34:00 +0100
|
|
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_bdi_conf.awk
|
|
@@ -0,0 +1,116 @@
|
|
+#!/usr/bin/awk -f
|
|
+#
|
|
+# Copyright (C) 2013 Luka Perkov <luka@openwrt.org>
|
|
+# Copyright (C) 2013 Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
|
|
+#
|
|
+# Usage:
|
|
+# awk -f lantiq_bdi_conf.awk -v soc=ar9 board=<name> PATH_TO_BOARD/ddr_settings.h
|
|
+#
|
|
+# Additional information:
|
|
+# http://www.abatron.ch/fileadmin/user_upload/products/pdf/ManGDBR4K-3000.pdf
|
|
+#
|
|
+# SPDX-License-Identifier: GPL-2.0+
|
|
+#
|
|
+
|
|
+function print_header()
|
|
+{
|
|
+ print "; "
|
|
+ print "; Copyright (C) 2013 Luka Perkov <luka@openwrt.org> "
|
|
+ print "; Copyright (C) 2013 Daniel Schwierzeck <daniel.schwierzeck@gmail.com> "
|
|
+ print "; "
|
|
+ print "; This file has been generated with lantiq_bdi_conf.awk script. "
|
|
+ print "; "
|
|
+ print "; SPDX-License-Identifier: GPL-2.0+ "
|
|
+ print "; "
|
|
+ print ""
|
|
+}
|
|
+
|
|
+function init_ar9_prologue()
|
|
+{
|
|
+ print "WM32 0xBF103010 0x80 ; CGU for CPU 333Mhz, DDR 167Mhz"
|
|
+ print "WM32 0xBF103014 0x01 ; CGU update"
|
|
+ print "WM32 0xBF800010 0x0 ; Clear error access log register"
|
|
+ print "WM32 0xBF800020 0x0 ; Clear error access log register"
|
|
+ print "WM32 0xBF800060 0xD ; Enable FPI, DDR and SRAM module in memory controller"
|
|
+ print "WM32 0xBF801030 0x0 ; Clear start bit of DDR memory controller"
|
|
+}
|
|
+
|
|
+function init_ar9_epilogue()
|
|
+{
|
|
+ print "WM32 0xBE105360 0x4001D7FF ; EBU setup"
|
|
+}
|
|
+
|
|
+function init_ddr1_epilogue()
|
|
+{
|
|
+ print "WM32 0xBF801030 0x100 ; Set start bit of DDR memory controller"
|
|
+}
|
|
+
|
|
+function ar9_target()
|
|
+{
|
|
+ print "CPUTYPE M34K"
|
|
+ print "ENDIAN BIG"
|
|
+ print "JTAGCLOCK 1"
|
|
+ print "BDIMODE AGENT ; [ LOADONLY, AGENT ]"
|
|
+ print "RESET JTAG ; [ NONE, JTAG, HARD ]"
|
|
+ print "POWERUP 100"
|
|
+ print "WAKEUP 100"
|
|
+ print "BREAKMODE HARD ; [ SOFT, HARD ]"
|
|
+ print "STEPMODE SWBP ; [ JTAG, HWBP, SWBP ]"
|
|
+ print "VECTOR CATCH"
|
|
+ print "SCANSUCC 1 5"
|
|
+}
|
|
+
|
|
+function flash_p2601hnfx()
|
|
+{
|
|
+ print "CHIPTYPE MIRRORX16"
|
|
+ print "CHIPSIZE 0x1000000"
|
|
+ print "BUSWIDTH 16"
|
|
+}
|
|
+
|
|
+BEGIN {
|
|
+ switch (soc) {
|
|
+ case "ar9":
|
|
+ reg_base = 0xbf801000
|
|
+ print_header()
|
|
+ print "[INIT]"
|
|
+ init_ar9_prologue()
|
|
+ break
|
|
+ default:
|
|
+ print "Invalid or no value for SoC specified!"
|
|
+ exit 1
|
|
+ }
|
|
+}
|
|
+
|
|
+/^#define/ {
|
|
+ /* DC03 contains MC enable bit and must not be set here */
|
|
+ if (tolower($2) != "mc_dc03_value")
|
|
+ printf("WM32 0x%x %s\n", reg_base, tolower($3))
|
|
+
|
|
+ reg_base += 0x10
|
|
+}
|
|
+
|
|
+END {
|
|
+ switch (soc) {
|
|
+ case "ar9":
|
|
+ init_ddr1_epilogue()
|
|
+ init_ar9_epilogue()
|
|
+ print ""
|
|
+ print "[TARGET]"
|
|
+ ar9_target()
|
|
+ print ""
|
|
+ print "[HOST]"
|
|
+ print "PROMPT \"ar9> \""
|
|
+ print ""
|
|
+ break
|
|
+ default:
|
|
+ }
|
|
+
|
|
+ switch (board) {
|
|
+ case "p2601hnfx":
|
|
+ print "[FLASH]"
|
|
+ flash_p2601hnfx()
|
|
+ print ""
|
|
+ break
|
|
+ default:
|
|
+ }
|
|
+}
|
|
--- /dev/null
|
|
+++ b/tools/lantiq_ram_extract_magic.awk
|
|
@@ -0,0 +1,69 @@
|
|
+#
|
|
+# Copyright (C) 2011-2013 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
|
|
+#
|
|
+# SPDX-License-Identifier: GPL-2.0+
|
|
+#
|
|
+
|
|
+BEGIN {
|
|
+ print "/* "
|
|
+ print " * Copyright (C) 2011-2013 Luka Perkov <luka@openwrt.org> "
|
|
+ print " * "
|
|
+ print " * This file has been generated with lantiq_ram_extract_magic.awk script. "
|
|
+ print " * "
|
|
+ print " * SPDX-License-Identifier: GPL-2.0+ "
|
|
+ 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,117 @@
|
|
+#!/usr/bin/awk -f
|
|
+#
|
|
+# 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
|
|
+#
|
|
+# SPDX-License-Identifier: GPL-2.0+
|
|
+#
|
|
+
|
|
+function print_header()
|
|
+{
|
|
+ print "; "
|
|
+ print "; Copyright (C) 2011-2013 Luka Perkov <luka@openwrt.org> "
|
|
+ print "; Copyright (C) 2012-2013 Daniel Schwierzeck <daniel.schwierzeck@gmail.com> "
|
|
+ print "; "
|
|
+ print "; This file has been generated with lantiq_ram_init_uart.awk script. "
|
|
+ print "; "
|
|
+ print "; SPDX-License-Identifier: GPL-2.0+ "
|
|
+ print ""
|
|
+}
|
|
+
|
|
+function mc_danube_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_ar9_prologue()
|
|
+{
|
|
+ /* Clear access error log registers */
|
|
+ print "0xbf800010", "0x0"
|
|
+ print "0xbf800020", "0x0"
|
|
+
|
|
+ /* Enable FPI, DDR and SRAM module in memory controller */
|
|
+ print "0xbf800060", "0xD"
|
|
+
|
|
+ /* 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":
|
|
+ reg_base = 0xbf801000
|
|
+ print_header()
|
|
+ mc_danube_prologue()
|
|
+ break
|
|
+ case "ar9":
|
|
+ reg_base = 0xbf801000
|
|
+ print_header()
|
|
+ mc_ar9_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/ {
|
|
+ /* CCR07 contains MC enable bit and must not be set here */
|
|
+ if (tolower($2) == "mc_ccr07_value")
|
|
+ mc_ccr07_value = strtonum($3)
|
|
+ if (tolower($2) == "mc_dc03_value")
|
|
+ /* CCR07 contains MC enable bit and must not be set here */
|
|
+ else
|
|
+ printf("0x%x %s\n", reg_base, tolower($3))
|
|
+
|
|
+ reg_base += 0x10
|
|
+}
|
|
+
|
|
+END {
|
|
+ switch (soc) {
|
|
+ case "danube":
|
|
+ case "ar9":
|
|
+ mc_ddr1_epilogue()
|
|
+ break
|
|
+ case "vr9":
|
|
+ mc_ddr2_epilogue(mc_ccr07_value)
|
|
+ break
|
|
+ default:
|
|
+ }
|
|
+}
|