新路程------imx6的uart小结(1)

 imx6用的是RS485,今天看看这个接口是怎么初始化的。

首先在./arch/arm/mach-mx6/board-mx6q_sabresd.c里找uart的相关信息

在static void __init mx6_sabresd_board_init(void)肯定会有初始化的相关信息

        gpio_request(SABRESD_EPDC_PWRSTAT, "uart2_en"); 申请gpio
	gpio_direction_output(SABRESD_EPDC_PWRSTAT, 1);  设置输入输出
	gpio_set_value(SABRESD_EPDC_PWRSTAT, 1);  设置初始电平

	gpio_request(SABRESD_EPDC_PWRCTRL0, "uart2_rts");
	gpio_direction_output(SABRESD_EPDC_PWRCTRL0, 1);
	gpio_set_value(SABRESD_EPDC_PWRCTRL0, 1);

	gpio_request(SABRESD_EPDC_PWRCTRL1, "uart3_en");
	gpio_direction_output(SABRESD_EPDC_PWRCTRL1, 1);
	gpio_set_value(SABRESD_EPDC_PWRCTRL1, 1);

	mx6q_sabresd_init_uart();

这里找到了之后,看看mx6q_sabresd_init_uart()

static const struct imxuart_platform_data mx6q_sd_uart3_data __initconst = {
	.flags      = IMXUART_HAVE_RTSCTS,
	.dma_req_rx = MX6Q_DMA_REQ_UART3_RX,
	.dma_req_tx = MX6Q_DMA_REQ_UART3_TX,
};
static inline void mx6q_sabresd_init_uart(void)
{
	//imx6q_add_imx_uart(2, NULL);
	imx6q_add_imx_uart(0, NULL);
	imx6q_add_imx_uart(1, NULL);
	imx6q_add_imx_uart(2, &mx6q_sd_uart3_data);
	imx6q_add_imx_uart(3, NULL);
	imx6q_add_imx_uart(4, NULL);
}
再看看#define imx6q_add_imx_uart(id, pdata) \
imx_add_imx_uart_1irq(&imx6q_imx_uart_data[id], pdata)
接下来是

struct platform_device *__init imx_add_imx_uart_1irq(
		const struct imx_imx_uart_1irq_data *data,
		const struct imxuart_platform_data *pdata)
{
	struct resource res[] = {
		{
			.start = data->iobase,
			.end = data->iobase + data->iosize - 1,
			.flags = IORESOURCE_MEM,
		}, {
			.start = data->irq,
			.end = data->irq,
			.flags = IORESOURCE_IRQ,
		},
	};

	return imx_add_platform_device("imx-uart", data->id, res, ARRAY_SIZE(res),
			pdata, sizeof(*pdata));
}
之前只有uart2有pdata,所以也只有2有用
这个

#ifdef CONFIG_SOC_IMX6Q
const struct imx_imx_uart_1irq_data imx6q_imx_uart_data[] __initconst = {
#define imx6q_imx_uart_data_entry(_id, _hwid) \
imx_imx_uart_1irq_data_entry(MX6Q, _id, _hwid, SZ_4K)
imx6q_imx_uart_data_entry(0, 1),
imx6q_imx_uart_data_entry(1, 2),
imx6q_imx_uart_data_entry(2, 3),
imx6q_imx_uart_data_entry(3, 4),
imx6q_imx_uart_data_entry(4, 5),
};

#define imx_imx_uart_1irq_data_entry(soc, _id, _hwid, _size) \
[_id] = { \
.id = _id, \
.iobase = soc ## _UART ## _hwid ## _BASE_ADDR, \
.iosize = _size, \
.irq = soc ## _INT_UART ## _hwid, \
}

到此为止,在linux系统中就存在了这个uart的pdate和resouce,等到驱动跑起来的时候传入probe的参数就是从这里来的

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值