P1010 GPIO_0 setup and use

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

P1010 GPIO_0 setup and use

Jump to solution
1,743 Views
yensid
Contributor III

Hi,

I hope this is an easy question and there is an easy answer.  I'm trying to use gpio0 on the P1010 as an output on our board which is designed after the P1010RDB. I'm trying to control gpio0 from a kernel module, and verify control with a scope on a testpoint.  I have been unable to change the value of the ouput, it is always high on our board, and low on the RDB.  The hardware engineer verfied the pull up, and I have tried with the open drain register set for active low and open drain.  In addtion to the code below, I have also tried to directly write the registers in U-boot and the output value does not change in that case either.

Is there an additional register/steps needed to enable gpio0? It appears to be enabled in the multiplex registers by default.

Thanks.

#define GPIO_BASE_ADDR 0x0FFE0F000

 

  typedef volatile struct

  {

  unsigned int GPIO_GPDIR;

  unsigned int GPIO_GPODR;

  unsigned int GPIO_GPDAT;

  unsigned int GPIO_GPIER;

  unsigned int GPIO_GPIMR;

  unsigned int GPIO_GPICR;

  } gpio_reg_t;

gpio_reg_t * pgpio_reg;

** Note code is taken from the driver init function **

{

  unsigned int temp;

  temp = 0;

  if (!request_mem_region(GPIO_BASE_ADDR, sizeof(gpio_reg_t), "GPIO Space"))

  {

  printk(KERN_WARNING"%s: Init: Could not request memory region.\n", gDrvrName);

  return (CRIT_ERR);

  }

 

  pgpio_reg = ioremap((unsigned long)GPIO_BASE_ADDR, sizeof(gpio_reg_t));

 

  if (!pgpio_reg)

  {

  printk(KERN_WARNING"%s: Init: Could not remap memory.\n", gDrvrName);

  return (CRIT_ERR);

  }

  /*GPIO GPDIR*/

  temp = ioread32be(&pgpio_reg->GPIO_GPDIR);

  printk("GPIO_GPDIR = 0x%08X\n", temp);

  temp = temp | 0x80000000;

  iowrite32be(temp, &pgpio_reg->GPIO_GPDIR);

  temp = ioread32be(&pgpio_reg->GPIO_GPDIR);

  printk("GPIO_GPDIR RESULT = 0x%08X\n", temp);

 

  /*GPIO GPODR*/

  temp = ioread32be(&pgpio_reg->GPIO_GPODR);

  printk("GPIO_GPODR = 0x%08X\n", temp);

  temp = temp | 0x80000000;

  iowrite32be(temp, &pgpio_reg->GPIO_GPODR);

  temp = ioread32be(&pgpio_reg->GPIO_GPODR);

  printk("GPIO_GPODR RESULT = 0x%08X\n", temp);

  /*GPIO GPIER*/

  temp = ioread32be(&pgpio_reg->GPIO_GPIER);

  printk("GPIO_GPIER = 0x%08X\n", temp);

  /* GPIO GPIMR */

  temp = ioread32be(&pgpio_reg->GPIO_GPIMR);

  printk("GPIO_GPIMR = 0x%08X\n", temp);

 

  /* GPIO GPICR */ 

  temp = ioread32be(&pgpio_reg->GPIO_GPICR);

  printk("GPIO_GPICR = 0x%08X\n", temp);

  /* As a test toggle gpio0*/

  while (1)

  {

    temp = 0x80000000;

    iowrite32be(temp, &pgpio_reg->GPIO_GPDAT);

    temp = ioread32(&pgpio_reg->GPIO_GPDAT);

    printk("HIGH GPIO_GPDAT 0x%08X\n", temp);

    msleep(250);

    temp = 0x00000000;

    iowrite32be(temp,  &pgpio_reg->GPIO_GPDAT);

    temp = ioread32( &pgpio_reg->GPIO_GPDAT);

    printk("LOW GPIO_GPDAT 0x%08X\n", temp);

   

    msleep(250);

  }

}

program Output

GPIO_GPDIR = 0x08000000

GPIO_GPDIR RESULT = 0x88000000

GPIO_GPODR = 0x00000000

GPIO_GPODR RESULT = 0x80000000

GPIO_GPIER = 0x00000000

GPIO_GPIMR = 0x00000000

GPIO_GPICR = 0x00000000

HIGH GPIO_GPDAT 0x00000030

LOW GPIO_GPDAT 0x00000030

HIGH GPIO_GPDAT 0x00000030

LOW GPIO_GPDAT 0x00000030

....

Tags (5)
0 Kudos
1 Solution
911 Views
yipingwang
NXP TechSupport
NXP TechSupport

Please try to use the attached Kernel configuration file which I have verified on P1010RDB target.

You could add GPIO initialization in PCIe driver, please refer to the existing GPIO driver drivers/gpio/gpio-mpc8xxx.c.


Have a great day,
Yiping Wang

-----------------------------------------------------------------------------------------------------------------------
Note: If this post answers your question, please click the Correct Answer button. Thank you!
-----------------------------------------------------------------------------------------------------------------------

View solution in original post

0 Kudos
7 Replies
912 Views
yipingwang
NXP TechSupport
NXP TechSupport

Please refer to the attached GPIO driver.

0 Kudos
912 Views
yensid
Contributor III

The best I can tell is that maybe the gpio module (gpio-mpc8xxx)is not being loaded. I don't see it listed when the system is booting up with its map to 0xffe0f000.  CONFIG_GPIO_MPC8XXX is enabled in the defconfig.

Any ideas on this?

Thanks

0 Kudos
912 Views
yensid
Contributor III

I forgot to post I'm using SDK v1.5.

If anyone has used GPIO on the P1010 please let me know how you got it working or has a simple example, it would be greatly appreciated.  I also tried to use the /sysfs/class/gpio however there was no option in menu config to turn it on and manually adding the options to the defconfig did not work.

Thanks!

0 Kudos
912 Views
yipingwang
NXP TechSupport
NXP TechSupport

In SDK 1.5, the MPC8xxx GPIO driver is located in drivers/gpio/gpio-mpc8xxx.c.

The following configuration should be configured

CONFIG_GENERIC_GPIO=y

CONFIG_GPIO_MPC8XXX=y

CONFIG_OF_GPIO=y

CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y

CONFIG_ARCH_REQUIRE_GPIOLIB=y

CONFIG_GPIOLIB=y

CONFIG_GPIO_SYSFS=Y

Also GPIO should be defined in dts file.

In SDK 1.5 default configuration, CONFIG_GPIO_SYSFS is not configured, you need to configure it and rebuild the Kernel.


Have a great day,
Yiping Wang

-----------------------------------------------------------------------------------------------------------------------
Note: If this post answers your question, please click the Correct Answer button. Thank you!
-----------------------------------------------------------------------------------------------------------------------

912 Views
yensid
Contributor III

Hi Yiping, Thanks for your reply.

I was missing "CONFIG_GENERIC_GPIO" in my configuration so I have added that and rebuilt the kernel.  I had previously looked through the dts file and found an existing entry for the gpio driver.  After doing this there is still no /sys/class/gpio node. I was hoping to use this to test gpio.  I also tried to access gpio through my driver but that did not work either. Do I need to link a specific GPIO line to my driver in the DTS file in order to access gpio from my driver?

My end use of gpio is the following: I have a driver (PCIe) that needs to set a gpio line based on a condition.  Can this be done by simply modifing registers as I have tried or do I need a full driver like the one you supplied.

Thanks again!

DTS entry concerning GPIO

gpio-controller@f000 {

  #gpio-cells = <2>;

  compatible = "fsl,pq3-gpio";

  reg = <0xf000 0x100>;

  interrupts = <47 0x2 0 0>;

  gpio-controller;

};

Kernel defconfig:

CONFIG_PPC_85xx=y

CONFIG_PHYS_64BIT=y

CONFIG_SYSVIPC=y

CONFIG_AUDIT=y

CONFIG_IRQ_DOMAIN_DEBUG=y

CONFIG_NO_HZ=y

CONFIG_HIGH_RES_TIMERS=y

CONFIG_BSD_PROCESS_ACCT=y

CONFIG_IKCONFIG=y

CONFIG_IKCONFIG_PROC=y

CONFIG_LOG_BUF_SHIFT=14

CONFIG_BLK_DEV_INITRD=y

CONFIG_EXPERT=y

CONFIG_KALLSYMS_ALL=y

CONFIG_MODULES=y

CONFIG_MODULE_UNLOAD=y

CONFIG_MODVERSIONS=y

# CONFIG_BLK_DEV_BSG is not set

CONFIG_PARTITION_ADVANCED=y

CONFIG_MAC_PARTITION=y

CONFIG_C293_PCIE=y

CONFIG_MPC8540_ADS=y

CONFIG_MPC8560_ADS=y

CONFIG_MPC85xx_CDS=y

CONFIG_MPC85xx_MDS=y

CONFIG_MPC8536_DS=y

CONFIG_MPC85xx_DS=y

CONFIG_MPC85xx_RDB=y

CONFIG_P1010_RDB=y

CONFIG_P1022_DS=y

CONFIG_P1022_RDK=y

CONFIG_P1023_RDS=y

CONFIG_SOCRATES=y

CONFIG_KSI8560=y

CONFIG_XES_MPC85xx=y

CONFIG_STX_GP3=y

CONFIG_TQM8540=y

CONFIG_TQM8541=y

CONFIG_TQM8548=y

CONFIG_TQM8555=y

CONFIG_TQM8560=y

CONFIG_SBC8548=y

CONFIG_PPC_QEMU_E500=y

CONFIG_KVM_GUEST=y

CONFIG_QUICC_ENGINE=y

CONFIG_QE_GPIO=y

CONFIG_HIGHMEM=y

CONFIG_BINFMT_MISC=m

CONFIG_MATH_EMULATION=y

CONFIG_FORCE_MAX_ZONEORDER=12

CONFIG_PCI=y

CONFIG_PCI_MSI=y

CONFIG_RAPIDIO=y

CONFIG_NET=y

CONFIG_PACKET=y

CONFIG_UNIX=y

CONFIG_XFRM_USER=y

CONFIG_NET_KEY=y

CONFIG_INET=y

CONFIG_IP_MULTICAST=y

CONFIG_IP_ADVANCED_ROUTER=y

CONFIG_IP_MULTIPLE_TABLES=y

CONFIG_IP_ROUTE_MULTIPATH=y

CONFIG_IP_ROUTE_VERBOSE=y

CONFIG_IP_PNP=y

CONFIG_IP_PNP_DHCP=y

CONFIG_IP_PNP_BOOTP=y

CONFIG_IP_PNP_RARP=y

CONFIG_NET_IPIP=y

CONFIG_IP_MROUTE=y

CONFIG_IP_PIMSM_V1=y

CONFIG_IP_PIMSM_V2=y

CONFIG_ARPD=y

CONFIG_INET_ESP=y

# CONFIG_INET_XFRM_MODE_BEET is not set

# CONFIG_INET_LRO is not set

CONFIG_IPV6=y

CONFIG_IP_SCTP=m

CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"

CONFIG_DEVTMPFS=y

CONFIG_DEVTMPFS_MOUNT=y

CONFIG_MTD=y

CONFIG_MTD_CMDLINE_PARTS=y

CONFIG_MTD_CHAR=y

CONFIG_MTD_BLOCK=y

CONFIG_FTL=y

CONFIG_MTD_CFI=y

CONFIG_MTD_CFI_INTELEXT=y

CONFIG_MTD_CFI_AMDSTD=y

CONFIG_MTD_PHYSMAP_OF=y

CONFIG_MTD_M25P80=y

CONFIG_MTD_NAND=y

CONFIG_MTD_NAND_FSL_ELBC=y

CONFIG_MTD_NAND_FSL_IFC=y

CONFIG_MTD_UBI=y

CONFIG_PROC_DEVICETREE=y

CONFIG_BLK_DEV_LOOP=y

CONFIG_BLK_DEV_NBD=y

CONFIG_BLK_DEV_RAM=y

CONFIG_BLK_DEV_RAM_SIZE=131072

CONFIG_IDE=y

CONFIG_BLK_DEV_VIA82CXXX=y

CONFIG_BLK_DEV_SD=y

CONFIG_CHR_DEV_ST=y

CONFIG_BLK_DEV_SR=y

CONFIG_CHR_DEV_SG=y

CONFIG_SCSI_MULTI_LUN=y

CONFIG_SCSI_LOGGING=y

CONFIG_ATA=y

CONFIG_SATA_AHCI=y

CONFIG_SATA_FSL=y

CONFIG_SATA_SIL24=y

CONFIG_PATA_ALI=y

CONFIG_PATA_VIA=y

CONFIG_NETDEVICES=y

CONFIG_DUMMY=y

CONFIG_FS_ENET=y

CONFIG_UCC_GETH=y

CONFIG_GIANFAR=y

CONFIG_E1000=y

CONFIG_E1000E=y

CONFIG_IGB=y

CONFIG_MARVELL_PHY=y

CONFIG_DAVICOM_PHY=y

CONFIG_CICADA_PHY=y

CONFIG_VITESSE_PHY=y

CONFIG_AT803X_PHY=y

CONFIG_FIXED_PHY=y

CONFIG_INPUT_FF_MEMLESS=m

# CONFIG_INPUT_MOUSEDEV is not set

# CONFIG_INPUT_KEYBOARD is not set

# CONFIG_INPUT_MOUSE is not set

CONFIG_SERIO_LIBPS2=y

CONFIG_SERIAL_8250=y

CONFIG_SERIAL_8250_CONSOLE=y

CONFIG_SERIAL_8250_NR_UARTS=2

CONFIG_SERIAL_8250_RUNTIME_UARTS=2

CONFIG_SERIAL_8250_MANY_PORTS=y

CONFIG_SERIAL_8250_DETECT_IRQ=y

CONFIG_SERIAL_8250_RSA=y

CONFIG_SERIAL_QE=m

CONFIG_NVRAM=y

CONFIG_SPI=y

CONFIG_SPI_FSL_SPI=y

CONFIG_SPI_FSL_ESPI=y

CONFIG_GENERIC_GPIO=y

CONFIG_GPIO_MPC8XXX=y

CONFIG_OF_GPIO=y

CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y

CONFIG_ARCH_REQUIRE_GPIOLIB=y

CONFIG_GPIOLIB=y

CONFIG_GPIO_SYSFS=Y

# CONFIG_HWMON is not set

CONFIG_VIDEO_OUTPUT_CONTROL=y

CONFIG_FB=y

CONFIG_FB_FSL_DIU=y

# CONFIG_VGA_CONSOLE is not set

CONFIG_FRAMEBUFFER_CONSOLE=y

CONFIG_FONTS=y

CONFIG_FONT_8x8=y

CONFIG_FONT_8x16=y

CONFIG_SOUND=y

CONFIG_SND=y

# CONFIG_SND_SUPPORT_OLD_API is not set

# CONFIG_SND_DRIVERS is not set

CONFIG_SND_INTEL8X0=y

# CONFIG_SND_PPC is not set

# CONFIG_SND_USB is not set

CONFIG_SND_SOC=y

CONFIG_SND_POWERPC_SOC=y

CONFIG_HID_A4TECH=y

CONFIG_HID_APPLE=y

CONFIG_HID_BELKIN=y

CONFIG_HID_CHERRY=y

CONFIG_HID_CHICONY=y

CONFIG_HID_CYPRESS=y

CONFIG_HID_EZKEY=y

CONFIG_HID_GYRATION=y

CONFIG_HID_LOGITECH=y

CONFIG_HID_MICROSOFT=y

CONFIG_HID_MONTEREY=y

CONFIG_HID_PANTHERLORD=y

CONFIG_HID_PETALYNX=y

CONFIG_HID_SAMSUNG=y

CONFIG_HID_SONY=y

CONFIG_HID_SUNPLUS=y

CONFIG_USB=y

CONFIG_USB_MON=y

CONFIG_USB_EHCI_HCD=y

CONFIG_USB_EHCI_FSL=y

CONFIG_USB_OHCI_HCD=y

CONFIG_USB_OHCI_HCD_PPC_OF_BE=y

CONFIG_USB_OHCI_HCD_PPC_OF_LE=y

CONFIG_USB_STORAGE=y

CONFIG_MMC=y

CONFIG_MMC_SDHCI=y

CONFIG_MMC_SDHCI_PLTFM=y

CONFIG_MMC_SDHCI_OF_ESDHC=y

CONFIG_EDAC=y

CONFIG_EDAC_MM_EDAC=y

CONFIG_RTC_CLASS=y

CONFIG_RTC_DRV_CMOS=y

CONFIG_DMADEVICES=y

CONFIG_FSL_DMA=y

# CONFIG_NET_DMA is not set

CONFIG_EXT2_FS=y

CONFIG_EXT3_FS=y

# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set

CONFIG_ISO9660_FS=m

CONFIG_JOLIET=y

CONFIG_ZISOFS=y

CONFIG_UDF_FS=m

CONFIG_MSDOS_FS=m

CONFIG_VFAT_FS=y

CONFIG_NTFS_FS=y

CONFIG_NLS_CODEPAGE_437=y

CONFIG_NLS_CODEPAGE_850=y

CONFIG_NLS_ISO8859_1=y

CONFIG_NLS_ASCII=y

CONFIG_PROC_KCORE=y

CONFIG_TMPFS=y

CONFIG_HUGETLBFS=y

CONFIG_HFSPLUS_FS=m

CONFIG_JFFS2_FS=y

CONFIG_JFFS2_FS_DEBUG=1

CONFIG_UBIFS_FS=y

CONFIG_CRAMFS=y

CONFIG_VXFS_FS=m

CONFIG_HPFS_FS=m

CONFIG_QNX4FS_FS=m

CONFIG_SYSV_FS=m

CONFIG_UFS_FS=m

CONFIG_NFS_FS=y

CONFIG_NFS_V4=y

CONFIG_ROOT_NFS=y

CONFIG_NFSD=y

CONFIG_CRC_T10DIF=y

CONFIG_DEBUG_FS=y

CONFIG_DETECT_HUNG_TASK=y

CONFIG_DEBUG_INFO=y

CONFIG_CRYPTO_PCBC=m

CONFIG_CRYPTO_SHA256=y

CONFIG_CRYPTO_SHA512=y

# CONFIG_CRYPTO_ANSI_CPRNG is not set

# CONFIG_CRYPTO_DEV_FSL_CAAM is not set

CONFIG_CRYPTO_DEV_TALITOS=y

0 Kudos
912 Views
yipingwang
NXP TechSupport
NXP TechSupport

Please try to use the attached Kernel configuration file which I have verified on P1010RDB target.

You could add GPIO initialization in PCIe driver, please refer to the existing GPIO driver drivers/gpio/gpio-mpc8xxx.c.


Have a great day,
Yiping Wang

-----------------------------------------------------------------------------------------------------------------------
Note: If this post answers your question, please click the Correct Answer button. Thank you!
-----------------------------------------------------------------------------------------------------------------------

0 Kudos
912 Views
yensid
Contributor III

Thanks Yiping!

That configuration created sys/class/gpio.

If it helps anyone else, before I tried the new configuration you provided I switched to GPIO5.  Following that I tried GPIO0 which was still not working. For whatever reason GPIO0 is set to an output DRVVBUS, even though on the schematic I have, it is listed as an input interrupt (IRQ4).  Changing PMUXCR2 fixed GPIO0.

It is all working now, Thanks again.

0 Kudos