On 25 March 2016 at 03:52, Ni, Ruiyu <ruiyu...@intel.com> wrote:
> Heyi,
> I was not able to remove the blue bar in the beginning of every line if I 
> embedded my reply.
> So I will directly write down here.
>
>
> 1.      I would like to know in what circumstance the key loss happens.
> Because your UART hardware has 32 FIFO buffer to receive the keys.
> A typical escape keys (corresponding to Arrow Left, Arrow Right, or F1-F12) 
> combination
> would only need 3-4 bytes. The FIFO buffer is sufficient to hold about 10
> combinations.
>

The loss of input characters occurs typically when you copy-paste
something into the terminal window.

>
> 2.      Your system's timer hardware is fast enough so your timer callback 
> can be triggered
> every 2 (2.78) ms, then terminal driver should be able to capture all the 
> escape keys.
> Now since terminal driver cannot capture all the escape keys, so you guess 
> the callback is
> not triggered every 2ms.
> Can you find a way to prove it? for example, save the time every time the 
> callback is called.
> Then after like 100 rounds of callback, dump all the 100 time values.
> Let's see the real time interval value.
>
>
> 3.      I forget about the FIFO depth change. The FIFO depth change doesn't 
> cause the device
>
> path reinstallation. I agree we need to detect the FIFO depth change in timer 
> call back
>
> to update the interval.
>
>
> Regards,
> Ray
>
> From: Heyi Guo [mailto:heyi....@linaro.org]
> Sent: Thursday, March 24, 2016 10:59 PM
> To: Ni, Ruiyu <ruiyu...@intel.com>; edk2-devel@lists.01.org
> Cc: Tian, Feng <feng.t...@intel.com>; Zeng, Star <star.z...@intel.com>
> Subject: Re: [edk2] [PATCH v2 3/3] MdeModulePkg/TerminalDxe: Set polling rate 
> by serial IO mode
>
> Hi Ruiyu,
>
> I had seen the other comments and I just needed more time to think about them 
> :)
>
> Please see my comments below.
> On 03/24/2016 03:26 PM, Ni, Ruiyu wrote:
> Heyi,
> I had 7 comments in previous mail. I guess you may miss the other comments.
>
> What Timer driver are you using? How many ms does one system tick cost?
> If you are using a less-precise timer driver/hardware, one tick may be larger 
> than
> what you expected.
> We are using ArmPlatformPkg/Drivers/SP804TimerDxe/SP804TimerDxe.inf as timer 
> driver.
> The frequency of the timer is 200MHz. Timer interrupt period is set to 1ms.
>
>
>
> And can you tell me all the UART parameters in your case? What timer interval
> did you get using the equation?
> Baud rate = 115200
> FIFO depth = 32
> Parity = 0
> stop = 1
> Data size = 8
> Polling interval = (1 + 8 + 0 + 1) * 32 / 115200 = 0.00278 (2.78ms)
>
> And please continue to see my opinions for other comments below:
>
>
>
> Regards,
> Ray
>
>
>>-----Original Message-----
>>From: Heyi Guo [mailto:heyi....@linaro.org]
>>Sent: Wednesday, March 23, 2016 5:44 PM
>>To: Ni, Ruiyu <ruiyu...@intel.com><mailto:ruiyu...@intel.com>; 
>>edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org>
>>Cc: Tian, Feng <feng.t...@intel.com><mailto:feng.t...@intel.com>; Zeng, Star 
>><star.z...@intel.com><mailto:star.z...@intel.com>; Kinney, Michael D 
>><michael.d.kin...@intel.com><mailto:michael.d.kin...@intel.com>
>>Subject: Re: [edk2] [PATCH v2 3/3] MdeModulePkg/TerminalDxe: Set polling rate 
>>by serial IO mode
>>
>>Hi Ruiyu,
>>
>>Many thanks for your review.
>>
>>For questions 2#, I tested equation #1 with copy-paste on serial
>>terminal, and found it still missing some characters when the FIFO was
>>almost full (i.e. near the end of input). I think it is because time
>>event is not real-time interrupt; it may be pending for equal or higher TPL.
>>
>>And a little faster polling rate tested well on real environment.
>>
>>Please let me know your suggestion.
>>
>>Regards.
>>
>>Heyi
>>
>>On 03/23/2016 04:03 PM, Ni, Ruiyu wrote:
>>> Heyi,
>>> I have comments in below.
>>>
>>> Regards,
>>> Ray
>>>
>>>
>>>> -----Original Message-----
>>>> From: edk2-devel [mailto:edk2-devel-boun...@lists.01.org] On Behalf Of 
>>>> Heyi Guo
>>>> Sent: Thursday, March 17, 2016 10:37 PM
>>>> To: edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org>
>>>> Cc: Heyi Guo <heyi....@linaro.org><mailto:heyi....@linaro.org>; Tian, Feng 
>>>> <feng.t...@intel.com><mailto:feng.t...@intel.com>; Zeng, Star 
>>>> <star.z...@intel.com><mailto:star.z...@intel.com>
>>>> Subject: [edk2] [PATCH v2 3/3] MdeModulePkg/TerminalDxe: Set polling rate 
>>>> by serial IO mode
>>>>
>>>> Calculate serial input polling rate according to parameters from
>>>> serial IO mode as below, to fix potential input truncation with fixed
>>>> polling interval 0.02s.
>>>>
>>>> Polling interval (100ns) =
>>>> FifoDepth * (ParityBits + StopBits + DataBits) * 10,000,000 / BaudRate
>>> 1. The above equation (let's call it equation #1) looks good.
>>>
> Sorry I think I missed the start bit, which should always be 1 bit.
>
>
>>>> However, as UEFI events will probably delayed by other code of higher
>>>> TPL, we use below equation to make polling rate fast enough:
>>>>
>>>> FifoDepth * DataBits * 10,000,000 * 2 / (BaudRate * 3)
>>> 2. Can you tell me why you multiple two in the left of "/" and multiple 3 
>>> in the right?
>>> Did you meet any real problem when using the original equation (#1)?
>>>
>>> I have more comments in below.
>>>
>>>> Signed-off-by: Heyi Guo <heyi....@linaro.org><mailto:heyi....@linaro.org>
>>>> Cc: Feng Tian <feng.t...@intel.com><mailto:feng.t...@intel.com>
>>>> Cc: Star Zeng <star.z...@intel.com><mailto:star.z...@intel.com>
>>>> ---
>>>> .../Universal/Console/TerminalDxe/Terminal.c       |  5 +-
>>>> .../Universal/Console/TerminalDxe/Terminal.h       | 27 ++++++++-
>>>> .../Universal/Console/TerminalDxe/TerminalConIn.c  | 68 
>>>> ++++++++++++++++++++++
>>>> 3 files changed, 98 insertions(+), 2 deletions(-)
>>>>
>>>> diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c
>>>> b/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c
>>>> index 5adaa97..db790f3 100644
>>>> --- a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c
>>>> +++ b/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c
>>>> @@ -71,6 +71,7 @@ TERMINAL_DEV  mTerminalDevTemplate = {
>>>>    },
>>>>    NULL, // TerminalConsoleModeData
>>>>    0,  // SerialInTimeOut
>>>> +  DEFAULT_KEYBOARD_TIMER_INTERVAL, // KeyboardTimerInterval
>>> 3. Can you remove the default timer interval?
>>> We should be able to calculate the timer interval from the default
>>> setting (DataBits, StopBits, BaudRate, etc).
>>>
> See below.
>
>>>>    NULL, // RawFifo
>>>>    NULL, // UnicodeFiFo
>>>> @@ -984,10 +985,12 @@ TerminalDriverBindingStart (
>>>>                      );
>>>>      ASSERT_EFI_ERROR (Status);
>>>>
>>>> +    TerminalDevice->KeyboardTimerInterval = GetKeyboardTimerInterval 
>>>> (Mode);
>>>> +
>>>>      Status = gBS->SetTimer (
>>>>                      TerminalDevice->TimerEvent,
>>>>                      TimerPeriodic,
>>>> -                    KEYBOARD_TIMER_INTERVAL
>>>> +                    TerminalDevice->KeyboardTimerInterval
>>>>                      );
>>>>      ASSERT_EFI_ERROR (Status);
>>>>
>>>> diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h
>>>> b/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h
>>>> index 269d2ae..58d5664 100644
>>>> --- a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h
>>>> +++ b/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h
>>>> @@ -68,7 +68,7 @@ typedef struct {
>>>>    UINTN   Rows;
>>>> } TERMINAL_CONSOLE_MODE_DATA;
>>>>
>>>> -#define KEYBOARD_TIMER_INTERVAL         200000  // 0.02s
>>>> +#define DEFAULT_KEYBOARD_TIMER_INTERVAL         200000  // 0.02s
>>>
>>> 4. Same question as #3.
>>>
>>>> #define TERMINAL_DEV_SIGNATURE  SIGNATURE_32 ('t', 'm', 'n', 'l')
>>>>
>>>> @@ -91,6 +91,7 @@ typedef struct {
>>>>    EFI_SIMPLE_TEXT_OUTPUT_MODE         SimpleTextOutputMode;
>>>>    TERMINAL_CONSOLE_MODE_DATA          *TerminalConsoleModeData;
>>>>    UINTN                               SerialInTimeOut;
>>>> +  UINT64                              KeyboardTimerInterval;
>>>>    RAW_DATA_FIFO                       *RawFiFo;
>>>>    UNICODE_FIFO                        *UnicodeFiFo;
>>>>    EFI_KEY_FIFO                        *EfiKeyFiFo;
>>>> @@ -1358,4 +1359,28 @@ TerminalConInTimerHandler (
>>>>    IN EFI_EVENT            Event,
>>>>    IN VOID                 *Context
>>>>    );
>>>> +
>>>> +/**
>>>> +  Calculate input polling timer interval by serial IO mode.
>>>> +
>>>> +  @param  Mode                  Pointer to serial IO mode.
>>>> +
>>>> +  @retval The required polling timer interval in 100ns.
>>>> +
>>>> +**/
>>>> +UINT64
>>>> +GetKeyboardTimerInterval (
>>>> +  IN EFI_SERIAL_IO_MODE   *Mode
>>>> +  );
>>>> +
>>>> +/**
>>>> +  Update period of polling timer event.
>>>> +
>>>> +  @param  TerminalDevice        The terminal device to update.
>>>> +**/
>>>> +VOID
>>>> +UpdatePollingRate (
>>>> +  IN TERMINAL_DEV         *TerminalDevice
>>>> +  );
>>>> +
>>>> #endif
>>>> diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConIn.c
>>>> b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConIn.c
>>>> index 2215df6..22349a0 100644
>>>> --- a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConIn.c
>>>> +++ b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConIn.c
>>>> @@ -502,6 +502,71 @@ TerminalConInWaitForKey (
>>>> }
>>>>
>>>> /**
>>>> +  Calculate input polling timer interval by serial IO mode.
>>>> +
>>>> +  @param  Mode                  Pointer to serial IO mode.
>>>> +
>>>> +  @retval The required polling timer interval in 100ns.
>>>> +
>>>> +**/
>>>> +UINT64
>>>> +GetKeyboardTimerInterval (
>>>> +  IN EFI_SERIAL_IO_MODE *Mode
>>>> +  )
>>>> +{
>>>> +  UINT32                FifoDepth;
>>>> +
>>>> +  if (Mode->BaudRate == 0) {
>>>> +    return DEFAULT_KEYBOARD_TIMER_INTERVAL;
>>>> +  }
>>> 5. Now I understand you need the default timer interval for the default 
>>> setting.
>>> Because UEFI spec says when the baud rate has the value of 0 to indicate 
>>> the device
>>> runs at the device's *designed speed*.
>>> But I still think you can calculate the timer interval assuming the 
>>> baudrate is 115200.
>>> Because if using 115200 the timer interval is about 0.001s which is still 
>>> shorter than 0.02s.
>>>
> Sounds good for me.
>
>
>>>> +
>>>> +  FifoDepth = Mode->ReceiveFifoDepth;
>>>> +  // Fix incorrect FIFO depth
>>>> +  if (FifoDepth == 0) {
>>>> +    FifoDepth = 1;
>>>> +  }
>>>> +
>>>> +  // We ignore stop bits and parity bit, and reduce the interval by 1/3,
>>>> +  // to make polling rate fast enough to avoid serial input truncation.
>>>> +  return DivU64x64Remainder (
>>>> +    FifoDepth * Mode->DataBits * 10000000 * 2,
>>>> +    Mode->BaudRate * 3,
>>>> +    NULL
>>>> +    );
>>>> +}
>>> 6. Same question. Can you use the original equation #1?
>>>
>>>> +
>>>> +
>>>> +/**
>>>> +  Update period of polling timer event.
>>>> +
>>>> +  @param  TerminalDevice        The terminal device to update.
>>>> +**/
>>>> +VOID
>>>> +UpdatePollingRate (
>>>> +  IN TERMINAL_DEV         *TerminalDevice
>>>> +  )
>>>> +{
>>>> +  UINT64                  NewInterval;
>>>> +  EFI_STATUS              Status;
>>>> +
>>>> +  NewInterval = GetKeyboardTimerInterval (TerminalDevice->SerialIo->Mode);
>>>> +
>>>> +  if (TerminalDevice->KeyboardTimerInterval == NewInterval) {
>>>> +    return;
>>>> +  }
>>>> +
>>>> +  Status = gBS->SetTimer (
>>>> +                  TerminalDevice->TimerEvent,
>>>> +                  TimerPeriodic,
>>>> +                  NewInterval
>>>> +                  );
>>>> +  ASSERT_EFI_ERROR (Status);
>>>> +
>>>> +  TerminalDevice->KeyboardTimerInterval = NewInterval;
>>>> +}
>>>> +
>>>> +
>>>> +/**
>>>>    Timer handler to poll the key from serial.
>>>>
>>>>    @param  Event                    Indicates the event that invoke this 
>>>> function.
>>>> @@ -560,6 +625,9 @@ TerminalConInTimerHandler (
>>>>        TerminalDevice->SerialInTimeOut = SerialInTimeOut;
>>>>      }
>>>>    }
>>>> +
>>>> +  UpdatePollingRate (TerminalDevice);
>>> 7. All the parameters (baudrate, databits, stopbits,etc) are stored in the 
>>> UART device path.
>>> Any change to these parameters triggers the UART device path 
>>> reinstallation, ultimately
>>> triggers the Terminal driver's restart.
>>> So the polling rate doesn't need to update here.
>>>
> How about FIFO depth change?
>
> Thanks for your review :)
>
> Heyi
>
>
>
>>>> +
>>>>    //
>>>>    // Check whether serial buffer is empty.
>>>>    // Skip the key transfer loop only if the SerialIo protocol instance
>>>> --
>>>> 2.7.0
>>>>
>>>> _______________________________________________
>>>> edk2-devel mailing list
>>>> edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org>
>>>> https://lists.01.org/mailman/listinfo/edk2-devel
>
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.01.org
> https://lists.01.org/mailman/listinfo/edk2-devel
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to