Vhex-kernel/src/kernel/drivers/ubc/driver.c

56 lines
1.2 KiB
C

#include <kernel/hardware/ubc.h>
#include <kernel/hardware/power.h>
#include <kernel/bits/driver.h>
#include <kernel/util/extra.h>
#include <string.h>
// Internal hardware context
struct __sh7305_ubc_context ubc_context;
// Internal global
int ubc_driver_is_installed = 0;
//@note: we known that Casio doesn't use the UBC module
static void sh7305_ubc_driver_install(void)
{
extern uint32_t vhex_dbr;
extern uint32_t bubc_ram;
extern uint32_t bubc_rom;
extern uint32_t subc;
// Check multiple installation
if (ubc_driver_is_installed != 0)
return;
// Dump UBC handler
memcpy(&bubc_ram, &bubc_rom, (size_t)&subc);
// Set the DBR
dbr_set(&vhex_dbr);
// Start User Break Controller
SH7305_POWER.MSTPCR0.UBC = 0;
// Default initialization
SH7305_UBC.CBR0.MFI = 0b000000;
SH7305_UBC.CBR0.CE = 0;
SH7305_UBC.CBR1.MFI = 0b000000;
SH7305_UBC.CBR1.CE = 0;
SH7305_UBC.CBCR.UBDE = 1;
}
static void sh7305_ubc_driver_uninstall(void)
{
// Nothing for now
// TODO: Casio seems to stop UBC module when power off occur
// SO, restore context if needed (?)
}
// Create driver object
VHEX_DRIVER(3, driver_ubc_sh7305) = {
.arch = MPU_SH7305,
.install = &sh7305_ubc_driver_install,
.uninstall = &sh7305_ubc_driver_uninstall,
.name = "intc"
};