diff --git a/loader/bootrom.h b/loader/bootrom.h index 0ae055c..a3e8e00 100644 --- a/loader/bootrom.h +++ b/loader/bootrom.h @@ -20,6 +20,4 @@ #define BOOTROM_USB_WRITE_EP1 0x001065C0 #define BOOTROM_USB_READ_EP1 0x00106612 - - #endif \ No newline at end of file diff --git a/loader/gpio.c b/loader/gpio.c index a3d0ac2..5a53ba9 100644 --- a/loader/gpio.c +++ b/loader/gpio.c @@ -1,6 +1,7 @@ /* * Copyright (c) 2024 hydrogenium2020-offical * Copyright (c) 2018 naehrwert +* Copyright (c) 2018-2022 CTCaer * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, diff --git a/loader/gpio.h b/loader/gpio.h index 7a4beb6..f4f5f36 100644 --- a/loader/gpio.h +++ b/loader/gpio.h @@ -1 +1,23 @@ -void config_gpios(); \ No newline at end of file +/* +* Copyright (c) 2024 hydrogenium2020-offical +* Copyright (c) 2018 naehrwert +* Copyright (c) 2019-2023 CTCaer +* +* This program is free software; you can redistribute it and/or modify it +* under the terms and conditions of the GNU General Public License, +* version 2, as published by the Free Software Foundation. +* +* This program is distributed in the hope it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +* more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +*/ +#ifndef _T124_GPIO_H_ +#define _T124_GPIO_H_ + +void config_gpios(); + +#endif diff --git a/loader/i2c.c b/loader/i2c.c new file mode 100644 index 0000000..16dbb21 --- /dev/null +++ b/loader/i2c.c @@ -0,0 +1,39 @@ +/* +* Copyright (c) 2024 hydrogenium2020-offical +* Copyright (c) 2018 naehrwert +* Copyright (c) 2020 CTCaer +* +* This program is free software; you can redistribute it and/or modify it +* under the terms and conditions of the GNU General Public License, +* version 2, as published by the Free Software Foundation. +* +* This program is distributed in the hope it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +* more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +*/ +#include "types.h" +#include "i2c.h" +void i2c_init(u32 i2c_idx) +{ + vu32 *base = (vu32 *)(I2C_BASE + (u32)_i2c_base_offsets[i2c_idx]); + + base[I2C_CLK_DIVISOR] = (5 << 16) | 1; // SF mode Div: 6, HS mode div: 2. + base[I2C_BUS_CLEAR_CONFIG] = (9 << 16) | BC_TERMINATE | BC_ENABLE; + + // Load configuration. + _i2c_load_cfg_wait(base); + + for (u32 i = 0; i < 10; i++) + { + if (base[I2C_INT_STATUS] & BUS_CLEAR_DONE) + break; + usleep(25); + } + + (vu32)base[I2C_BUS_CLEAR_STATUS]; + base[I2C_INT_STATUS] = base[I2C_INT_STATUS]; +} \ No newline at end of file diff --git a/loader/i2c.h b/loader/i2c.h index 90ac430..440db7d 100755 --- a/loader/i2c.h +++ b/loader/i2c.h @@ -1,22 +1,7 @@ -/* -* Copyright (c) 2018 naehrwert -* -* This program is free software; you can redistribute it and/or modify it -* under the terms and conditions of the GNU General Public License, -* version 2, as published by the Free Software Foundation. -* -* This program is distributed in the hope it will be useful, but WITHOUT -* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -* more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -*/ - /* * Copyright (c) 2024 hydrogenium2020-offical * Copyright (c) 2018 naehrwert +* Copyright (c) 2020 CTCaer * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, @@ -42,6 +27,6 @@ #define I2C_5 4 #define I2C_6 5 -void i2c_init(u32 idx); +void i2c_init(u32 i2c_idx); #endif diff --git a/loader/main.c b/loader/main.c index 52c30e7..e862388 100644 --- a/loader/main.c +++ b/loader/main.c @@ -1,6 +1,7 @@ /* * Copyright (c) 2024 hydrogenium2020-offical * Copyright (c) 2018 naehrwert +* Copyright (c) 2018-2023 CTCaer * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, @@ -17,9 +18,7 @@ #include "types.h" #include "printf.h" #include "string.h" - #include "t124.h" -#include "se.h" #include "usb.h" #include "bootrom.h" #include "fuse.h" @@ -28,8 +27,9 @@ #include "util.h" #include "pinmux.h" #include "gpio.h" -#include "i2c.h" #include "uart.h" +#include "sdram.h" +#include "memory_map.h" static inline u32 read32(uintptr_t addr) { return *(vu32 *)addr; @@ -76,36 +76,47 @@ void config_hw(){ // uart_init(UART_D, 115200, UART_AO_TX_AO_RX); // uart_invert(UART_D, 0, UART_INVERT_TXD); - uart_send(UART_D, (u8 *)"hekate: Hello!\r\n", 16); - uart_wait_xfer(UART_D, UART_TX_IDLE); + //uart_send(UART_D, (u8 *)"hekate: Hello!\r\n", 16); + //uart_wait_xfer(UART_D, UART_TX_IDLE); - mc_enable(); - printf_("[x] mc setup\n"); + // mc_enable(); + // printf_("[x] mc setup\n"); config_gpios(); printf_("[x] GPIO setup\n"); - + + sdram_init(); + printf_("[x] SDRAM setup\n"); + } extern void pivot_stack(u32 stack_top); __attribute__((section(".init"))) void _start() { // u8 *buffer = (u8*)0x40020000; - printf_("gardenia is booting."); + printf_("gardenia is booting.\n"); //printf_("%p",&_start); - //pivot_stack(0x200); //Setting up hardware dump_pkc(); config_hw(); - //FIXME!!!->init memory - //Pivot the stack so we have enough space. -// pivot_stack(0x40000000); + printf_("%d\n",MMIO_REG32(0x90010000,0)); + MMIO_REG32(0x90010000,0)=0x123456; + printf_("%d\n",MMIO_REG32(0x90010000,0)); + sleep(200); + printf_("%d\n",MMIO_REG32(0x90010000,0)); - //Tegra/Horizon configuration goes to 0x80000000+, package2 goes to 0xA9800000, we place our heap in between. -// heap_init(0x90020000); + u32 total_size = (MC(MC_EMEM_CFG) >> + MC_EMEM_CFG_SIZE_MB_SHIFT) & MC_EMEM_CFG_SIZE_MB_MASK; + + printf_("Total SDRAM (MB): %u\n", total_size); + //Pivot the stack so we have enough space. + pivot_stack(IPL_STACK_TOP); + printf_("alive"); + + heap_init(IPL_HEAP_START); enter_rcm(); } diff --git a/loader/pmc.h b/loader/pmc.h index 8493f3c..ac1e0bd 100644 --- a/loader/pmc.h +++ b/loader/pmc.h @@ -1,6 +1,7 @@ /* * Copyright (c) 2024 hydrogenium2020-offical * Copyright (c) 2018 naehrwert +* Copyright (c) 2020 CTCaer * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, @@ -14,9 +15,44 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ + +#ifndef _T124_PMC_H_ +#define _T124_PMC_H_ + #include "types.h" #define APBDEV_PMC_OSC_EDPD_OVER 0x1A4 + +//SDRAM +#define APBDEV_PMC_VDDP_SEL 0x1CC +#define APBDEV_PMC_DDR_PWR 0xE8 +#define APBDEV_PMC_NO_IOPOWER 0x44 +#define APBDEV_PMC_REG_SHORT 0x2CC +#define APBDEV_PMC_DDR_CFG 0x1D0 +#define APBDEV_PMC_POR_DPD_CTRL 0x264 +#define APBDEV_PMC_IO_DPD3_REQ 0x45c enum { PMC_XOFS_SHIFT = 1, PMC_XOFS_MASK = 0x3f << PMC_XOFS_SHIFT -}; \ No newline at end of file +}; + +enum { + PMC_POR_DPD_CTRL_MEM0_ADDR0_CLK_SEL_DPD_MASK = 1 << 0, + PMC_POR_DPD_CTRL_MEM0_ADDR1_CLK_SEL_DPD_MASK = 1 << 1, + PMC_POR_DPD_CTRL_MEM0_HOLD_CKE_LOW_OVR_MASK = 1 << 31, +}; +enum { + PMC_DDR_CFG_PKG_MASK = 1 << 0, + PMC_DDR_CFG_IF_MASK = 1 << 1, + PMC_DDR_CFG_XM0_RESET_TRI_MASK = 1 << 12, + PMC_DDR_CFG_XM0_RESET_DPDIO_MASK = 1 << 13, +}; +enum { + PMC_DDR_PWR_EMMC_MASK = 1 << 1, + PMC_DDR_PWR_VAL_MASK = 1 << 0, +}; +enum { + PMC_NO_IOPOWER_MEM_MASK = 1 << 7, + PMC_NO_IOPOWER_MEM_COMP_MASK = 1 << 16, +}; + +#endif \ No newline at end of file diff --git a/loader/timer.h b/loader/timer.h index 42c969c..72e979b 100644 --- a/loader/timer.h +++ b/loader/timer.h @@ -14,5 +14,9 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +#ifndef _T124_TIMER_H_ +#define _T124_TIMER_H_ + #define TIMERUS_CNTR_1US (0x10 + 0x0) -#define TIMERUS_USEC_CFG (0x10 + 0x4) \ No newline at end of file + +#endif \ No newline at end of file diff --git a/loader/uart.c b/loader/uart.c index 0d72e0c..24a7596 100644 --- a/loader/uart.c +++ b/loader/uart.c @@ -1,3 +1,21 @@ +/* +* Copyright (c) 2018 naehrwert +* Copyright (c) 2019-2022 CTCaer +* Copyright (c) 2024 hydrogenium2020-offical +* +* This program is free software; you can redistribute it and/or modify it +* under the terms and conditions of the GNU General Public License, +* version 2, as published by the Free Software Foundation. +* +* This program is distributed in the hope it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +* more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +*/ + #include "uart.h" #include "t124.h" #include "util.h" diff --git a/loader/uart.h b/loader/uart.h index 4a2adf4..1a675f7 100644 --- a/loader/uart.h +++ b/loader/uart.h @@ -1,3 +1,23 @@ +/* +* Copyright (c) 2018 naehrwert +* Copyright (c) 2019-2020 CTCaer +* Copyright (c) 2024 hydrogenium2020-offical +* +* This program is free software; you can redistribute it and/or modify it +* under the terms and conditions of the GNU General Public License, +* version 2, as published by the Free Software Foundation. +* +* This program is distributed in the hope it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +* more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +*/ +#ifndef _T124_UART_H_ +#define _T124_UART_H_ + #include "types.h" #define UART_A 0 #define UART_B 1 @@ -80,4 +100,6 @@ typedef struct _uart_t void uart_wait_xfer(u32 idx, u32 which); void uart_invert(u32 idx, u32 enable, u32 invert_mask); void uart_init(u32 idx, u32 baud, u32 mode); -void uart_send(u32 idx, const u8 *buf, u32 len); \ No newline at end of file +void uart_send(u32 idx, const u8 *buf, u32 len); + +#endif diff --git a/loader/usb.c b/loader/usb.c index 0544b8c..a99f4af 100644 --- a/loader/usb.c +++ b/loader/usb.c @@ -1,6 +1,5 @@ /* * Copyright (c) 2024 hydrogenium2020-offical -* Copyright (c) 2018 naehrwert * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, diff --git a/loader/usb.h b/loader/usb.h index 592f980..ca8dc45 100644 --- a/loader/usb.h +++ b/loader/usb.h @@ -1,6 +1,5 @@ /* * Copyright (c) 2024 hydrogenium2020-offical -* Copyright (c) 2018 naehrwert * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, @@ -14,8 +13,8 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -#ifndef _T124_UTIL_H_ -#define _T124_UTIL_H_ +#ifndef _T124_USB_H_ +#define _T124_USB_H_ #include "types.h" #define USB_MAX_TXFR_BYTES 0x1000 u32 _usb_log(char *msg); diff --git a/loader/util.c b/loader/util.c index 1405fc6..46fe34d 100644 --- a/loader/util.c +++ b/loader/util.c @@ -25,3 +25,21 @@ void sleep(u32 ticks) while (TIMER0(TIMERUS_CNTR_1US) - start <= ticks) ; } +// static inline void setbits32(uint32_t bits, void *addr) +// { +// write32(addr, read32(addr) | bits); +// } + +// static inline void clrbits32(uint32_t bits, void *addr) +// { +// write32(addr, read32(addr) & ~bits); +// } + + +// void clrsetbits32(addr, mask, set){ +// MMIO_REG32(addr,0)=MMIO_REG32(addr,0) &~(mask) | (value & mask); +// } +// static void writebits(uint32_t value, uint32_t *addr, uint32_t mask) +// { +// clrsetbits32(addr, mask, (value & mask)); +// } diff --git a/loader/util.h b/loader/util.h index d0d6930..ea1882e 100644 --- a/loader/util.h +++ b/loader/util.h @@ -1,18 +1,23 @@ /* -* Copyright (c) 2024 hydrogenium2020-offical -* Copyright (c) 2018 naehrwert -* -* This program is free software; you can redistribute it and/or modify it -* under the terms and conditions of the GNU General Public License, -* version 2, as published by the Free Software Foundation. -* -* This program is distributed in the hope it will be useful, but WITHOUT -* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -* more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -*/ + * Copyright (c) 2024 hydrogenium2020-offical + * Copyright (c) 2019 CTCaer + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#ifndef _T124_UTIL_H_ +#define _T124_UTIL_H_ + #include "types.h" void sleep(u32 ticks); + +#endif \ No newline at end of file