IMX6DL 串口篇
1 设备树文件
1.1 引脚配置
硬件上采用了 CSI0_DAT10、CSI0_DAT11 做为串口 1 的 TX,RX,在设备树文件中,需要按照如下配置:
pinctrl_uart1: uart1grp {fsl,pins = <MX6QDL_PAD_CSI0_DAT10__UART1_TX_DATA 0x1b0b1MX6QDL_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_reg | PAD MUX Register offset |
conf_reg | PAD Control Register offset |
input_reg | select input register offset |
mux_mode | value of PAD MUX Register |
input_val | value of select input Register |
config | value 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结束;停止定时器;失能所有中断;*/
}
IMX6DL 串口篇相关推荐
- FPGA学习之串口篇
FPGA学习之串口篇 文章目录 FPGA学习之串口篇 前言 二.UART发送代码 三.UART接收代码 三. 总结 前言 UART(Universal Asynchronous Receiver/ ...
- Android 对接硬件串口篇
简介:硬件设备有IC卡片,指压测试仪(测试脉搏信号.心率.血压),经过串口获取硬件设备发送的数据. 正文:第一步:获得硬件设备,应用市场下载串口调适软件,测试一下在Android环境下数据是否能正常获 ...
- .Net Core跨平台应用研究-HelloArm(串口篇)
引言 为了验证采用dotnet core技术开发的物联网设备数据采集接入服务应用是否能在高性价比的linux嵌入式平台运行,针对dotnet core应用程序进行嵌入式linux环境的发布部署运行验证 ...
- android 硬件对接,Android 对接硬件串口篇
private DispQueueThread DispQueue; private AssistBean AssistData; private SerialControl ComA; @Overr ...
- 第三篇 香橙派的外设开发基础(中)— 串口篇
目录 一.OrangePi PC Plus的串口 1.开启OrangePi PC+用于通信的串口
- 串口服务器之虚拟串口篇
可将TCP/IP连接.Modbus Tcp映射成本地虚拟串口,本地应用(InTouch.WinCC.组态王等)通过访问虚拟串口就可以完成远程监控及数据传输功能.VX:18106118736 QQ:80 ...
- Windows操作系统:串口篇
windows下串口编程还是linux有区别的,将最近调试的demo和查到的相关资料做了总结 1.打开串口 打开串口使用CreateFile()函数.以打开COM1为例: HANDLE hComm;h ...
- linux 串口波特率的修改与sdma的设置
最近这几天准备用串口实现DMA的传输数据,刚开始研究三天DMA,结果是一脸懵逼,无奈之下,只能跑去研究串口,结果发现Linux系统串口和DMA是真的难(小白,而且没人一起研究!),芯片手册对应的页数可 ...
- 单片机通信总述——理论部分(CAN、串口、SPI、I2C等)
一.基础概念 1.1 通信方法 并行通信:传输原理:数据各个位同时传输:优点:速度快: 缺点:占用引脚资源多.是指使用 8.16.32 及 64 根或更多的数据线(有多少信号为就需要多少信号位)进行传 ...
- 基于STM32F103入门4——串口通信
STM32F103串口篇 串口的基本概念 串行和并行 串行 并行 通信方式 全双工 半双工 单工 波特率 波特率计算 串口的配置 代码编写步骤 串口的重定向 串口的例程 main.c usart.c ...
最新文章
- 人工智能--野人过河
- [解决方案]sql server复制需要有实际的服务器名称才能连接到服务器
- Ext.DomHelper类的使用示例(内容操作)
- 仅输入单张图片,就能“看”出物体材质!这篇图形学论文已被SIGGRAPH 2021收录...
- pcb二次钻孔_作为一名合格的PCB设计工程师,了解生产制造很重要
- [转载] su和sudo
- 四大障碍将阻止或减缓广电发展宽带业务
- Vs2015常见错误码:error LNK2019: 无法解析的外部符号;error C2011:类型重定义;
- 如何免费制作表白二维码?
- 导向滤波-Guided Image Filtering
- Need和Want有何不同?
- 商品订单管理系统(参考答案)
- 常见十大漏洞总结(原理、危害、防御)
- 进销存ERP系统、销售单、采购单、退货单、库存管理、库存盘点、调拨、借入、借出、出库、入库、归还单、收款单、付款单、资金流水、销售报表、采购报表、库存报表、财务报表、商品库、电商erp、连锁erp
- Zookeeper 集群模式搭建
- 在绝望中寻找希望,把自己逼上成功
- 通过MATLAB模拟24个GPS卫星的轨道运行效果
- 一个简单的扑克牌小游戏
- 【关于回归结果F值缺失的处理方式】
- QEMU TCG Plugins详解
热门文章
- 编译实验 . 递归下降分析器
- 无线通信基础知识14:数字通信之调制
- kindeditor上传图片php,kindeditor上传图片与上传文件js
- 在vue中使用echarts之世界各地到中国某些城市的航线
- 在计算机上配置超级终端,电脑中如何添加超级终端?添加超级终端的方法
- 理解AutoResetEvent与ManualResetEvent的区别
- C#——SqlParameter的使用方法及注意事项
- oracle多表查询员工和上级,oracle多表查询之经典面试题
- vb.net 教程 3-10 窗体编程 datagridview控件 7 修改单元格
- Android 分区布局详解