Add cli() to protoect ADB critical timing part
This commit is contained in:
parent
eea3b699a6
commit
94823030f0
1 changed files with 7 additions and 11 deletions
|
@ -41,7 +41,6 @@ POSSIBILITY OF SUCH DAMAGE.
|
|||
#include <avr/io.h>
|
||||
#include <avr/interrupt.h>
|
||||
#include "adb.h"
|
||||
#include "debug.h"
|
||||
|
||||
|
||||
// GCC doesn't inline functions normally
|
||||
|
@ -125,16 +124,15 @@ bool adb_host_psw(void)
|
|||
uint16_t adb_host_kbd_recv(void)
|
||||
{
|
||||
uint16_t data = 0;
|
||||
cli();
|
||||
attention();
|
||||
send_byte(0x2C); // Addr:Keyboard(0010), Cmd:Talk(11), Register0(00)
|
||||
place_bit0(); // Stopbit(0)
|
||||
if (!wait_data_lo(500)) { // Tlt/Stop to Start(140-260us)
|
||||
sei();
|
||||
return 0; // No data to send
|
||||
}
|
||||
|
||||
// ad hoc fix: without block inerrupt read wrong bit occasionally and get keys stuck
|
||||
// TODO: is this needed anymore with improved timing?
|
||||
//cli();
|
||||
uint8_t n = 17; // start bit + 16 data bits
|
||||
do {
|
||||
uint8_t lo = (uint8_t) wait_data_hi(130);
|
||||
|
@ -153,10 +151,8 @@ uint16_t adb_host_kbd_recv(void)
|
|||
data |= 1;
|
||||
}
|
||||
else if (n == 17) {
|
||||
// Service Request
|
||||
dprintf("Startbit ERROR\n");
|
||||
sei();
|
||||
return -2;
|
||||
return -20;
|
||||
}
|
||||
}
|
||||
while ( --n );
|
||||
|
@ -164,21 +160,20 @@ uint16_t adb_host_kbd_recv(void)
|
|||
// Stop bit can't be checked normally since it could have service request lenghtening
|
||||
// and its high state never goes low.
|
||||
if (!wait_data_hi(351) || wait_data_lo(91)) {
|
||||
dprintf("Stopbit ERROR\n");
|
||||
sei();
|
||||
return -3;
|
||||
return -21;
|
||||
}
|
||||
sei();
|
||||
return data;
|
||||
|
||||
error:
|
||||
dprintf("Bit ERROR\n");
|
||||
sei();
|
||||
return -4;
|
||||
return -n;
|
||||
}
|
||||
|
||||
void adb_host_listen(uint8_t cmd, uint8_t data_h, uint8_t data_l)
|
||||
{
|
||||
cli();
|
||||
attention();
|
||||
send_byte(cmd);
|
||||
place_bit0(); // Stopbit(0)
|
||||
|
@ -187,6 +182,7 @@ void adb_host_listen(uint8_t cmd, uint8_t data_h, uint8_t data_l)
|
|||
send_byte(data_h);
|
||||
send_byte(data_l);
|
||||
place_bit0(); // Stopbit(0);
|
||||
sei();
|
||||
}
|
||||
|
||||
// send state of LEDs
|
||||
|
|
Loading…
Reference in a new issue