IMX6DL 串口篇

1 设备树文件

1.1 引脚配置

硬件上采用了 CSI0_DAT10、CSI0_DAT11 做为串口 1 的 TX,RX,在设备树文件中,需要按照如下配置:

		pinctrl_uart1: uart1grp {
			fsl,pins = <
				MX6QDL_PAD_CSI0_DAT10__UART1_TX_DATA	0x1b0b1
				MX6QDL_PAD_CSI0_DAT11__UART1_RX_DATA	0x1b0b1
			>;
		};

#define MX6QDL_PAD_CSI0_DAT10__UART1_TX_DATA        0x280 0x650 0x000 0x3 0x0
#define MX6QDL_PAD_CSI0_DAT11__UART1_RX_DATA        0x284 0x654 0x920 0x3 0x1

在这里插入图片描述

参数描述
mux_regPAD MUX Register offset
conf_regPAD Control Register offset
input_regselect input register offset
mux_modevalue of PAD MUX Register
input_valvalue of select input Register
configvalue of PAD Control Register
1.1.1 mux_reg:PAD MUX Register offset

mux_mode = 0x03
select signal UART1_TX_DATA
在这里插入图片描述

1.1.2 conf_reg:PAD Control Register offset

config = 0x1b0b1

在这里插入图片描述在这里插入图片描述

1.2 串口资源描述
				uart1: serial@02020000 {
					compatible = "fsl,imx6q-uart", "fsl,imx21-uart";
					reg = <0x02020000 0x4000>;
					interrupts = <0 26 IRQ_TYPE_LEVEL_HIGH>;
					clocks = <&clks IMX6QDL_CLK_UART_IPG>,
						 <&clks IMX6QDL_CLK_UART_SERIAL>;
					clock-names = "ipg", "per";
					dmas = <&sdma 25 4 0>, <&sdma 26 4 0>;
					dma-names = "rx", "tx";
					status = "okay";
				};
  • 这个一般只需要改动 status 的值。okay,disabled。
  • reg = <0x02020000 0x4000>,表示 uart1 寄存器的起始地址与大小
  • interrupts = <0 26 IRQ_TYPE_LEVEL_HIGH>,中断号 26,高电平有效
  • clocks = <&clks IMX6QDL_CLK_UART_IPG>, <&clks IMX6QDL_CLK_UART_SERIAL>; 未搞懂
  • dmas = <&sdma 25 4 0>, <&sdma 26 4 0>; 未搞懂

2 系统调用 open、write、read 是如何操作串口

在 Linux 系统中,每个字符设备都由一个 struct cdev 结构表示:

struct cdev {
	struct kobject kobj;
	struct module *owner;
	const struct file_operations *ops;
	struct list_head list;
	dev_t dev;
	unsigned int count;
};

其中,包含了文件操作的接口 struct file_operation *ops,编写串口驱动就是用串口的操作函数填充这些接口。如下图所示:
在这里插入图片描述

2.1 open 操作

open 函数经过层层调用,最后调用了 imx_startup 函数。

static int imx_startup(struct uart_port *port)
{
	/*
	使能时钟;
	设置发送/接收 FIFO 触发字节数;
	设置DMA;
	注册DMA发送函数;
	使能中断;
	*/
}
2.2 write 操作

write 函数经过层层调用,最后调用了 imx_start_tx 函数。

static void imx_start_tx(struct uart_port *port)
{
	/*
	根据是否开启DMA,开启相应的发送中断;
	*/
}

开启中断后,注册过的中断发送函数会自动将发送 buff 内的字节发送出去。

2.3 read 操作

接收中断会自动将接收到的字节搬运至接收缓冲区,所以串口不需要实现特定的 read 函数,调用 read 函数,最后会调用 tty_read 函数,将接收缓冲区的内容搬运至用户空间。

2.4 close 操作

close 函数经过层层调用,最后调用了 imx_shutdown 函数。

static void imx_shutdown(struct uart_port *port)
{
	/*
	等待DMA结束;
	停止定时器;
	失能所有中断;
	*/
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值