On Thu, May 16, 2013 at 03:13:10PM +0800, li guang wrote: > 在 2013-05-16四的 14:58 +0800,Amos Kong写道: > > On Thu, May 16, 2013 at 01:30:28PM +0800, li guang wrote: > > > 在 2013-05-16四的 12:30 +0800,Amos Kong写道: > > > > Guest driver sets repeat rate and delay time by KBD_CMD_SET_RATE, > > > > but ps2 backend doesn't process it and no auto-repeat implementation. > > > > This patch adds support of auto-repeat feature. > > > > > > > > Guest ps2 driver sets autorepeat to fastest possible in reset, > > > > period: 250ms, delay: 33ms > > > > > > > > Tested by 'sendkey' monitor command. > > > > > > > > referenced: http://www.computer-engineering.org/ps2keyboard/ > > > > > > > > Signed-off-by: Amos Kong <ak...@redhat.com>
> > Hi, Li guang > > > > > theoretically, we have to check if the typematic key is in break > > > now, if so, we will not do repeat anymore. > > > > You mean key is released? I checked by '~keycode & 0x80', stop repeat > > when key is release. > > > > > don't you think we have a chance that new key can come in during > > > waiting? > > > > When the new key (press) comes, repeat_timer will be modified by > > qemu_mod_timer(), original repate will be end. > > > > > > + if (auto_repeat) { > > > > + qemu_mod_timer(repeat_timer, qemu_get_clock_ns(vm_clock) + > > > > + muldiv64(get_ticks_per_sec(), s->repeat_period, > > > > + 1000)); > > > > + ps2_queue(&s->common, s->repeat_key); > > > > + } > > > > +} > > > > + > > > > + > > > > /* > > > > keycode is expressed as follow: > > > > bit 7 - 0 key pressed, 1 = key released > > > > @@ -167,7 +186,17 @@ static void ps2_put_keycode(void *opaque, int > > > > keycode) > > > > keycode = ps2_raw_keycode_set3[keycode & 0x7f]; > > > > } > > > > } > > > > + > > > > + /* only auto-repeat press event */ > > > > + auto_repeat = ~keycode & 0x80; > > > > ^^^ > > case: > > 1. new key pressed > 2. enter ps2_put_keycode > 3. previous timer timeout I guess it's repeat_timer > 4. enter repeat_ps2_queue > 5. put previous keycode in queue > 6. back to ps2_put_keycode back? repeat_ps_queue() is called in background. > 7. check auto_repeat > > so, an obsolete key comes up. > can timer interrupt ps2_put_keycode? no. -- Amos.