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

      如果有问题,请加QQ群 891339868 进行交流

       当前的项目中,需要使用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);
}

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

#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初始化的操作;

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;
}

/**
 * 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;
}

这段代码里面包含了对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 */

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

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依然保持低电平,所以不需要再修改内核启动部分的代码。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值