Implement shift+<key> support, and ...
[lunaix-os.git] / lunaix-os / kernel / k_main.c
1 #include <hal/cpu.h>
2 #include <lunaix/syslog.h>
3 #include <lunaix/mm/kalloc.h>
4 #include <lunaix/mm/vmm.h>
5 #include <lunaix/spike.h>
6 #include <lunaix/clock.h>
7 #include <lunaix/timer.h>
8 #include <lunaix/keyboard.h>
9 #include <lunaix/tty/tty.h>
10 #include <stdint.h>
11
12 extern uint8_t __kernel_start;
13
14 LOG_MODULE("LX")
15
16 void 
17 test_timer(void* payload);
18
19 void
20 _kernel_main()
21 {
22     char buf[64];
23
24     kprintf(KINFO "Hello higher half kernel world!\nWe are now running in virtual "
25            "address space!\n\n");
26
27     cpu_get_brand(buf);
28     kprintf("CPU: %s\n\n", buf);
29
30     void* k_start = vmm_v2p(&__kernel_start);
31     kprintf(KINFO "The kernel's base address mapping: %p->%p\n", &__kernel_start, k_start);
32
33     // test malloc & free
34
35     uint8_t** arr = (uint8_t**)lxmalloc(10 * sizeof(uint8_t*));
36
37     for (size_t i = 0; i < 10; i++) {
38         arr[i] = (uint8_t*)lxmalloc((i + 1) * 2);
39     }
40
41     for (size_t i = 0; i < 10; i++) {
42         lxfree(arr[i]);
43     }
44
45     uint8_t* big_ = lxmalloc(8192);
46     big_[0] = 123;
47     big_[1] = 23;
48     big_[2] = 3;
49
50     kprintf(KINFO "%u, %u, %u\n", big_[0], big_[1], big_[2]);
51
52     // good free
53     lxfree(arr);
54     lxfree(big_);
55
56     // timer_run_second(1, test_timer, NULL, TIMER_MODE_PERIODIC);
57
58     while (1)
59     {
60         struct kdb_keyinfo_pkt* keyevent = kbd_try_read_one();
61         if (!keyevent) {
62             continue;
63         }
64         if ((keyevent->state & KBD_KEY_FPRESSED) && (keyevent->keycode & 0xff00) <= KEYPAD) {
65             tty_put_char((char)(keyevent->keycode & 0x00ff));
66         }
67         lxfree(keyevent);
68     }
69
70     spin();
71 }
72
73 static datetime_t datetime;
74
75 void test_timer(void* payload) {
76     clock_walltime(&datetime);
77
78     kprintf(KWARN "%u/%02u/%02u %02u:%02u:%02u\r",
79            datetime.year,
80            datetime.month,
81            datetime.day,
82            datetime.hour,
83            datetime.minute,
84            datetime.second);
85 }