/* Copyright 2010,2011,2012,2013 Jun WAKO */ #include #include #include "debug.h" #include "ring_buffer.h" #include "ibm4704.h" #define WAIT(stat, us, err) do { \ if (!wait_##stat(us)) { \ ibm4704_error = err; \ goto ERROR; \ } \ } while (0) uint8_t ibm4704_error = 0; void ibm4704_init(void) { inhibit(); // keep keyboard from sending IBM4704_INT_INIT(); IBM4704_INT_ON(); idle(); // allow keyboard sending } /* Host to Keyboard ---------------- Data bits are LSB first and Parity is odd. Clock has around 60us high and 30us low part. ____ __ __ __ __ __ __ __ __ __ ________ Clock \______/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ ^ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ___ Data ____|__/ X____X____X____X____X____X____X____X____X____X \___ | Start 0 1 2 3 4 5 6 7 P Stop Request by host Start bit: can be long as 300-350us. Request: Host pulls Clock line down to request to send a command. Timing: After Request keyboard pull up Data and down Clock line to low for start bit. After request host release Clock line once Data line becomes hi. Host writes a bit while Clock is hi and Keyboard reads while low. Stop bit: Host releases or pulls up Data line to hi after 9th clock and waits for keyboard pull down the line to lo. */ uint8_t ibm4704_send(uint8_t data) { bool parity = true; // odd parity ibm4704_error = 0; IBM4704_INT_OFF(); /* Request to send */ idle(); clock_lo(); /* wait for Start bit(Clock:lo/Data:hi) */ WAIT(data_hi, 300, 0x30); /* Data bit */ for (uint8_t i = 0; i < 8; i++) { WAIT(clock_hi, 100, 0x40+i); if (data&(1< 0x30) { xprintf("S:%02X ", ibm4704_error); } IBM4704_INT_ON(); return -1; } /* wait forever to receive data */ uint8_t ibm4704_recv_response(void) { while (!rbuf_has_data()) { _delay_ms(1); } return rbuf_dequeue(); } uint8_t ibm4704_recv(void) { if (rbuf_has_data()) { return rbuf_dequeue(); } else { return -1; } } /* Keyboard to Host ---------------- Data bits are LSB first and Parity is odd. Clock has around 60us high and 30us low part. ____ __ __ __ __ __ __ __ __ __ _______ Clock \_____/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ Data ____/ X____X____X____X____X____X____X____X____X____X________ Start 0 1 2 3 4 5 6 7 P Stop Start bit: can be long as 300-350us. Inhibit: Pull Data line down to inhibit keyboard to send. Timing: Host reads bit while Clock is hi.(rising edge) Stop bit: Keyboard pulls down Data line to lo after 9th clock. */ ISR(IBM4704_INT_VECT) { static enum { BIT0, BIT1, BIT2, BIT3, BIT4, BIT5, BIT6, BIT7, PARITY, STOP } state = BIT0; // LSB first static uint8_t data = 0; // Odd parity static uint8_t parity = false; ibm4704_error = 0; switch (state) { case BIT0: case BIT1: case BIT2: case BIT3: case BIT4: case BIT5: case BIT6: case BIT7: data >>= 1; if (data_in()) { data |= 0x80; parity = !parity; } break; case PARITY: if (data_in()) { parity = !parity; } if (!parity) goto ERROR; break; case STOP: // Data:Low WAIT(data_lo, 100, state); rbuf_enqueue(data); ibm4704_error = IBM4704_ERR_NONE; goto DONE; break; default: goto ERROR; } state++; goto RETURN; ERROR: ibm4704_error = state; while (ibm4704_send(0xFE)) _delay_ms(1); // resend xprintf("R:%02X%02X\n", state, data); DONE: state = BIT0; data = 0; parity = false; RETURN: return; } ysecure/keychain/operations?id=fdb1a7384e81d6b395ec6d930a1df46eb7db9496'>operations/results/EditKeyResult.java
blob: 6098d59d5b296de44f5c4479ae3de1f4000342bf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/*
 * Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
 * Copyright (C) 2014 Vincent Breitmoser <v.breitmoser@mugenguild.com>
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package org.sufficientlysecure.keychain.operations.results;

import android.os.Parcel;

import org.sufficientlysecure.keychain.service.input.CryptoInputParcel;
import org.sufficientlysecure.keychain.service.input.RequiredInputParcel;

public class EditKeyResult extends InputPendingResult {

    public final Long mMasterKeyId;

    public EditKeyResult(int result, OperationLog log, Long masterKeyId) {
        super(result, log);
        mMasterKeyId = masterKeyId;
    }

    public EditKeyResult(OperationLog log, RequiredInputParcel requiredInput,
                         CryptoInputParcel cryptoInputParcel) {
        super(log, requiredInput, cryptoInputParcel);
        mMasterKeyId = null;
    }

    public EditKeyResult(Parcel source) {
        super(source);
        mMasterKeyId = source.readInt() != 0 ? source.readLong() : null;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        super.writeToParcel(dest, flags);
        if (mMasterKeyId != null) {
            dest.writeInt(1);
            dest.writeLong(mMasterKeyId);
        } else {
            dest.writeInt(0);
        }
    }

    public static Creator<EditKeyResult> CREATOR = new Creator<EditKeyResult>() {
        public EditKeyResult createFromParcel(final Parcel source) {
            return new EditKeyResult(source);
        }

        public EditKeyResult[] newArray(final int size) {
            return new EditKeyResult[size];
        }
    };

}