~ruther/qmk_firmware

fa545c87f74833856761572ef631d20accc1d026 — tmk 11 years ago 862f519
Fix rn42.h API
3 files changed, 60 insertions(+), 59 deletions(-)

M keyboard/hhkb_rn42/main.c
M keyboard/hhkb_rn42/rn42.c
M keyboard/hhkb_rn42/rn42.h
M keyboard/hhkb_rn42/main.c => keyboard/hhkb_rn42/main.c +25 -43
@@ 45,9 45,6 @@ static void SetupHardware(void)
    PORTD |= (1<<0);
    DDRD &= ~(1<<1);
    PORTD |= (1<<1);

    // CTS control
    CTS_INIT();
}

static bool force_usb = false;


@@ 75,7 72,7 @@ int main(void)
    /* init modules */
    keyboard_init();

    if (rn42_ready()) {
    if (!rn42_rts()) {
        host_set_driver(&rn42_driver);
    } else {
        host_set_driver(&lufa_driver);


@@ 112,9 109,9 @@ int main(void)
        if (config_mode) {
            while ((c = serial_recv2()) != -1) {
                // without flow control it'll fail to receive data when flooded
                CTS_HI();
                rn42_cts_hi();
                xprintf("%c", c);
                CTS_LO();
                rn42_cts_lo();
            }
        } else {
            while ((c = serial_recv2()) != -1) {


@@ 148,10 145,10 @@ int main(void)

        /* Bluetooth mode when ready */
        if (!config_mode && !force_usb) {
            if (rn42_ready() && host_get_driver() != &rn42_driver) {
            if (!rn42_rts() && host_get_driver() != &rn42_driver) {
                clear_keyboard();
                host_set_driver(&rn42_driver);
            } else if (!rn42_ready() && host_get_driver() != &lufa_driver) {
            } else if (rn42_rts() && host_get_driver() != &lufa_driver) {
                clear_keyboard();
                host_set_driver(&lufa_driver);
            }


@@ 159,7 156,10 @@ int main(void)
    }
}

static bool local_echo = false;

/******************************************************************************
 * Command
 ******************************************************************************/
bool command_extra(uint8_t code)
{
    static host_driver_t *prev_driver = &rn42_driver;


@@ 167,46 167,37 @@ bool command_extra(uint8_t code)
        case KC_H:
        case KC_SLASH: /* ? */
            print("\n\n----- Bluetooth RN-42 Help -----\n");
            print("w:   toggle RN-42 config mode(enter/exit)\n");
            print("l:   toggle print module output(local echo)\n");
            print("a:   Bluetooth auto connect\n");
            print("del: Bluetooth disconnect\n");
            print("i:   info\n");
            print("Del: auto_connect/disconnect(enter/exit config mode)\n");
            print("i:   RN-42 info\n");
            print("b:   battery voltage\n");

            if (config_mode) {
                return true;
            } else {
                print("u:   force USB mode\n");
                print("u:   Force USB mode\n");
                return false;   // to display default command help
            }
        case KC_W:
            if (!config_mode) {
                print("\nEnter RN-42 config mode\n");
                print("type $$$ to enter RN-42 command mode\n");
                print("type Delete to disconnect Bluetooth connection\n");
        case KC_DELETE:
            if (rn42_autoconnecting()) {
                rn42_disconnect();
                print("\nRN-42: disconnect\n");
                print("Enter config mode\n");
                print("type $$$ to start and + for local echo\n");
                command_state = CONSOLE;
                config_mode = true;
                prev_driver = host_get_driver();
                clear_keyboard();
                host_set_driver(&rn42_config_driver);
                host_set_driver(&rn42_config_driver);   // null driver; not to send a key to host
            } else {
                print("\nExit RN-42 config mode\n");
                rn42_autoconnect();
                print("\nRN-42: auto_connect\n");
                print("Exit config mode\n");
                command_state = ONESHOT;
                config_mode = false;
                clear_keyboard();
                host_set_driver(prev_driver);
            }
            return true;
        case KC_L:
            if (local_echo) {
                print("local echo off\n");
                local_echo = false;
            } else {
                print("local echo on\n");
                local_echo = true;
            }
            return true;
        case KC_U:
            if (config_mode) return false;
            if (force_usb) {


@@ 219,20 210,12 @@ bool command_extra(uint8_t code)
                host_set_driver(&lufa_driver);
            }
            return true;
        case KC_A:
            print("auto connect\n");
            rn42_autoconnect();
            return true;
        case KC_DELETE:
            print("disconnect\n");
            rn42_disconnect();
            //rn42_putc('\0');    // see 5.3.4.4 DISCONNECT KEY of User's Guide
            return true;
        case KC_I:
            print("\nRN-42 info\n");
            print("\n----- RN-42 info -----\n");
            xprintf("protocol: %s\n", (host_get_driver() == &rn42_driver) ? "RN-42" : "LUFA");
            xprintf("force_usb: %X\n", force_usb);
            xprintf("rn42_ready(): %X\n", rn42_ready());
            xprintf("rn42_autoconnecting(): %X\n", rn42_autoconnecting());
            xprintf("rn42_rts(): %X\n", rn42_rts());
            xprintf("config_mode: %X\n", config_mode);
            return true;
        case KC_B:


@@ 266,7 249,6 @@ bool command_console_extra(uint8_t code)
    switch (code) {
        default:
            rn42_putc(code2asc(code));
            if (local_echo) xprintf("%c", code2asc(code));
            return true;
    }
    return false;

M keyboard/hhkb_rn42/rn42.c => keyboard/hhkb_rn42/rn42.c +31 -10
@@ 24,17 24,17 @@ host_driver_t rn42_driver = {

void rn42_init(void)
{
    // PF1: check RTS(active low)
    DDRF &= ~(1<<1);
    PORTF &= ~(1<<1);

    // PF7: BT connection control(HiZ: connect, low: disconnect)
    // JTAG disable for PORT F. write JTD bit twice within four cycles.
    MCUCR |= (1<<JTD);
    MCUCR |= (1<<JTD);
    rn42_autoconnect();

    // PD5: CTS    (low: allow to send, high:not allowed)
    // PF1: RTS(low: allowed to send, high: not allowed)
    DDRF &= ~(1<<1);
    PORTF &= ~(1<<1);

    // PD5: CTS(low: allow to send, high:not allow)
    DDRD |= (1<<5);
    PORTD &= ~(1<<5);



@@ 46,22 46,43 @@ void rn42_putc(uint8_t c)
    serial_send(c);
}

bool rn42_autoconnecting(void)
{
    // GPIO6 for control connection(high: auto connect, low: disconnect)
    // Note that this needs config: SM,4(Auto-Connect DTR Mode)
    return (PORTF & (1<<7) ? true : false);
}

void rn42_autoconnect(void)
{
    DDRF &= ~(1<<7);
    PORTF &= ~(1<<7);
    // hi to auto connect
    DDRF |= (1<<7);
    PORTF |= (1<<7);
}

void rn42_disconnect(void)
{
    // low to disconnect
    DDRF |= (1<<7);
    PORTF &= ~(1<<7);
}

bool rn42_ready(void)
bool rn42_rts(void)
{
    // low when RN-42 is powered and ready to receive
    return PINF&(1<<1);
}

void rn42_cts_hi(void)
{
    // RTS low
    return PINF&(1<<1) ? false : true;
    // not allow to send
    PORTD |= (1<<5);
}

void rn42_cts_lo(void)
{
    // allow to send
    PORTD &= ~(1<<5);
}



M keyboard/hhkb_rn42/rn42.h => keyboard/hhkb_rn42/rn42.h +4 -6
@@ 3,18 3,16 @@

#include <stdbool.h>

// RN-42 CTS pin
#define CTS_INIT()  (DDRD  |=  (1<<5))
#define CTS_HI()    (PORTD |=  (1<<5))
#define CTS_LO()    (PORTD &= ~(1<<5))

host_driver_t rn42_driver;
host_driver_t rn42_config_driver;

void rn42_init(void);
void rn42_putc(uint8_t c);
bool rn42_autoconnecting(void);
void rn42_autoconnect(void);
void rn42_disconnect(void);
bool rn42_ready(void);
bool rn42_rts(void);
void rn42_cts_hi(void);
void rn42_cts_lo(void);

#endif