mx6q_sabresd_init_uart函数跟踪

串口初始化:

static inline void mx6q_sabresd_init_uart(void)
{
	imx6q_add_imx_uart(2, NULL);
	imx6q_add_imx_uart(0, NULL);
}
跟踪这个函数:imx6q_add_imx_uart

#define imx6q_add_imx_uart(id, pdata)	\
	imx_add_imx_uart_1irq(&imx6q_imx_uart_data[id], pdata)


先关注一下参数imx6q_imx_uart_data[]:

const struct imx_imx_uart_1irq_data imx6sl_imx_uart_data[] __initconst = {
#define imx6sl_imx_uart_data_entry(_id, _hwid)				\
	imx_imx_uart_1irq_data_entry(MX6SL, _id, _hwid, SZ_4K)
	imx6sl_imx_uart_data_entry(0, 1),
	imx6sl_imx_uart_data_entry(1, 2),
	imx6sl_imx_uart_data_entry(2, 3),
	imx6sl_imx_uart_data_entry(3, 4),
	imx6sl_imx_uart_data_entry(4, 5),
};

跟踪一下imx_inx_yart_1irq_data_entry:

#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,			\
	}
然后再看看这句:imx6sl_imx_uart_data_entry(0, 1),

我们把他展开iobase=MX6SL_UART1_BASE_ADDR

arm$ grep MX6SL_UART1_BASE_ADDR * -R
plat-mxc/include/mach/mx6.h:#define MX6SL_UART1_BASE_ADDR        (ATZ1_BASE_ADDR + 0x20000) /* MX6SL */

通过这个命令我们找到这个宏定义。然后再展开0X02000000+0x20000=0x02020000;这应该就是一个物理地址。

然后再回来看看这个函数:

imx_add_imx_uart_1irq
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));
}




然后是这个函数

 imx_add_platform_device


static inline struct platform_device *imx_add_platform_device(
		const char *name, int id,
		const struct resource *res, unsigned int num_resources,
		const void *data, size_t size_data)
{
	return imx_add_platform_device_dmamask(
			name, id, res, num_resources, data, size_data, 0);
}

然后
struct platform_device *__init imx_add_platform_device_dmamask(
		const char *name, int id,
		const struct resource *res, unsigned int num_resources,
		const void *data, size_t size_data, u64 dmamask)
{
	int ret = -ENOMEM;
	struct platform_device *pdev;

	pdev = platform_device_alloc(name, id);
	if (!pdev)
		goto err;

	if (dmamask) {
		/*
		 * This memory isn't freed when the device is put,
		 * I don't have a nice idea for that though.  Conceptually
		 * dma_mask in struct device should not be a pointer.
		 * See http://thread.gmane.org/gmane.linux.kernel.pci/9081
这个是最终的设备注册函数。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值