add input
This commit is contained in:
parent
fa35f79e34
commit
8af36091ba
40
README.md
40
README.md
@ -1,5 +1,41 @@
|
|||||||
Arch uefi_run fix: sudo ln -s /usr/share/edk2/x64/OVMF_CODE.4m.fd /usr/share/qemu/OVMF.fd
|
|
||||||
|
|
||||||
|
# UEFI Fireworks
|
||||||
|
|
||||||
|
## How to build
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git submodule update --init --recursive
|
||||||
cd edk2
|
cd edk2
|
||||||
source edksetup.sh
|
source edksetup.sh
|
||||||
make -C BaseTools # if first run
|
make -C BaseTools
|
||||||
|
cd ..
|
||||||
|
./build.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
## How to use
|
||||||
|
|
||||||
|
### On VM
|
||||||
|
|
||||||
|
run ```./test.sh``` to run in VM using QEMU
|
||||||
|
|
||||||
|
### On Real hardware
|
||||||
|
|
||||||
|
copy ```edk2/Build/UEFI_fireworks/DEBUG_GCC5/<YOUR ARCH>/UEFI_fireworks.efi``` to FAT32 or FAT16 USB at location:
|
||||||
|
|
||||||
|
| Architecture | Default Boot Path |
|
||||||
|
|--------------|-------------------|
|
||||||
|
| **x86_64 (AMD64)** | `\EFI\BOOT\BOOTX64.EFI` |
|
||||||
|
| **x86 (IA32)** | `\EFI\BOOT\BOOTIA32.EFI` |
|
||||||
|
| **ARM64 (AArch64)** | `\EFI\BOOT\BOOTAA64.EFI` |
|
||||||
|
| **ARM (32-bit)** | `\EFI\BOOT\BOOTARM.EFI` |
|
||||||
|
|
||||||
|
## Controling
|
||||||
|
|
||||||
|
| Key | Action | Note |
|
||||||
|
|-----|--------|------|
|
||||||
|
| ARROW_UP | speed up | delays under 1ms may be unrelayable |
|
||||||
|
| ARROW_DOWN | slow down | max delay is about UINT32_MAXμs |
|
||||||
|
| PAGE_UP | speed up | 10x step |
|
||||||
|
| PAGE_DOWN | speed down | 10x step |
|
||||||
|
| Home key | reset speed | reset frame delay to 10ms |
|
||||||
|
| Delete key | clear screen | |
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
#include "ProcessorBind.h"
|
#include "ProcessorBind.h"
|
||||||
|
#include "Protocol/SimpleTextIn.h"
|
||||||
|
#include "Uefi/UefiBaseType.h"
|
||||||
#include "const.h"
|
#include "const.h"
|
||||||
#include "drawing.h"
|
#include "drawing.h"
|
||||||
#include "global.h"
|
#include "global.h"
|
||||||
@ -20,7 +22,7 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
EFI_GRAPHICS_OUTPUT_BLT_PIXEL night_sky =
|
EFI_GRAPHICS_OUTPUT_BLT_PIXEL night_sky =
|
||||||
COLOR_FROM_HEX(0x090531); // this cannot be const becose EDK2 said so
|
COLOR_FROM_HEX(0x090531); // this cannot be const becose EDK2 said so
|
||||||
|
#define DEFAULT_SLEEP_TIME 10000
|
||||||
firework_instance create_firework();
|
firework_instance create_firework();
|
||||||
EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput = NULL;
|
EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput = NULL;
|
||||||
EFI_GRAPHICS_OUTPUT_BLT_PIXEL *framebuffer = NULL;
|
EFI_GRAPHICS_OUTPUT_BLT_PIXEL *framebuffer = NULL;
|
||||||
@ -71,16 +73,10 @@ EFI_STATUS EFIAPI UefiMain(IN EFI_HANDLE imgHandle,
|
|||||||
|
|
||||||
SERIAL_PRINT("DOES it work?\n");
|
SERIAL_PRINT("DOES it work?\n");
|
||||||
Print(L"If you see this message for long time, timer does not work\n");
|
Print(L"If you see this message for long time, timer does not work\n");
|
||||||
milisleep(1);
|
microsleep(1);
|
||||||
clear_screen();
|
clear_screen();
|
||||||
|
|
||||||
/*rocket_instance rocket = {
|
UINTN sleep_time = DEFAULT_SLEEP_TIME;
|
||||||
.x = GraphicsOutput->Mode->Info->HorizontalResolution / 2,
|
|
||||||
.y = GraphicsOutput->Mode->Info->VerticalResolution - 50};
|
|
||||||
while (step_rocket(&rocket, 100)) {
|
|
||||||
milisleep(10);
|
|
||||||
}*/
|
|
||||||
|
|
||||||
while (TRUE) {
|
while (TRUE) {
|
||||||
UINT8 random;
|
UINT8 random;
|
||||||
fill_random_bytes(&random, sizeof(random));
|
fill_random_bytes(&random, sizeof(random));
|
||||||
@ -124,8 +120,71 @@ EFI_STATUS EFIAPI UefiMain(IN EFI_HANDLE imgHandle,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
EFI_INPUT_KEY key;
|
||||||
|
EFI_STATUS status = gST->ConIn->ReadKeyStroke(gST->ConIn, &key);
|
||||||
|
gST->ConIn->Reset(gST->ConIn, FALSE);
|
||||||
|
if (status == EFI_SUCCESS) {
|
||||||
|
switch (key.ScanCode) {
|
||||||
|
case SCAN_UP: // increase simulation speed
|
||||||
|
|
||||||
milisleep(10);
|
if (sleep_time > 100) {
|
||||||
|
sleep_time = sleep_time - 100;
|
||||||
|
} else if (sleep_time > 10) {
|
||||||
|
sleep_time = sleep_time - 10;
|
||||||
|
} else if (sleep_time > 1) {
|
||||||
|
sleep_time = sleep_time - 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case SCAN_DOWN:
|
||||||
|
if (sleep_time < UINT32_MAX - 100) {
|
||||||
|
sleep_time = sleep_time + 100;
|
||||||
|
} else if (sleep_time < UINT32_MAX - 10) {
|
||||||
|
sleep_time = sleep_time + 10;
|
||||||
|
} else if (sleep_time < UINT32_MAX - 1) {
|
||||||
|
sleep_time = sleep_time + 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case SCAN_PAGE_UP:
|
||||||
|
if (sleep_time > 1000) {
|
||||||
|
sleep_time = sleep_time - 1000;
|
||||||
|
} else if (sleep_time > 100) {
|
||||||
|
sleep_time = sleep_time - 100;
|
||||||
|
} else if (sleep_time > 10) {
|
||||||
|
sleep_time = sleep_time - 10;
|
||||||
|
} else if (sleep_time > 1) {
|
||||||
|
sleep_time = sleep_time - 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case SCAN_PAGE_DOWN:
|
||||||
|
if (sleep_time < UINT32_MAX - 1000) {
|
||||||
|
sleep_time = sleep_time + 1000;
|
||||||
|
} else if (sleep_time < UINT32_MAX - 100) {
|
||||||
|
sleep_time = sleep_time + 100;
|
||||||
|
} else if (sleep_time < UINT32_MAX - 10) {
|
||||||
|
sleep_time = sleep_time + 10;
|
||||||
|
} else if (sleep_time < UINT32_MAX - 1) {
|
||||||
|
sleep_time = sleep_time + 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case SCAN_HOME:
|
||||||
|
sleep_time = DEFAULT_SLEEP_TIME;
|
||||||
|
break;
|
||||||
|
case SCAN_DELETE:
|
||||||
|
for (UINT8 i = 0; i < ARRAY_SIZE(firework_array); i++) {
|
||||||
|
if (firework_array[i] != NULL) {
|
||||||
|
FreePool(firework_array[i]);
|
||||||
|
firework_array[i] = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// clear_screen(); does not work on real hardware here for some unknown
|
||||||
|
// reason
|
||||||
|
for (UINTN i = 0; i < GraphicsOutput->Mode->FrameBufferSize; i++) {
|
||||||
|
framebuffer[i] = night_sky;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
microsleep(sleep_time);
|
||||||
}
|
}
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
|
@ -68,7 +68,7 @@ void init_rng() {
|
|||||||
Status = gRT->GetTime(&Time, NULL);
|
Status = gRT->GetTime(&Time, NULL);
|
||||||
if (EFI_ERROR(Status)) {
|
if (EFI_ERROR(Status)) {
|
||||||
Print(L"failed to get time\r\n");
|
Print(L"failed to get time\r\n");
|
||||||
milisleep(2000);
|
microsleep(2000000);
|
||||||
starting = 1;
|
starting = 1;
|
||||||
} else {
|
} else {
|
||||||
starting = Time.Second;
|
starting = Time.Second;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#include "Library/UefiLib.h"
|
#include "Library/UefiLib.h"
|
||||||
#include <Library/UefiBootServicesTableLib.h>
|
#include <Library/UefiBootServicesTableLib.h>
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
milisleep(UINTN Milliseconds) {
|
microsleep(UINTN n) {
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_EVENT TimerEvent;
|
EFI_EVENT TimerEvent;
|
||||||
|
|
||||||
@ -13,7 +13,7 @@ milisleep(UINTN Milliseconds) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Status = gBS->SetTimer(TimerEvent, TimerRelative,
|
Status = gBS->SetTimer(TimerEvent, TimerRelative,
|
||||||
EFI_TIMER_PERIOD_MILLISECONDS(Milliseconds));
|
EFI_TIMER_PERIOD_MICROSECONDS(n));
|
||||||
|
|
||||||
if (!EFI_ERROR(Status)) {
|
if (!EFI_ERROR(Status)) {
|
||||||
gBS->WaitForEvent(1, &TimerEvent, NULL);
|
gBS->WaitForEvent(1, &TimerEvent, NULL);
|
||||||
|
@ -1,2 +1,2 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
void milisleep(UINTN n);
|
void microsleep(UINTN n);
|
Loading…
x
Reference in New Issue
Block a user