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);
}
首先,需要确认SR8201FN网卡是否是通过SPI接口与imx6ull交互。如果是,则需要在uboot中添加SPI驱动,并在SPI驱动中添加SR8201FN网卡的驱动支持。 以下是添加SPI驱动的步骤: 1. 打开uboot源码目录中的configs目录,复制一个与你的开发板相似的配置文件,例如mx6ull_14x14_evk_defconfig,重命名为你自己的配置文件名。 2. 在你的配置文件中,添加以下配置选项: ``` CONFIG_SPI=y CONFIG_DM_SPI=y CONFIG_SPI_FLASH=y ``` 3. 如果你的开发板中使用的SPI控制器不同于MX6UL/DL内置的ECspi控制器,则需要添加SPI控制器的驱动支持,例如,如果你的开发板使用的是MX6ULL内置的QSPI控制器,则需要添加以下配置选项: ``` CONFIG_SPI_MXS_QSPI=y CONFIG_SPI_FLASH_SPANSION=y ``` 4. 如果你的开发板中使用的SPI接口与SR8201FN网卡连接,则需要添加SR8201FN网卡的驱动支持。你可以从SR8201FN网卡的官网下载驱动程序,并将其添加到uboot源码的drivers目录中。然后在你的配置文件中添加以下配置选项: ``` CONFIG_DM_ETH=y CONFIG_CMD_NET=y ``` 5. 在你的配置文件中添加以下配置选项启用SR8201FN网卡的驱动支持: ``` CONFIG_ETH_DESIGNWARE=y CONFIG_ETH_DESIGNWARE_SPI=y CONFIG_ETH_DESIGNWARE_SPI_BUS_MAX=1 CONFIG_DM_ETH_SPI=y CONFIG_MII=y CONFIG_PHYLIB=y CONFIG_PHYLIB_10G=y CONFIG_PHY_ATHEROS=y CONFIG_PHYLIB_ETHERNET=y CONFIG_PHYLIB_MICREL=y CONFIG_PHYLIB_NETPHY=y CONFIG_PHYLIB_REALTEK=y CONFIG_PHYLIB_SMSC=y CONFIG_DM_GPIO=y CONFIG_DM_SPI_FLASH=y CONFIG_DM_SPI=y CONFIG_DM_SPI_SLAVE=y CONFIG_SPI_FLASH=y CONFIG_CMD_SPI=y CONFIG_SPI_FLASH_MTD=y CONFIG_DM_SPI_FLASH_MTD=y CONFIG_SPI_FLASH_BAR=y CONFIG_SPI_FLASH_MACRONIX=y CONFIG_SPI_FLASH_SPANSION=y CONFIG_SPI_FLASH_STMICRO=y CONFIG_SPI_FLASH_SST=y CONFIG_SPI_FLASH_WINBOND=y ``` 6. 将你的配置文件编译成uboot二进制文件并烧写到开发板中,测试SR8201FN网卡是否工作正常。 以上是添加SR8201FN网卡驱动的大致步骤,具体实现可能会因为开发板和uboot版本的不同而略有不同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

omnibots

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

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

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

打赏作者

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

抵扣说明:

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

余额充值