Mbed-os: Cypress: FPGA: gpio test looks like not valid

Created on 7 Nov 2019  路  39Comments  路  Source: ARMmbed/mbed-os

Description of defect

Cypress: FPGA: gpio test looks like not valid.

In file TESTS/mbed_hal_fpga_ci_test_shield/gpio/main.cpp line 165:

`
// Initialize GPIO pin as an input, pull-up mode.

memset(&gpio, 0, sizeof gpio);

gpio_init_inout(&gpio, pin, PIN_INPUT, PullUp, 0);

TEST_ASSERT_NOT_EQUAL(0, gpio_is_connected(&gpio));

tester.gpio_write(MbedTester::LogicalPinGPIO0, 0, false);

wait_us(HI_Z_READ_DELAY_US);

TEST_ASSERT_EQUAL_INT(1, gpio_read(&gpio)); // hi-Z, pulled up

gpio_free(&gpio);`

PSoC6 set 0, tester(FPGA) set 0. But expect 1. Test FAILED. It looks like it doesn't make sense.
This test PASSED if set PSOC6 1, tester(FPGA) set 0.

Target(s) affected by this defect ?

Tested on CY8CKIT_062_WIFI_BT

Toolchain(s) (name and version) displaying this defect ?

Tested on GCC_ARM

What version of Mbed-os are you using (tag or sha) ?

Latest

What version(s) of tools are you using. List all that apply (E.g. mbed-cli)

N/A

How is this defect reproduced ?

Always

CLOSED mirrored bug

Most helpful comment

All GPIO tests are PASSED.

[1574155268.32][CONN][RXD] >>> Running case #1: 'generic init, input & output'...
[1574155268.38][CONN][INF] found KV pair in stream: {{__testcase_start;generic init, input & output}}, queued...
[1574155268.41][CONN][RXD] Skipping IO pin D0 (327680)
[1574155268.44][CONN][RXD] Skipping IO pin D1 (327681)
[1574155268.46][CONN][RXD] Skipping IO pin D2 (327682)
[1574155268.50][CONN][RXD] Skipping IO pin D3 (327683)
[1574155268.53][CONN][RXD] Skipping IO pin D11 (786432)
[1574155268.56][CONN][RXD] Skipping IO pin D12 (786433)
[1574155268.59][CONN][RXD] Skipping IO pin D13 (786434)
[1574155268.62][CONN][RXD] Skipping IO pin D14 (393217)
[1574155268.66][CONN][RXD] Skipping IO pin D15 (393216)
[1574155268.70][CONN][RXD] Testing GPIO on all form factor ports
[1574155268.76][CONN][RXD] D4 - IO pin tested on port: peripheral=(0) IO=(D4) ...succeeded
[1574155268.84][CONN][RXD] D5 - IO pin tested on port: peripheral=(0) IO=(D5) ...succeeded
[1574155268.90][CONN][RXD] D6 - IO pin tested on port: peripheral=(0) IO=(D6) ...succeeded
[1574155268.96][CONN][RXD] D7 - IO pin tested on port: peripheral=(0) IO=(D7) ...succeeded
[1574155269.04][CONN][RXD] D8 - IO pin tested on port: peripheral=(0) IO=(D8) ...succeeded
[1574155269.10][CONN][RXD] D9 - IO pin tested on port: peripheral=(0) IO=(D9) ...succeeded
[1574155269.17][CONN][RXD] D10 - IO pin tested on port: peripheral=(0) IO=(D10) ...succeeded
[1574155269.24][CONN][RXD] A0 - IO pin tested on port: peripheral=(0) IO=(A0) ...succeeded
[1574155269.31][CONN][RXD] A1 - IO pin tested on port: peripheral=(0) IO=(A1) ...succeeded
[1574155269.38][CONN][RXD] A2 - IO pin tested on port: peripheral=(0) IO=(A2) ...succeeded
[1574155269.44][CONN][RXD] A3 - IO pin tested on port: peripheral=(0) IO=(A3) ...succeeded
[1574155269.51][CONN][RXD] A4 - IO pin tested on port: peripheral=(0) IO=(A4) ...succeeded
[1574155269.57][CONN][RXD] A5 - IO pin tested on port: peripheral=(0) IO=(A5) ...succeeded
[1574155269.64][CONN][INF] found KV pair in stream: {{__testcase_finish;generic init, input & output;1;0}}, queued...
[1574155269.69][CONN][RXD] >>> 'generic init, input & output': 1 passed, 0 failed
[1574155269.69][CONN][RXD]
[1574155269.74][CONN][RXD] >>> Running case #2: 'explicit init, input'...
[1574155269.79][CONN][INF] found KV pair in stream: {{__testcase_start;explicit init, input}}, queued...
[1574155269.82][CONN][RXD] Skipping IO pin D0 (327680)
[1574155269.85][CONN][RXD] Skipping IO pin D1 (327681)
[1574155269.88][CONN][RXD] Skipping IO pin D2 (327682)
[1574155269.90][CONN][RXD] Skipping IO pin D3 (327683)
[1574155269.93][CONN][RXD] Skipping IO pin D11 (786432)
[1574155269.97][CONN][RXD] Skipping IO pin D12 (786433)
[1574155270.00][CONN][RXD] Skipping IO pin D13 (786434)
[1574155270.03][CONN][RXD] Skipping IO pin D14 (393217)
[1574155270.06][CONN][RXD] Skipping IO pin D15 (393216)
[1574155270.11][CONN][RXD] Testing GPIO on all form factor ports
[1574155270.18][CONN][RXD] D4 - IO pin tested on port: peripheral=(0) IO=(D4) ...succeeded
[1574155270.24][CONN][RXD] D5 - IO pin tested on port: peripheral=(0) IO=(D5) ...succeeded
[1574155270.31][CONN][RXD] D6 - IO pin tested on port: peripheral=(0) IO=(D6) ...succeeded
[1574155270.37][CONN][RXD] D7 - IO pin tested on port: peripheral=(0) IO=(D7) ...succeeded
[1574155270.45][CONN][RXD] D8 - IO pin tested on port: peripheral=(0) IO=(D8) ...succeeded
[1574155270.51][CONN][RXD] D9 - IO pin tested on port: peripheral=(0) IO=(D9) ...succeeded
[1574155270.58][CONN][RXD] D10 - IO pin tested on port: peripheral=(0) IO=(D10) ...succeeded
[1574155270.65][CONN][RXD] A0 - IO pin tested on port: peripheral=(0) IO=(A0) ...succeeded
[1574155270.72][CONN][RXD] A1 - IO pin tested on port: peripheral=(0) IO=(A1) ...succeeded
[1574155270.78][CONN][RXD] A2 - IO pin tested on port: peripheral=(0) IO=(A2) ...succeeded
[1574155270.86][CONN][RXD] A3 - IO pin tested on port: peripheral=(0) IO=(A3) ...succeeded
[1574155270.92][CONN][RXD] A4 - IO pin tested on port: peripheral=(0) IO=(A4) ...succeeded
[1574155270.98][CONN][RXD] A5 - IO pin tested on port: peripheral=(0) IO=(A5) ...succeeded
[1574155271.04][CONN][INF] found KV pair in stream: {{__testcase_finish;explicit init, input;1;0}}, queued...
[1574155271.09][CONN][RXD] >>> 'explicit init, input': 1 passed, 0 failed
[1574155271.09][CONN][RXD]
[1574155271.14][CONN][RXD] >>> Running case #3: 'explicit init, output'...
[1574155271.18][CONN][INF] found KV pair in stream: {{__testcase_start;explicit init, output}}, queued...
[1574155271.22][CONN][RXD] Skipping IO pin D0 (327680)
[1574155271.25][CONN][RXD] Skipping IO pin D1 (327681)
[1574155271.27][CONN][RXD] Skipping IO pin D2 (327682)
[1574155271.30][CONN][RXD] Skipping IO pin D3 (327683)
[1574155271.33][CONN][RXD] Skipping IO pin D11 (786432)
[1574155271.36][CONN][RXD] Skipping IO pin D12 (786433)
[1574155271.39][CONN][RXD] Skipping IO pin D13 (786434)
[1574155271.43][CONN][RXD] Skipping IO pin D14 (393217)
[1574155271.46][CONN][RXD] Skipping IO pin D15 (393216)
[1574155271.51][CONN][RXD] Testing GPIO on all form factor ports
[1574155271.57][CONN][RXD] D4 - IO pin tested on port: peripheral=(0) IO=(D4) ...succeeded
[1574155271.65][CONN][RXD] D5 - IO pin tested on port: peripheral=(0) IO=(D5) ...succeeded
[1574155271.71][CONN][RXD] D6 - IO pin tested on port: peripheral=(0) IO=(D6) ...succeeded
[1574155271.77][CONN][RXD] D7 - IO pin tested on port: peripheral=(0) IO=(D7) ...succeeded
[1574155271.85][CONN][RXD] D8 - IO pin tested on port: peripheral=(0) IO=(D8) ...succeeded
[1574155271.91][CONN][RXD] D9 - IO pin tested on port: peripheral=(0) IO=(D9) ...succeeded
[1574155271.98][CONN][RXD] D10 - IO pin tested on port: peripheral=(0) IO=(D10) ...succeeded
[1574155272.04][CONN][RXD] A0 - IO pin tested on port: peripheral=(0) IO=(A0) ...succeeded
[1574155272.12][CONN][RXD] A1 - IO pin tested on port: peripheral=(0) IO=(A1) ...succeeded
[1574155272.18][CONN][RXD] A2 - IO pin tested on port: peripheral=(0) IO=(A2) ...succeeded
[1574155272.25][CONN][RXD] A3 - IO pin tested on port: peripheral=(0) IO=(A3) ...succeeded
[1574155272.32][CONN][RXD] A4 - IO pin tested on port: peripheral=(0) IO=(A4) ...succeeded
[1574155272.38][CONN][RXD] A5 - IO pin tested on port: peripheral=(0) IO=(A5) ...succeeded
[1574155272.44][CONN][INF] found KV pair in stream: {{__testcase_finish;explicit init, output;1;0}}, queued...
[1574155272.49][CONN][RXD] >>> 'explicit init, output': 1 passed, 0 failed
[1574155272.49][CONN][RXD]
[1574155272.52][CONN][RXD] >>> Test cases: 3 passed, 0 failed

All 39 comments

@0xc0170

@yarbcy What is not valid in the code snippet above?

cc @mprse

@yarbcy What is not valid in the code snippet above?

cc @mprse

PSoC6 set 0, tester(FPGA) set 0. But expect 1

Isn't it that you write 0 (fpga side), but because of pull up you expect 1 on the actual pin?

This comment explains it : // hi-Z, pulled up

Isn't it that you write 0 (fpga side), but because of pull up you expect 1 on the actual pin?

This comment explains it : // hi-Z, pulled up

Yes. But PSoC6 also set initial state 0.

@0xc0170 @mprse
All the rest GPIO test are passed. Except this one.

gpio api supports value even for input, it writes to gpio as it claims "for future use if you switch to output". Although as soon as you change the direction, you write a new value so I dont understand the use case for that condition there).
My expectation, once you set pin to input, it goes into Hi-Z state (no matter what you write as a value, it shall be ignored. As soon as you change the direction, the value is preserved and output equals to the value we wrote earlier), and that is what the test also expects. How does it work for failing target? What happens if you set direction to input to the pin itself?

I cant find it in the history why it was there, will need someone else to look at this closer.

From my point of view:

  1. PSoC6 set PullUp drive mode (Input)
  2. Set gpio_write(0) (I see it on logical analyzer)
  3. Set tester (FPGA) 0
  4. gpio_read() return 0. But expect 1.

Test scenario:

  1. Set Mbed GPIO to pulled-up input. Provided value, in this case, is irrelevant.
  2. Set the corresponding pin on the FPGA side to Hi-Z (something like no connection between GPIOs).
  3. Read the Mbed GPIO.
  4. Expect logic 1 since the pin is pulled up.

Maybe pull mode does not work on the cypress board?

@mprse Cypress support pull mode.

This case is passed if replace gpio_init_inout() -> gpio_init_in_ex()

Could you please help me understand why?

void gpio_init_inout(gpio_t *gpio, PinName pin, PinDirection direction, PinMode mode, int value)
{
    if (direction == PIN_INPUT) {
        _gpio_init_in(gpio, pin, mode);
        if (pin != NC) {
            gpio_write(gpio, value);    // we prepare the value in case it is switched later
        }
    } else {
        _gpio_init_out(gpio, pin, mode, value);
    }
}
void gpio_init_in_ex(gpio_t *gpio, PinName pin, PinMode mode)
{
    _gpio_init_in(gpio, pin, mode);
}

gpio_init_inout() calls _gpio_init_in() and gpio_write().
gpio_init_in_ex() calls only _gpio_init_in().

This call to gpio_write() is suspicious. Probably this is done to set the value for the future if the port direction is changed (according to https://github.com/ARMmbed/mbed-os/issues/11835#issuecomment-551062580).
Maybe the gpio_write() changes the port direction?

Maybe the gpio_write() changes the port direction?

Looks like no.

But why we have initial state for input pin it should be done for output pin. Right?

That is what I dont understand. 馃槥

anyway, what happens on the pin if you set it to output (it should be floating, no value set?). Is this documented in the reference manual for that MCU ? What is expected behavior for input pin?

In case the pin has different behavior than we expect (@mprse I havent found the behavior defined in the gpio_api header file for this inout function), you can always check in HAL (if pin is output, and something asks to write to the pin, ignore it and keep it floating).

Looking in apply_config, called from gpio_dir for PSOC6, I see

if (obj->drive_mode == PullUp) {
    gpio_write(obj, 1);
...

Suggesting that the gpio_write control is used to set the pull - presumably it's acting as a "weak drive".

That test (and the init_inout) seems to be assuming that the gpio_write has no effect until the direction is switched.

Seems like achieving that would need a more advanced gpio_write implementation - which is unfortunate as we normally like it to be a nice small inline register write.

static inline void gpio_write(gpio_t *obj, int value)
{
    if (obj->direction == CYHAL_GPIO_DIR_OUTPUT) {    <--- set only if output
        MBED_ASSERT(obj->pin != CYHAL_NC_PIN_VALUE);
        cyhal_gpio_write(obj->pin, value != 0);
    }
}

static inline void gpio_set_pull(gpio_t *obj, int value)  <--- new function for setting pull mode
{
    MBED_ASSERT(obj->pin != CYHAL_NC_PIN_VALUE);
    cyhal_gpio_write(obj->pin, value != 0);
}

void apply_config(gpio_t *obj)
{
    MBED_ASSERT(obj->pin != CYHAL_NC_PIN_VALUE);

    cy_rslt_t rslt;
    if (CY_RSLT_SUCCESS != (rslt = cyhal_gpio_configure(obj->pin, obj->direction, obj->drive_mode))) {
        MBED_ERROR(MBED_MAKE_ERROR(MBED_MODULE_DRIVER_GPIO, CY_RSLT_GET_CODE(rslt)), "cyhal_gpio_configure failed");
    }

    if (obj->drive_mode == PullUp) {
        gpio_set_pull(obj, 1);  <--- use new function for pull mode
    } else if (obj->drive_mode == PullDown) {
        gpio_set_pull(obj, 0);  <--- use new function for pull mode
    }
}

Maybe something like this?

I think so, but it seems that needs to be extended so that if you're told to write while an input, you should be remembering the written value (in obj, I guess) to write next time you switch to output.

(I guess that sort of thing is a valid use case, as you could leave the output set to 0 always, then flip between input and output to bitbang I2C, for example, where you only ever drive low)

@0xc0170 @mprse Do we have some updates?

@yarbcy Can you review the proposal above https://github.com/ARMmbed/mbed-os/issues/11835#issuecomment-551097567 ?

@0xc0170 Looks good. But I m not expert in mbed_hal.

@yarbcy Can you test this code?

@mprse Yes.

@mprse I tested and it failed communication with FPGA tester: "An MbedTester communication channel could not be created"

The communication with the FPGA-test-shield is established using bit-banged SPI communication - based on GPIOs (DigitalInOut). So dealing with GPIO driver may have influence on this.
Can you share your code changes?

I replaced cy_gpio_api.c line 32 apply_config():

void apply_config(gpio_t *obj)
{
MBED_ASSERT(obj->pin != CYHAL_NC_PIN_VALUE);

cy_rslt_t rslt;
if (CY_RSLT_SUCCESS != (rslt = cyhal_gpio_configure(obj->pin, obj->direction, obj->drive_mode))) {
    MBED_ERROR(MBED_MAKE_ERROR(MBED_MODULE_DRIVER_GPIO, CY_RSLT_GET_CODE(rslt)), "cyhal_gpio_configure failed");
}

if (obj->drive_mode == PullUp) {
    gpio_set_pull(obj, 1);  <--- use new function for pull mode
} else if (obj->drive_mode == PullDown) {
    gpio_set_pull(obj, 0);  <--- use new function for pull mode
}

}

Replaced gpio_object.h line 59 gpio_write():

static inline void gpio_write(gpio_t *obj, int value)
{
if (obj->direction == CYHAL_GPIO_DIR_OUTPUT) { <--- set only if output
MBED_ASSERT(obj->pin != CYHAL_NC_PIN_VALUE);
cyhal_gpio_write(obj->pin, value != 0);
}
}

Added new after gpio_write():

static inline void gpio_set_pull(gpio_t *obj, int value) <--- new function for setting pull mode
{
MBED_ASSERT(obj->pin != CYHAL_NC_PIN_VALUE);
cyhal_gpio_write(obj->pin, value != 0);
}

@mprse My proposal for code change is:

mbed-os/hal/mbed_gpio.c remove line 63-65 because initial value doesn't make sense when pin direction is in input direction.

mbed-os/hal/mbed_gpio.c remove line 63-65 because initial value doesn't make sense when pin direction is in input direction.

As I noted in my example above, there is a use-case for this. Set the output to low, and flip between input and output to manually bit-bang an I2C open-drain output.

That would be efficient on a chip with "OUT" and "DIR" registers where OUT was ignored when DIR was set to input.

I don't know whether any Mbed application in the word is currently doing this, but it does currently work, those lines 63-65 seem to be intended for that, and that test makes sure it works.

Annoyingly, the commit that added lines 63-65 (be8bca4aa06bf63042ac92b79092b67d319c4be2) only has the commit message "proposed change of gpio_api", so it's not 100% clear what they were intending. But it was deliberate.

@kjbracey-arm I don't understand next steps. If you don't agree (line 63-65). Please propose your approach.

My suggestion is roughly as @mprse suggested above, but with the addition as I stated:

if you're told to write while an input, you should be remembering the written value (in obj, I guess) to write next time you switch to output.

@mprse @0xc0170 Could you please take a look?

@yarbcy @mprse will update the suggestion above with written value storing, it will be good to take this to PR to propose a change. It should fix the failures you have been seeing

Annoyingly, the commit that added lines 63-65 (be8bca4) only has the commit message "proposed change of gpio_api", so it's not 100% clear what they were intending. But it was deliberate.

馃憤 , the comment in the PR itself states something similar about the intention https://github.com/ARMmbed/mbed-os/pull/198#commitcomment-5619242 . Sadly, this is not included in the commit itself

@mprse I don't have clear understanding what needs to be done. Can you do these changes?

I will create a fix proposition.

The fix can be found here: PR https://github.com/ARMmbed/mbed-os/pull/11867

@mprse I tested. All GPIO tests PASSED.

But please fix in file gpio_object.h line 66: change '==' to '='.

[1573807873.51][CONN][RXD] >>> Running case #1: 'generic init, input & output'...
[1573807873.56][CONN][INF] found KV pair in stream: {{__testcase_start;generic init, input & output}}, queued...
[1573807873.59][CONN][RXD] Skipping IO pin D0 (327680)
[1573807873.62][CONN][RXD] Skipping IO pin D1 (327681)
[1573807873.64][CONN][RXD] Skipping IO pin D2 (327682)
[1573807873.67][CONN][RXD] Skipping IO pin D3 (327683)
[1573807873.71][CONN][RXD] Skipping IO pin D11 (786432)
[1573807873.74][CONN][RXD] Skipping IO pin D12 (786433)
[1573807873.77][CONN][RXD] Skipping IO pin D13 (786434)
[1573807873.80][CONN][RXD] Skipping IO pin D14 (393217)
[1573807873.83][CONN][RXD] Skipping IO pin D15 (393216)
[1573807873.88][CONN][RXD] Testing GPIO on all form factor ports
[1573807873.95][CONN][RXD] D4 - IO pin tested on port: peripheral=(0) IO=(D4) ...succeeded
[1573807874.01][CONN][RXD] D5 - IO pin tested on port: peripheral=(0) IO=(D5) ...succeeded
[1573807874.09][CONN][RXD] D6 - IO pin tested on port: peripheral=(0) IO=(D6) ...succeeded
[1573807874.15][CONN][RXD] D7 - IO pin tested on port: peripheral=(0) IO=(D7) ...succeeded
[1573807874.21][CONN][RXD] D8 - IO pin tested on port: peripheral=(0) IO=(D8) ...succeeded
[1573807874.29][CONN][RXD] D9 - IO pin tested on port: peripheral=(0) IO=(D9) ...succeeded
[1573807874.35][CONN][RXD] D10 - IO pin tested on port: peripheral=(0) IO=(D10) ...succeeded
[1573807874.42][CONN][RXD] A0 - IO pin tested on port: peripheral=(0) IO=(A0) ...succeeded
[1573807874.49][CONN][RXD] A1 - IO pin tested on port: peripheral=(0) IO=(A1) ...succeeded
[1573807874.56][CONN][RXD] A2 - IO pin tested on port: peripheral=(0) IO=(A2) ...succeeded
[1573807874.62][CONN][RXD] A3 - IO pin tested on port: peripheral=(0) IO=(A3) ...succeeded
[1573807874.69][CONN][RXD] A4 - IO pin tested on port: peripheral=(0) IO=(A4) ...succeeded
[1573807874.76][CONN][RXD] A5 - IO pin tested on port: peripheral=(0) IO=(A5) ...succeeded
[1573807874.81][CONN][INF] found KV pair in stream: {{__testcase_finish;generic init, input & output;1;0}}, queued...
[1573807874.88][CONN][RXD] >>> 'generic init, input & output': 1 passed, 0 failed
[1573807874.88][CONN][RXD]
[1573807874.93][CONN][RXD] >>> Running case #2: 'explicit init, input'...
[1573807874.97][CONN][INF] found KV pair in stream: {{__testcase_start;explicit init, input}}, queued...
[1573807875.00][CONN][RXD] Skipping IO pin D0 (327680)
[1573807875.02][CONN][RXD] Skipping IO pin D1 (327681)
[1573807875.05][CONN][RXD] Skipping IO pin D2 (327682)
[1573807875.09][CONN][RXD] Skipping IO pin D3 (327683)
[1573807875.12][CONN][RXD] Skipping IO pin D11 (786432)
[1573807875.15][CONN][RXD] Skipping IO pin D12 (786433)
[1573807875.18][CONN][RXD] Skipping IO pin D13 (786434)
[1573807875.21][CONN][RXD] Skipping IO pin D14 (393217)
[1573807875.24][CONN][RXD] Skipping IO pin D15 (393216)
[1573807875.29][CONN][RXD] Testing GPIO on all form factor ports
[1573807875.36][CONN][RXD] D4 - IO pin tested on port: peripheral=(0) IO=(D4) ...succeeded
[1573807875.42][CONN][RXD] D5 - IO pin tested on port: peripheral=(0) IO=(D5) ...succeeded
[1573807875.50][CONN][RXD] D6 - IO pin tested on port: peripheral=(0) IO=(D6) ...succeeded
[1573807875.56][CONN][RXD] D7 - IO pin tested on port: peripheral=(0) IO=(D7) ...succeeded
[1573807875.62][CONN][RXD] D8 - IO pin tested on port: peripheral=(0) IO=(D8) ...succeeded
[1573807875.70][CONN][RXD] D9 - IO pin tested on port: peripheral=(0) IO=(D9) ...succeeded
[1573807875.76][CONN][RXD] D10 - IO pin tested on port: peripheral=(0) IO=(D10) ...succeeded
[1573807875.83][CONN][RXD] A0 - IO pin tested on port: peripheral=(0) IO=(A0) ...succeeded
[1573807875.90][CONN][RXD] A1 - IO pin tested on port: peripheral=(0) IO=(A1) ...succeeded
[1573807875.97][CONN][RXD] A2 - IO pin tested on port: peripheral=(0) IO=(A2) ...succeeded
[1573807876.03][CONN][RXD] A3 - IO pin tested on port: peripheral=(0) IO=(A3) ...succeeded
[1573807876.10][CONN][RXD] A4 - IO pin tested on port: peripheral=(0) IO=(A4) ...succeeded
[1573807876.17][CONN][RXD] A5 - IO pin tested on port: peripheral=(0) IO=(A5) ...succeeded
[1573807876.22][CONN][INF] found KV pair in stream: {{__testcase_finish;explicit init, input;1;0}}, queued...
[1573807876.26][CONN][RXD] >>> 'explicit init, input': 1 passed, 0 failed
[1573807876.26][CONN][RXD]
[1573807876.32][CONN][RXD] >>> Running case #3: 'explicit init, output'...
[1573807876.37][CONN][INF] found KV pair in stream: {{__testcase_start;explicit init, output}}, queued...
[1573807876.39][CONN][RXD] Skipping IO pin D0 (327680)
[1573807876.42][CONN][RXD] Skipping IO pin D1 (327681)
[1573807876.45][CONN][RXD] Skipping IO pin D2 (327682)
[1573807876.48][CONN][RXD] Skipping IO pin D3 (327683)
[1573807876.51][CONN][RXD] Skipping IO pin D11 (786432)
[1573807876.55][CONN][RXD] Skipping IO pin D12 (786433)
[1573807876.58][CONN][RXD] Skipping IO pin D13 (786434)
[1573807876.61][CONN][RXD] Skipping IO pin D14 (393217)
[1573807876.64][CONN][RXD] Skipping IO pin D15 (393216)
[1573807876.69][CONN][RXD] Testing GPIO on all form factor ports
[1573807876.75][CONN][RXD] D4 - IO pin tested on port: peripheral=(0) IO=(D4) ...succeeded
[1573807876.82][CONN][RXD] D5 - IO pin tested on port: peripheral=(0) IO=(D5) ...succeeded
[1573807876.89][CONN][RXD] D6 - IO pin tested on port: peripheral=(0) IO=(D6) ...succeeded
[1573807876.95][CONN][RXD] D7 - IO pin tested on port: peripheral=(0) IO=(D7) ...succeeded
[1573807877.02][CONN][RXD] D8 - IO pin tested on port: peripheral=(0) IO=(D8) ...succeeded
[1573807877.09][CONN][RXD] D9 - IO pin tested on port: peripheral=(0) IO=(D9) ...succeeded
[1573807877.15][CONN][RXD] D10 - IO pin tested on port: peripheral=(0) IO=(D10) ...succeeded
[1573807877.23][CONN][RXD] A0 - IO pin tested on port: peripheral=(0) IO=(A0) ...succeeded
[1573807877.29][CONN][RXD] A1 - IO pin tested on port: peripheral=(0) IO=(A1) ...succeeded
[1573807877.36][CONN][RXD] A2 - IO pin tested on port: peripheral=(0) IO=(A2) ...succeeded
[1573807877.43][CONN][RXD] A3 - IO pin tested on port: peripheral=(0) IO=(A3) ...succeeded
[1573807877.49][CONN][RXD] A4 - IO pin tested on port: peripheral=(0) IO=(A4) ...succeeded
[1573807877.57][CONN][RXD] A5 - IO pin tested on port: peripheral=(0) IO=(A5) ...succeeded
[1573807877.61][CONN][INF] found KV pair in stream: {{__testcase_finish;explicit init, output;1;0}}, queued...
[1573807877.66][CONN][RXD] >>> 'explicit init, output': 1 passed, 0 failed
[1573807877.66][CONN][RXD]
[1573807877.70][CONN][RXD] >>> Test cases: 3 passed, 0 failed

Great news! 馃帀

But please fix in file gpio_object.h line 66: change '==' to '='.

Fixed! Thanks for catching this.

BTW. Probably the previous implementation faulty because the direction check was invalid:

static inline void gpio_write(gpio_t *obj, int value)
{
    if (obj->direction == CYHAL_GPIO_DIR_OUTPUT) {    <--- issue: when output direction is set to CYHAL_GPIO_DIR_BIDIRECTIONAL
        MBED_ASSERT(obj->pin != CYHAL_NC_PIN_VALUE);
        cyhal_gpio_write(obj->pin, value != 0);
    }
}

All GPIO tests are PASSED.

[1574155268.32][CONN][RXD] >>> Running case #1: 'generic init, input & output'...
[1574155268.38][CONN][INF] found KV pair in stream: {{__testcase_start;generic init, input & output}}, queued...
[1574155268.41][CONN][RXD] Skipping IO pin D0 (327680)
[1574155268.44][CONN][RXD] Skipping IO pin D1 (327681)
[1574155268.46][CONN][RXD] Skipping IO pin D2 (327682)
[1574155268.50][CONN][RXD] Skipping IO pin D3 (327683)
[1574155268.53][CONN][RXD] Skipping IO pin D11 (786432)
[1574155268.56][CONN][RXD] Skipping IO pin D12 (786433)
[1574155268.59][CONN][RXD] Skipping IO pin D13 (786434)
[1574155268.62][CONN][RXD] Skipping IO pin D14 (393217)
[1574155268.66][CONN][RXD] Skipping IO pin D15 (393216)
[1574155268.70][CONN][RXD] Testing GPIO on all form factor ports
[1574155268.76][CONN][RXD] D4 - IO pin tested on port: peripheral=(0) IO=(D4) ...succeeded
[1574155268.84][CONN][RXD] D5 - IO pin tested on port: peripheral=(0) IO=(D5) ...succeeded
[1574155268.90][CONN][RXD] D6 - IO pin tested on port: peripheral=(0) IO=(D6) ...succeeded
[1574155268.96][CONN][RXD] D7 - IO pin tested on port: peripheral=(0) IO=(D7) ...succeeded
[1574155269.04][CONN][RXD] D8 - IO pin tested on port: peripheral=(0) IO=(D8) ...succeeded
[1574155269.10][CONN][RXD] D9 - IO pin tested on port: peripheral=(0) IO=(D9) ...succeeded
[1574155269.17][CONN][RXD] D10 - IO pin tested on port: peripheral=(0) IO=(D10) ...succeeded
[1574155269.24][CONN][RXD] A0 - IO pin tested on port: peripheral=(0) IO=(A0) ...succeeded
[1574155269.31][CONN][RXD] A1 - IO pin tested on port: peripheral=(0) IO=(A1) ...succeeded
[1574155269.38][CONN][RXD] A2 - IO pin tested on port: peripheral=(0) IO=(A2) ...succeeded
[1574155269.44][CONN][RXD] A3 - IO pin tested on port: peripheral=(0) IO=(A3) ...succeeded
[1574155269.51][CONN][RXD] A4 - IO pin tested on port: peripheral=(0) IO=(A4) ...succeeded
[1574155269.57][CONN][RXD] A5 - IO pin tested on port: peripheral=(0) IO=(A5) ...succeeded
[1574155269.64][CONN][INF] found KV pair in stream: {{__testcase_finish;generic init, input & output;1;0}}, queued...
[1574155269.69][CONN][RXD] >>> 'generic init, input & output': 1 passed, 0 failed
[1574155269.69][CONN][RXD]
[1574155269.74][CONN][RXD] >>> Running case #2: 'explicit init, input'...
[1574155269.79][CONN][INF] found KV pair in stream: {{__testcase_start;explicit init, input}}, queued...
[1574155269.82][CONN][RXD] Skipping IO pin D0 (327680)
[1574155269.85][CONN][RXD] Skipping IO pin D1 (327681)
[1574155269.88][CONN][RXD] Skipping IO pin D2 (327682)
[1574155269.90][CONN][RXD] Skipping IO pin D3 (327683)
[1574155269.93][CONN][RXD] Skipping IO pin D11 (786432)
[1574155269.97][CONN][RXD] Skipping IO pin D12 (786433)
[1574155270.00][CONN][RXD] Skipping IO pin D13 (786434)
[1574155270.03][CONN][RXD] Skipping IO pin D14 (393217)
[1574155270.06][CONN][RXD] Skipping IO pin D15 (393216)
[1574155270.11][CONN][RXD] Testing GPIO on all form factor ports
[1574155270.18][CONN][RXD] D4 - IO pin tested on port: peripheral=(0) IO=(D4) ...succeeded
[1574155270.24][CONN][RXD] D5 - IO pin tested on port: peripheral=(0) IO=(D5) ...succeeded
[1574155270.31][CONN][RXD] D6 - IO pin tested on port: peripheral=(0) IO=(D6) ...succeeded
[1574155270.37][CONN][RXD] D7 - IO pin tested on port: peripheral=(0) IO=(D7) ...succeeded
[1574155270.45][CONN][RXD] D8 - IO pin tested on port: peripheral=(0) IO=(D8) ...succeeded
[1574155270.51][CONN][RXD] D9 - IO pin tested on port: peripheral=(0) IO=(D9) ...succeeded
[1574155270.58][CONN][RXD] D10 - IO pin tested on port: peripheral=(0) IO=(D10) ...succeeded
[1574155270.65][CONN][RXD] A0 - IO pin tested on port: peripheral=(0) IO=(A0) ...succeeded
[1574155270.72][CONN][RXD] A1 - IO pin tested on port: peripheral=(0) IO=(A1) ...succeeded
[1574155270.78][CONN][RXD] A2 - IO pin tested on port: peripheral=(0) IO=(A2) ...succeeded
[1574155270.86][CONN][RXD] A3 - IO pin tested on port: peripheral=(0) IO=(A3) ...succeeded
[1574155270.92][CONN][RXD] A4 - IO pin tested on port: peripheral=(0) IO=(A4) ...succeeded
[1574155270.98][CONN][RXD] A5 - IO pin tested on port: peripheral=(0) IO=(A5) ...succeeded
[1574155271.04][CONN][INF] found KV pair in stream: {{__testcase_finish;explicit init, input;1;0}}, queued...
[1574155271.09][CONN][RXD] >>> 'explicit init, input': 1 passed, 0 failed
[1574155271.09][CONN][RXD]
[1574155271.14][CONN][RXD] >>> Running case #3: 'explicit init, output'...
[1574155271.18][CONN][INF] found KV pair in stream: {{__testcase_start;explicit init, output}}, queued...
[1574155271.22][CONN][RXD] Skipping IO pin D0 (327680)
[1574155271.25][CONN][RXD] Skipping IO pin D1 (327681)
[1574155271.27][CONN][RXD] Skipping IO pin D2 (327682)
[1574155271.30][CONN][RXD] Skipping IO pin D3 (327683)
[1574155271.33][CONN][RXD] Skipping IO pin D11 (786432)
[1574155271.36][CONN][RXD] Skipping IO pin D12 (786433)
[1574155271.39][CONN][RXD] Skipping IO pin D13 (786434)
[1574155271.43][CONN][RXD] Skipping IO pin D14 (393217)
[1574155271.46][CONN][RXD] Skipping IO pin D15 (393216)
[1574155271.51][CONN][RXD] Testing GPIO on all form factor ports
[1574155271.57][CONN][RXD] D4 - IO pin tested on port: peripheral=(0) IO=(D4) ...succeeded
[1574155271.65][CONN][RXD] D5 - IO pin tested on port: peripheral=(0) IO=(D5) ...succeeded
[1574155271.71][CONN][RXD] D6 - IO pin tested on port: peripheral=(0) IO=(D6) ...succeeded
[1574155271.77][CONN][RXD] D7 - IO pin tested on port: peripheral=(0) IO=(D7) ...succeeded
[1574155271.85][CONN][RXD] D8 - IO pin tested on port: peripheral=(0) IO=(D8) ...succeeded
[1574155271.91][CONN][RXD] D9 - IO pin tested on port: peripheral=(0) IO=(D9) ...succeeded
[1574155271.98][CONN][RXD] D10 - IO pin tested on port: peripheral=(0) IO=(D10) ...succeeded
[1574155272.04][CONN][RXD] A0 - IO pin tested on port: peripheral=(0) IO=(A0) ...succeeded
[1574155272.12][CONN][RXD] A1 - IO pin tested on port: peripheral=(0) IO=(A1) ...succeeded
[1574155272.18][CONN][RXD] A2 - IO pin tested on port: peripheral=(0) IO=(A2) ...succeeded
[1574155272.25][CONN][RXD] A3 - IO pin tested on port: peripheral=(0) IO=(A3) ...succeeded
[1574155272.32][CONN][RXD] A4 - IO pin tested on port: peripheral=(0) IO=(A4) ...succeeded
[1574155272.38][CONN][RXD] A5 - IO pin tested on port: peripheral=(0) IO=(A5) ...succeeded
[1574155272.44][CONN][INF] found KV pair in stream: {{__testcase_finish;explicit init, output;1;0}}, queued...
[1574155272.49][CONN][RXD] >>> 'explicit init, output': 1 passed, 0 failed
[1574155272.49][CONN][RXD]
[1574155272.52][CONN][RXD] >>> Test cases: 3 passed, 0 failed

Was this page helpful?
0 / 5 - 0 ratings