Move kbc_event to board code
This commit is contained in:
		@@ -5,4 +5,6 @@
 | 
			
		||||
 | 
			
		||||
void kbc_init(void);
 | 
			
		||||
 | 
			
		||||
void kbc_event(struct Kbc * kbc);
 | 
			
		||||
 | 
			
		||||
#endif // _BOARD_KBC_H
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,93 @@
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
 | 
			
		||||
#include <board/kbc.h>
 | 
			
		||||
 | 
			
		||||
void kbc_init(void) {
 | 
			
		||||
    *(KBC.irq) = 0;
 | 
			
		||||
    *(KBC.control) = 0x48;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
enum KbcState {
 | 
			
		||||
    KBC_STATE_NORMAL,
 | 
			
		||||
    KBC_STATE_WRITE_CONFIG,
 | 
			
		||||
    KBC_STATE_SET_LEDS,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void kbc_event(struct Kbc * kbc) {
 | 
			
		||||
    // TODO: state per KBC (we only have one KBC so low priority)
 | 
			
		||||
    static enum KbcState state = KBC_STATE_NORMAL;
 | 
			
		||||
 | 
			
		||||
    uint8_t sts = kbc_status(kbc);
 | 
			
		||||
    if (sts & KBC_STS_IBF) {
 | 
			
		||||
        uint8_t data = kbc_read(kbc);
 | 
			
		||||
        if (sts & KBC_STS_CMD) {
 | 
			
		||||
            printf("kbc cmd: %02X\n", data);
 | 
			
		||||
 | 
			
		||||
            state = KBC_STATE_NORMAL;
 | 
			
		||||
            switch (data) {
 | 
			
		||||
            case 0x60:
 | 
			
		||||
                printf("  write configuration byte\n");
 | 
			
		||||
                state = KBC_STATE_WRITE_CONFIG;
 | 
			
		||||
                break;
 | 
			
		||||
            case 0xA7:
 | 
			
		||||
                printf("  disable second port\n");
 | 
			
		||||
                break;
 | 
			
		||||
            case 0xA8:
 | 
			
		||||
                printf("  enable second port\n");
 | 
			
		||||
                break;
 | 
			
		||||
            case 0xAA:
 | 
			
		||||
                printf("  test controller\n");
 | 
			
		||||
                // Why not pass the test?
 | 
			
		||||
                kbc_keyboard(kbc, 0x55);
 | 
			
		||||
                break;
 | 
			
		||||
            case 0xAB:
 | 
			
		||||
                printf("  test first port\n");
 | 
			
		||||
                // We _ARE_ the keyboard, so everything is good.
 | 
			
		||||
                kbc_keyboard(kbc, 0x00);
 | 
			
		||||
                break;
 | 
			
		||||
            case 0xAD:
 | 
			
		||||
                printf("  disable first port\n");
 | 
			
		||||
                break;
 | 
			
		||||
            case 0xAE:
 | 
			
		||||
                printf("  enable first port\n");
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            printf("kbc data: %02X\n", data);
 | 
			
		||||
 | 
			
		||||
            switch (state) {
 | 
			
		||||
                case KBC_STATE_NORMAL:
 | 
			
		||||
                    printf("  keyboard command\n");
 | 
			
		||||
                    switch (data) {
 | 
			
		||||
                        case 0xED:
 | 
			
		||||
                            printf("    set leds\n");
 | 
			
		||||
                            state = KBC_STATE_SET_LEDS;
 | 
			
		||||
                            break;
 | 
			
		||||
                        case 0xF4:
 | 
			
		||||
                            printf("    enable scanning\n");
 | 
			
		||||
                            kbc_keyboard(kbc, 0xFA);
 | 
			
		||||
                            break;
 | 
			
		||||
                        case 0xF5:
 | 
			
		||||
                            printf("    disable scanning\n");
 | 
			
		||||
                            kbc_keyboard(kbc, 0xFA);
 | 
			
		||||
                            break;
 | 
			
		||||
                        case 0xFF:
 | 
			
		||||
                            printf("    self test\n");
 | 
			
		||||
                            // Yep, everything is still good, I promise
 | 
			
		||||
                            kbc_keyboard(kbc, 0xAA);
 | 
			
		||||
                            break;
 | 
			
		||||
                    }
 | 
			
		||||
                    break;
 | 
			
		||||
                case KBC_STATE_WRITE_CONFIG:
 | 
			
		||||
                    printf("  write configuration byte\n");
 | 
			
		||||
                    state = KBC_STATE_NORMAL;
 | 
			
		||||
                    break;
 | 
			
		||||
                case KBC_STATE_SET_LEDS:
 | 
			
		||||
                    printf("  set leds\n");
 | 
			
		||||
                    state = KBC_STATE_NORMAL;
 | 
			
		||||
                    kbc_keyboard(kbc, 0xFA);
 | 
			
		||||
                    break;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -31,8 +31,6 @@ uint8_t kbc_read(struct Kbc * kbc);
 | 
			
		||||
void kbc_keyboard(struct Kbc * kbc, uint8_t data);
 | 
			
		||||
void kbc_mouse(struct Kbc * kbc, uint8_t data);
 | 
			
		||||
 | 
			
		||||
void kbc_event(struct Kbc * kbc);
 | 
			
		||||
 | 
			
		||||
volatile uint8_t __xdata __at(0x1300) KBHICR;
 | 
			
		||||
volatile uint8_t __xdata __at(0x1302) KBIRQR;
 | 
			
		||||
volatile uint8_t __xdata __at(0x1304) KBHISR;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,3 @@
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
 | 
			
		||||
#include <ec/kbc.h>
 | 
			
		||||
 | 
			
		||||
struct Kbc __code KBC = {
 | 
			
		||||
@@ -26,15 +24,3 @@ void kbc_keyboard(struct Kbc * kbc, uint8_t data) {
 | 
			
		||||
void kbc_mouse(struct Kbc * kbc, uint8_t data) {
 | 
			
		||||
    *(kbc->mouse_out) = data;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void kbc_event(struct Kbc * kbc) {
 | 
			
		||||
    uint8_t sts = kbc_status(kbc);
 | 
			
		||||
    if (sts & KBC_STS_IBF) {
 | 
			
		||||
        uint8_t data = kbc_read(kbc);
 | 
			
		||||
        if (sts & KBC_STS_CMD) {
 | 
			
		||||
            printf("kbc cmd: %02X\n", data);
 | 
			
		||||
        } else {
 | 
			
		||||
            printf("kbc data: %02X\n", data);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user