完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
当前的项目中,需要使用nuc972的GPIO去控制短波电台的PTT,而在实际的使用中发现,NUC972从上电到程序运行,GPIO的默认值一直是高电平,而我是用高电平控制短波电台发射,这就比较麻烦了,系统从上电到程序运行,少说也得好几秒的时间,而且在调试期间,是用的NFS挂在的方式,启动时间更长,在这么长的时间里,短波电台一直处于发射状态,怎么说也不太合适,而且我也不想修改硬件,所以只能从软件上找解决方法了,经过多方面的查找,决定在uboot里面修改GPIO的初始状态,具体步骤如下:
1.首先在uboot中找到和NUC972上电初始化相关的代码,具体的路径uboot不同的版本可能不一样,我的uboot路径在uboot/board/nuvoton/nuc970evb/nuc970.c中,先来大概看一下这个初始化代码: #include #include #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 #include #include #include #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依然保持低电平,所以不需要再修改内核启动部分的代码。 |
|
相关推荐
1个回答
|
|
在uboot中初始化nuc972 GPIO的具体步骤如下:
1. 找到NUC972的GPIO控制寄存器,这通常是通过查找NUC972的数据手册来确定的。 2. 使用uboot提供的GPIO驱动程序,打开GPIO控制寄存器,使其可读/写。 3. 设置GPIO控制寄存器的初始状态,这通常可以通过设置寄存器的位来实现。 例如,如果需要将GPIO设为低电平状态,则应将相应位设置为0。 4. 保存GPIO控制寄存器的状态,以便在系统运行期间可以快速地访问和修改其状态。 5. 启动系统并验证GPIO控制寄存器的状态是否正确。 需要注意的是,由于uboot是一个容易被修改的环境,因此应该特别小心地设置GPIO控制寄存器的初始状态,以确保不会对系统的正常运行造成任何负面影响。同时也需要注意,不同的GPIO可能需要采用不同的初始化方法,因此应该查找相应的数据手册,确定正确的初始化方法。 |
|
|
|
只有小组成员才能发言,加入小组>>
3284 浏览 9 评论
2960 浏览 16 评论
3464 浏览 1 评论
9008 浏览 16 评论
4054 浏览 18 评论
1124浏览 3评论
577浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
572浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2305浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1863浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-28 00:11 , Processed in 1.243804 second(s), Total 79, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号