2019-04-09 09:33:52 -03:00
|
|
|
#include <arm.h>
|
2017-08-08 09:40:09 -03:00
|
|
|
#include <pxi.h>
|
2017-08-21 21:01:18 -03:00
|
|
|
#include <gic.h>
|
|
|
|
#include <gpulcd.h>
|
2017-08-18 13:45:00 -03:00
|
|
|
#include <vram.h>
|
2017-08-21 21:01:18 -03:00
|
|
|
#include <types.h>
|
2017-08-18 13:45:00 -03:00
|
|
|
|
2019-04-08 17:38:38 -03:00
|
|
|
#include <i2c.h>
|
|
|
|
|
2019-04-09 09:33:52 -03:00
|
|
|
#define CFG11_MPCORE_CLKCNT ((vu16*)(0x10141300))
|
|
|
|
#define CFG11_SOCINFO ((vu16*)(0x10140FFC))
|
2019-04-08 17:38:38 -03:00
|
|
|
|
2019-04-09 09:33:52 -03:00
|
|
|
#define LEGACY_BOOT_ENTRY ((vu32*)0x1FFFFFFC)
|
|
|
|
#define LEGACY_BOOT_MAGIC (0xDEADDEAD)
|
2017-07-26 21:39:30 +02:00
|
|
|
|
2019-04-08 17:38:38 -03:00
|
|
|
void PXI_RX_Handler(void)
|
2017-07-26 21:39:30 +02:00
|
|
|
{
|
2019-04-09 09:33:52 -03:00
|
|
|
u32 ret, msg, cmd, argc, args[PXI_FIFO_LEN];
|
|
|
|
|
|
|
|
msg = PXI_Recv();
|
|
|
|
cmd = msg & 0xFFFF;
|
|
|
|
argc = msg >> 16;
|
|
|
|
|
|
|
|
if (argc > PXI_FIFO_LEN) {
|
|
|
|
PXI_Send(0xFFFFFFFF);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
PXI_RecvArray(args, argc);
|
|
|
|
|
|
|
|
switch (cmd) {
|
|
|
|
case PXI_SCREENINIT:
|
|
|
|
{
|
|
|
|
GPU_Init();
|
|
|
|
GPU_PSCFill(VRAM_START, VRAM_END, 0);
|
|
|
|
GPU_SetFramebuffers((u32[]){VRAM_TOP_LA, VRAM_TOP_LB,
|
|
|
|
VRAM_TOP_RA, VRAM_TOP_RB,
|
|
|
|
VRAM_BOT_A, VRAM_BOT_B});
|
|
|
|
|
|
|
|
GPU_SetFramebufferMode(0, PDC_RGB24);
|
|
|
|
GPU_SetFramebufferMode(1, PDC_RGB24);
|
|
|
|
ret = 0;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case PXI_BRIGHTNESS:
|
|
|
|
{
|
|
|
|
LCD_SetBrightness(0, args[0]);
|
|
|
|
LCD_SetBrightness(1, args[0]);
|
|
|
|
ret = args[0];
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case PXI_I2C_READ:
|
|
|
|
{
|
|
|
|
ret = I2C_readRegBuf(args[0], args[1], (u8*)args[2], args[3]);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case PXI_I2C_WRITE:
|
|
|
|
{
|
|
|
|
ret = I2C_writeRegBuf(args[0], args[1], (u8*)args[2], args[3]);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case PXI_LEGACY_BOOT:
|
|
|
|
{
|
|
|
|
*LEGACY_BOOT_ENTRY = LEGACY_BOOT_MAGIC;
|
|
|
|
ret = 0;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* New CMD template:
|
|
|
|
case CMD_ID:
|
|
|
|
{
|
|
|
|
<var declarations/assignments>
|
|
|
|
<execute the command>
|
|
|
|
<set the return value>
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
*/
|
|
|
|
|
|
|
|
default:
|
|
|
|
ret = 0xFFFFFFFF;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
PXI_Send(ret);
|
|
|
|
return;
|
2017-08-08 09:40:09 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
void main(void)
|
|
|
|
{
|
2019-04-09 09:33:52 -03:00
|
|
|
u32 entry;
|
2017-07-26 21:39:30 +02:00
|
|
|
|
2019-04-09 09:33:52 -03:00
|
|
|
if ((*CFG11_SOCINFO & 2) && (!(*CFG11_MPCORE_CLKCNT & 1))) {
|
|
|
|
GIC_Reset();
|
|
|
|
GIC_SetIRQ(88, NULL);
|
|
|
|
arm_enable_ints();
|
|
|
|
*CFG11_MPCORE_CLKCNT = 0x8001;
|
|
|
|
do {
|
|
|
|
asm("wfi\n\t");
|
|
|
|
} while(!(*CFG11_MPCORE_CLKCNT & 0x8000));
|
|
|
|
arm_disable_ints();
|
|
|
|
}
|
2018-03-14 23:18:29 +01:00
|
|
|
|
2019-04-09 09:33:52 -03:00
|
|
|
GIC_Reset();
|
2017-08-08 09:40:09 -03:00
|
|
|
|
2019-04-09 09:33:52 -03:00
|
|
|
PXI_Reset();
|
|
|
|
I2C_init();
|
|
|
|
//MCU_init();
|
2019-04-08 17:38:38 -03:00
|
|
|
|
2019-04-09 09:33:52 -03:00
|
|
|
GIC_SetIRQ(IRQ_PXI_RX, PXI_RX_Handler);
|
|
|
|
*LEGACY_BOOT_ENTRY = 0;
|
2019-04-08 17:38:38 -03:00
|
|
|
|
2019-04-09 09:33:52 -03:00
|
|
|
arm_enable_ints();
|
2017-08-12 16:04:20 -03:00
|
|
|
|
2019-04-09 09:33:52 -03:00
|
|
|
do {
|
|
|
|
arm_wfi();
|
|
|
|
} while(*LEGACY_BOOT_ENTRY != LEGACY_BOOT_MAGIC);
|
2017-08-08 09:40:09 -03:00
|
|
|
|
2019-04-09 09:33:52 -03:00
|
|
|
arm_disable_ints();
|
|
|
|
GIC_Reset();
|
2017-08-21 21:01:18 -03:00
|
|
|
|
2019-04-09 09:33:52 -03:00
|
|
|
do {
|
|
|
|
entry = *LEGACY_BOOT_ENTRY;
|
|
|
|
} while(entry == LEGACY_BOOT_MAGIC);
|
|
|
|
|
|
|
|
((void (*)())(entry))();
|
2017-07-26 21:39:30 +02:00
|
|
|
}
|