Esempio n. 1
0
void send_packet(uint8_t byte) {
    uint8_t parity;
    parity = oparity(byte);
	clk(0);
	_delay_us(DELAY);
    data(0); //Start
    clk(1);
	CDDR &= ~(1 << CBIT); // Release clock
	CPORT |= (1 << CBIT); //Set the pull up on Clock
    /////////////
    serout((byte & (1 << 0)) >> 0);
    serout((byte & (1 << 1)) >> 1);
    serout((byte & (1 << 2)) >> 2);
    serout((byte & (1 << 3)) >> 3);
    serout((byte & (1 << 4)) >> 4);
    serout((byte & (1 << 5)) >> 5);
    serout((byte & (1 << 6)) >> 6);
    serout((byte & (1 << 7)) >> 7);
    /////////////
    serout(parity);
    /////////////
    serout(1); //Stop
    DDDR &= ~(1 << DBIT); //Release the Data line
    DPORT |= (1 << DBIT); //Set the pull up on Data
    /////////////
    if(serin() != ACK)
        send_packet(byte); // Try again if ACK has not been received

	return;
}
Esempio n. 2
0
bool send_packet(uint8_t byte)
{
    /// @todo Error checking in PS/2 code
    uint8_t sent_retries=0;

    do {
        uint8_t parity = oparity(byte);
        clk(0);
        _delay_us(DELAY);
        data(0); //Start
        clk(1);
        CDDR &= ~(1 << CBIT); // Release clock
        CPORT |= (1 << CBIT); //Set the pull up on Clock

        /////////////
        serout((byte & (1 << 0)) >> 0);
        serout((byte & (1 << 1)) >> 1);
        serout((byte & (1 << 2)) >> 2);
        serout((byte & (1 << 3)) >> 3);
        serout((byte & (1 << 4)) >> 4);
        serout((byte & (1 << 5)) >> 5);
        serout((byte & (1 << 6)) >> 6);
        serout((byte & (1 << 7)) >> 7);
        serout(parity);

        serout(1); //Stop

        DDDR &= ~(1 << DBIT); //Release the Data line
        DPORT |= (1 << DBIT); //Set the pull up on Data

        //if(serin() != PS2_ACK )
        //    send_packet(byte); // Try again if PS2_ACK has not been received
        sent_retries++;
    } while (serin() != 0 && sent_retries < 5 );

    if(sent_retries >= 5)
        return false;
    return true;
}
Esempio n. 3
0
uint8_t read_packet(void) {
    uint8_t byte=0,par;
    serin(); //Start
    byte |= (serin() << 0);
    byte |= (serin() << 1);
    byte |= (serin() << 2);
    byte |= (serin() << 3);
    byte |= (serin() << 4);
    byte |= (serin() << 5);
    byte |= (serin() << 6);
    byte |= (serin() << 7);
    par = serin(); //Parity
    serin(); //Stop

    if(par != oparity(byte))
        send_packet(0xfe); //Resend

	return byte;
}