" On 15 January 2016 at 08:51, Zeng, Star <star.z...@intel.com> wrote: > On 2016/1/15 16:08, Ryan Harkin wrote: >> >> On 15 January 2016 at 06:50, Zeng, Star <star.z...@intel.com> wrote: >>> >>> On 2016/1/15 14:36, Ryan Harkin wrote: >>>> >>>> >>>> On 15 Jan 2016 01:41, "Zeng, Star" <star.z...@intel.com> wrote: >>>>> >>>>> >>>>> >>>>> Hi Ryan, >>>>> >>>>> >>>>> On 2016/1/15 3:10, Ryan Harkin wrote: >>>>>> >>>>>> >>>>>> >>>>>> Hi Star, >>>>>> >>>>>> This patch breaks the serial terminal for ARM FVP and Juno platforms. >>>>>> I assume it also breaks TC2 and other such "vexpress" platforms >>>>>> effected by this change. >>>>>> >>>>>> Whilst simple text input seems to work ok, cursor support does not. >>>>>> And we need cursor support for Intel BDS. >>>>>> >>>>>> Below is my hack at fixing the problem. >>>>>> >>>>>> Basically, I reintroduce PL011SerialPortExtLib and stub out the >>>>>> functionality in the functions copied into PL011SerialPortLib. >>>>> >>>>> >>>>> >>>>> >>>>> You just copied the function implementation back to >>>> >>>> >>>> PL011SerialPortExtLib, then it would work? It is so weird, >>>> >>>> Yes, that's exactly what I did! Very weird! >>>> >>>>> may I know where your fork? >>>>> >>>> >>>> I haven't pushed this branch yet because I had only just started moving >>>> to >>>> the latest EDK2 tree. But my branch is only tianocore plus >>>> OpenPlatformPkg and my patch below. I see the same problem on FVP >>>> models >>>> on upstream and Juno on upstream if I hack it to use IntelBDS. >>> >>> >>> >>> You means it works well with latest EDK2 TRUNK code if no any change? But >>> it >>> will not work any more after using IntelBDS? >>> >> >> No, it does not work well using EDK2 trunk code. Normal text entry >> works on trunk, it is cursor keys that are broken. Probably some >> other special keys are broken too. >> >> You can use FVP to test trunk. So one can test this problem using the >> free FVP Foundation model from ARM. >> >> But if you want to test Juno on trunk, you have to make a change to >> ArmJuno.dsc to use Intel BDS instead of ARM BDS. Just like this FVP >> change: >> >> f46ac5f 2015-09-01 ArmPlatformPkg/ArmVExpress-FVP: add support for >> the Intel BDS [Ard Biesheuvel] >> >> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@18378 >> 6f19259b-4bc3-4df7-8a09-765794883524 >> >> This is because Intel BDS using cursor keys, ARM BDS does not. > > > Sorry, I am not familiar with ARM platform and can only analyze the problem > by code review. Up to now, I have no idea about the reason since the code > implementation are same but just in different library instances. > > Could you push your code into your fork? Then we can get it to have a look. >
Sure, I've just pushed it: https://git.linaro.org/landing-teams/working/arm/edk2.git/shortlog/refs/heads/serialdxe-fix-005 It's in the "serialdxe-fix-005" branch. > >> >> >>> >>>> >>>>> Thanks, >>>>> Star >>>>> >>>>> >>>>>> >>>>>> Any suggestions about why this is broken or proposals of a proper fix >>>>>> are welcome. In the meantime, I guess I'll have to carry this patch >>>>>> in my own fork. >>>>>> >>>>>> Regards, >>>>>> Ryan. >>>>>> >>>>>> >>>>>> From 76352a589d5eaf6e9be28469aba63288f4defb25 Mon Sep 17 00:00:00 >>>>>> 2001 >>>>>> From: Ryan Harkin <ryan.har...@linaro.org> >>>>>> Date: Thu, 14 Jan 2016 18:41:54 +0000 >>>>>> Subject: [PATCH] Fix "ArmPlatformPkg: Use SerialDxe in MdeModulePkg >>>>>> instead of EmbeddedPkg" >>>>>> >>>>>> The SerialDxe patch below breaks ARM Ltd. platforms: >>>>>> >>>>>>> commit 921e987b2b26602dc85eaee856d494b97b6e02b0 >>>>>>> Author: Star Zeng <star.z...@intel.com> >>>>>>> Date: Thu Nov 26 08:51:05 2015 +0000 >>>>>>> >>>>>>> ArmPlatformPkg: Use SerialDxe in MdeModulePkg instead of >>>>>>> EmbeddedPkg >>>>>>> >>>>>>> It is also to integrate PL011SerialPortExtLib to >>>>>>> PL011SerialPortLib. >>>>>>> >>>>>>> Cc: Michael D Kinney <michael.d.kin...@intel.com> >>>>>>> Cc: Liming Gao <liming....@intel.com> >>>>>>> Cc: Leif Lindholm <leif.lindh...@linaro.org> >>>>>>> Cc: Ard Biesheuvel <ard.biesheu...@linaro.org> >>>>>>> Contributed-under: TianoCore Contribution Agreement 1.0 >>>>>>> Signed-off-by: Star Zeng <star.z...@intel.com> >>>>>>> Reviewed-by: Ard Biesheuvel <ard.biesheu...@linaro.org> >>>>>>> >>>>>>> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@18971 >>>> >>>> >>>> 6f19259b-4bc3-4df7-8a09-765794883524 >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> I found that also reverting the change in PL011SerialPortLib.c >>>>>> resulted >>>>>> in failure to compilate, so I simply changed the return values of the >>>>>> copied in functions to zero. >>>>>> >>>>>> Signed-off-by: Ryan Harkin <ryan.har...@linaro.org> >>>>>> --- >>>>>> ArmPlatformPkg/ArmVExpressPkg/ArmVExpress.dsc.inc | 1 + >>>>>> .../PL011SerialPortLib/PL011SerialPortExtLib.c | 137 >>>> >>>> >>>> +++++++++++++++++++++ >>>>>> >>>>>> >>>>>> .../PL011SerialPortLib/PL011SerialPortExtLib.inf | 43 +++++++ >>>>>> .../PL011SerialPortLib/PL011SerialPortLib.c | 12 +- >>>>>> 4 files changed, 184 insertions(+), 9 deletions(-) >>>>>> create mode 100644 >>>>>> ArmPlatformPkg/Library/PL011SerialPortLib/PL011SerialPortExtLib.c >>>>>> create mode 100644 >>>>>> ArmPlatformPkg/Library/PL011SerialPortLib/PL011SerialPortExtLib.inf >>>>>> >>>>>> diff --git a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress.dsc.inc >>>>>> b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress.dsc.inc >>>>>> index 1b8127d..19c1955 100644 >>>>>> --- a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress.dsc.inc >>>>>> +++ b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress.dsc.inc >>>>>> @@ -95,6 +95,7 @@ >>>>>> # ARM PL011 UART Driver >>>>>> PL011UartLib|ArmPlatformPkg/Drivers/PL011Uart/PL011Uart.inf >>>>>> >>>> >>>> >>>> SerialPortLib|ArmPlatformPkg/Library/PL011SerialPortLib/PL011SerialPortLib.inf >>>>>> >>>>>> >>>>>> + >>>> >>>> >>>> >>>> >>>> SerialPortExtLib|ArmPlatformPkg/Library/PL011SerialPortLib/PL011SerialPortExtLib.inf >>>>>> >>>>>> >>>>>> # ARM SP804 Dual Timer Driver >>>>>> TimerLib|ArmPlatformPkg/Library/SP804TimerLib/SP804TimerLib.inf >>>>>> >>>>>> diff --git >>>> >>>> >>>> a/ArmPlatformPkg/Library/PL011SerialPortLib/PL011SerialPortExtLib.c >>>>>> >>>>>> >>>>>> b/ArmPlatformPkg/Library/PL011SerialPortLib/PL011SerialPortExtLib.c >>>>>> new file mode 100644 >>>>>> index 0000000..c60e7a4 >>>>>> --- /dev/null >>>>>> +++ >>>>>> b/ArmPlatformPkg/Library/PL011SerialPortLib/PL011SerialPortExtLib.c >>>>>> @@ -0,0 +1,137 @@ >>>>>> +/** @file >>>>>> + Serial I/O Port library functions with no library >>>> >>>> >>>> constructor/destructor >>>>>> >>>>>> >>>>>> + >>>>>> + Copyright (c) 2012-2014, ARM Ltd. All rights reserved.<BR> >>>>>> + >>>>>> + This program and the accompanying materials >>>>>> + are licensed and made available under the terms and conditions of >>>>>> the BSD License >>>>>> + which accompanies this distribution. The full text of the license >>>>>> may be found at >>>>>> + http://opensource.org/licenses/bsd-license.php >>>>>> + >>>>>> + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" >>>>>> BASIS, >>>>>> + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS >>>>>> OR >>>> >>>> >>>> IMPLIED. >>>>>> >>>>>> >>>>>> + >>>>>> +**/ >>>>>> + >>>>>> +#include <Base.h> >>>>>> + >>>>>> +#include <Library/IoLib.h> >>>>>> +#include <Library/PcdLib.h> >>>>>> +#include <Library/SerialPortExtLib.h> >>>>>> + >>>>>> +#include <Drivers/PL011Uart.h> >>>>>> + >>>>>> +/** >>>>>> + Set new attributes to PL011. >>>>>> + >>>>>> + @param BaudRate The baud rate of the serial device. >>>>>> If the baud rate is not supported, >>>>>> + the speed will be reduced down to >>>>>> the nearest supported one and the >>>>>> + variable's value will be updated >>>> >>>> >>>> accordingly. >>>>>> >>>>>> >>>>>> + @param ReceiveFifoDepth The number of characters the device >>>>>> will buffer on input. If the specified >>>>>> + value is not supported, the >>>>>> variable's value will be reduced down to the >>>>>> + nearest supported one. >>>>>> + @param Timeout If applicable, the number of >>>>>> microseconds the device will wait >>>>>> + before timing out a Read or a Write >>>>>> operation. >>>>>> + @param Parity If applicable, this is the >>>>>> EFI_PARITY_TYPE that is computed or checked >>>>>> + as each character is transmitted or >>>>>> received. If the device does not >>>>>> + support parity, the value is the >>>>>> default parity value. >>>>>> + @param DataBits The number of data bits in each >>>> >>>> >>>> character >>>>>> >>>>>> >>>>>> + @param StopBits If applicable, the >>>>>> EFI_STOP_BITS_TYPE number of stop bits per character. >>>>>> + If the device does not support stop >>>>>> bits, the value is the default stop >>>>>> + bit value. >>>>>> + >>>>>> + @retval EFI_SUCCESS All attributes were set correctly >>>>>> on the serial device. >>>>>> + @retval EFI_INVALID_PARAMETERS One or more of the attributes has >>>>>> an unsupported value. >>>>>> + >>>>>> +**/ >>>>>> +RETURN_STATUS >>>>>> +EFIAPI >>>>>> +SerialPortSetAttributes ( >>>>>> + IN OUT UINT64 *BaudRate, >>>>>> + IN OUT UINT32 *ReceiveFifoDepth, >>>>>> + IN OUT UINT32 *Timeout, >>>>>> + IN OUT EFI_PARITY_TYPE *Parity, >>>>>> + IN OUT UINT8 *DataBits, >>>>>> + IN OUT EFI_STOP_BITS_TYPE *StopBits >>>>>> + ) >>>>>> +{ >>>>>> + return PL011UartInitializePort ( >>>>>> + (UINTN)PcdGet64 (PcdSerialRegisterBase), >>>>>> + BaudRate, >>>>>> + ReceiveFifoDepth, >>>>>> + Parity, >>>>>> + DataBits, >>>>>> + StopBits); >>>>>> +} >>>>>> + >>>>>> +/** >>>>>> + >>>>>> + Assert or deassert the control signals on a serial port. >>>>>> + The following control signals are set according their bit settings >>>>>> : >>>>>> + . Request to Send >>>>>> + . Data Terminal Ready >>>>>> + >>>>>> + @param[in] Control The following bits are taken into account : >>>>>> + . EFI_SERIAL_REQUEST_TO_SEND : assert/deassert >>>> >>>> >>>> the >>>>>> >>>>>> >>>>>> + "Request To Send" control signal if this bit >>>>>> is >>>>>> + equal to one/zero. >>>>>> + . EFI_SERIAL_DATA_TERMINAL_READY : >>>> >>>> >>>> assert/deassert >>>>>> >>>>>> >>>>>> + the "Data Terminal Ready" control signal if >>>> >>>> >>>> this >>>>>> >>>>>> >>>>>> + bit is equal to one/zero. >>>>>> + . EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE : >>>> >>>> >>>> enable/disable >>>>>> >>>>>> >>>>>> + the hardware loopback if this bit is equal >>>>>> to >>>>>> + one/zero. >>>>>> + . EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE : not >>>> >>>> >>>> supported. >>>>>> >>>>>> >>>>>> + . EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE : >>>> >>>> >>>> enable/ >>>>>> >>>>>> >>>>>> + disable the hardware flow control based on >>>>>> CTS >>>> >>>> >>>> (Clear >>>>>> >>>>>> >>>>>> + To Send) and RTS (Ready To Send) control >>>> >>>> >>>> signals. >>>>>> >>>>>> >>>>>> + >>>>>> + @retval RETURN_SUCCESS The new control bits were set on the >>>>>> serial device. >>>>>> + @retval RETURN_UNSUPPORTED The serial device does not support >>>>>> this operation. >>>>>> + >>>>>> +**/ >>>>>> +RETURN_STATUS >>>>>> +EFIAPI >>>>>> +SerialPortSetControl ( >>>>>> + IN UINT32 Control >>>>>> + ) >>>>>> +{ >>>>>> + return PL011UartSetControl ((UINTN)PcdGet64 >>>>>> (PcdSerialRegisterBase), Control); >>>>>> +} >>>>>> + >>>>>> +/** >>>>>> + >>>>>> + Retrieve the status of the control bits on a serial device. >>>>>> + >>>>>> + @param[out] Control Status of the control bits on a serial device >>>>>> : >>>>>> + >>>>>> + . EFI_SERIAL_DATA_CLEAR_TO_SEND, >>>>>> EFI_SERIAL_DATA_SET_READY, >>>>>> + EFI_SERIAL_RING_INDICATE, >>>> >>>> >>>> EFI_SERIAL_CARRIER_DETECT, >>>>>> >>>>>> >>>>>> + EFI_SERIAL_REQUEST_TO_SEND, >>>>>> EFI_SERIAL_DATA_TERMINAL_READY >>>>>> + are all related to the DTE (Data Terminal >>>>>> Equipment) and >>>>>> + DCE (Data Communication Equipment) modes of >>>>>> operation of >>>>>> + the serial device. >>>>>> + . EFI_SERIAL_INPUT_BUFFER_EMPTY : equal to >>>>>> one if the receive >>>>>> + buffer is empty, 0 otherwise. >>>>>> + . EFI_SERIAL_OUTPUT_BUFFER_EMPTY : equal to >>>>>> one if the transmit >>>>>> + buffer is empty, 0 otherwise. >>>>>> + . EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE : equal >>>>>> to one if the >>>>>> + hardware loopback is enabled (the ouput >>>>>> feeds the receive >>>>>> + buffer), 0 otherwise. >>>>>> + . EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE : equal >>>>>> to one if a >>>>>> + loopback is accomplished by software, 0 >>>> >>>> >>>> otherwise. >>>>>> >>>>>> >>>>>> + . EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE : >>>>>> equal to one if the >>>>>> + hardware flow control based on CTS (Clear >>>>>> To Send) and RTS >>>>>> + (Ready To Send) control signals is enabled, >>>>>> 0 otherwise. >>>>>> + >>>>>> + @retval RETURN_SUCCESS The control bits were read from the serial >>>> >>>> >>>> device. >>>>>> >>>>>> >>>>>> + >>>>>> +**/ >>>>>> +RETURN_STATUS >>>>>> +EFIAPI >>>>>> +SerialPortGetControl ( >>>>>> + OUT UINT32 *Control >>>>>> + ) >>>>>> +{ >>>>>> + return PL011UartGetControl ((UINTN)PcdGet64 >>>>>> (PcdSerialRegisterBase), Control); >>>>>> +} >>>>>> diff --git >>>> >>>> >>>> a/ArmPlatformPkg/Library/PL011SerialPortLib/PL011SerialPortExtLib.inf >>>>>> >>>>>> >>>>>> b/ArmPlatformPkg/Library/PL011SerialPortLib/PL011SerialPortExtLib.inf >>>>>> new file mode 100644 >>>>>> index 0000000..38cdeee >>>>>> --- /dev/null >>>>>> +++ >>>>>> b/ArmPlatformPkg/Library/PL011SerialPortLib/PL011SerialPortExtLib.inf >>>>>> @@ -0,0 +1,43 @@ >>>>>> +#/** @file >>>>>> +# >>>>>> +# Component description file for PL011SerialPortLib module >>>>>> +# >>>>>> +# Copyright (c) 2011-2012, ARM Ltd. All rights reserved.<BR> >>>>>> +# >>>>>> +# This program and the accompanying materials >>>>>> +# are licensed and made available under the terms and conditions of >>>>>> the BSD License >>>>>> +# which accompanies this distribution. The full text of the license >>>>>> may be found at >>>>>> +# http://opensource.org/licenses/bsd-license.php >>>>>> +# >>>>>> +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" >>>>>> BASIS, >>>>>> +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS >>>>>> OR IMPLIED. >>>>>> +# >>>>>> +#**/ >>>>>> + >>>>>> +[Defines] >>>>>> + INF_VERSION = 0x00010005 >>>>>> + BASE_NAME = PL011SerialPortExtLib >>>>>> + FILE_GUID = >>>>>> 2be281f1-c506-4558-bd98-d6930e6de9d6 >>>>>> + MODULE_TYPE = BASE >>>>>> + VERSION_STRING = 1.0 >>>>>> + LIBRARY_CLASS = SerialPortExtLib >>>>>> + >>>>>> +[Sources.common] >>>>>> + PL011SerialPortExtLib.c >>>>>> + >>>>>> +[LibraryClasses] >>>>>> + PL011UartLib >>>>>> + PcdLib >>>>>> + >>>>>> +[Packages] >>>>>> + EmbeddedPkg/EmbeddedPkg.dec >>>>>> + MdePkg/MdePkg.dec >>>>>> + MdeModulePkg/MdeModulePkg.dec >>>>>> + ArmPlatformPkg/ArmPlatformPkg.dec >>>>>> + >>>>>> +[Pcd] >>>>>> + gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterBase >>>>>> + gEfiMdePkgTokenSpaceGuid.PcdUartDefaultBaudRate >>>>>> + gEfiMdePkgTokenSpaceGuid.PcdUartDefaultDataBits >>>>>> + gEfiMdePkgTokenSpaceGuid.PcdUartDefaultParity >>>>>> + gEfiMdePkgTokenSpaceGuid.PcdUartDefaultStopBits >>>>>> diff --git >>>> >>>> >>>> a/ArmPlatformPkg/Library/PL011SerialPortLib/PL011SerialPortLib.c >>>>>> >>>>>> >>>>>> b/ArmPlatformPkg/Library/PL011SerialPortLib/PL011SerialPortLib.c >>>>>> index 7497b5e..8ab3dac 100644 >>>>>> --- a/ArmPlatformPkg/Library/PL011SerialPortLib/PL011SerialPortLib.c >>>>>> +++ b/ArmPlatformPkg/Library/PL011SerialPortLib/PL011SerialPortLib.c >>>>>> @@ -144,13 +144,7 @@ SerialPortSetAttributes ( >>>>>> IN OUT EFI_STOP_BITS_TYPE *StopBits >>>>>> ) >>>>>> { >>>>>> - return PL011UartInitializePort ( >>>>>> - (UINTN)PcdGet64 (PcdSerialRegisterBase), >>>>>> - BaudRate, >>>>>> - ReceiveFifoDepth, >>>>>> - Parity, >>>>>> - DataBits, >>>>>> - StopBits); >>>>>> + return 0; >>>>>> } >>>>>> >>>>>> /** >>>>>> @@ -185,7 +179,7 @@ SerialPortSetControl ( >>>>>> IN UINT32 Control >>>>>> ) >>>>>> { >>>>>> - return PL011UartSetControl ((UINTN)PcdGet64 >>>>>> (PcdSerialRegisterBase), Control); >>>>>> + return 0; >>>>>> } >>>>>> >>>>>> /** >>>>>> @@ -222,5 +216,5 @@ SerialPortGetControl ( >>>>>> OUT UINT32 *Control >>>>>> ) >>>>>> { >>>>>> - return PL011UartGetControl ((UINTN)PcdGet64 >>>>>> (PcdSerialRegisterBase), Control); >>>>>> + return 0; >>>>>> } >>>>>> >>>>> >>> > _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel