mirror of
https://github.com/Atmosphere-NX/Atmosphere.git
synced 2025-05-30 14:35:17 -04:00
sdmmc: implement driver suitable for fs + bootloader
* sdmmc: begin skeletoning sdmmc driver * sdmmc: add most of SdHostStandardController * sdmmc: implement most of SdmmcController * sdmmc: Sdmmc2Controller * sdmmc: skeleton implementation of Sdmmc1Controller * sdmmc: complete abstract logic for Sdmmc1 power controller * sdmmc: implement gpio handling for sdmmc1-register-control * sdmmc: implement pinmux handling for sdmmc1-register-control * sdmmc: fix building for arm32 and in stratosphere context * sdmmc: implement voltage enable/set for sdmmc1-register-control * util: move T(V)SNPrintf from kernel to util * sdmmc: implement BaseDeviceAccessor * sdmmc: implement MmcDeviceAccessor * sdmmc: implement clock reset controller for register api * sdmmc: fix bug in WaitWhileCommandInhibit, add mmc accessors * exo: add sdmmc test program * sdmmc: fix speed mode extension, add CheckMmcConnection for debug * sdmmc: add DeviceDetector, gpio: implement client api * gpio: modernize client api instead of doing it the lazy way * sdmmc: SdCardDeviceAccessor impl * sdmmc: update test program to read first two sectors of sd card * sdmmc: fix vref sel * sdmmc: finish outward-facing api (untested) * ams: changes for libvapours including tegra register defs * sdmmc: remove hwinit
This commit is contained in:
parent
ac04e02a08
commit
166318ba77
143 changed files with 13696 additions and 1569 deletions
|
@ -92,7 +92,7 @@ void __appInit(void) {
|
|||
R_ABORT_UNLESS(psmInitialize());
|
||||
R_ABORT_UNLESS(spsmInitialize());
|
||||
R_ABORT_UNLESS(plInitialize(::PlServiceType_User));
|
||||
R_ABORT_UNLESS(gpioInitialize());
|
||||
gpio::Initialize();
|
||||
R_ABORT_UNLESS(fsInitialize());
|
||||
});
|
||||
|
||||
|
@ -105,7 +105,7 @@ void __appExit(void) {
|
|||
/* Cleanup services. */
|
||||
fsExit();
|
||||
plExit();
|
||||
gpioExit();
|
||||
gpio::Finalize();
|
||||
spsmExit();
|
||||
psmExit();
|
||||
lblExit();
|
||||
|
|
|
@ -33,22 +33,21 @@ namespace ams::fatal::srv {
|
|||
|
||||
bool IsInRepairWithoutVolHeld() {
|
||||
if (IsInRepair()) {
|
||||
GpioPadSession vol_btn;
|
||||
if (R_FAILED(gpioOpenSession(&vol_btn, GpioPadName_ButtonVolUp))) {
|
||||
gpio::GpioPadSession vol_btn;
|
||||
if (R_FAILED(gpio::OpenSession(std::addressof(vol_btn), gpio::DeviceCode_ButtonVolUp))) {
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Ensure we close even on early return. */
|
||||
ON_SCOPE_EXIT { gpioPadClose(&vol_btn); };
|
||||
ON_SCOPE_EXIT { gpio::CloseSession(std::addressof(vol_btn)); };
|
||||
|
||||
/* Set direction input. */
|
||||
gpioPadSetDirection(&vol_btn, GpioDirection_Input);
|
||||
gpio::SetDirection(std::addressof(vol_btn), gpio::Direction_Input);
|
||||
|
||||
/* Ensure that we're holding the volume button for a full second. */
|
||||
auto start = os::GetSystemTick();
|
||||
do {
|
||||
GpioValue val;
|
||||
if (R_FAILED(gpioPadGetValue(&vol_btn, &val)) || val != GpioValue_Low) {
|
||||
if (gpio::GetValue(std::addressof(vol_btn)) != gpio::GpioValue_Low) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -156,33 +156,33 @@ namespace ams::fatal::srv {
|
|||
RebootTimingObserver fatal_reboot_helper(config.IsFatalRebootEnabled(), config.GetFatalRebootTimeoutInterval());
|
||||
|
||||
bool check_vol_up = true, check_vol_down = true;
|
||||
GpioPadSession vol_up_btn, vol_down_btn;
|
||||
if (R_FAILED(gpioOpenSession(&vol_up_btn, GpioPadName_ButtonVolUp))) {
|
||||
gpio::GpioPadSession vol_up_btn, vol_down_btn;
|
||||
if (R_FAILED(gpio::OpenSession(std::addressof(vol_up_btn), gpio::DeviceCode_ButtonVolUp))) {
|
||||
check_vol_up = false;
|
||||
}
|
||||
if (R_FAILED(gpioOpenSession(&vol_down_btn, GpioPadName_ButtonVolDown))) {
|
||||
if (R_FAILED(gpio::OpenSession(std::addressof(vol_down_btn), gpio::DeviceCode_ButtonVolDn))) {
|
||||
check_vol_down = false;
|
||||
}
|
||||
|
||||
/* Ensure we close on early return. */
|
||||
ON_SCOPE_EXIT { if (check_vol_up) { gpioPadClose(&vol_up_btn); } };
|
||||
ON_SCOPE_EXIT { if (check_vol_down) { gpioPadClose(&vol_down_btn); } };
|
||||
ON_SCOPE_EXIT { if (check_vol_up) { gpio::CloseSession(std::addressof(vol_up_btn)); } };
|
||||
ON_SCOPE_EXIT { if (check_vol_down) { gpio::CloseSession(std::addressof(vol_down_btn)); } };
|
||||
|
||||
/* Set direction input. */
|
||||
if (check_vol_up) {
|
||||
gpioPadSetDirection(&vol_up_btn, GpioDirection_Input);
|
||||
gpio::SetDirection(std::addressof(vol_up_btn), gpio::Direction_Input);
|
||||
}
|
||||
if (check_vol_down) {
|
||||
gpioPadSetDirection(&vol_down_btn, GpioDirection_Input);
|
||||
gpio::SetDirection(std::addressof(vol_down_btn), gpio::Direction_Input);
|
||||
}
|
||||
|
||||
BpcSleepButtonState state;
|
||||
GpioValue val;
|
||||
while (true) {
|
||||
if (fatal_reboot_helper.IsRebootTiming() || (quest_reboot_helper.IsRebootTiming()) ||
|
||||
(check_vol_up && R_SUCCEEDED(gpioPadGetValue(&vol_up_btn, &val)) && val == GpioValue_Low) ||
|
||||
(check_vol_down && R_SUCCEEDED(gpioPadGetValue(&vol_down_btn, &val)) && val == GpioValue_Low) ||
|
||||
(R_SUCCEEDED(bpcGetSleepButtonState(&state)) && state == BpcSleepButtonState_Held)) {
|
||||
(check_vol_up && gpio::GetValue(std::addressof(vol_up_btn)) == gpio::GpioValue_Low) ||
|
||||
(check_vol_down && gpio::GetValue(std::addressof(vol_down_btn)) == gpio::GpioValue_Low) ||
|
||||
(R_SUCCEEDED(bpcGetSleepButtonState(&state)) && state == BpcSleepButtonState_Held))
|
||||
{
|
||||
/* If any of the above conditions succeeded, we should reboot. */
|
||||
bpcRebootSystem();
|
||||
return;
|
||||
|
|
|
@ -70,16 +70,16 @@ namespace ams::fatal::srv {
|
|||
|
||||
/* Talk to the ALC5639 over GPIO, and disable audio output */
|
||||
{
|
||||
GpioPadSession audio;
|
||||
if (R_SUCCEEDED(gpioOpenSession(&audio, GpioPadName_AudioCodec))) {
|
||||
ON_SCOPE_EXIT { gpioPadClose(&audio); };
|
||||
gpio::GpioPadSession audio;
|
||||
if (R_SUCCEEDED(gpio::OpenSession(std::addressof(audio), gpio::DeviceCode_CodecLdoEnTemp))) {
|
||||
ON_SCOPE_EXIT { gpio::CloseSession(std::addressof(audio)); };
|
||||
|
||||
/* Set direction output, sleep 200 ms so it can take effect. */
|
||||
gpioPadSetDirection(&audio, GpioDirection_Output);
|
||||
svcSleepThread(200000000UL);
|
||||
gpio::SetDirection(std::addressof(audio), gpio::Direction_Output);
|
||||
os::SleepThread(TimeSpan::FromMilliSeconds(200));
|
||||
|
||||
/* Pull audio codec low. */
|
||||
gpioPadSetValue(&audio, GpioValue_Low);
|
||||
gpio::SetValue(std::addressof(audio), gpio::GpioValue_Low);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue