├── CMakeLists.txt ├── README.md ├── main.c ├── noled.yml └── taihen.json /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.8) 2 | 3 | set(CMAKE_SYSTEM_NAME "Generic") 4 | set(CMAKE_C_COMPILER "arm-vita-eabi-gcc") 5 | set(CMAKE_CXX_COMPILER "arm-vita-eabi-g++") 6 | 7 | project(HENkaku) 8 | 9 | set(CMAKE_C_FLAGS "-Wl,-q -Wall -O3 -std=gnu99") 10 | set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS} -std=c++11 -fno-rtti -fno-exceptions") 11 | 12 | include_directories( 13 | ) 14 | 15 | link_directories( 16 | ${CMAKE_CURRENT_BINARY_DIR} 17 | ) 18 | 19 | if (NOT ${RELEASE}) 20 | add_definitions(-DENABLE_LOGGING) 21 | endif() 22 | 23 | add_executable(noled.elf 24 | main.c 25 | ) 26 | 27 | target_link_libraries(noled.elf 28 | taihenForKernel_stub 29 | SceLedForDriver_stub 30 | ScePowerForDriver_stub 31 | SceGpioForDriver_stub 32 | ) 33 | 34 | set_target_properties(noled.elf 35 | PROPERTIES LINK_FLAGS "-nostdlib" 36 | COMPILE_FLAGS "-D__VITA_KERNEL__" 37 | ) 38 | 39 | add_custom_target(noled.skprx ALL 40 | COMMAND vita-elf-create -e ${CMAKE_SOURCE_DIR}/noled.yml noled.elf noled.velf ${CMAKE_SOURCE_DIR}/taihen.json 41 | COMMAND vita-make-fself -c noled.velf noled.skprx 42 | ) 43 | add_dependencies(noled.skprx noled.elf) 44 | 45 | add_custom_target(send 46 | COMMAND curl -T noled.skprx ftp://$(PSVITAIP):1337/ux0:/data/tai/ 47 | DEPENDS noled.skprx 48 | ) 49 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # noled 2 | noled is a simple plugin to turn off the blue home button led of PS Vita. Especially useful at night. With the release of v1.2, it will now disable both the Home Button LED and Game Cartridge LED. 3 | 4 | https://youtu.be/YbxpdJ67VgE 5 | 6 | It is a kernel plugin so enable it in kernel section of your config.txt. 7 | 8 | copy noled.skprx to tai folder (ux0:/tai) 9 | edit config.txt: 10 | 11 | *KERNEL 12 | 13 | ux0:tai/noled.skprx 14 | 15 | after that, reboot your vita and restart henkaku. 16 | 17 | All credits to @xerpi, all i did was to compile the source. 18 | 19 | A known issue is, after resuming from standby, blue light will turn on for a second and then turn off. 20 | -------------------------------------------------------------------------------- /main.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | void _start() __attribute__ ((weak, alias ("module_start"))); 7 | 8 | // handle to our hook 9 | static tai_hook_ref_t hook_disable_led; 10 | // this function is in kernel space 11 | SceUID disable_led_other(int bus, int port) { 12 | if ((bus == 0) && ((port == 7) | (port == 6))) 13 | { 14 | return 0; 15 | } 16 | //disable_led(); 17 | return TAI_CONTINUE(SceUID, hook_disable_led, bus, port); 18 | } 19 | 20 | static void disable_led() 21 | { 22 | ksceGpioPortClear(0, 7); 23 | ksceGpioPortClear(0, 6); 24 | } 25 | 26 | int module_start(SceSize argc, const void *args) 27 | { 28 | disable_led(); 29 | taiHookFunctionExportForKernel(KERNEL_PID, // Kernel process 30 | &hook_disable_led, // Output a reference 31 | "SceLowio", // Name of module being hooked 32 | TAI_ANY_LIBRARY, // If there's multiple libs exporting this 33 | 0xD454A584, // NID specifying `ksceGpioPortSet` 34 | disable_led_other); // Name of the hook function 35 | return SCE_KERNEL_START_SUCCESS; 36 | } 37 | 38 | int module_stop(SceSize argc, const void *args) 39 | { 40 | return SCE_KERNEL_STOP_SUCCESS; 41 | } 42 | -------------------------------------------------------------------------------- /noled.yml: -------------------------------------------------------------------------------- 1 | noled: 2 | attributes: 0 3 | version: 4 | major: 1 5 | minor: 1 6 | main: 7 | start: module_start 8 | stop: module_stop 9 | -------------------------------------------------------------------------------- /taihen.json: -------------------------------------------------------------------------------- 1 | { 2 | "taihen": { 3 | "nid": 1606611896, 4 | "modules": { 5 | "taihen": { 6 | "nid": 540875304, 7 | "kernel": false, 8 | "functions": { 9 | "taiHookFunctionExportForUser": 2269553102, 10 | "taiHookFunctionImportForUser": 1399025245, 11 | "taiHookFunctionOffsetForUser": 87368282, 12 | "taiGetModuleInfo": 2777256836, 13 | "taiHookRelease": 472967065, 14 | "taiInjectAbs": 1247316228, 15 | "taiInjectDataForUser": 3458578876, 16 | "taiInjectRelease": 564447398 17 | }, 18 | "variables": {} 19 | }, 20 | "taihenUnsafe": { 21 | "nid": 2998301478, 22 | "kernel": false, 23 | "functions": { 24 | "taiLoadKernelModule": 3603990244, 25 | "taiStartKernelModuleForUser": 2850755214, 26 | "taiLoadStartKernelModuleForUser": 2559617235, 27 | "taiLoadStartModuleForPidForUser": 3897797579, 28 | "taiStopKernelModuleForUser": 481663624, 29 | "taiUnloadKernelModule": 1275696130, 30 | "taiStopUnloadKernelModuleForUser": 1277030648, 31 | "taiStopModuleForPidForUser": 748497445, 32 | "taiUnloadModuleForPid": 4106888249, 33 | "taiStopUnloadModuleForPidForUser": 1630160410, 34 | "taiMemcpyUserToKernel": 4138861294, 35 | "taiMemcpyKernelToUser": 2310758437 36 | }, 37 | "variables": {} 38 | }, 39 | "taihenForKernel": { 40 | "nid": 3487819968, 41 | "kernel": true, 42 | "functions": { 43 | "taiHookFunctionAbs": 3605329551, 44 | "taiHookFunctionExportForKernel": 1171062720, 45 | "taiHookFunctionImportForKernel": 1159321730, 46 | "taiHookFunctionOffsetForKernel": 2402393463, 47 | "taiGetModuleInfoForKernel": 1855132055, 48 | "taiHookReleaseForKernel": 3525736650, 49 | "taiInjectAbsForKernel": 4230976111, 50 | "taiInjectDataForKernel": 2678390840, 51 | "taiInjectReleaseForKernel": 1371225801, 52 | "taiLoadPluginsForTitleForKernel": 2621581546 53 | }, 54 | "variables": {} 55 | } 56 | } 57 | } 58 | } --------------------------------------------------------------------------------