On Tue, 2015-08-18 at 10:45 +0200, Ard Biesheuvel wrote:
> On 18 August 2015 at 10:39, Haojian Zhuang <haojian.zhu...@linaro.org> wrote:
> > // All bits low except one bit high, restricted to 8 bits
> > // (i.e. ensures zeros above 8bits)
> >
> > But '&&' is wrong at here. It'll only return 1 or 0 as the result
> > of GPIO_PIN_MASK_HIGH_8BIT(Pin).
> >
> > Since PL061 spec said in below.
> >
> > In order to write to GPIODATA, the corresponding bits in the mask,
> > resulting from the address bus, PADDR[9:2], must be HIGH. Otherwise
> > the bit values remain unchanged by the write.
> > Similarly, the values read from this register are determined for
> > each bit, by the mask bit derived from the address used to access
> > the data register, PADDR[9:2]. Bits that are 1 in the address mask
> > cause the corresponding bits in GPIODATA to be read, and bits that
> > are 0 in the address mask cause the corresponding bits in GPIODATA
> > to be read as 0, regardless of their value.
> >
> > Now simplify the way to read/write bit of GPIO_DATA register.
> >
> > Contributed-under: TianoCore Contribution Agreement 1.0
> > Signed-off-by: Haojian Zhuang <haojian.zhu...@linaro.org>
> > ---
> >  ArmPlatformPkg/Drivers/PL061GpioDxe/PL061Gpio.c | 16 ++++++++--------
> >  ArmPlatformPkg/Include/Drivers/PL061Gpio.h      |  4 ----
> >  2 files changed, 8 insertions(+), 12 deletions(-)
> >
> > diff --git a/ArmPlatformPkg/Drivers/PL061GpioDxe/PL061Gpio.c 
> > b/ArmPlatformPkg/Drivers/PL061GpioDxe/PL061Gpio.c
> > index ff05662..e8a2094 100644
> > --- a/ArmPlatformPkg/Drivers/PL061GpioDxe/PL061Gpio.c
> > +++ b/ArmPlatformPkg/Drivers/PL061GpioDxe/PL061Gpio.c
> > @@ -125,7 +125,7 @@ Get (
> >      }
> >    }
> >
> > -  if (MmioRead8 (PL061_GPIO_DATA_REG) & GPIO_PIN_MASK_HIGH_8BIT(Gpio)) {
> > +  if (MmioRead8 (PL061_GPIO_DATA_REG + (GPIO_PIN_MASK(Gpio) << 2))) {
> >      *Value = 1;
> >    } else {
> >      *Value = 0;
> > @@ -181,21 +181,21 @@ Set (
> >    {
> >      case GPIO_MODE_INPUT:
> >        // Set the corresponding direction bit to LOW for input
> > -      MmioAnd8 (PL061_GPIO_DIR_REG, GPIO_PIN_MASK_LOW_8BIT(Gpio));
> > +      MmioAnd8 (PL061_GPIO_DIR_REG, GPIO_PIN_MASK(Gpio));
> 
> This should be ~GPIO_PIN_MASK(Gpio)

OK. I'll fix it.
> 
> >        break;
> >
> >      case GPIO_MODE_OUTPUT_0:
> >        // Set the corresponding data bit to LOW for 0
> > -      MmioAnd8 (PL061_GPIO_DATA_REG, GPIO_PIN_MASK_LOW_8BIT(Gpio));
> > +      MmioWrite8 (PL061_GPIO_DATA_REG + (GPIO_PIN_MASK(Gpio) << 2), 
> > GPIO_PIN_MASK(Gpio));
> 
> You should write the value 0x0 here: this will only affect the GPIO
> that you selected, so it will clear only a single bit
> 

All these are already fixed in v3 patches. But I miss to merge them into
the 3rd patch. I'll reformat the patches.

And these other 2 patches of v3 are sent separately since I met the
issue of sending email. I have to resend them again.

Regards
Haojian

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to