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