diff options
Diffstat (limited to 'mig_test/software/ambainfo.c')
-rw-r--r-- | mig_test/software/ambainfo.c | 216 |
1 files changed, 216 insertions, 0 deletions
diff --git a/mig_test/software/ambainfo.c b/mig_test/software/ambainfo.c new file mode 100644 index 0000000..83813b0 --- /dev/null +++ b/mig_test/software/ambainfo.c @@ -0,0 +1,216 @@ +/* + * $HeadURL: https://svn.fzd.de/repo/concast/FWF_Projects/FWKE/hw_sp605/bsp_zpuahb/software/ambainfo.c $ + * $Date$ + * $Author$ + * $Revision$ + */ + +#include <types.h> + +
+/*
+ print some spaces to make output alignment columnwise
+*/
+void fill(uint8_t length, uint8_t fillupto)
+{
+ while (length < fillupto)
+ {
+ putchar(' ');
+ length++;
+ }
+} + + + +//////////////////////////////////////////////////////////// +// print vendor +void print_vendor_device( uint8_t vendor, uint8_t device) +{ + switch( vendor) + { + case 0x01: putstr("gaisler "); + switch( device) + { + case 0x06: putstr("AHB/APB Bridge"); break; + case 0x0c: putstr("Generic UART"); break; + case 0x0f: putstr("Dual-port AHB SRAM module"); break; + case 0x11: putstr("Modular Timer Unit"); break; + case 0x1a: putstr("General Purpose I/O port"); break; + case 0x1d: putstr("GR 10/100 Mbit Ethernet MAC"); break; + case 0x28: putstr("AMBA Wrapper for OC I2C-master");break; + case 0x45: putstr("SPI Memory Controller"); break; + case 0x61: putstr("VGA controller"); break; + case 0x87: putstr("General Purpose Register"); break; + default : putstr("unknown device"); break; + } + break; + case 0x04: putstr("ESA "); + switch( device) + { + case 0x0f: putstr("Leon2 Memory Controller"); break; + default : putstr("unknown device"); break; + } + break; + case 0x55: putstr("HZDR "); + switch( device) + { + case 0x01: putstr("ZPU AHB Wrapper"); break; + case 0x02: putstr("ZPU Memory wrapper"); break; + case 0x03: putstr("DCM phase shift control"); break; + case 0x04: putstr("debug console"); break; + case 0x05: putstr("trigger generator"); break; + case 0x06: putstr("beam position monitor"); break; + case 0x07: putstr("debug buffer control"); break; + case 0x08: putstr("EA-DOGS display driver"); break; + case 0x09: putstr("debug tracer memory"); break; + case 0x0a: putstr("differential current monitor"); break; + default : putstr("unknown device"); break; + } + break; + default : putstr("vendor? "); break; + } +} + +//////////////////////////////////////////////////////////// +// apb info +void apb_info( uint32_t* addr, uint8_t verbose) +{ + // identification register + uint16_t vendor; + uint16_t device; + uint16_t version; + uint16_t irq; + uint32_t dev_addr; + + uint32_t* config; + uint32_t* idreg_addr; + uint32_t idreg_word; + uint32_t* bar_addr; + uint32_t bar_word; + + uint32_t apb_addr; + uint32_t apb_unit; + + config = addr; + apb_addr = (*config & 0xfff00000); // get apb address + + // we can have up to 512 slaves, but we scan only 16 + // to avoid double scans at the moment + for (apb_unit = 0; apb_unit < 16; apb_unit++) + { + idreg_addr = (uint32_t*) (apb_addr | 0x000ff000 | (apb_unit << 3)); + idreg_word = *idreg_addr; + bar_addr = idreg_addr + 1; + bar_word = *bar_addr; + + dev_addr = apb_addr | ((bar_word & 0xfff00000) >> 12); + vendor = (idreg_word >> 24) & 0xff; + device = (idreg_word >> 12) & 0xfff; + version = (idreg_word >> 5) & 0xf; + irq = (idreg_word >> 0) & 0x1f; + + if (vendor > 0) + { + putstr(" apbslv"); + fill( putint( apb_unit), 4); + + // print idreg word + putstr("vend 0x"); fill( puthex( 8, vendor), 4); + putstr("dev 0x"); fill( puthex(16, device), 6); + putstr("ver "); fill( putint( version), 4); + putstr("irq "); fill( putint( irq), 4); + putstr("addr 0x"); fill( puthex(32, dev_addr), 10); + if (verbose) + print_vendor_device( vendor, device); + putchar('\n'); + } + } +} + +void ahb_info( uint8_t verbose) +{ + uint16_t vendor; + uint16_t device; + uint16_t version; + uint16_t irq; + + uint32_t address; + uint16_t cp; + uint16_t mask; + uint16_t type; + + uint32_t config_word; + uint32_t bar; + uint32_t ahb_unit; + + uint8_t i; + + uint32_t* config_addr = (uint32_t*) 0xfffff000; + uint32_t* bar_addr = (uint32_t*) 0xfffff010; + + + // check for 64 master and 64 slaves + for (ahb_unit = 0; ahb_unit < 128; ahb_unit++) + { + config_addr = (uint32_t*) (0xfffff000 + (ahb_unit << 5)); + bar_addr = (uint32_t*) config_addr + 4; + + config_word = *config_addr; + + vendor = (config_word >> 24) & 0xff; + device = (config_word >> 12) & 0xfff; + version = (config_word >> 5) & 0xf; + irq = (config_word >> 0) & 0x1f; + + if (vendor > 0) + { + if (ahb_unit < 64) + { + putstr("ahbmst"); + fill( putint( ahb_unit), 6); + } + else + { + putstr("ahbslv"); + fill( putint( ahb_unit - 64), 6); + } + + // print config word + putstr("vend 0x"); fill( puthex( 8, vendor), 4); + putstr("dev 0x"); fill( puthex(16, device), 6); + putstr("ver "); fill( putint( version), 4); + putstr("irq "); fill( putint( irq), 4); + putstr("addr 0x"); fill( puthex(32, *bar_addr & 0xfff00000), 10); + if (verbose) + print_vendor_device( vendor, device); + putchar('\n'); + + if ((vendor == 1) && (device == 6)) + apb_info( bar_addr, verbose); + + /* + // check all 4 bank address registers + for (i = 0; i < 4; i++) + { + bar = *bar_addr; + + address = bar & 0xfff0000; + cp = (bar >> 16) & 0xf; + mask = (bar >> 4) & 0xfff; + type = (bar >> 0) & 0xf; + + // print bank address register + putstr("address 0x"); fill( puthex( 32, address), 6); + putstr("c/p 0x"); fill( puthex( 8, cp), 6); + putstr("mask 0x"); fill( puthex( 16, mask), 6); + putstr("type 0x"); fill( puthex( 8, type), 6); + putchar('\n'); + + bar_addr++; + } // for i + */ + + } // vendor > 0 + } // for ahb_unit +} + |