NXP imx6ull在uboot中控制gpio

NXP imx6ull在uboot中控制gpio

函数

复用

arch/arm/mach-imx/iomux-v3.c

/* configures a list of pads within declared with IOMUX_PADS macro */
void imx_iomux_v3_setup_multiple_pads(iomux_v3_cfg_t const *pad_list,
				      unsigned count)
{
	iomux_v3_cfg_t const *p = pad_list;
	int stride;
	int i;

#if defined(CONFIG_MX6QDL)
	stride = 2;
	if (!is_mx6dq() && !is_mx6dqp())
		p += 1;
#else
	stride = 1;
#endif
	for (i = 0; i < count; i++) {
		imx_iomux_v3_setup_pad(*p);
		p += stride;
	}
}

控制

drivers/gpio/mxc_gpio.c

常用函数:

static int mxc_gpio_direction(unsigned int gpio,
	enum mxc_gpio_direction direction)
{
	unsigned int port = GPIO_TO_PORT(gpio);
	struct gpio_regs *regs;
	u32 l;

	if (port >= ARRAY_SIZE(gpio_ports))
		return -1;

	if (RDC_CHECK(port))
		return -1;

	RDC_SPINLOCK_UP(port);

	gpio &= 0x1f;

	regs = (struct gpio_regs *)gpio_ports[port];

	l = readl(&regs->gpio_dir);

	switch (direction) {
	case MXC_GPIO_DIRECTION_OUT:
		l |= 1 << gpio;
		break;
	case MXC_GPIO_DIRECTION_IN:
		l &= ~(1 << gpio);
	}
	writel(l, &regs->gpio_dir);

	RDC_SPINLOCK_DOWN(port);

	return 0;
}

int gpio_set_value(unsigned gpio, int value)
{
	unsigned int port = GPIO_TO_PORT(gpio);
	struct gpio_regs *regs;
	u32 l;

	if (port >= ARRAY_SIZE(gpio_ports))
		return -1;

	if (RDC_CHECK(port))
		return -1;

	RDC_SPINLOCK_UP(port);

	gpio &= 0x1f;

	regs = (struct gpio_regs *)gpio_ports[port];

	l = readl(&regs->gpio_dr);
	if (value)
		l |= 1 << gpio;
	else
		l &= ~(1 << gpio);
	writel(l, &regs->gpio_dr);

	RDC_SPINLOCK_DOWN(port);

	return 0;
}

int gpio_get_value(unsigned gpio)
{
	unsigned int port = GPIO_TO_PORT(gpio);
	struct gpio_regs *regs;
	u32 val;

	if (port >= ARRAY_SIZE(gpio_ports))
		return -1;

	if (RDC_CHECK(port))
		return -1;

	RDC_SPINLOCK_UP(port);

	gpio &= 0x1f;

	regs = (struct gpio_regs *)gpio_ports[port];

	val = (readl(&regs->gpio_dr) >> gpio) & 0x01;

	RDC_SPINLOCK_DOWN(port);

	return val;
}

int gpio_request(unsigned gpio, const char *label)
{
	unsigned int port = GPIO_TO_PORT(gpio);
	if (port >= ARRAY_SIZE(gpio_ports))
		return -1;

	if (RDC_CHECK(port))
		return -1;

	return 0;
}

int gpio_free(unsigned gpio)
{
	return 0;
}

int gpio_direction_input(unsigned gpio)
{
	return mxc_gpio_direction(gpio, MXC_GPIO_DIRECTION_IN);
}

int gpio_direction_output(unsigned gpio, int value)
{
	int ret = gpio_set_value(gpio, value);

	if (ret < 0)
		return ret;

	return mxc_gpio_direction(gpio, MXC_GPIO_DIRECTION_OUT);
}

控制GPIO

在引脚复用定义文件,arch/arm/include/asm/arch-mx6/mx6ull_pins.h中找到需要控制的引脚。

在 board/freescale/mx6ullevk/mx6ullevk.c 中添加定义和控制代码。

static iomux_v3_cfg_t const mygpio_pads[] = {
	        MX6_PAD_SNVS_TAMPER0__GPIO5_IO000 | MUX_PAD_CTRL(NO_PAD_CTRL),
};

//随便找个函数控制gpio
int power_init_board(void)
{
    /*** 省略原有代码 ***/
	imx_iomux_v3_setup_multiple_pads(mygpio_pads, ARRAY_SIZE(mygpio_pads));
	/*IMX_GPIO_NR计算gpio号
    #define IMX_GPIO_NR(port, index)		((((port)-1)*32)+((index)&31))
    gpio5_0, (5-1)*32+0 = 128
    */
    gpio_request(IMX_GPIO_NR(5, 0), "mygpio");
    
    //设置为输出模式,输出低信号
	gpio_direction_output(IMX_GPIO_NR(5, 0) , 0);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 要将U-Boot 2021移植到i.MX6ULL上,需要进行以下步骤: 1. 获取U-Boot 2021源代码,并解压缩。 2. 进入U-Boot源代码目录,执行make mx6ull_config命令,生成配置文件。 3. 执行make命令编译U-Boot。 4. 将编译好的U-Boot烧录到i.MX6ULL的启动设备上,例如SD卡或eMMC。 5. 在i.MX6ULL上启动U-Boot,可以通过串口或网络连接进行调试和配置。 需要注意的是,U-Boot的移植需要根据具体的硬件平台进行调整和配置,例如时钟、存储器、网络等参数。同时,还需要根据具体的应用场景进行功能定制和优化。 ### 回答2: 如何移植uboot2021到imx6ull平台上呢?这里主要分为以下几个步骤: 1. 准备工作:获取uboot2021源码,编译工具链及imx6ull开发板。 2. 配置uboot:将uboot源码解压到本地目录,进入该目录执行make distclean命令清除旧的编译结果,接着执行make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_evk_defconfig命令生成初始配置文件,该命令将生成一个.config文件,保存uboot的各种配置选项。若需要重新配置uboot,可以执行make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig命令,进入ncurses界面进行配置。 3. 编译uboot:执行make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-命令编译uboot。编译完成后会生成u-boot.bin文件及其他相关文件。 4. 烧写uboot:将编译好的u-boot.bin文件烧写到imx6ull开发板上,可以使用JTAG或SD卡等方式进行烧写操作。 5. 测试uboot:烧写完成后重启开发板,在uboot命令行模式下执行命令,如printenv、boot等,验证uboot是否能够正常工作。 在这个过程需要注意以下几点: 1. 在配置uboot时,需要参考imx6ull开发板的硬件配置文件进行相应的配置,如串口、网卡等。 2. 在编译uboot时,需要指定交叉编译工具链的路径及前缀,例如arm-linux-gnueabihf-。 3. 在烧写uboot前,需要确保imx6ull开发板已处于烧写模式,并准备好相应的烧写工具。 总结来说,移植uboot2021到imx6ull平台上需要对uboot进行配置、编译和烧写等操作,需要了解相关的硬件配置和交叉编译工具链等知识,同时需要注意进行正确的操作步骤和验证步骤。 ### 回答3: imx6ull是一款基于ARM Cortex-A7架构的嵌入式处理器,它广泛应用于物联网、智能家居、医疗设备等领域。移植U-Boot可以为imx6ull的开发和应用提供更多的功能和扩展性。本文将介绍如何移植U-Boot 2021到imx6ull平台上。 移植步骤: 1. 准备工具和环境:交叉编译工具、串口调试器和开发板。安装交叉编译工具,设置环境变量。 2. 下载U-Boot源码,并解压缩。 3. 选择imx6ull配置文件:从U-Boot源码找到与imx6ull对应的配置文件,具体位置在“configs/”目录下。可以通过“make menuconfig”命令进行配置,或者手动复制对应的配置文件到“config/”目录下。 4. 编译U-Boot:执行“make”命令进行编译,输出“u-boot.bin”文件。 5. 烧录U-Boot:通过串口调试器将U-Boot烧录到开发板的Flash。连接串口调试器,并使用命令“sudo minicom -s”打开串口设置界面。设置串口设备、波特率等参数,保存退出。使用“sudo minicom”命令即可进入串口终端,输入“Ctrl + C”进入U-Boot命令行模式。通过“mmc dev 0”和“mmc part”命令设置分区和卡设备。使用“fatls mmc 0:1”或“ext2ls mmc 0:1”查看文件系统,确认烧录地址和文件名。 6. 烧录软件:使用命令“fatload mmc 0:1 ${loadaddr} u-boot.bin”将U-Boot软件烧录到开发板,然后通过“go ${loadaddr}”命令运行U-Boot。 注意事项: 1. 在选择配置文件时,要注意选择与开发板硬件一致的配置文件,否则可能会出现不可预知的问题。 2. 在烧录过程,注意确认文件名和烧录地址是否正确,以免造成不可恢复的损失。 3. 在调试过程,可以使用“printenv”命令查看环境变量,使用“setenv”命令设置和修改环境变量。 总结: 移植U-Boot需要使用交叉编译工具和串口调试器,选取开发板对应的配置文件,然后进行编译和烧录。在调试过程要注意环境变量和文件名,避免出现不可预知的问题。U-Boot为开发者提供了更多的扩展性和功能,可以大大提高开发效率和应用体验。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

omnibots

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值