This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

AM5728: GPIO65 (GPIO3_1) Fan Works in U-Boot But Not in Kernel - AM5728 + SDK 9.03

Part Number: AM5728

Tool/software:

Hi TI team,

We are working with a custom AM5728-based board (derived from Beagle-X15) using TI Linux SDK 9.03.06.05 (kernel 6.1.x) and U-Boot 2023.04. A fan is connected to GPIO3_1 (GPIO number 65), and it is functional at U-Boot but not working under the Linux kernel. Below are all the relevant details and diagnostics.

Platform Info

  • SoC: AM5728

  • Board: Custom based on Beagle-X15

  • TI SDK Version: 09.03.06.05

  • U-Boot Version: 2023.04 (from TI SDK 9.03)

  • Kernel Version: 6.1.46 (from TI SDK 9.03)

  • U-Boot Environment: Fan works when manually setting GPIO 65

  • Linux Environment: Fan does not run even when GPIO 65 is exported and set to 1

Pinmux Information:  mux_data.h at uboot

#ifndef _MUX_DATA_BEAGLE_X15_H_
#define _MUX_DATA_BEAGLE_X15_H_

#include <asm/arch/mux_dra7xx.h>

const struct pad_conf_entry core_padconf_array_essential_x15[] = {


{VIN1A_DE0, (M14 | PIN_INPUT)}, /* AD9 vin1a_de0.gpio3_0 */
{VIN1A_FLD0, (M14 | PIN_OUTPUT)}, /* AF9 vin1a_fld0.gpio3_1 */
{VIN1A_D3, (M14 | PIN_INPUT)}, /* AH6 vin1a_d3.gpio3_7 */
{VIN1A_D4, (M14 | PIN_OUTPUT)}, /* AH3 vin1a_d4.gpio3_8 */
{VIN1A_D5, (M14 | PIN_INPUT)}, /* AH5 vin1a_d5.gpio3_9 */
{VIN1A_D6, (M14 | PIN_OUTPUT)}, /* AG6 vin1a_d6.gpio3_10 */
{VIN2A_D2, (M14 | PIN_INPUT)}, /* D1 vin2a_d2.gpio4_3 */
{VIN2A_D4, (M14 | PIN_INPUT)}, /* D2 vin2a_d4.gpio4_5 */
{VIN2A_D6, (M14 | PIN_OUTPUT)}, /* C1 vin2a_d6.gpio4_7 */
{VIN2A_D8, (M14 | PIN_INPUT)}, /* F5 vin2a_d8.gpio4_9 */
}

const struct pad_conf_entry core_padconf_array_delta_x15_sr2_0[] = {

{VOUT1_CLK, (M0 | PIN_OUTPUT | SLEWCONTROL | MANUAL_MODE)}, /* D11 vout1_clk.vout1_clk */
{VOUT1_DE, (M0 | PIN_OUTPUT | SLEWCONTROL | MANUAL_MODE)}, /* B10 vout1_de.vout1_de */
{VOUT1_HSYNC, (M0 | PIN_OUTPUT | SLEWCONTROL | MANUAL_MODE)}, /* C11 vout1_hsync.vout1_hsync */
{VOUT1_VSYNC, (M0 | PIN_OUTPUT | SLEWCONTROL | MANUAL_MODE)}, /* E11 vout1_vsync.vout1_vsync */
{VOUT1_D0, (M0 | PIN_OUTPUT | SLEWCONTROL | MANUAL_MODE)}, /* F11 vout1_d0.vout1_d0 */
{VOUT1_D1, (M0 | PIN_OUTPUT | SLEWCONTROL | MANUAL_MODE)}, /* G10 vout1_d1.vout1_d1 */
{VOUT1_D2, (M0 | PIN_OUTPUT | SLEWCONTROL | MANUAL_MODE)}, /* F10 vout1_d2.vout1_d2 */
{VOUT1_D3, (M0 | PIN_OUTPUT | SLEWCONTROL | MANUAL_MODE)}, /* G11 vout1_d3.vout1_d3 */
{VOUT1_D4, (M0 | PIN_OUTPUT | SLEWCONTROL | MANUAL_MODE)}, /* E9 vout1_d4.vout1_d4 */
{VOUT1_D5, (M0 | PIN_OUTPUT | SLEWCONTROL | MANUAL_MODE)}, /* F9 vout1_d5.vout1_d5 */
{VOUT1_D6, (M0 | PIN_OUTPUT | SLEWCONTROL | MANUAL_MODE)}, /* F8 vout1_d6.vout1_d6 */
{VOUT1_D7, (M0 | PIN_OUTPUT | SLEWCONTROL | MANUAL_MODE)}, /* E7 vout1_d7.vout1_d7 */
{VOUT1_D8, (M0 | PIN_OUTPUT | SLEWCONTROL | MANUAL_MODE)}, /* E8 vout1_d8.vout1_d8 */
{VOUT1_D9, (M0 | PIN_OUTPUT | SLEWCONTROL | MANUAL_MODE)}, /* D9 vout1_d9.vout1_d9 */
{VOUT1_D10, (M0 | PIN_OUTPUT | SLEWCONTROL | MANUAL_MODE)}, /* D7 vout1_d10.vout1_d10 */
{VOUT1_D11, (M0 | PIN_OUTPUT | SLEWCONTROL | MANUAL_MODE)}, /* D8 vout1_d11.vout1_d11 */
{VOUT1_D12, (M0 | PIN_OUTPUT | SLEWCONTROL | MANUAL_MODE)}, /* A5 vout1_d12.vout1_d12 */
{VOUT1_D13, (M0 | PIN_OUTPUT | SLEWCONTROL | MANUAL_MODE)}, /* C6 vout1_d13.vout1_d13 */
{VOUT1_D14, (M0 | PIN_OUTPUT | SLEWCONTROL | MANUAL_MODE)}, /* C8 vout1_d14.vout1_d14 */
{VOUT1_D15, (M0 | PIN_OUTPUT | SLEWCONTROL | MANUAL_MODE)}, /* C7 vout1_d15.vout1_d15 */
{VOUT1_D16, (M0 | PIN_OUTPUT | SLEWCONTROL | MANUAL_MODE)}, /* B7 vout1_d16.vout1_d16 */
{VOUT1_D17, (M0 | PIN_OUTPUT | SLEWCONTROL | MANUAL_MODE)}, /* B8 vout1_d17.vout1_d17 */
{VOUT1_D18, (M0 | PIN_OUTPUT | SLEWCONTROL | MANUAL_MODE)}, /* A7 vout1_d18.vout1_d18 */
{VOUT1_D19, (M0 | PIN_OUTPUT | SLEWCONTROL | MANUAL_MODE)}, /* A8 vout1_d19.vout1_d19 */
{VOUT1_D20, (M0 | PIN_OUTPUT | SLEWCONTROL | MANUAL_MODE)}, /* C9 vout1_d20.vout1_d20 */
{VOUT1_D21, (M0 | PIN_OUTPUT | SLEWCONTROL | MANUAL_MODE)}, /* A9 vout1_d21.vout1_d21 */
{VOUT1_D22, (M0 | PIN_OUTPUT | SLEWCONTROL | MANUAL_MODE)}, /* B9 vout1_d22.vout1_d22 */
{VOUT1_D23, (M0 | PIN_OUTPUT | SLEWCONTROL | MANUAL_MODE)}, /* A10 vout1_d23.vout1_d23 */

};

What Works in U-Boot:

  • Pinmux is correctly set for vin1a_fld0.gpio3_1 at boot.

  • U-Boot command used

    => gpio set 65
    gpio: pin 65 (gpio 65) value is 1

  • The fan starts running immediately when the GPIO is set.

    What Fails After full boot
  • I manually export and set GPIO65:in Kernel:
    echo 65 > /sys/class/gpio/export
    echo out > /sys/class/gpio/gpio65/direction
    echo 1 > /sys/class/gpio/gpio65/value


  • Value is set to 1 correctly:

    cat /sys/class/gpio/gpio65/value
    1
    But fan is NOT running.

    Again added pinmux at kernel DST
    dra74x-mmc-iodelay.dtsi file added

     fan_ctrl_pins: pinmux_fan_ctrl_pins {
     pinctrl-single,pins = <
     DRA7XX_CORE_IOPAD(0x1404, PIN_OUTPUT | MUX_MODE7) // GPIO3_1
     >;
    };

    am57xx-beagle-x15-common.dtsi file added
    &gpio3 {
     pinctrl-names = "default";
     pinctrl-0 = <&fan_gpio_pins>;
    };

    But this time also fan is not toggle with gpio65


    Debug :
    root@am57xx-evm:~# gpiodetect
    gpiochip0 [gpio-0-31] (32 lines)
    gpiochip1 [gpio-32-63] (32 lines)
    gpiochip2 [gpio-64-95] (32 lines)
    gpiochip3 [gpio-96-127] (32 lines)
    gpiochip4 [gpio-128-159] (32 lines)
    gpiochip5 [gpio-160-191] (32 lines)
    gpiochip6 [gpio-192-223] (32 lines)
    gpiochip7 [gpio-224-255] (32 lines)
    gpiochip8 [48070000.i2c:tps659038@58:tps65] (8 lines)
    root@am57xx-evm:~# cat /sys/kernel/debug/pinctrl/*/pinmux-pins | grep 65
    pin 65 (PIN65): (MUX UNCLAIMED) (GPIO UNCLAIMED)
    pin 165 (PIN165): (MUX UNCLAIMED) (GPIO UNCLAIMED)
    pin 265 (PIN265): (MUX UNCLAIMED) (GPIO UNCLAIMED)
    root@am57xx-evm:~# gpioset gpiochip3 1=1