tried adding arm9
This commit is contained in:
parent
d91bab77a4
commit
e5db9dfff1
8 changed files with 178 additions and 2 deletions
|
@ -16,6 +16,7 @@ def get_elf_seg(f): #Return entry,section_beg,section_size,section
|
||||||
raise Exception("Little Endian ELF required!")
|
raise Exception("Little Endian ELF required!")
|
||||||
if f.read(1) != b"\x01":
|
if f.read(1) != b"\x01":
|
||||||
raise Exception("Unknown ELF version!")
|
raise Exception("Unknown ELF version!")
|
||||||
|
f.read(9)
|
||||||
if struct.unpack("<H",f.read(2))[0] != 2:
|
if struct.unpack("<H",f.read(2))[0] != 2:
|
||||||
raise Exception("Invalid ELF format")
|
raise Exception("Invalid ELF format")
|
||||||
if struct.unpack("<H",f.read(2))[0] != 0x28:
|
if struct.unpack("<H",f.read(2))[0] != 0x28:
|
||||||
|
@ -31,7 +32,8 @@ def get_elf_seg(f): #Return entry,section_beg,section_size,section
|
||||||
section_size = 0
|
section_size = 0
|
||||||
section = b''
|
section = b''
|
||||||
for ent in range(no_ent):
|
for ent in range(no_ent):
|
||||||
if struct.unpack("<I",f.read(4)) != 1:
|
f.seek(phoff+ent*0x20)
|
||||||
|
if struct.unpack("<I",f.read(4))[0] != 1:
|
||||||
continue
|
continue
|
||||||
off,vaddr,filesz,memsz=struct.unpack("<IIxxxxII",f.read(20))
|
off,vaddr,filesz,memsz=struct.unpack("<IIxxxxII",f.read(20))
|
||||||
section_begin = vaddr
|
section_begin = vaddr
|
||||||
|
@ -44,7 +46,7 @@ def get_elf_seg(f): #Return entry,section_beg,section_size,section
|
||||||
return (loadAddr,section_begin,section_size,section)
|
return (loadAddr,section_begin,section_size,section)
|
||||||
f1 = open(sys.argv[1],"rb")
|
f1 = open(sys.argv[1],"rb")
|
||||||
f2 = open(sys.argv[2],"rb")
|
f2 = open(sys.argv[2],"rb")
|
||||||
f3 = open(sys.argv[3],"wb")
|
f = open(sys.argv[3],"wb")
|
||||||
arm9_entry,arm9_section_beg,arm9_section_size,arm9_section = get_elf_seg(f1)
|
arm9_entry,arm9_section_beg,arm9_section_size,arm9_section = get_elf_seg(f1)
|
||||||
arm11_entry,arm11_section_beg,arm11_section_size,arm11_section = get_elf_seg(f2)
|
arm11_entry,arm11_section_beg,arm11_section_size,arm11_section = get_elf_seg(f2)
|
||||||
arm9_hash=hashlib.sha256(arm9_section).digest()
|
arm9_hash=hashlib.sha256(arm9_section).digest()
|
||||||
|
|
3
kernel/arch/arm/3ds9/flags.cmake
Normal file
3
kernel/arch/arm/3ds9/flags.cmake
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
SET(PLATFORM_C_FLAGS "-I../../kernel/arch/arm/3ds9/include")
|
||||||
|
SET(PLATFORM_CXX_FLAGS "${PLATFORM_C_FLAGS}")
|
||||||
|
SET(PLATFORM_ASM_FLAGS "${PLATFORM_C_FLAGS}")
|
36
kernel/arch/arm/3ds9/layout.ld
Normal file
36
kernel/arch/arm/3ds9/layout.ld
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
ENTRY(_start)
|
||||||
|
SECTIONS {
|
||||||
|
. = 0x08000100;
|
||||||
|
kernel_start = .;
|
||||||
|
.text : {
|
||||||
|
KEEP(*(.text.boot));
|
||||||
|
*(.text)
|
||||||
|
}
|
||||||
|
.data : {
|
||||||
|
start_ctors = .;
|
||||||
|
KEEP(*(.init_array));
|
||||||
|
KEEP(*(SORT_BY_INIT_PRIORITY(.init_array.*)));
|
||||||
|
KEEP(*(.ctors));
|
||||||
|
end_ctors = .;
|
||||||
|
start_dtors = .;
|
||||||
|
KEEP(*(.fini_array));
|
||||||
|
KEEP(*(.fini_array.*));
|
||||||
|
KEEP(*(.dtors));
|
||||||
|
end_dtors = .;
|
||||||
|
start_eh_frame = .;
|
||||||
|
KEEP(*(.eh_frame));
|
||||||
|
KEEP(*(.eh_frame.*));
|
||||||
|
QUAD(0);
|
||||||
|
KEEP(*(.gcc_except_table));
|
||||||
|
KEEP(*(.gcc_except_table.*));
|
||||||
|
*(.data)
|
||||||
|
}
|
||||||
|
.rodata : {
|
||||||
|
*(.rodata)
|
||||||
|
}
|
||||||
|
.bss : {
|
||||||
|
*(.bss)
|
||||||
|
*(COMMON)
|
||||||
|
}
|
||||||
|
kernel_end = .;
|
||||||
|
}
|
11
kernel/arch/arm/3ds9/start.cpp
Normal file
11
kernel/arch/arm/3ds9/start.cpp
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
#include "../../../hw/3ds9/picafb/picafb.hpp"
|
||||||
|
#include <base.hpp>
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
PICAfb term;
|
||||||
|
void main();
|
||||||
|
extern "C" void start() { main(); }
|
||||||
|
void drivers_init() {
|
||||||
|
setMainTTY(&term);
|
||||||
|
--term;
|
||||||
|
}
|
94
kernel/arch/arm/3ds9/start.s
Normal file
94
kernel/arch/arm/3ds9/start.s
Normal file
|
@ -0,0 +1,94 @@
|
||||||
|
.align 4
|
||||||
|
.global _start
|
||||||
|
.extern start
|
||||||
|
.section .text.boot
|
||||||
|
_start:
|
||||||
|
mrs r0, cpsr
|
||||||
|
orr r0, r0, #0x80
|
||||||
|
msr cpsr_c, r0 //Disable IRQs
|
||||||
|
//Flush instruction cache
|
||||||
|
mov r0, #0
|
||||||
|
mcr p15, 0, r0, c7, c5, 0
|
||||||
|
|
||||||
|
//Use nintendos data cache flusher here, because I don't want to reverse it
|
||||||
|
ldr r0, =0xFFFF0830
|
||||||
|
blx r0
|
||||||
|
|
||||||
|
//Disable caches and MPU
|
||||||
|
mrc p15, 0, r0, c1, c0, 0 //read
|
||||||
|
bic r0, r0, #(1<<12) //Disable instruction cache
|
||||||
|
bic r0, r0, #(1<<2) //Disable data cache
|
||||||
|
bic r0, r0, #(1<<0) //disable mpu
|
||||||
|
mcr p15, 0, r0, c1, c0, 0 //write
|
||||||
|
|
||||||
|
//clear caches again
|
||||||
|
mov r0, #0
|
||||||
|
mcr p15, 0, r0, c7, c5, 0
|
||||||
|
ldr r0, =0xFFFF0830
|
||||||
|
blx r0
|
||||||
|
|
||||||
|
ldr sp, =kernel_stack //set stack
|
||||||
|
|
||||||
|
//Configure ITCM to…something
|
||||||
|
mrc p15, 0, r0, c9, c1, 1
|
||||||
|
bic r0, #0b111110
|
||||||
|
orr r0, #0b100010
|
||||||
|
mcr p15, 0, r0, c9, c1, 1
|
||||||
|
|
||||||
|
//Configure DTCM to address 0x30000000
|
||||||
|
mrc p15, 0, r0, c9, c1, 0
|
||||||
|
bic r0, #0b111110
|
||||||
|
orr r0, #0b001010
|
||||||
|
ldr r1, =0xFFFFF000
|
||||||
|
bic r0, r1
|
||||||
|
ldr r1, =0x30000000
|
||||||
|
orr r0, r1
|
||||||
|
mcr p15, 0, r0, c9, c1, 0
|
||||||
|
|
||||||
|
//Enable both
|
||||||
|
mrc p15, 0, r0, c1, c0, 0
|
||||||
|
orr r0, r0, #(1<<18)
|
||||||
|
bic r0, r0, #(1<<17)
|
||||||
|
orr r0, r0, #(1<<16)
|
||||||
|
mcr p15, 0, r0, c1, c0, 0
|
||||||
|
|
||||||
|
//Give RW permissions to all memory regions
|
||||||
|
ldr r0, =0x33333333
|
||||||
|
mcr p15, 0, r0, c5, c0, 2 //Write Data
|
||||||
|
mcr p15, 0, r0, c5, c0, 3 //Write instructions
|
||||||
|
|
||||||
|
//Set MPU and caching
|
||||||
|
ldr r0, =0xFFFF001F // ffff0000 64k bootrom
|
||||||
|
ldr r1, =0x3000001B // 30000000 16k dtcm
|
||||||
|
ldr r2, =0x00000035 // 00000000 128M ITCM
|
||||||
|
ldr r3, =0x08000029 // 08000000 2M arm9 mem
|
||||||
|
ldr r4, =0x10000029 // 10000000 2M IO mem
|
||||||
|
ldr r5, =0x20000037 // 20000000 256M fcram
|
||||||
|
ldr r6, =0x1FF00027 // 1FF00000 1M DSP
|
||||||
|
ldr r7, =0x1800002D // 18000000 8M VRAM
|
||||||
|
mcr p15, 0, r0, c6, c0, 0
|
||||||
|
mcr p15, 0, r1, c6, c1, 0
|
||||||
|
mcr p15, 0, r2, c6, c2, 0
|
||||||
|
mcr p15, 0, r3, c6, c3, 0
|
||||||
|
mcr p15, 0, r4, c6, c4, 0
|
||||||
|
mcr p15, 0, r5, c6, c5, 0
|
||||||
|
mcr p15, 0, r6, c6, c6, 0
|
||||||
|
mcr p15, 0, r7, c6, c7, 0
|
||||||
|
mov r0, #0b10101001 // unprot | arm9 | fcram | VRAM
|
||||||
|
mcr p15, 0, r0, c2, c0, 0 // Data cacheable
|
||||||
|
mcr p15, 0, r0, c2, c0, 1 // Instruction cacheable
|
||||||
|
mcr p15, 0, r0, c3, c0, 0 // Data bufferable
|
||||||
|
|
||||||
|
// Enable MPU and caching
|
||||||
|
mcr p15, 0, r0, c3, c0, 0
|
||||||
|
orr r0, r0, #(1<<12)
|
||||||
|
orr r0, r0, #(1<<2)
|
||||||
|
orr r0, r0, #(1<<0)
|
||||||
|
mcr p15, 0, r0, c1, c0, 0
|
||||||
|
|
||||||
|
//Start start
|
||||||
|
blx start
|
||||||
|
|
||||||
|
.section .bss
|
||||||
|
.space 16384
|
||||||
|
kernel_stack:
|
|
@ -1 +1,5 @@
|
||||||
config["ENABLE_EXTRA_MEMORY"] = get_yes_no("Enable 512KB of memory on n3DS", True)
|
config["ENABLE_EXTRA_MEMORY"] = get_yes_no("Enable 512KB of memory on n3DS", True)
|
||||||
|
add_driver(True, "framebuffer")
|
||||||
|
add_driver(False, "picafb")
|
||||||
|
print("Enable complete Unicode font: NO (because of the size)")
|
||||||
|
config["ENABLE_FRAMEBUFFER_UNICODE"] = False
|
||||||
|
|
13
kernel/hw/3ds9/picafb/picafb.cpp
Normal file
13
kernel/hw/3ds9/picafb/picafb.cpp
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
#include "picafb.hpp"
|
||||||
|
#include <config.h>
|
||||||
|
PICAfb::PICAfb() : Framebuffer(25, 20) {}
|
||||||
|
PICAfb::~PICAfb() {}
|
||||||
|
auto PICAfb::plotPixel(int x, int y, int col) -> void {
|
||||||
|
unsigned char *lfb = (unsigned char *)0x18300000 + 0x46500;
|
||||||
|
// XXX I know it's rotated. But I need more vertical space than horizonal space.
|
||||||
|
int off = (y * 240 + x) * 3;
|
||||||
|
for (int i = 0; i < 3; i++) {
|
||||||
|
lfb[off++] = col;
|
||||||
|
col >>= 8;
|
||||||
|
}
|
||||||
|
}
|
13
kernel/hw/3ds9/picafb/picafb.hpp
Normal file
13
kernel/hw/3ds9/picafb/picafb.hpp
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
#pragma once
|
||||||
|
#include "../../framebuffer/framebuffer.hpp"
|
||||||
|
/**
|
||||||
|
* Framebuffer for the 3ds
|
||||||
|
*/
|
||||||
|
class PICAfb : public Framebuffer {
|
||||||
|
protected:
|
||||||
|
virtual auto plotPixel(int x, int y, int col) -> void;
|
||||||
|
|
||||||
|
public:
|
||||||
|
PICAfb();
|
||||||
|
virtual ~PICAfb();
|
||||||
|
};
|
Loading…
Reference in a new issue