diff options
| author | Evan Lojewski <github@meklort.com> | 2019-04-03 22:11:01 -0600 |
|---|---|---|
| committer | Evan Lojewski <github@meklort.com> | 2019-04-03 22:11:01 -0600 |
| commit | 8571a5e64773d87733514993bf8d330eee8c3bc5 (patch) | |
| tree | 10c666b3b2ef19118a376208dfda7f5038097e7f /utils/bcmregtool/main.cpp | |
| parent | ef55c3b6ecf7bbd4e35fb982b51601a5800ad1fa (diff) | |
| download | bcm5719-ortega-8571a5e64773d87733514993bf8d330eee8c3bc5.tar.gz bcm5719-ortega-8571a5e64773d87733514993bf8d330eee8c3bc5.zip | |
Add support for chainloading the ape binary
Diffstat (limited to 'utils/bcmregtool/main.cpp')
| -rw-r--r-- | utils/bcmregtool/main.cpp | 58 |
1 files changed, 33 insertions, 25 deletions
diff --git a/utils/bcmregtool/main.cpp b/utils/bcmregtool/main.cpp index 5f326e0..4b8f1fa 100644 --- a/utils/bcmregtool/main.cpp +++ b/utils/bcmregtool/main.cpp @@ -98,7 +98,8 @@ void boot_ape_loader() int numWords = apeloader_bin_len/4; - RegAPEMode_t mode = APE.Mode; + RegAPEMode_t mode; + mode.r32 = 0; mode.bits.Halt = 1; mode.bits.FastBoot = 1; APE.Mode = mode; @@ -110,8 +111,6 @@ void boot_ape_loader() for(int i = 0; i < numWords; i++) { SHM.write(0x0B00 + i*4, ((uint32_t*)apeloader_bin)[i]); - - printf("SHM[%d]: 0x%08X ?= 0x%08X\n", i, SHM.read(0x0B00 + i*4), ((uint32_t*)apeloader_bin)[i]); } @@ -129,6 +128,27 @@ void boot_ape_loader() while(0 == SHM.FwStatus.bits.Ready); } +uint32_t loader_read_mem(uint32_t addr) +{ + SHM.LoaderArg0.r32 = addr; + SHM.LoaderCommand.bits.Command = SHM_LOADER_COMMAND_COMMAND_READ_MEM; + + // Wait for command to be handled. + while(0 != SHM.LoaderCommand.bits.Command); + + return (uint32_t)SHM.LoaderArg0.r32; +} + +void loader_write_mem(uint32_t addr, uint32_t value) +{ + SHM.LoaderArg0.r32 = addr; + SHM.LoaderArg1.r32 = value; + SHM.LoaderCommand.bits.Command = SHM_LOADER_COMMAND_COMMAND_WRITE_MEM; + + // Wait for command to be handled. + while(0 != SHM.LoaderCommand.bits.Command); +} + const string symbol_for_address(uint32_t address, uint32_t &offset) { Elf_Half sec_num = gELFIOReader.sections.size(); @@ -528,38 +548,26 @@ int main(int argc, char const *argv[]) } } - RegAPEMode_t mode = APE.Mode; - mode.bits.Halt = 1; - mode.bits.FastBoot = 1; - APE.Mode = mode; - - // We hijack the complete SHM here. - // load file. for(int i = 0; i < fileWords; i++) { - SHM.write(0x0B00 + i*4, ape.words[i]); - - printf("SHM[%d]: 0x%08X ?= 0x%08X\n", i, SHM.read(0x0B00 + i*4), ape.words[i]); - - // DEVICE.ApeMemoryBase.r32 = 0xD800 + (i * 4); - // DEVICE.ApeMemoryData.r32 = ape.words[i]; + uint32_t addr = 0x10D800 + i*4; + loader_write_mem(addr, ape.words[i]); } + RegAPEMode_t mode; + mode.r32 = 0; + mode.bits.Halt = 1; + mode.bits.FastBoot = 1; + APE.Mode = mode; - // Start the file - APE.GpioMessage.r32 = 0x60220B00|2; - // DEVICE.ApeMemoryBase.r32 = 0xD800; - // printf("APE Memory Base: 0x%08X\n", (uint32_t)DEVICE.ApeMemoryBase.r32); - // printf("APE Memory Data: 0x%08X\n", (uint32_t)DEVICE.ApeMemoryData.r32); - // DEVICE.ApeMemoryData.r32 = ape.words[0]; - // printf("APE Memory Base: 0x%08X\n", (uint32_t)DEVICE.ApeMemoryBase.r32); - // printf("APE Memory Data: 0x%08X\n", (uint32_t)DEVICE.ApeMemoryData.r32); - // printf("ape.words[0]: 0x%08X\n", (uint32_t)ape.words[0]); + // Set the payload address + APE.GpioMessage.r32 = 0x10D800|2; + // Boot mode.bits.Halt = 0; mode.bits.FastBoot = 1; mode.bits.Reset = 1; |

