打印
[应用方案]

在uboot中初始化nuc972的GPIO初始状态

[复制链接]
1854|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
renzheshengui|  楼主 | 2021-7-1 13:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
   当前的项目中,需要使用nuc972的GPIO去控制短波电台的PTT,而在实际的使用中发现,NUC972从上电到程序运行,GPIO的默认值一直是高电平,而我是用高电平控制短波电台发射,这就比较麻烦了,系统从上电到程序运行,少说也得好几秒的时间,而且在调试期间,是用的NFS挂在的方式,启动时间更长,在这么长的时间里,短波电台一直处于发射状态,怎么说也不太合适,而且我也不想修改硬件,所以只能从软件上找解决方法了,经过多方面的查找,决定在uboot里面修改GPIO的初始状态,具体步骤如下:

1.首先在uboot中找到和NUC972上电初始化相关的代码,具体的路径uboot不同的版本可能不一样,我的uboot路径在uboot/board/nuvoton/nuc970evb/nuc970.c中,先来大概看一下这个初始化代码:

#include <common.h>
#include <asm/io.h>
#include "../../../drivers/gpio/nuc970_gpio.h"

#define REG_SDIC_SIZE0  0xB0001810   
#define REG_SDIC_SIZE1  0xB0001814  
#define REG_HCLKEN      0xB0000210
#define REG_CLKDIVCTL8  0xB0000240
#define REG_PCLKEN0     0xB0000218
#define REG_WDT_CTL        0xB8001800
#define REG_MFP_GPA_L        0xB0000070
#define REG_MFP_GPA_H        0xB0000074
#define REG_MFP_GPC_L        0xB0000080
#define REG_MFP_GPD_L        0xB0000088
#define REG_MFP_GPE_L        0xB0000090
#define REG_MFP_GPE_H        0xB0000094
#define REG_MFP_GPF_L        0xB0000098
#define REG_MFP_GPF_H        0xB000009C
#define REG_MFP_GPH_L        0xB00000A8
#define REG_MFP_GPH_H        0xB00000AC
#define REG_MFP_GPI_L        0xB00000B0
#define REG_MFP_GPI_H        0xB00000B4

int NUC970_cleanup(void);
extern int spi_flash_disable_quad_mode(void);

DECLARE_GLOBAL_DATA_PTR;

int board_early_init_f (void)
{
    writel(readl(REG_PCLKEN0) | 0x10000, REG_PCLKEN0);   // UART clk
    writel(readl(REG_PCLKEN0) | 0x100, REG_PCLKEN0);   // Timer clk
#ifdef CONFIG_NUC970_GPIO
    writel(readl(REG_PCLKEN0) | 0x8, REG_PCLKEN0);   // GPIO clk
#endif

    return 0;
}


static unsigned int sdram_size(unsigned int config)
{
    unsigned int size = 0;

    config &= 0x7;

    switch (config) {
    case 0:
        size = 0;
        break;
    case 1:
        size = 0x200000;
        break;
    case 2:
        size = 0x400000;
        break;
    case 3:
        size = 0x800000;
        break;
    case 4:
        size = 0x1000000;
        break;
    case 5:
        size = 0x2000000;
        break;
    case 6:
        size = 0x4000000;
        break;
    case 7:
        size = 0x8000000;
        break;
    }

    return(size);
}



使用特权

评论回复
沙发
renzheshengui|  楼主 | 2021-7-1 14:01 | 只看该作者
void dram_init_banksize(void)
{
    gd->bd->bi_dram[0].size = sdram_size(readl(REG_SDIC_SIZE0));
    gd->bd->bi_dram[0].start = gd->bd->bi_dram[0].size == 0 ? 0 : (readl(REG_SDIC_SIZE0) & 0x1FE00000);

    gd->bd->bi_dram[1].size = sdram_size(readl(REG_SDIC_SIZE1));
    gd->bd->bi_dram[1].start = gd->bd->bi_dram[1].size == 0 ? 0 : (readl(REG_SDIC_SIZE1) & 0x1FE00000);
}

int dram_init(void)
{
    gd->ram_size = sdram_size(readl(REG_SDIC_SIZE0)) + sdram_size(readl(REG_SDIC_SIZE1));

    return(0);
}

#ifdef CONFIG_NUC970_ETH
extern int nuc970_eth_register(void);

int board_eth_init(bd_t *bis)
{
#ifdef CONFIG_NUC970_EMAC0
    writel(readl(REG_HCLKEN) | 0x10000, REG_HCLKEN);   // EMAC0 clk
    writel(readl(REG_CLKDIVCTL8) | 0x10, REG_CLKDIVCTL8); //MII management interface clock
    //Init multi-function pin for RMII
    writel(0x11111111, REG_MFP_GPF_L);        // pin F0~F7 for RMII0
    writel((readl(REG_MFP_GPF_H) & ~0xff) | 0x11, REG_MFP_GPF_H);// pin F8~F9 for RMII0
#else //CONFIG_NUC970_EMAC1
    writel(readl(REG_HCLKEN) | 0x20000, REG_HCLKEN);   // EMAC1 clk
    writel(readl(REG_CLKDIVCTL8) | 0x10, REG_CLKDIVCTL8); //MII management interface clock
    //Init multi-function pin for RMII
    writel((readl(REG_MFP_GPE_L) & ~0xffffff00) | 0x11111100, REG_MFP_GPE_L);// pin E2~E7 for RMII1
    writel((readl(REG_MFP_GPE_H) & ~0xffff) | 0x1111, REG_MFP_GPE_H);// pin E8~E11 for RMII1
#endif

    return(nuc970_eth_register());
}

#endif

#ifdef CONFIG_NUC970_MMC
#define REG_PWRON       0xB0000004
#define REG_CLKDIVCTL3  0xB000022C
#define REG_CLKDIVCTL9  0xB0000244
#define FMI_BA            0xB000D000 /* Flash Memory Card Interface */
#define SDH_BA          0xB000C000 /* SD Host */
#define REG_SDH_GCTL    (SDH_BA+0x800)   /* Global Control and Status Register */
#define REG_ECTL        (SDH_BA+0x840)   /* SD Host extend control register */
#define REG_FMICTL      (FMI_BA+0x800)  /* FMI control and status register */
#define GCTL_RST        0x1
#define SD_EN           0x2
#define EMMC_EN         0x2

int board_mmc_init(bd_t *bd)
{

    volatile int i;

#if defined(CONFIG_NUC970_SD_PORT0) || defined(CONFIG_NUC970_SD_PORT1)
    writel(readl(REG_HCLKEN) | 0x40000000, REG_HCLKEN);   // SDH clk
    writel((readl(REG_CLKDIVCTL9) & ~0x18), REG_CLKDIVCTL9); //Set SDH clock source from XIN
    writel((readl(REG_CLKDIVCTL9) & ~0xFF00) | (0x1d << 8), REG_CLKDIVCTL9); //Set SDH clock divider => 400 KHz

    writel(GCTL_RST, REG_SDH_GCTL);
    for(i = 0; i < 10; i++);        // Need few clock delay 'til SW_RST auto cleared.
    writel(SD_EN, REG_SDH_GCTL);

    writel(readl(REG_ECTL) & ~3, REG_ECTL); // SD port 0,1 power enable
#endif

#ifdef CONFIG_NUC970_SD_PORT0
    writel(0x66666666, REG_MFP_GPD_L);   // Set GPD for SD0

    nuc970_mmc_init(0); // init for SD port 0
#endif
#ifdef CONFIG_NUC970_SD_PORT1
    writel((readl(REG_MFP_GPH_L) & ~0xff000000) | 0x66000000, REG_MFP_GPH_L); // pin H6~H7 for SD1
    writel((readl(REG_MFP_GPH_H) & ~0x00ffffff) | 0x666666, REG_MFP_GPH_H); // pin H8~H13 for SD1

    nuc970_mmc_init(1); // init for SD port 1
#endif

#ifdef CONFIG_NUC970_EMMC
#ifdef CONFIG_NAND_NUC970
# error Don't enable eMMC(CONFIG_NUC970_EMMC) and NAND(CONFIG_NAND_NUC970) at the same time!
#endif
    writel(readl(REG_HCLKEN) | 0x00700000, REG_HCLKEN);   // eMMC & NAND & FMI clk
    writel((readl(REG_CLKDIVCTL3) & ~0x18), REG_CLKDIVCTL3); //Set eMMC clock source from XIN
    writel((readl(REG_CLKDIVCTL3) & ~0xFF00) | (0x28 << 8), REG_CLKDIVCTL3); //Set eMMC clock divider => 300 KHz
    // Set MFP the same port as NAND according to power-on setting register
    if (readl(REG_PWRON) & 0x08000000)
    {
        writel((readl(REG_MFP_GPI_L) & ~0xfff00000) | 0x66600000, REG_MFP_GPI_L);   // pin I5~7 for eMMC
        writel((readl(REG_MFP_GPI_H) & ~0x00000fff) | 0x00000666, REG_MFP_GPI_H);   // pin I8~10 for eMMC
    }
    else
    {
        writel((readl(REG_MFP_GPC_L) & ~0x00ffffff) | 0x00666666, REG_MFP_GPC_L);   // pin C0~5 for eMMC
    }
    nuc970_mmc_init(2); // init for eMMC
#endif
    return 0;
}
#endif



使用特权

评论回复
板凳
renzheshengui|  楼主 | 2021-7-1 14:01 | 只看该作者
#ifdef CONFIG_SYS_CONSOLE_OVERWRITE_ROUTINE
int overwrite_console(void)
{
    return 1;  // force serial interface as stdin/stdout/stderr even lcd interface enabled
}
#endif
void enable_caches(void)
{
#ifndef CONFIG_SYS_ICACHE_OFF
    icache_enable();
#endif
#ifndef CONFIG_SYS_DCACHE_OFF
    dcache_enable();
#endif
    return;
}
int board_init(void)
{
    gd->bd->bi_boot_params = 0x100;
    return(0);
}
int board_late_init(void)
{
#ifdef CONFIG_HW_WATCHDOG
    hw_watchdog_init();
#endif
    return 0;
}
int NUC970_cleanup(void)
{
#ifdef CONFIG_SYS_USE_SPIFLASH
    spi_flash_disable_quad_mode();
#endif
    return 0;
}


可以看出来,这一大段代码描述了CPU的几大部分的初始化,而ram的初始化比较早,所以可以在ram初始化的子程序里,添加对某个gpio初始化的操作;


使用特权

评论回复
地板
renzheshengui|  楼主 | 2021-7-1 14:02 | 只看该作者
2.在uboot里面找到gpio相关的代码,在路径uboot/drivers/gpio/nuc970_gpio.c这个文件里面,先来看一次这个文件:

#include <common.h>
#include <asm/io.h>
#include <asm/errno.h>

#include <asm-generic/gpio.h>
#include "nuc970_gpio.h"

struct gpio_port {
        volatile unsigned int * dir;
        volatile unsigned int * out;
        volatile unsigned int * in;
};

static const struct gpio_port port_class[] = {
        {(volatile unsigned int *)REG_GPIOA_DIR, (volatile unsigned int *)REG_GPIOA_DATAOUT,
         (volatile unsigned int *)REG_GPIOA_DATAIN},
        {(volatile unsigned int *)REG_GPIOB_DIR, (volatile unsigned int *)REG_GPIOB_DATAOUT,
         (volatile unsigned int *)REG_GPIOB_DATAIN},
        {(volatile unsigned int *)REG_GPIOC_DIR, (volatile unsigned int *)REG_GPIOC_DATAOUT,
         (volatile unsigned int *)REG_GPIOC_DATAIN},
        {(volatile unsigned int *)REG_GPIOD_DIR, (volatile unsigned int *)REG_GPIOD_DATAOUT,
         (volatile unsigned int *)REG_GPIOD_DATAIN},
        {(volatile unsigned int *)REG_GPIOE_DIR, (volatile unsigned int *)REG_GPIOE_DATAOUT,
         (volatile unsigned int *)REG_GPIOE_DATAIN},
        {(volatile unsigned int *)REG_GPIOF_DIR, (volatile unsigned int *)REG_GPIOF_DATAOUT,
         (volatile unsigned int *)REG_GPIOF_DATAIN},
        {(volatile unsigned int *)REG_GPIOG_DIR, (volatile unsigned int *)REG_GPIOG_DATAOUT,
         (volatile unsigned int *)REG_GPIOG_DATAIN},
        {(volatile unsigned int *)REG_GPIOH_DIR, (volatile unsigned int *)REG_GPIOH_DATAOUT,
         (volatile unsigned int *)REG_GPIOH_DATAIN},
        {(volatile unsigned int *)REG_GPIOI_DIR, (volatile unsigned int *)REG_GPIOI_DATAOUT,
         (volatile unsigned int *)REG_GPIOI_DATAIN},
        {},
};

static const struct gpio_port *nuc970_gpio_cla_port(unsigned gpio,
                                                    int *num)
{
        int group;
        group = gpio / GPIO_OFFSET;
        *num = gpio % GPIO_OFFSET;
        return &port_class[group];
}

/**
* Set value of the specified gpio
*/
int gpio_set_value(unsigned gpio, int val)
{
        int port_num, value;
        const struct gpio_port *port =
            nuc970_gpio_cla_port(gpio, &port_num);

        if ((readl(port->dir) & (1 << port_num))) {        //GPIO OUT
                value = readl(port->out);
                if (val)
                        value |= (1 << port_num);
                else
                        value &= ~(1 << port_num);
                writel(value, port->out);

        } else {                //GPIO IN
                value = readl(port->in);
                if (val)
                        value |= (1 << port_num);
                else
                        value &= ~(1 << port_num);
                writel(value, port->in);;
        }


        return 0;
}

/**
* Get value of the specified gpio
*/
int gpio_get_value(unsigned gpio)
{
        int port_num, value;
        const struct gpio_port *port;
        port = nuc970_gpio_cla_port(gpio, &port_num);
        value = 0;

        if ((readl(port->dir) & (1 << port_num))) {        //GPIO OUT
                value = (readl(port->out) >> port_num) & 0x1;

        } else {                //GPIO IN
                value = (readl(port->in) >> port_num) & 0x1;
                writel(value, port->in);
        }

        return value;
}

/**
* Set gpio direction as input
*/
int gpio_direction_input(unsigned gpio)
{
        int port_num;
        unsigned long value;
        const struct gpio_port *port =
            nuc970_gpio_cla_port(gpio, &port_num);

        value = readl(port->dir);
        value &= ~(1 << port_num);
        writel(value, port->dir);

        return 0;
}



使用特权

评论回复
5
renzheshengui|  楼主 | 2021-7-1 14:02 | 只看该作者
/**
* Set gpio direction as output
*/
int gpio_direction_output(unsigned gpio, int val)
{
        int port_num;
        unsigned long value;
        const struct gpio_port *port =
            nuc970_gpio_cla_port(gpio, &port_num);

        value = readl(port->dir);
        value |= (1 << port_num);
        writel(value, port->dir);
        gpio_set_value(gpio, val);

        return 0;
}

/**
* Request a gpio before using it.
*
* NOTE: Argument 'label' is unused.
*/
int gpio_request(unsigned gpio, const char *label)
{
        unsigned int group,num,reg,value;
        group = gpio / GPIO_OFFSET;
        num   = gpio % GPIO_OFFSET;
        reg   = (unsigned int)REG_MFP_GPA_L + (group* 0x08);
        if (num > 7)
        {
                num -= 8;
                reg = reg + 0x04 ;
        }

        value =        ( readl((volatile unsigned int *)reg) & (0xf<<(num*4)))>>(num*4);
        if(value>0 && value<0xf)
        {
                        printf("[%s] Please Check GPIO pin [%d], multi-function pins = 0x%x \n",__FUNCTION__,gpio,value);
                        return -EINVAL;
        }
        return 0;
}

/**
* Reset and free the gpio after using it.
*/
int gpio_free(unsigned gpio)
{
        return 0;
}


使用特权

评论回复
6
renzheshengui|  楼主 | 2021-7-1 14:02 | 只看该作者
这段代码里面包含了对nuc970系列gpio操作的相关函数,在uboot/drivers/gpio/nuc970_gpio.h这个文件里,定义了nuc970系列所有的gpio寄存器地址,当然都是物理地址:

#ifndef __NUC970_REGS_GPIO_H
#define __NUC970_REGS_GPIO_H

/* Global control registers */
#define REG_MFP_GPA_L   0xB0000070
#define GPIO_BA                0xB8003000

#define REG_GPIOA_DIR                 (GPIO_BA+0x000)
#define REG_GPIOA_DATAOUT         (GPIO_BA+0x004)
#define REG_GPIOA_DATAIN         (GPIO_BA+0x008)
#define REG_GPIOA_IMD                 (GPIO_BA+0x00C)
#define REG_GPIOA_IREN                 (GPIO_BA+0x010)
#define REG_GPIOA_IFEN                 (GPIO_BA+0x014)
#define REG_GPIOA_ISR                 (GPIO_BA+0x018)
#define REG_GPIOA_DBEN                 (GPIO_BA+0x01C)
#define REG_GPIOA_PUEN                 (GPIO_BA+0x020)
#define REG_GPIOA_PDEN                 (GPIO_BA+0x024)
#define REG_GPIOA_ICEN                 (GPIO_BA+0x028)
#define REG_GPIOA_ISEN                 (GPIO_BA+0x02C)
       
#define REG_GPIOB_DIR                 (GPIO_BA+0x040)              
#define REG_GPIOB_DATAOUT         (GPIO_BA+0x044)            
#define REG_GPIOB_DATAIN         (GPIO_BA+0x048)              
#define REG_GPIOB_IMD                 (GPIO_BA+0x04C)              
#define REG_GPIOB_IREN                 (GPIO_BA+0x050)              
#define REG_GPIOB_IFEN                 (GPIO_BA+0x054)              
#define REG_GPIOB_ISR                 (GPIO_BA+0x058)              
#define REG_GPIOB_DBEN                 (GPIO_BA+0x05C)              
#define REG_GPIOB_PUEN                 (GPIO_BA+0x060)              
#define REG_GPIOB_PDEN                 (GPIO_BA+0x064)              
#define REG_GPIOB_ICEN                 (GPIO_BA+0x068)              
#define REG_GPIOB_ISEN                 (GPIO_BA+0x06C)              

#define REG_GPIOC_DIR                 (GPIO_BA+0x080)              
#define REG_GPIOC_DATAOUT         (GPIO_BA+0x084)            
#define REG_GPIOC_DATAIN         (GPIO_BA+0x088)              
#define REG_GPIOC_IMD                 (GPIO_BA+0x08C)              
#define REG_GPIOC_IREN                 (GPIO_BA+0x090)              
#define REG_GPIOC_IFEN                 (GPIO_BA+0x094)              
#define REG_GPIOC_ISR                 (GPIO_BA+0x098)              
#define REG_GPIOC_DBEN                 (GPIO_BA+0x09C)              
#define REG_GPIOC_PUEN                 (GPIO_BA+0x0A0)              
#define REG_GPIOC_PDEN                 (GPIO_BA+0x0A4)              
#define REG_GPIOC_ICEN                 (GPIO_BA+0x0A8)              
#define REG_GPIOC_ISEN                 (GPIO_BA+0x0AC)              

#define REG_GPIOD_DIR                 (GPIO_BA+0x0C0)              
#define REG_GPIOD_DATAOUT         (GPIO_BA+0x0C4)            
#define REG_GPIOD_DATAIN         (GPIO_BA+0x0C8)              
#define REG_GPIOD_IMD                 (GPIO_BA+0x0CC)              
#define REG_GPIOD_IREN                 (GPIO_BA+0x0D0)              
#define REG_GPIOD_IFEN                 (GPIO_BA+0x0D4)              
#define REG_GPIOD_ISR                 (GPIO_BA+0x0D8)              
#define REG_GPIOD_DBEN                 (GPIO_BA+0x0DC)              
#define REG_GPIOD_PUEN                 (GPIO_BA+0x0E0)              
#define REG_GPIOD_PDEN                 (GPIO_BA+0x0E4)              
#define REG_GPIOD_ICEN                 (GPIO_BA+0x0E8)              
#define REG_GPIOD_ISEN                 (GPIO_BA+0x0EC)              

#define REG_GPIOE_DIR                 (GPIO_BA+0x100)              
#define REG_GPIOE_DATAOUT         (GPIO_BA+0x104)            
#define REG_GPIOE_DATAIN         (GPIO_BA+0x108)              
#define REG_GPIOE_IMD                 (GPIO_BA+0x10C)              
#define REG_GPIOE_IREN                 (GPIO_BA+0x110)              
#define REG_GPIOE_IFEN                 (GPIO_BA+0x114)              
#define REG_GPIOE_ISR                 (GPIO_BA+0x118)              
#define REG_GPIOE_DBEN                 (GPIO_BA+0x11C)              
#define REG_GPIOE_PUEN                 (GPIO_BA+0x120)              
#define REG_GPIOE_PDEN                 (GPIO_BA+0x124)              
#define REG_GPIOE_ICEN                 (GPIO_BA+0x128)              
#define REG_GPIOE_ISEN                 (GPIO_BA+0x12C)              

#define REG_GPIOF_DIR                 (GPIO_BA+0x140)              
#define REG_GPIOF_DATAOUT         (GPIO_BA+0x144)
#define REG_GPIOF_DATAIN         (GPIO_BA+0x148)              
#define REG_GPIOF_IMD                 (GPIO_BA+0x14C)              
#define REG_GPIOF_IREN                 (GPIO_BA+0x150)              
#define REG_GPIOF_IFEN                 (GPIO_BA+0x154)              
#define REG_GPIOF_ISR                 (GPIO_BA+0x158)              
#define REG_GPIOF_DBEN                 (GPIO_BA+0x15C)              
#define REG_GPIOF_PUEN                 (GPIO_BA+0x160)            
#define REG_GPIOF_PDEN                 (GPIO_BA+0x164)              
#define REG_GPIOF_ICEN                 (GPIO_BA+0x168)              
#define REG_GPIOF_ISEN                 (GPIO_BA+0x16C)              
                                                             
#define REG_GPIOG_DIR                 (GPIO_BA+0x180)              
#define REG_GPIOG_DATAOUT         (GPIO_BA+0x184)
#define REG_GPIOG_DATAIN         (GPIO_BA+0x188)              
#define REG_GPIOG_IMD                 (GPIO_BA+0x18C)              
#define REG_GPIOG_IREN                 (GPIO_BA+0x190)              
#define REG_GPIOG_IFEN                 (GPIO_BA+0x194)              
#define REG_GPIOG_ISR                 (GPIO_BA+0x198)              
#define REG_GPIOG_DBEN                 (GPIO_BA+0x19C)              
#define REG_GPIOG_PUEN                 (GPIO_BA+0x1A0)              
#define REG_GPIOG_PDEN                 (GPIO_BA+0x1A4)            
#define REG_GPIOG_ICEN                 (GPIO_BA+0x1A8)              
#define REG_GPIOG_ISEN                 (GPIO_BA+0x1AC)

#define REG_GPIOH_DIR                 (GPIO_BA+0x1C0)              
#define REG_GPIOH_DATAOUT         (GPIO_BA+0x1C4)            
#define REG_GPIOH_DATAIN         (GPIO_BA+0x1C8)              
#define REG_GPIOH_IMD                 (GPIO_BA+0x1CC)              
#define REG_GPIOH_IREN                 (GPIO_BA+0x1D0)              
#define REG_GPIOH_IFEN                 (GPIO_BA+0x1D4)
#define REG_GPIOH_ISR                 (GPIO_BA+0x1D8)              
#define REG_GPIOH_DBEN                 (GPIO_BA+0x1DC)              
#define REG_GPIOH_PUEN                 (GPIO_BA+0x1E0)              
#define REG_GPIOH_PDEN                 (GPIO_BA+0x1E4)              
#define REG_GPIOH_ICEN                 (GPIO_BA+0x1E8)              
#define REG_GPIOH_ISEN                 (GPIO_BA+0x1EC)              
                                                             
#define REG_GPIOI_DIR                 (GPIO_BA+0x200)              
#define REG_GPIOI_DATAOUT         (GPIO_BA+0x204)            
#define REG_GPIOI_DATAIN         (GPIO_BA+0x208)              
#define REG_GPIOI_IMD                 (GPIO_BA+0x20C)              
#define REG_GPIOI_IREN                 (GPIO_BA+0x210)              
#define REG_GPIOI_IFEN                 (GPIO_BA+0x214)              
#define REG_GPIOI_ISR                 (GPIO_BA+0x218)              
#define REG_GPIOI_DBEN                 (GPIO_BA+0x21C)              
#define REG_GPIOI_PUEN                 (GPIO_BA+0x220)              
#define REG_GPIOI_PDEN                 (GPIO_BA+0x224)              
#define REG_GPIOI_ICEN                 (GPIO_BA+0x228)              
#define REG_GPIOI_ISEN                 (GPIO_BA+0x22C)  


#define REG_GPIOJ_DIR                 (GPIO_BA+0x240)              
#define REG_GPIOJ_DATAOUT        (GPIO_BA+0x244)            
#define REG_GPIOJ_DATAIN         (GPIO_BA+0x248)              
#define REG_GPIOJ_IMD                 (GPIO_BA+0x24C)              
#define REG_GPIOJ_IREN                 (GPIO_BA+0x250)              
#define REG_GPIOJ_IFEN                 (GPIO_BA+0x254)              
#define REG_GPIOJ_ISR                 (GPIO_BA+0x258)              
#define REG_GPIOJ_DBEN                 (GPIO_BA+0x25C)              
#define REG_GPIOJ_PUEN                 (GPIO_BA+0x260)              
#define REG_GPIOJ_PDEN                 (GPIO_BA+0x264)              
#define REG_GPIOJ_ICEN                 (GPIO_BA+0x268)              
#define REG_GPIOJ_ISEN                 (GPIO_BA+0x26C)

#define REG_GPIO_DBNCECON        (GPIO_BA+0x3F0)              
#define REG_GPIO_ISR                  (GPIO_BA+0x3FC)

#define GPIO_OFFSET 0x20
#define        DRIVER_NAME "nuc970-gpio"
#define NUMGPIO 0x20 * 10        //(PortA~Portj)

#define GPIO_PA0        0
#define GPIO_PA1        1
#define GPIO_PA2        2
#define GPIO_PA3        3
#define GPIO_PA4        4
#define GPIO_PA5        5
#define GPIO_PA6        6
#define GPIO_PA7        7
#define GPIO_PA8        8
#define GPIO_PA9        9
#define GPIO_PA10        10
#define GPIO_PA11        11
#define GPIO_PA12        12
#define GPIO_PA13        13
#define GPIO_PA14        14
#define GPIO_PA15        15
#define GPIO_PB0        32
#define GPIO_PB1        33
#define GPIO_PB2        34
#define GPIO_PB3        35
#define GPIO_PB4        36
#define GPIO_PB5        37
#define GPIO_PB6        38
#define GPIO_PB7        39
#define GPIO_PB8        40
#define GPIO_PB9        41
#define GPIO_PB10        42
#define GPIO_PB11        43
#define GPIO_PB12        44
#define GPIO_PB13        45
#define GPIO_PB14        46
#define GPIO_PB15        47
#define GPIO_PC0        (2*GPIO_OFFSET + 0)
#define GPIO_PC1        (2*GPIO_OFFSET + 1)
#define GPIO_PC2        (2*GPIO_OFFSET + 2)
#define GPIO_PC3        (2*GPIO_OFFSET + 3)
#define GPIO_PC4        (2*GPIO_OFFSET + 4)
#define GPIO_PC5        (2*GPIO_OFFSET + 5)
#define GPIO_PC6        (2*GPIO_OFFSET + 6)
#define GPIO_PC7        (2*GPIO_OFFSET + 7)
#define GPIO_PC8        (2*GPIO_OFFSET + 8)
#define GPIO_PC9        (2*GPIO_OFFSET + 9)
#define GPIO_PC10        (2*GPIO_OFFSET + 10)
#define GPIO_PC11        (2*GPIO_OFFSET + 11)
#define GPIO_PC12        (2*GPIO_OFFSET + 12)
#define GPIO_PC13        (2*GPIO_OFFSET + 13)
#define GPIO_PC14        (2*GPIO_OFFSET + 14)
#define GPIO_PC15        (2*GPIO_OFFSET + 15)
#define GPIO_PD0        (3*GPIO_OFFSET + 0)
#define GPIO_PD1        (3*GPIO_OFFSET + 1)
#define GPIO_PD2        (3*GPIO_OFFSET + 2)
#define GPIO_PD3        (3*GPIO_OFFSET + 3)
#define GPIO_PD4        (3*GPIO_OFFSET + 4)
#define GPIO_PD5        (3*GPIO_OFFSET + 5)
#define GPIO_PD6        (3*GPIO_OFFSET + 6)
#define GPIO_PD7        (3*GPIO_OFFSET + 7)
#define GPIO_PD8        (3*GPIO_OFFSET + 8)
#define GPIO_PD9        (3*GPIO_OFFSET + 9)
#define GPIO_PD10        (3*GPIO_OFFSET + 10)
#define GPIO_PD11        (3*GPIO_OFFSET + 11)
#define GPIO_PD12        (3*GPIO_OFFSET + 12)
#define GPIO_PD13        (3*GPIO_OFFSET + 13)
#define GPIO_PD14        (3*GPIO_OFFSET + 14)
#define GPIO_PD15        (3*GPIO_OFFSET + 15)
#define GPIO_PE0        (4*GPIO_OFFSET + 0)
#define GPIO_PE1        (4*GPIO_OFFSET + 1)
#define GPIO_PE2        (4*GPIO_OFFSET + 2)
#define GPIO_PE3        (4*GPIO_OFFSET + 3)
#define GPIO_PE4        (4*GPIO_OFFSET + 4)
#define GPIO_PE5        (4*GPIO_OFFSET + 5)
#define GPIO_PE6        (4*GPIO_OFFSET + 6)
#define GPIO_PE7        (4*GPIO_OFFSET + 7)
#define GPIO_PE8        (4*GPIO_OFFSET + 8)
#define GPIO_PE9        (4*GPIO_OFFSET + 9)
#define GPIO_PE10        (4*GPIO_OFFSET + 10)
#define GPIO_PE11        (4*GPIO_OFFSET + 11)
#define GPIO_PE12        (4*GPIO_OFFSET + 12)
#define GPIO_PE13        (4*GPIO_OFFSET + 13)
#define GPIO_PE14        (4*GPIO_OFFSET + 14)
#define GPIO_PE15        (4*GPIO_OFFSET + 15)
#define GPIO_PF0        (5*GPIO_OFFSET + 0)
#define GPIO_PF1        (5*GPIO_OFFSET + 1)
#define GPIO_PF2        (5*GPIO_OFFSET + 2)
#define GPIO_PF3        (5*GPIO_OFFSET + 3)
#define GPIO_PF4        (5*GPIO_OFFSET + 4)
#define GPIO_PF5        (5*GPIO_OFFSET + 5)
#define GPIO_PF6        (5*GPIO_OFFSET + 6)
#define GPIO_PF7        (5*GPIO_OFFSET + 7)
#define GPIO_PF8        (5*GPIO_OFFSET + 8)
#define GPIO_PF9        (5*GPIO_OFFSET + 9)
#define GPIO_PF10        (5*GPIO_OFFSET + 10)
#define GPIO_PF11        (5*GPIO_OFFSET + 11)
#define GPIO_PF12        (5*GPIO_OFFSET + 12)
#define GPIO_PF13        (5*GPIO_OFFSET + 13)
#define GPIO_PE14        (5*GPIO_OFFSET + 14)
#define GPIO_PE15        (5*GPIO_OFFSET + 15)
#define GPIO_PG0        (6*GPIO_OFFSET + 0)
#define GPIO_PG1        (6*GPIO_OFFSET + 1)
#define GPIO_PG2        (6*GPIO_OFFSET + 2)
#define GPIO_PG3        (6*GPIO_OFFSET + 3)
#define GPIO_PG4        (6*GPIO_OFFSET + 4)
#define GPIO_PG5        (6*GPIO_OFFSET + 5)
#define GPIO_PG6        (6*GPIO_OFFSET + 6)
#define GPIO_PG7        (6*GPIO_OFFSET + 7)
#define GPIO_PG8        (6*GPIO_OFFSET + 8)
#define GPIO_PG9        (6*GPIO_OFFSET + 9)
#define GPIO_PG10        (6*GPIO_OFFSET + 10)
#define GPIO_PG11        (6*GPIO_OFFSET + 11)
#define GPIO_PG12        (6*GPIO_OFFSET + 12)
#define GPIO_PG13        (6*GPIO_OFFSET + 13)
#define GPIO_PG14        (6*GPIO_OFFSET + 14)
#define GPIO_PG15        (6*GPIO_OFFSET + 15)
#define GPIO_PH0        (7*GPIO_OFFSET + 0)
#define GPIO_PH1        (7*GPIO_OFFSET + 1)
#define GPIO_PH2        (7*GPIO_OFFSET + 2)
#define GPIO_PH3        (7*GPIO_OFFSET + 3)
#define GPIO_PH4        (7*GPIO_OFFSET + 4)
#define GPIO_PH5        (7*GPIO_OFFSET + 5)
#define GPIO_PH6        (7*GPIO_OFFSET + 6)
#define GPIO_PH7        (7*GPIO_OFFSET + 7)
#define GPIO_PH8        (7*GPIO_OFFSET + 8)
#define GPIO_PH9        (7*GPIO_OFFSET + 9)
#define GPIO_PH10        (7*GPIO_OFFSET + 10)
#define GPIO_PH11        (7*GPIO_OFFSET + 11)
#define GPIO_PH12        (7*GPIO_OFFSET + 12)
#define GPIO_PH13        (7*GPIO_OFFSET + 13)
#define GPIO_PH14        (7*GPIO_OFFSET + 14)
#define GPIO_PH15        (7*GPIO_OFFSET + 15)
#define GPIO_PI0        (8*GPIO_OFFSET + 0)
#define GPIO_PI1        (8*GPIO_OFFSET + 1)
#define GPIO_PI2        (8*GPIO_OFFSET + 2)
#define GPIO_PI3        (8*GPIO_OFFSET + 3)
#define GPIO_PI4        (8*GPIO_OFFSET + 4)
#define GPIO_PI5        (8*GPIO_OFFSET + 5)
#define GPIO_PI6        (8*GPIO_OFFSET + 6)
#define GPIO_PI7        (8*GPIO_OFFSET + 7)
#define GPIO_PI8        (8*GPIO_OFFSET + 8)
#define GPIO_PI9        (8*GPIO_OFFSET + 9)
#define GPIO_PI10        (8*GPIO_OFFSET + 10)
#define GPIO_PI11        (8*GPIO_OFFSET + 11)
#define GPIO_PI12        (8*GPIO_OFFSET + 12)
#define GPIO_PI13        (8*GPIO_OFFSET + 13)
#define GPIO_PI14        (8*GPIO_OFFSET + 14)
#define GPIO_PI15        (8*GPIO_OFFSET + 15)
#define GPIO_PJ0        (9*GPIO_OFFSET + 0)
#define GPIO_PJ1        (9*GPIO_OFFSET + 1)
#define GPIO_PJ2        (9*GPIO_OFFSET + 2)
#define GPIO_PJ3        (9*GPIO_OFFSET + 3)
#define GPIO_PJ4        (9*GPIO_OFFSET + 4)
#define GPIO_PJ5        (9*GPIO_OFFSET + 5)
#define GPIO_PJ6        (9*GPIO_OFFSET + 6)
#define GPIO_PJ7        (9*GPIO_OFFSET + 7)
#define GPIO_PJ8        (9*GPIO_OFFSET + 8)
#define GPIO_PJ9        (9*GPIO_OFFSET + 9)
#define GPIO_PJ10        (9*GPIO_OFFSET + 10)
#define GPIO_PJ11        (9*GPIO_OFFSET + 11)
#define GPIO_PJ12        (9*GPIO_OFFSET + 12)
#define GPIO_PJ13        (9*GPIO_OFFSET + 13)
#define GPIO_PJ14        (9*GPIO_OFFSET + 14)
#define GPIO_PJ15        (9*GPIO_OFFSET + 15)

#endif /*  __NUC970_REGS_GPIO_H */
这样用起来就很方便了,不用再去查数据手册了。


使用特权

评论回复
7
renzheshengui|  楼主 | 2021-7-1 14:03 | 只看该作者
3.在初始化ram的代码段中添加对gpio的初始化代码,我这里使用的是PE4,所以添加如下代码:

int dram_init(void)
{
    gd->ram_size = sdram_size(readl(REG_SDIC_SIZE0)) + sdram_size(readl(REG_SDIC_SIZE1));

        gpio_request(GPIO_PE4, "VOX_1");
        gpio_direction_output(GPIO_PE4, 0);
       
    return(0);
}
添加这两行代码,在Uboot启动后,初始化PE4为输出模式,低电平,重新编译一下uboot烧录一下就OK了。

4.在linux内核启动时,我没有对gpio进行操作,所以内核启动后,PE4依然保持低电平,所以不需要再修改内核启动部分的代码。


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

78

主题

3858

帖子

2

粉丝